craetejobs modal front

This commit is contained in:
SamSys
2025-10-14 04:21:50 +03:30
parent e9c3176dfc
commit 596e21b712
11 changed files with 423 additions and 47 deletions

View File

@@ -14,6 +14,14 @@ public interface IClassificationGroupRepository : IRepository<long, Classificati
/// <returns></returns>
Task<List<ClassificationGroupAndJobModel>> GetGroupAndJobs(long schemeId);
/// <summary>
/// دریافت مشاغل گروه توسط آی دی گروه
/// </summary>
/// <param name="groupId"></param>
/// <returns></returns>
Task<List<EditClassificationGroupJob>> GetGroupJobs(long groupId);
/// <summary>
/// ایجاد گروه های بیست گانه
/// </summary>

View File

@@ -11,6 +11,13 @@ public interface IJobRepository : IRepository<long, Job>
EditJob GetDetails(long id);
List<JobViewModel> Search(JobSearchModel searchModel);
List<JobViewModel> SearchJobForMain(JobSearchModel searchModel);
/// <summary>
/// جستجوس مشاغل
/// </summary>
/// <param name="searchtText"></param>
/// <returns></returns>
Task<List<JobViewModel>> JobSearchSelect(string searchtText);
// Task<List<JobViewModel>> GetJobListByText(string searchtText);
List<JobViewModel> GetJobListByText(string searchtText);
List<JobViewModel> GetJobListByWorkshopId(long workshopId);

View File

@@ -48,6 +48,13 @@ public interface IClassificationSchemeApplication
Task<List<ClassificationGroupAndJobModel>> GetGroupAndJobs(long schemeId);
/// <summary>
/// دریافت مشاغل گروه توسط آی دی گروه
/// </summary>
/// <param name="groupId"></param>
/// <returns></returns>
Task<List<EditClassificationGroupJob>> GetGroupJobs(long groupId);
/// <summary>
/// ایجاد مشاغل گروه
/// </summary>

View File

@@ -13,6 +13,13 @@ public interface IJobApplication
List<JobViewModel> Search(JobSearchModel searchModel);
List<JobViewModel> SearchJobForMain(JobSearchModel searchModel);
//Task<List<JobViewModel>> GetJobListByText(string searchtText);
/// <summary>
/// جستجوی مشاغل برای سلکت تو
/// </summary>
/// <param name="searchtText"></param>
/// <returns></returns>
Task<List<JobViewModel>> JobSearchSelect(string searchtText);
List<JobViewModel> GetJobListByText(string searchtText);
List<JobViewModel> GetJobListByWorkshopId(long workshopId);
List<JobViewModel> GetJobListByTextAndWorkshopId(string textSearch, long workshopId);

View File

@@ -115,6 +115,11 @@ public class ClassificationSchemeApplication : IClassificationSchemeApplication
return await _classificationGroupRepository.GetGroupAndJobs(schemeId);
}
public async Task<List<EditClassificationGroupJob>> GetGroupJobs(long groupId)
{
return await _classificationGroupRepository.GetGroupJobs(groupId);
}
public Task<OperationResult> CreateGroupJobs(ClassificationGroupAndJobModel command)
{
throw new System.NotImplementedException();

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using _0_Framework.Application;
using Company.Domain.JobAgg;
using CompanyManagment.App.Contracts.Job;
@@ -66,6 +67,11 @@ public class JobApplication : IJobApplication
return _jobRepository.SearchJobForMain(searchModel);
}
public async Task<List<JobViewModel>> JobSearchSelect(string searchtText)
{
return await _jobRepository.JobSearchSelect(searchtText);
}
//public Task<List<JobViewModel>> GetJobListByText(string searchtText)
//{
// return _jobRepository.GetJobListByText(searchtText);

View File

@@ -46,6 +46,29 @@ public class ClassificationGroupRepository : RepositoryBase<long, Classification
}).OrderBy(x=>x.GroupNoInt).ToListAsync();
}
/// <summary>
/// دریافت مشاغل گروه توسط آی دی گروه
/// </summary>
/// <param name="groupId"></param>
/// <returns></returns>
public async Task<List<EditClassificationGroupJob>> GetGroupJobs(long groupId)
{
return await _context.ClassificationGroupJobs
.Where(x => x.id == groupId).Select(jobs => new EditClassificationGroupJob()
{
Id = jobs.id,
JobId = jobs.JobId,
JobName = jobs.JobName,
JobCode = jobs.JobCode,
ClassificationGroupId = jobs.ClassificationGroupId,
GroupNo = jobs.GroupNo,
}).ToListAsync();
}
/// <summary>
/// ایجاد گروه های بیست گانه
/// </summary>

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using _0_Framework.InfraStructure;
using Company.Domain.JobAgg;
using CompanyManagment.App.Contracts.Job;
@@ -83,6 +84,32 @@ public class JobRepository: RepositoryBase<long, Job>, IJobRepository
}
public async Task<List<JobViewModel>> JobSearchSelect(string searchtText)
{
if (!string.IsNullOrWhiteSpace(searchtText))
{
var query =_context.Jobs.Select(x => new JobViewModel
{
Id = x.id,
JobName = x.JobName,
JobCode = x.JobCode
});
query = query.Where(x => x.JobName.Contains(searchtText));
var jobViewModelList =await query.Take(100).Select(x => new JobViewModel
{
Id = x.Id,
JobName = x.JobName,
JobCode = x.JobCode
}).ToListAsync();
return jobViewModelList;
}
else
{
return new List<JobViewModel>();
}
}
// public async Task<List<JobViewModel>> GetJobListByText(string searchtText)
public List<JobViewModel> GetJobListByText(string searchtText)
{

View File

@@ -1,4 +1,5 @@
using CompanyManagment.App.Contracts.ClassificationScheme;
using CompanyManagment.App.Contracts.Job;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
@@ -10,11 +11,12 @@ namespace ServiceHost.Areas.Admin.Pages.Company.Workshops;
public class ClassificationSchemeModel : PageModel
{
private readonly IClassificationSchemeApplication _classificationSchemeApplication;
private readonly IJobApplication _jobApplication;
public ClassificationSchemeModel(IClassificationSchemeApplication classificationSchemeApplication)
public ClassificationSchemeModel(IClassificationSchemeApplication classificationSchemeApplication, IJobApplication jobApplication)
{
_classificationSchemeApplication = classificationSchemeApplication;
_jobApplication = jobApplication;
}
/// <summary>
@@ -116,14 +118,42 @@ public class ClassificationSchemeModel : PageModel
/// لود مدال ایجاد یا ویرایش مشاغل گروه
/// </summary>
/// <param name="groupId"></param>
/// <param name="groupNo"></param>
/// <returns></returns>
public IActionResult OnGetCreateOrEditJobs(long groupId)
public IActionResult OnGetCreateOrEditJobs(long groupId, string groupNo)
{
var model = new ClassificationGroupAndJobModel();
model.GroupId = groupId;
model.GroupNo = groupNo;
model.EditClassificationGroupJob =
_classificationSchemeApplication.GetGroupJobs(groupId).GetAwaiter().GetResult();
return Partial("_ClassificationPartials/ClassificationGroupJobsTab");
return Partial("_ClassificationPartials/CreateOrEditGroupJobs", model);
}
/// <summary>
/// جستجو شغل
/// </summary>
/// <param name="textSearch"></param>
/// <returns></returns>
public IActionResult OnPostJobByTextSearch(string textSearch)
{
var jobs = _jobApplication.JobSearchSelect(textSearch).GetAwaiter().GetResult();
jobs = jobs.OrderBy(x => x.JobName.Length).ToList().Select(x => new JobViewModel
{
Id = x.Id,
JobName = x.JobName,
JobCode = x.JobCode,
SearchResultTitle = x.JobName,
SearchResultCode = x.JobCode
}).ToList();
return new JsonResult(new
{
IsSuccedded = true,
List = jobs
});
}
#endregion

View File

@@ -77,7 +77,7 @@
<div class="col-3 col-md-3 align-items-center" style="float:left; direction:ltr">
<a href="#">
<a href="#showmodal=@Url.Page("./ClassificationScheme", "CreateOrEditJobs" ,new {groupId = itemRight.GroupId , groupNo = itemRight.GroupNo})">
<span class="icon-span @(itemRight.EditClassificationGroupJob.Count < 1 ? "add-jobs" : "edit-jobs")" style="padding: 4px;font-size: 11px;">
@if (itemRight.EditClassificationGroupJob.Count < 1)
{
@@ -128,7 +128,7 @@
<div class="col-3 col-md-3 align-items-center" style="float:left; direction:ltr">
<a href="#">
<a href="#showmodal=@Url.Page("./ClassificationScheme", "CreateOrEditJobs" ,new {groupId = itemLeft.GroupId , groupNo = itemLeft.GroupNo})">
<span class="icon-span @(itemLeft.EditClassificationGroupJob.Count < 1 ? "add-jobs" : "edit-jobs")" style="padding: 4px;font-size: 11px;">
@if (itemLeft.EditClassificationGroupJob.Count < 1)
{

View File

@@ -1,9 +1,63 @@
@model CompanyManagment.App.Contracts.ClassificationScheme.ClassificationGroupAndJobModel
@Html.AntiForgeryToken()
@{
int index = 1;
<link href="@Href("~/DadmehrSelect/dad-mehr-select.css")" rel="stylesheet" />
<style>
.name-right{
position:inherit !important;
}
.dadmehr-select-search .options li{
padding: 4px 12px;
margin-top: 6px;
font-size: 12px;
box-shadow: 0 1px 2px 0 rgba(0,0,0,.1);
border-top: none;
border-radius: 7px;
background-color: #e8e8e8 !important;
cursor: pointer;
color: #504f4f;
}
.dadmehr-select-search .custom-select{
borderRadius: 5px!important;
border-top-right-radius : 5px;
}
.job-item{
background-color: #bdeae9;
flex: 0 0 calc(33.333% - 8px); /* دقیقاً سه‌تا در هر سطر */
box-sizing: border-box;
direction: rtl;
justify-content: flex-start;
align-items: flex-start; /* آیتم‌ها در یک راستا از بالا */
padding: 6px 10px;
border-radius: 5px;
min-height: 36px; /* برای ارتفاع یکنواخت */
}
.tr-job {
display: flex;
flex-wrap: wrap;
gap: 8px;
box-sizing: border-box;
}
</style>
}
<div class="modal-header">
<h5 class="modal-title"> @Model.GroupNo تعیین مشاغل گروه </h5>
<h5 class="modal-title"> تعیین مشاغل گروه @Model.GroupNo </h5>
<button type="button" class="close" data-dismiss="modal" aria-label="بستن">
<span aria-hidden="true">&times;</span>
</button>
@@ -11,61 +65,263 @@
<form asp-page="./ClassificationScheme" asp-page-handler="CreateScheme" method="post" autocomplete="off"
data-ajax="true" data-action="Refresh" enctype="multipart/form-data">
<div class="modal-body">
<div class="row">
</div>
<div class="card shadow-sm border-0">
<div class="card-body">
<div class="row fw-bold mb-2 head-table">
<div class="col-2 col-md-1">ردیف</div>
<div class="col-10 col-md-3">نام شغل</div>
<div class=" dadmehr-select-search" onclick="inputFocus(this)">
<div class="custom-select text-right">
<ul class="ul-search single text-right" data-url="@Url.Page("/Company/Workshops/ClassificationScheme", "JobByTextSearch")">
<div class="col-12 col-md-3" style="float:left; direction:ltr">عملیات</div>
</div>
@foreach (var item in Model.EditClassificationGroupJob)
{
<div class="row align-items-center mb-2 p-2 tr-table">
<li>
<input id="searchingJob" placeholder="جستجوی شغل..." job-id="" onkeyup="searchText(event, this, '@Url.Page("/Company/Workshops/ClassificationScheme", "JobByTextSearch")', true)" class="text-right input-text" />
<div class="col-2 col-md-1">
<div class="row-number">@index</div></div>
<div class="col-10 col-md-3">@item.JobName</div>
@{
index++;
}
<div class="col-12 col-md-3 align-items-center" style="float:left; direction:ltr">
<a style="border-radius:5px;" href="#showmodal=@Url.Page("./ClassificationScheme", "CreateScheme", new { workshopId = @Model.WorkshopId })">
<span class="icon-span" style="background-color:#ddd3e0">
<svg width="19" height="18" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="18.5047" height="18.5047" transform="translate(0.523438 0.523438)" fill="#DDD3E0"></rect>
<path d="M7.84814 11.7031L7.84814 9.39004" stroke="#BF3737" stroke-linecap="round"></path>
<path d="M11.7031 11.7031L11.7031 9.39004" stroke="#BF3737" stroke-linecap="round"></path>
<path d="M2.83643 5.53125H16.7149V5.53125C16.0652 5.53125 15.7403 5.53125 15.4745 5.60604C14.8039 5.79477 14.2799 6.31884 14.0911 6.98943C14.0163 7.25518 14.0163 7.58007 14.0163 8.22985V11.5546C14.0163 13.4402 14.0163 14.383 13.4305 14.9688C12.8448 15.5546 11.902 15.5546 10.0163 15.5546H9.53502C7.64941 15.5546 6.7066 15.5546 6.12081 14.9688C5.53502 14.383 5.53502 13.4402 5.53502 11.5546V8.22985C5.53502 7.58007 5.53502 7.25518 5.46023 6.98943C5.27151 6.31884 4.74744 5.79477 4.07685 5.60604C3.8111 5.53125 3.48621 5.53125 2.83643 5.53125V5.53125Z" stroke="#BF3737" stroke-linecap="round"></path>
<path d="M7.84799 3.22434C7.84799 3.22434 8.2335 2.45312 9.77556 2.45312C11.3176 2.45312 11.7031 3.22415 11.7031 3.22415" stroke="#BF3737" stroke-linecap="round"></path>
</svg>
</span>
</a>
</li>
</ul>
<ul class="result options text-right">
</ul>
</div>
<span class="span-input"></span>
</div>
</div>
</div>
<div class="shadow-sm border-0 m-t-10">
<button onclick="addJobs()" class="btn btn-success" style="position: relative;border-radius: 10px; padding:1px 5px;">
<span class="icon-span" style="padding: 4px;font-size: 11px;">
<svg width="19" height="18" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="11" cy="11" r="8.25" stroke="white" />
<path d="M11 13.75L11 8.25" stroke="white" stroke-linecap="round" />
<path d="M13.75 11L8.25 11" stroke="white" stroke-linecap="round" />
</svg>
<span class="job-btn-text" >افزودن شغل</span>
</span>
</button>
</div>
<div class="card shadow-sm border-0 m-t-10" style="height:300px; overflow-y:scroll">
<div class="card-body">
<div class="align-items-center mb-2 p-2 tr-table tr-job">
@if (Model.EditClassificationGroupJob.Count > 0)
{
@foreach (var item in Model.EditClassificationGroupJob)
{
<div class="col-xs-12 col-md-4 job-item">
<span>@item.JobName</span>
<span>&nbsp;</span>
<span>-</span>
<span>&nbsp;</span>
<span>@item.JobCode</span>
<input type="hidden" job-id="@item.JobId" job-code="@item.JobCode" job-name="@item.JobName" name="job-data"/>
</div>
}
}
</div>
</div>
</div>
}
</div>
<input type="hidden" asp-for="WorkshopId" value="@Model.GroupId" />
@* <input type="hidden" asp-for="WorkshopId" value="@Model.GroupId" /> *@
<div class="modal-footer border-0">
<button type="submit" class="btn btn-success px-4 rounded-pill">ذخیره</button>
<button type="button" class="btn btn-outline-secondary px-4 rounded-pill" data-dismiss="modal">بستن</button>
</div>
</form>
<script language="javascript" src="~/AdminTheme/js/city.js"></script>
<script>
function addJobs() {
let jobHiddenInput = $('.span-input').find('.selectedJob');
// اگر وجود داشت
if (jobHiddenInput.length > 0) {
let jobItems = document.querySelectorAll(".job-item-data");
// خواندن مقادیر از اتریبیوت‌ها
let jobName = jobHiddenInput.attr('selectedJob-name');
let jobCode = jobHiddenInput.attr('selectedJob-code');
let jobId = jobHiddenInput.attr('selectedJob-id');
var checkExist = false;
jobItems.forEach((jobItem) => {
if($(jobItem).attr("job-id") == jobId){
$.Notification.autoHideNotify('error', 'top center', 'پیام سیستم ', 'این شغل قبلا اضافه شده است');
checkExist = true;
}
});
if(checkExist == false){
let html = `
<div class="col-xs-12 job-item">
<span>${jobName}</span>
<span>&nbsp;</span>
<span>-</span>
<span>&nbsp;</span>
<span>${jobCode}</span>
<input class="job-item-data" type="hidden"
job-id="${jobId}"
job-code="${jobCode}"
job-name="${jobName}"
name="job-data"/>
</div>`;
// افزودن به div مقصد
$('.tr-job').append(html);
}
}
}
function inputFocus(element) {
$(element).find('ul.ul-search').find('.input-text').focus();
}
function searchText(e,element, urlPost, hasCode) {
var code = e.code;
if (code != "ArrowDown" && code != "ArrowUp" && code != "Enter") {
var text = $(element).val();
textlength = text.length;
$(element).parent().parent().parent('.custom-select').children('.result').html('');
if (text != "") {
$(element).parent().parent().parent('.custom-select').children('.result').html('');
$(element).parent().parent().parent('.custom-select').children('ul.result').show();
$.ajax({
dataType: 'json',
type: 'POST',
url: urlPost,
headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
data: { "textSearch": text },
success: function (response) {
index = 0;
$(element).parent().parent().parent('.custom-select').children('.result').html('');
if (response.list.length > 0) {
var ids = [];
$(element).parent().parent().parent('.custom-select').children('.result').find("li.select-item:not(.hasinput)").remove();
$('.custom-select').children('ul.ul-search').find('span.items-selected').each(function (x) {
ids.push(Number($(this).attr('data-value')));
});
$.each(response.list, function (i, item) {
if (jQuery.inArray(item.id, ids) == -1) {
if (hasCode) {
$(element).parent().parent().parent('.custom-select').children('.result').append('<li class="select-item" onclick="selectItemSearch(this)" data-code="' + item.searchResultCode + '" data-name="' + item.searchResultTitle + '" data-value="' + item.id + '"><span class="name-right">' + item.searchResultTitle + ' - ' + item.searchResultCode + '</span></li>');
$('.code-left').each(function () {
var spanContent = $(this).text();
if (/\D/.test(spanContent)) { // Check if the content of the span contains non-digits
$(this).css('color', 'red');
}
});
}
else {
$(element).parent().parent().parent('.custom-select').children('.result').append('<li class="select-item" onclick="selectItemSearch(this)" data-name="' + item.searchResultTitle + '" data-value="' + item.id + '"><span class="name-right">' + item.searchResultTitle + '</span></li>');
}
}
});
$(element).parent().parent().parent('.custom-select').children('.result').find("li.select-item:not(.hasinput)").first().focus();
$(element).parent().parent().parent('.custom-select').children('.result').find("li.select-item:not(.hasinput)").first().addClass('arrowselected');
}
else {
$(element).parent().parent().parent('.custom-select').children('.result').html('');
$(element).parent().parent().parent('.custom-select').children('.result').append('<li class="select-item"><span>هیچ نتیجه ای یافت نشد</span></li>');
}
},
failure: function (response) {
//console.log(5, response);
}
});
}
else {
$(element).parent().parent().parent('.custom-select').children('.result').find("li.select-item:not(.hasinput)").remove();
}
}
}
var selectItemSearch = function (element) {
$('.selectedJob').remove();
let activeTabPane = $('.card-body');
var name = activeTabPane.find(element).attr("data-name");
var code = activeTabPane.find(element).attr("data-code");
var value = activeTabPane.find(element).attr("data-value");
//وقنی اسکرول بالا رفت اینطور شود
//$(element).parent().parent('.custom-select').children('ul.result').removeClass('posistion-static');
//$(element).parent().parent('.custom-select').children('ul.result').removeClass('posistion-absolute');
activeTabPane.find(element).parent().parent().children('ul.ul-search').find('input').val(name + ' - ' + code);
activeTabPane.find(element).parent().parent().children('ul.ul-search').find('input').attr("job-id", value);
// activeTabPane.find(element).parent().parent().children('ul.ul-search').find('input').parent('li').remove();
activeTabPane.find(element).parent().parent('.custom-select').children('ul.result').hide();
$('.span-input')
.append('<input class="selectedJob" type="hidden" selectedJob-id="' + value + '" selectedJob-code="' + code + '" selectedJob-name="' + name + '" name="selectedjob-data"/>');
// activeTabPane.find(element).parent().parent().children('ul.ul-search').find('.singleItem').remove();
// if (code == 'undefined' || code == null) {
// activeTabPane.find(element).parent().parent().children('ul.ul-search').append('<li onclick="openSearchResult(this)" class="singleItem"><span data-value="' + value + '" >' + name + '</li>');
// }
// else
// activeTabPane.find(element).parent().parent().children('ul.ul-search').append('<li onclick="openSearchResultByCode(this)" class="singleItem"><span class="value" data-value="' + value + '" >' + name + '</span>|<span class="code" data-code="' + code + '" >' + code + '</span></li>');
//$(element).parent().parent().children('ul.ul-search').append('<li> <input onkeyup="searchText(this)" onkeypress="searchTextResize(this)" class="text-right input-text" /></li>');
}
$(document).on('input', '#searchingJob', function () {
var value = $(this).val().trim();
if (value === "") {
$('.selectedJob').remove();
}
});
$(document).click(
function (e) {
// console.log($(e.target).attr('class'));
var classElement = $(e.target).parent().attr('class');
if (classElement != "input-text-single" && classElement != "select-item hasinput" && classElement != "del-selected" && classElement != "singleItem" && classElement != "select-item" && classElement !="result options text-right" ) {
$(".dadmehr-select-search").find('.result').hide();
}
});
function handleClick(event) {
const customSelect = $(event.target).closest(".custom-select input");
const divOffset = customSelect.offset();
$(".options").css("top", divOffset.top - 5);
if ($(window).width() < 1550) {
$(".options").css("top", divOffset.top + 10);
// console.log(1);
}
}
</script>