ultimatepos/public/js/holding.js

324 lines
12 KiB
JavaScript
Vendored

$(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('<br>');
} 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);
}
}
});
});
});
});