$(document).ready(function() { var dtLang = (typeof app_locale !== 'undefined' && app_locale === 'fa') ? { search: 'جستجو:', lengthMenu: 'نمایش _MENU_ ردیف', info: 'نمایش _START_ تا _END_ از _TOTAL_ ردیف', infoEmpty: 'ردیفی یافت نشد', zeroRecords: 'ردیفی یافت نشد', paginate: { first: 'اول', last: 'آخر', next: 'بعدی', previous: 'قبلی' } } : {}; var dtDefaults = { pageLength: 10, lengthMenu: [[10, 25, 50, -1], [10, 25, 50, 'همه']], order: [], language: dtLang, dom: 'lfrtip', deferRender: true, autoWidth: false }; var tabTableMap = { '#entities_tab': '#holding_entities_table', '#units_tab': '#holding_units_table', '#relations_tab': '#holding_relations_table', '#assignments_tab': '#holding_assignments_table' }; function destroyAllHoldingDataTables() { $.each(tabTableMap, function(tabHash, tableSelector) { var $table = $(tableSelector); if ($table.length && $.fn.DataTable.isDataTable($table[0])) { $table.DataTable().destroy(); } }); } function destroyOtherHoldingDataTables(activeTableSelector) { $.each(tabTableMap, function(tabHash, tableSelector) { if (tableSelector === activeTableSelector) { return; } var $table = $(tableSelector); if ($table.length && $.fn.DataTable.isDataTable($table[0])) { $table.DataTable().destroy(); } }); } function initHoldingDataTable(tableSelector) { if (!$.fn.DataTable) { return; } var $table = $(tableSelector); if (!$table.length) { return; } destroyOtherHoldingDataTables(tableSelector); if ($.fn.DataTable.isDataTable($table[0])) { $table.DataTable().columns.adjust().draw(false); return; } if ($table.find('tbody tr').not('.holding-table-empty').length === 0) { return; } $table.DataTable(dtDefaults); } var tabAdjustTimer = null; function scheduleTableInit(tabHash) { clearTimeout(tabAdjustTimer); tabAdjustTimer = setTimeout(function() { var tableSelector = tabTableMap[tabHash]; if (!tableSelector) { destroyAllHoldingDataTables(); return; } initHoldingDataTable(tableSelector); }, 50); } var hash = window.location.hash; if (hash && tabTableMap[hash]) { $('a[href="' + hash + '"]').tab('show'); scheduleTableInit(hash); } $('a[data-toggle="tab"]').on('shown.bs.tab', function(e) { if (e.target.hash) { history.replaceState(null, '', e.target.hash); scheduleTableInit(e.target.hash); } }); function destroyHoldingDatepickers($container) { $container.find('.holding-date-picker').each(function() { var $input = $(this); if ($input.data('persianDatepicker')) { try { $input.persianDatepicker('destroy'); } catch (e) {} } if ($input.data('datepicker')) { try { $input.datepicker('destroy'); } catch (e) {} } }); } function syncHoldingDatepickerValues($container) { $container.find('.holding-date-picker').each(function() { var $input = $(this); $input.trigger('blur'); if ($input.data('persianDatepicker')) { var pdInstance = $input.data('persianDatepicker'); try { if (pdInstance.getState && pdInstance.getState().selected) { var selected = pdInstance.getState().selected; var formatted = selected.year + '/' + String(selected.month).padStart(2, '0') + '/' + String(selected.day).padStart(2, '0'); $input.val(formatted); } else if (pdInstance.getSelectedDate) { var date = pdInstance.getSelectedDate(); if (date) { $input.val(date.year + '/' + String(date.month).padStart(2, '0') + '/' + String(date.day).padStart(2, '0')); } } } catch (e) {} } if (!$.trim($input.val())) { $input.val(''); } }); } function initHoldingDatepickers($container) { destroyHoldingDatepickers($container); var $inputs = $container.find('.holding-date-picker'); if (!$inputs.length) { return; } var pickerOptions = { autoClose: true, initialValue: true, observer: true, timePicker: { enabled: false } }; if (typeof initPersianDatepicker === 'function') { initPersianDatepicker($inputs, pickerOptions); } else if (typeof is_persian_lang !== 'undefined' && is_persian_lang && typeof $.fn.persianDatepicker !== 'undefined') { $inputs.persianDatepicker($.extend({ calendarType: 'persian', format: typeof datepicker_date_format !== 'undefined' ? datepicker_date_format : 'YYYY/MM/DD' }, pickerOptions)); } else { $inputs.datepicker({ autoclose: true, format: typeof datepicker_date_format !== 'undefined' ? datepicker_date_format : 'yyyy/mm/dd', container: $container.closest('.modal'), todayHighlight: true }); } $('.datepicker-container').css('z-index', 2000); } var holdingModalSelector = '.holding_entity_modal, .holding_unit_modal, .holding_relation_modal, .holding_assignment_modal'; $(document).on('shown.bs.modal', holdingModalSelector, function() { var $modal = $(this); __select2($modal.find('.select2')); setTimeout(function() { initHoldingDatepickers($modal); }, 100); }); $(document).on('hidden.bs.modal', holdingModalSelector, function() { destroyHoldingDatepickers($(this)); }); function applyUserHrmDefaults($modal) { var userId = $modal.find('.holding-assignment-user').val(); var map = window.HOLDING_USER_HRM || {}; if (!userId || !map[userId]) { return; } var hrm = map[userId]; if (hrm.org_unit_id) { $modal.find('.holding-assignment-org-unit').val(hrm.org_unit_id).trigger('change'); } if (hrm.designation_id) { $modal.find('.holding-assignment-designation').val(hrm.designation_id).trigger('change'); $modal.find('.holding-assignment-title-custom').val(''); } } $(document).on('change', '.holding-assignment-user', function() { applyUserHrmDefaults($(this).closest('.modal')); }); $(document).on('change', '.holding-assignment-designation', function() { var $modal = $(this).closest('.modal'); if ($(this).val()) { $modal.find('.holding-assignment-title-custom').val(''); } }); function submitHoldingForm(formSelector, modalSelector) { $(document).on('submit', formSelector, function(e) { e.preventDefault(); var $form = $(this); var $submitBtn = $form.find('button[type="submit"]'); syncHoldingDatepickerValues($form); $.ajax({ method: 'POST', url: $form.attr('action'), data: $form.serialize(), dataType: 'json', headers: { 'X-Requested-With': 'XMLHttpRequest', 'Accept': 'application/json' }, success: function(result) { if (result.success) { $(modalSelector).modal('hide'); toastr.success(result.msg); setTimeout(function() { window.location.hash = result.tab ? '#' + result.tab : ''; window.location.reload(); }, 600); } else { toastr.error(result.msg); $submitBtn.prop('disabled', false); } }, error: function(xhr) { var msg = LANG.something_went_wrong; if (xhr.responseJSON) { if (xhr.responseJSON.msg) { msg = xhr.responseJSON.msg; } else if (xhr.responseJSON.errors) { msg = $.map(xhr.responseJSON.errors, function(v) { return v[0]; }).join('
'); } else if (xhr.responseJSON.message) { msg = xhr.responseJSON.message; } } toastr.error(msg); $submitBtn.prop('disabled', false); } }); }); } submitHoldingForm('#holding_entity_form', '.holding_entity_modal'); submitHoldingForm('#holding_unit_form', '.holding_unit_modal'); submitHoldingForm('#holding_relation_form', '.holding_relation_modal'); submitHoldingForm('#holding_assignment_form', '.holding_assignment_modal'); function syncHrm() { if (!HOLDING_LANG.sync_hrm_url) return; $.ajax({ method: 'POST', url: HOLDING_LANG.sync_hrm_url, dataType: 'json', headers: { 'X-Requested-With': 'XMLHttpRequest', 'Accept': 'application/json', 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, success: function(result) { if (result.success) { toastr.success(result.msg); window.location.hash = '#assignments_tab'; window.location.reload(); } else { toastr.error(result.msg); } } }); } $('#holding_sync_hrm_form').on('submit', function(e) { e.preventDefault(); syncHrm(); }); $('#holding_sync_hrm_btn').on('click', function() { syncHrm(); }); $(document).on('click', '.holding-delete', function() { var url = $(this).data('href'); var tab = $(this).data('tab') || ''; swal({ title: LANG.sure, text: typeof HOLDING_LANG !== 'undefined' ? HOLDING_LANG.confirm_delete : LANG.sure, icon: 'warning', buttons: true, dangerMode: true }).then(function(willDelete) { if (!willDelete) return; $.ajax({ method: 'DELETE', url: url, dataType: 'json', headers: { 'X-Requested-With': 'XMLHttpRequest', 'Accept': 'application/json' }, success: function(result) { if (result.success) { toastr.success(result.msg); window.location.hash = tab ? '#' + tab : ''; window.location.reload(); } else { toastr.error(result.msg); } } }); }); }); });