Files
BusinessMgr-2019/SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-main.js
T

592 lines
19 KiB
JavaScript

/*
* Main scripts.
*/
(function (win, doc, undef)
{
"use strict";
win.sbm = win.sbm || {};
//--------------------------------------------------------------
// Utilities.
sbm.isDef = function (obj)
{
return obj === null || typeof obj == "undefined" ? false : true;
}
sbm.isFn = function (fn)
{
return fn != null && typeof fn == typeof Function;
}
sbm.isNumeric = function (n)
{
return !isNaN(parseFloat(n)) && isFinite(n);
}
sbm.getTime = function ()
{
return (new Date()).getTime();
}
sbm.zeroPad = function (num, count)
{
var val = num + '';
while (val.length < count) val = "0" + val;
return val;
}
sbm.toInt = function (value, defaultValue)
{
return sbm.isNumeric(value) ? parseInt(value, 10) : defaultValue || 0;
}
if ("function" != typeof "".format)
String.prototype.format = (function ()
{
var rx1 = /\{(\d|\d\d)\}/g, rx2 = /\d+/;
return function ()
{
var args = arguments;
return this.replace(rx1, function ($0)
{
var idx = 1 * $0.match(rx2)[0];
return args[idx] !== undefined ? args[idx] : (args[idx] === "" ? "" : $0);
});
}
}());
sbm.getFileType = function (file)
{
if (!file) return "";
if (file.type) return file.type;
if (file.filename) return filename.split('.').pop();
return "";
}
sbm.formatFileSize = function (size, decimals = 0)
{
if (size / 10 ** 9 > 1) return (size / 10.0 ** 9).toFixed(decimals) + ' Gb';
if (size / 10 ** 6 > 1) return (size / 10.0 ** 6).toFixed(decimals) + ' Mb';
if (size / 10 ** 3 > 1) return (size / 10.0 ** 3).toFixed(decimals) + ' Kb';
return size + ' bytes';
}
sbm.escapeRegExp = function (val)
{
return (val || '').replace(/[[{}()*+?^$|\]\.\\]/g, "\\$&");
}
sbm.haltEvent = function (evt)
{
evt.preventDefault();
evt.stopPropagation();
}
sbm.debug = sbm.debugMode ? win.console.log.bind(win.console) : function () { };
//--------------------------------------------------------------
sbm.compareCI = function (a, b)
{
var comparison = a.toLowerCase().localeCompare(b.toLowerCase());
if (comparison === 0)
return a.localeCompare(b);
return comparison;
}
sbm.arraySortCI = function ()
{
if (!this) return this;
this.sort(function (a, b) { return sbm.compareCI(a, b); });
return this;
};
//--------------------------------------------------------------
sbm.setOddDataRowClass = function (rowSel, cName)
{
$(rowSel).addClass(function (index, currentClasses)
{
return index % 2 == 1 ? (cName || "other") : "";
});
}
sbm.selectOrAdd = function ($sel, code, desc)
{
$sel = $($sel);
if ($sel.val(code).val() == code) return;
$sel.append($('<option>').prop('value', code).text(desc));
$sel.val(code);
}
sbm.populateSelect = function ($sel, values, code, desc)
{
code = code || 'code';
desc = desc || 'desc';
$sel = $($sel).empty();
for (const value of values || [])
$sel.append($('<option>').prop('value', value[code]).text(value[desc]));
}
sbm.populateSelectCodeDesc = function ($sel, values)
{
sbm.populateSelect($($sel), values);
}
sbm.checkTextAreaMaxLength = function (ctrl, len)
{
if (ctrl == null || ctrl.value == null) return;
if (ctrl.value.length > len) ctrl.value = ctrl.value.substring(0, len);
}
sbm.setAvailableCharsInfo = function ($if, max, $info)
{
let info = '';
if (max > 0)
{
let avail = Math.max(0, max - $if.val().length);
info = (avail == 1 ? sbm.lbl.charAvailable : sbm.lbl.charsAvailable.replace(/\{0\}/g, avail));
}
($info || $('.sbm-info', $if.closest('.sbm-form-control'))).text(info);
}
sbm.setItemsSelectedInfo = function ($sel, $info)
{
var sel = $(':selected', $sel).length;
($info || $('.sbm-info', $sel.closest('.sbm-form-control'))).text(sel == 0 ? sbm.lbl.noneSelected : sbm.lbl.numberSelected.replace(/\{0\}/g, sel));
}
sbm.initCalendars = function (sel, opt)
{
return $(sel).datepicker(opt || {});
}
sbm.allowClearCalendar = function (sel)
{
$(sel).datepicker().on('keyup', function (e)
{
if (e.key == 'Backspace' || e.key == 'Delete')
$(this).datepicker('setDate', null).datepicker('hide').trigger('change');
});
}
sbm.refreshPaging = function (response, context, refreshFn)
{
if (sbm.isFn(sbm.resultsPaging.fn.refreshPaging))
sbm.resultsPaging.fn.refreshPaging(response.paging, context, refreshFn);
}
//--------------------------------------------------------------
sbm.configureItemTable = function (cfg, $sel)
{
//sbm.debug('configureItemTable', cfg, $sel);
let col = cfg.column || {};
let $cell = $('th,td', $sel).removeClass('hidden');
(col.hide || []).forEach(function (v, i, a) { $cell.filter('.' + col.prefix + v).addClass('hidden'); });
}
sbm.populateItemValues = function (cfg, $item, val)
{
//sbm.debug('populateItemValues', cfg, $item, val);
for (var name in val || []) { $item.find('.' + cfg.column.prefix + name).text(val[name]); };
}
sbm.clearItemForm = function ($frm)
{
sbm.clearControlErrors($frm);
$('.sbm-input,.sbm-textarea,.sbm-select', $frm).val('').prop('readonly', false).prop('disabled', false);
$('.sbm-checkbox', $frm).prop('readonly', false).prop('disabled', false).removeAttr('checked');
}
sbm.configureItemControls = function (cfg, $frm)
{
//sbm.debug('configureItemControls', cfg);
let fld = cfg.field || {};
let $ctrl = $('.sbm-form-control', $frm).show();
for (var name in fld.label || {}) { /* ... */ };
(fld.hide || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).hide().find('.sbm-input,.sbm-textarea,.sbm-select,.sbm-checkbox').prop('disabled', true); });
(fld.readonly || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).find('.sbm-input,.sbm.textarea,.sbm-select,.sbm-checkbox').prop('readonly', true).prop('disabled', true); });
}
sbm.populateFormValues = function (cfg, $frm, val)
{
//sbm.debug('populateFormValues', cfg, $frm, val);
let $ctrl = $('.sbm-form-control', $frm);
for (var name in val || {}) { $ctrl.filter('.' + cfg.field.prefix + name).find('.sbm-input,.sbm-textarea,.sbm-select').filter('.sbm-auto-val').val(val[name]).end().find('.sbm-checkbox').prop('checked', !!val[name]); };
}
//--------------------------------------------------------------
// Page navigation.
sbm.navigateTo = function (action)
{
sbm.doPleaseWait();
$('#frmNavigate').prop('action', sbm.url.base + action).trigger('submit');
}
sbm.goToPage = function (action)
{
sbm.doPleaseWait();
location = sbm.url.base + action;
}
// Security.
sbm.redirectHome = function ()
{
sbm.goToPage('');
}
sbm.redirectHomeExp = function ()
{
sbm.doPleaseWait();
document.location = sbm.url.sesionExpired;
}
sbm.onSignOut = function ()
{
sbm.doConfirm(sbm.dlg.title.signOut, sbm.msg.signOutConfirm, sbm.doSignOut);
}
sbm.doSignOut = function ()
{
sbm.doAjaxRequest({ url: sbm.url.base + 'Security/Ajax/SignOut', formId: 'frmNavigate' }, 50);
}
//--------------------------------------------------------------
// Dialogs.
sbm.openDialog = function ($dlg, width, height)
{
let $win = $(win);
$dlg.dialog(
{
minWidth: null, maxWidth: null, width: Math.min(width || 400, $win.width() * .90),
minHeight: null, maxHeight: null, height: Math.min(height || 320, $win.innerHeight() * .96)
}).dialog('open');
return $dlg;
}
sbm.dlgOpts = function ()
{
return { autoOpen: false, modal: true, show: 'clip', hide: 'clip', minWidth: 320, maxWidth: 480, width: 'auto', resizable: false, draggable: false, closeOnEscape: false, dialogClass: "no-close", buttons: {} };
}
sbm.dlgOptsClose = function ()
{
var opts = sbm.dlgOpts();
opts.buttons[sbm.lbl.close] = function () { $(this).dialog('close'); };
return opts;
}
sbm.doAlert = function (title, msg, onOk)
{
if (!msg)
{
msg = title;
title = null;
}
if (!sbm.isDef(sbm.$dlg.alert))
{
var opt = sbm.dlgOpts();
sbm.$dlg.alert = $('<div id="dlgAlert"><div id="dlgAlertMsg"></div></div>').dialog(opt);
}
$('#dlgAlertMsg', sbm.$dlg.alert).html(msg.replace(/\n/g, '<br>'));
let btns = {};
btns[sbm.lbl.ok] = function () { $(this).dialog('close'); if (onOk) onOk(); };
sbm.$dlg.alert.dialog('option', { title: title || sbm.dlg.title.alert, buttons: btns });
sbm.openDialog(sbm.$dlg.alert);
}
sbm.doConfirm = function (title, msg, onOk, onCancel)
{
if (!msg)
{
msg = title;
title = null;
}
if (!sbm.isDef(sbm.$dlg.confirm))
{
var opt = sbm.dlgOpts();
opt.dialogClass += " sbm-dark-blue";
sbm.$dlg.confirm = $('<div id="dlgConfirm"><div class="spacer2"></div><div id="dlgConfirmMsg"></div></div>').dialog(opt);
}
let btns = {};
btns[sbm.lbl.yes] = function () { $(this).dialog('close'); if (onOk) onOk(); };
btns[sbm.lbl.no] = function () { $(this).dialog('close'); if (onCancel) onCancel(); };
sbm.$dlg.confirm.dialog('option', { title: title || sbm.dlg.title.confirm, buttons: btns });
$('#dlgConfirmMsg').html(msg.replace(/\n/g, '<br>'));
sbm.openDialog(sbm.$dlg.confirm);
}
sbm.confirmItemRemove = function (fn)
{
sbm.doConfirm('', sbm.msg.itemRemoveConfirm, fn);
}
sbm.doProgress = function (title, msg, delay)
{
if (!msg)
{
msg = title;
title = null;
}
clearTimeout(sbm.toShowProgress);
if (!sbm.isDef(sbm.$dlg.progress))
{
var opt = sbm.dlgOpts();
opt.show = { effect: 'fade', duration: 200 };
opt.hide = { effect: 'fade', duration: 200 };
sbm.$dlg.progress = $('<div id="dlgProgress"><div id="dlgProgressMsg"></div></div>').dialog(opt);
}
$('#dlgProgressMsg').html(msg.replace(/\n/g, '<br>'));
sbm.$dlg.progress.dialog('option', { title: title || sbm.dlg.title.progress });
if (delay > 0) sbm.toShowProgress = setTimeout(function () { sbm.$dlg.progress.dialog('open'); }, delay);
else sbm.$dlg.progress.dialog('open');
}
sbm.hideProgress = function ()
{
clearTimeout(sbm.toShowProgress);
sbm.$dlg.progress.dialog('close');
}
//--------------------------------------------------------------
// Notifications.
sbm.showNotification = function (title, msg)
{
win.clearTimeout(sbm.toNotification);
var $win = $(win);
var $not = $('#sbm-notification').hide();
if (!$not.length)
{
$not = $('<div id="sbm-notification"><div class="content"><div class="heading"><div class="close" onclick="sbm.hideNotification()">&#10006;</div><div class="title"></div></div><div class="message"></div></div></div>');
$('body').append($not);
}
var $hdr = $('.heading', $not).css({ 'background-color': 'rgba(247,217,0,0.7)' });
$('.title', $not).html(title);
$('.message', $not).html(msg);
var $bdy = $('#sbm-page-body');
//sbm.debug(sbm.topMargin($bdy));
var fbr = $bdy[0].getBoundingClientRect();
var fn = function () { $hdr.delay(2000).animate({ backgroundColor: '#f0f0f0' }, 1000); };
$not.css({ 'top': Math.max(0, fbr.top /*- sbm.topMargin($bdy)*/), 'right': $win.width() - fbr.right }).slideDown(500, fn);
sbm.toNotification = setTimeout(sbm.hideNotification, 6000);
}
sbm.hideNotification = function ()
{
win.clearTimeout(sbm.toNotification);
$('#sbm-notification').slideUp(500);
}
sbm.doPleaseWait = function ()
{
sbm.$pleaseWait = sbm.$pleaseWait || $('#sbm-please-wait');
sbm.$pleaseWait.stop(true, false).animate({ "null": 1 }, 200).fadeTo(200, 1);
}
sbm.hidePleaseWait = function ()
{
if (sbm.$pleaseWait) sbm.$pleaseWait.stop(true, false).fadeOut(200);
}
//--------------------------------------------------------------
// Ajax.
sbm.doAjaxRequest = function (ajax, delay)
{
win.clearTimeout(ajax.timeout);
if (!ajax.noWaitIcon) sbm.doPleaseWait();
ajax.timeout = setTimeout(function () { sbm.execAjaxRequest(ajax); }, Math.max(50, parseInt(delay || 0, 10)));
}
sbm.execAjaxRequest = function (ajax)
{
win.clearTimeout(ajax.timeout);
if (ajax.request) ajax.request.abort();
var cfgAjax =
{
url: ajax.url,
type: 'POST',
cache: false,
//enctype: 'multipart/form-data',
data: ajax.formData || $(ajax.formSel || "#" + ajax.formId).serialize(),
dataType: 'json',
success: function (response, status, jqXHR)
{
if (!ajax.noWaitIcon) sbm.hidePleaseWait();
ajax.status = status;
if (response.notification)
sbm.showNotification(response.notification.title, response.notification.message);
if (response.message)
{
var fnCloseAlert = function ()
{
if (response.sessionExpired) return sbm.redirectHomeExp();
if (response.goHome) return sbm.redirectHome();
if (ajax.callbackFn) ajax.callbackFn(response);
}
sbm.doAlert(response.message.title, response.message.text, function () { fnCloseAlert(); });
}
else if (response.sessionExpired)
return sbm.redirectHomeExp();
else if (response.goHome)
return sbm.redirectHome();
else if (response.error && ajax.errFn) ajax.errFn(response);
else if (ajax.callbackFn) ajax.callbackFn(response);
},
error: function (jqXHR, status, errorThrown)
{
if (!ajax.noWaitIcon) sbm.hidePleaseWait();
ajax.status = status;
if (status == "abort") return;
sbm.doAlert(sbm.dlg.title.alert, sbm.msg.somethingGoneWrong, sbm.redirectHome);
},
complete: function (jqXHR, textStatus)
{
if (!ajax.noWaitIcon) sbm.hidePleaseWait();
ajax.formData = null;
ajax.complete = true;
}
}
if (ajax.formData)
{
//for (var pair of ajax.formData.entries()) sbm.debug(pair[0] + ': ' + pair[1]);
cfgAjax.processData = false;
cfgAjax.contentType = false;
}
ajax.request = $.ajax(cfgAjax);
}
//--------------------------------------------------------------
// Session.
sbm.configureKeepLoggedIn = function ()
{
//sbm.debug('KeepLoggedIn Configuring');
setTimeout(sbm.doKeepLoggedIn, Math.max(30000, sbm.keepLoggedInDelay || 300000));
}
sbm.doKeepLoggedIn = function ()
{
//sbm.debug('KeepLoggedIn Calling');
var onKeepLoggedIn = function (response)
{
//sbm.debug('KeepLoggedIn Responded', response);
sbm.configureKeepLoggedIn();
}
sbm.doAjaxRequest({ url: sbm.url.base + 'Security/Ajax/KeepLoggedIn', formId: 'frmNavigate', noWaitIcon: true, callbackFn: onKeepLoggedIn }, 1000)
}
sbm.configureSessionRefresh = function ()
{
//sbm.debug('SessionRefresh Configuring');
$(document).on('mousedown mousemove touchstart scroll keydown', sbm.triggeRefreshSession);
}
sbm.triggeRefreshSession = function ()
{
let ssr = sbm.session.refresh = sbm.session.refresh || {};
win.clearTimeout(ssr.timeout);
ssr.timeout = setTimeout(function () { sbm.refreshSession(); }, 150000);
}
sbm.refreshSession = function ()
{
//sbm.debug('sbm.refreshSession');
sbm.doKeepLoggedIn();
}
//--------------------------------------------------------------
// Data entry.
sbm.clearControlErrors = function (context)
{
var $ctrls = $('.sbm-form-control', $(context || doc.body)).removeClass('sbm-error');
$('.sbm-message', $ctrls).empty();
}
sbm.clearControlError = function (sel)
{
var $ctrl = $(sel).closest('.sbm-form-control').removeClass('sbm-error');
$('.sbm-message', $ctrl).empty();
}
sbm.setControlError = function (sel, error)
{
var $ctrl = $(sel).closest('.sbm-form-control').toggleClass('sbm-error', !!error.length);
$('.sbm-message', $ctrl).text(error);
}
sbm.refreshControlValues = function (controlValues, context)
{
var $frmCtrls = $('.sbm-form-control', $(context || doc.body)).removeClass('sbm-error');
sbm.clearControlErrors(context);
var values = (controlValues || []);
var valuesLen = values.length;
for (var valIdx = 0; valIdx < valuesLen; valIdx++)
{
let ctrlValue = values[valIdx];
$frmCtrls.each(function (idx, frmCtrl)
{
var $frmCtrl = $(frmCtrl);
if (!$frmCtrl.hasClass(ctrlValue.controlName)) return;
var $ctrl = $('input,textarea,select', $frmCtrl);
if ($ctrl.length && $ctrl.prop('name') == ctrlValue.controlName && ctrlValue.value)
$ctrl.val(ctrlValue.value);
if (ctrlValue.error)
$frmCtrl.addClass('sbm-error').find('.sbm-message').text(ctrlValue.error);
});
}
}
//--------------------------------------------------------------
// Elements.
sbm.objBtm = function (sel)
{
var $obj = $(sel);
return Math.floor($obj.offset().top + $obj.outerHeight(true));
}
sbm.innerBtm = function (sel)
{
var $obj = $(sel);
return Math.floor($obj.offset().top + $obj.outerHeight() - sbm.bottomSurround($obj));
}
sbm.innerTop = function (sel)
{
var $obj = $(sel);
return Math.floor($obj.offset().top + sbm.topSurround($obj));
}
sbm.topMargin = function (sel)
{
var $obj = $(sel);
return parseInt($obj.css('margin-top'), 10);
}
sbm.topSurround = function (sel)
{
var $obj = $(sel);
return parseInt($obj.css('margin-top'), 10) + parseInt($obj.css('border-top-width'), 10) + parseInt($obj.css('padding-top'), 10);
}
sbm.bottomSurround = function (sel)
{
var $obj = $(sel);
return parseInt($obj.css('margin-bottom'), 10) + parseInt($obj.css('border-bottom-width'), 10) + parseInt($obj.css('padding-bottom'), 10);
}
sbm.marginHeight = function (sel)
{
var $obj = $(sel);
return parseInt($obj.css('margin-top'), 10) + parseInt($obj.css('margin-bottom'), 10);
}
sbm.borderHeight = function (sel)
{
var $obj = $(sel);
return parseInt($obj.css('border-top-width'), 10) + parseInt($obj.css('border-bottom-width'), 10);
}
//--------------------------------------------------------------
// Viewport - Desktop or Mobile.
sbm.isMob = function () { return $('body.mob').length > 0; };
sbm.onChangeViewport = function (viewport)
{
var $body = $('body');
$body.removeClass('mob dsk');
if (viewport.is('xs')) $body.addClass('mob');
else if (viewport.current() != 'unrecognized') $body.addClass('dsk');
}
sbm.isAutoHeight = function () { return ($(win).width() < 360 || $(win).height() < 560 || sbm.isMob()); }
sbm.onWinResizePage = function () { };
sbm.onWinResize = function ()
{
$('body').toggleClass('sbm-layout-flex', !sbm.isAutoHeight()).toggleClass('sbm-layout-flow', sbm.isAutoHeight());
sbm.onWinResizePage();
}
setTimeout(sbm.onWinResize, 50);
//--------------------------------------------------------------
$(function ()
{
$(win).on('resize', function () { sbm.onWinResize(); });
$('.sbm-button-cta,.sbm-button-action,.sbm-action-link,.sbm-social-icon.sbm-action').prop('tabindex', 0);
$.fn.visible = function () { return this.css('visibility', 'visible'); };
$.fn.invisible = function () { return this.css('visibility', 'hidden'); };
$.fn.toggleVisibility = function ()
{
return this.css('visibility', function (i, visibility) { return (visibility == 'visible') ? 'hidden' : 'visible'; });
};
$.fn.removeStatusClasses = function ()
{
return this.removeClass(function (idx, name) { return (name.match(/(^|\s)sbm-status-\S+/g) || []).join(' '); });
};
if (sbm.keepLoggedIn)
sbm.configureKeepLoggedIn();
else if (!sbm.awaitingLogin)
sbm.configureSessionRefresh();
$.datepicker.setDefaults({
showOn: 'both',
buttonImageOnly: true,
buttonImage: '../img/action/calendar32.png',
buttonText: sbm.lbl.calendar,
dateFormat: sbm.form.calendarDateFormat,
changeMonth: true,
changeYear: false,
yearRange: '-14:+01',
firstDay: 1,
//defaultDate: 0,
});
});
}(window, window.document));
/* The End */