function nuInitJSOptions() {
if (window.nuAdminButtons === undefined) {
window.nuAdminButtons =
{
'nuDebug': true,
'nuPHP': true,
'nuRefresh': true,
'nuObjects': true,
'nuProperties': true
};
}
if (window.nuUXOptions === undefined) {
window.nuUXOptions =
{
'nuEnableBrowserBackButton': true, // Enable the browser's Back button
'nuPreventButtonDblClick': true, // Disable a button for 1 5 s to prevent a double click
'nuShowPropertiesOnMiddleClick': true, // Show the Object Properties on middle mouse click
'nuAutosizeBrowseColumns': true, // Autosize columns to fit the document width
'nuShowBackButton': false, // Show a Back Button
'nuMobileView': false, // Optimise view for mobile devices
'nuBrowsePaginationInfo': 'default', // Default Format is: '{StartRow} - {EndRow} ' + nuTranslate('of') + ' ' + '{TotalRows}'
'nuShowNuBuilderLink': true, // Show the link to nubuilder com
'nuShowLoggedInUser': false, // Show the logged in User
'nuShowBrowserTabTitle': true, // Show the Form Title in the Browser Tab
'nuDebugMode': true, // Debug Mode
'nuBrowserTabTitlePrefix': 'nuBuilder', // Prefix in the Browser Tab
'nuCalendarStartOfWeek': 'Sunday', // nuCalendar: Start of Week: Sunday (default) or Monday
'nuSelect2Theme': 'default', // select2 theme (default, classic) Default: default
'nuEditCloseAfterSave': 'None', // Close forms after saving. Values: None, All, User, System
'nuShowJSErrors' : 'None' // Show JS errors in alert message
};
}
}
nuInitJSOptions();
function nuBuildForm(formObj) {
window.nuOnSetSelect2Options = null; // can be overwritten by nuAddJavaScript()
window.nuSERVERRESPONSE = formObj;
if (formObj.record_id != '-2') {
nuAddJavaScript(formObj.javascript_bc);
}
$('#nubody').off('.nuresizecolumn').css('transform', 'scale(1)');
$('html,body').scrollTop(0).scrollLeft(0);
if (nuNeedToLoginAgain(formObj)) return;
const formType = nuFormType();
nuSetDefaultWindowProperties(formObj, formType);
nuInitShowJSErrors();
nuFORM.edited = false;
if (nuEditDoCloseAfterSave(formObj)) {
return;
}
nuFORM.scroll = [];
nuSetSuffix(1000);
nuSetBody(formObj);
nuRedefineNuSelectBrowse();
nuFORM.tableSchema = formObj.tableSchema;
nuFORM.formSchema = formObj.formSchema;
window.nuLANGUAGE = formObj.translation;
nuSetProperty('refreshed', nuGetProperty('refreshed') + 1);
nuAddedByLookup(formObj);
var currentForm = nuSetFormProperties(formObj);
nuAddHolder('nuBreadcrumbHolder');
nuAddHomeLogout();
nuAddHolder('nuActionHolder');
if (formType == 'edit') {
nuAddHolder('nuTabHolder');
}
// const nuRecordDiv =
nuAddHolder('nuRECORD')
.attr('data-nu-table', formObj.table)
.attr('data-nu-primary-key-name', formObj.primary_key);
// DEV: nuWrapWithForm(nuRecordDiv[0], '#', '');
nuAddBreadcrumbs();
nuAddEditTabs('', formObj);
if (typeof window.nuBeforeAddActionButtons === 'function') {
nuBeforeAddActionButtons();
}
nuAddActionButtons(formObj);
nuRecordProperties(formObj, '');
let obj0 = null;
if (formType == 'edit') {
nuOptions(formObj.form_id, '', 'form', formObj.global_access);
nuBuildEditObjects(formObj, '', '', formObj);
nuResizeFormDialogCoordinates();
nuCalculateForm(false);
obj0 = nuGetFirstObject(formObj.objects, -1);
}
nuGetStartingTab();
if (formType == 'edit' && nuIsNewRecord() && (obj0 !== null)) {
obj0.nuFocusWithoutScrolling();
}
if (formObj.record_id == '-2') { // Arrange Objects
nuCreateDragOptionsBox(formObj);
} else {
nuAddJavaScript(formObj.javascript);
}
nuDragTitleEvents();
nuAddHome();
nuShowLastUpdatedMessage();
if (window.nuOnEditorLoad) {
nuOnEditorLoad();
} else {
$('.nuEditor').each((index, element) => {
nuInitTinyMCE(element.id);
});
}
nuEvaluateOnLoadEvents();
if (window.nuLoadEditGlobal && formType == 'edit') {
nuLoadEditGlobal(formObj.form_id, formObj.form_code);
}
if (window.nuLoadBrowseGlobal && formType == 'browse') {
nuLoadBrowseGlobal(formObj.form_id, formObj.form_code);
}
if (window.nuOnLoad) {
nuOnLoad(formObj.form_id, formObj.form_code);
}
if (formType == 'edit') {
window.nuRESPONSIVE.getStartPositions();
} else {
if (currentForm.browse_autoresize_columns !== '0' || nuDocumentID !== parent.nuDocumentID) {
if (nuUXOptions.nuAutosizeBrowseColumns || currentForm.browse_autoresize_columns === '1' || nuDocumentID !== parent.nuDocumentID) {
nuResizeBrowseColumns(true);
}
}
}
if (nuUXOptions.nuShowBrowserTabTitle) {
nuSetBrowserTabTitle(nuUXOptions.nuBrowserTabTitlePrefix);
} else {
document.title = nuUXOptions.nuBrowserTabTitlePrefix;
}
if (Object.keys(window.nuAdminButtons).length) {
nuAddAdminButtons();
}
if (nuUXOptions.nuEnableBrowserBackButton) {
nuEnableBrowserBackButton();
}
if (nuUXOptions.nuPreventButtonDblClick) {
nuPreventButtonDblClick();
}
if (nuUXOptions.nuShowBackButton) {
nuAddBackButton();
}
if (nuUXOptions.nuShowPropertiesOnMiddleClick) {
document.addEventListener("mousedown", nuOpenPropertiesOnMiddleClick, { passive: true });
}
if ((nuUXOptions.nuBrowsePaginationInfo) !== '') {
nuShowBrowsePaginationInfo((nuUXOptions.nuBrowsePaginationInfo));
}
if (nuUXOptions.nuShowLoggedInUser) {
nuDisplayLoggedInUser();
} else
if (!nuUXOptions.nuShowNuBuilderLink) {
$('.nuBuilderLink').remove();
}
nuInitSetBrowseWidthHelper();
if (window.nuMESSAGES.length > 0) {
let msgDiv = nuMessage(window.nuMESSAGES);
if (window.nuOnMessage) {
nuOnMessage(msgDiv, window.nuMESSAGES);
}
window.nuMESSAGES = [];
}
nuProcessAfterSave();
nuAddFormStyle(formObj.style);
const globalAccess = nuGlobalAccess();
if (globalAccess) {
nuContextMenuUpdate();
}
nuSetSaved(true);
nuCursor('default');
window.nuPORTRAITSCREEN = false;
if (!nuIsMobile()) {
$('#nuSearchField').trigger("focus");
} else {
nuMobileView(currentForm.mobile_view);
}
nuWindowPosition();
nuFormModification();
nuRestoreScrollPositions();
if ((nuSERVERRESPONSE.user_a11y || globalAccess) && window.nuSetAccessibility) {
nuSetAccessibility(formType, globalAccess);
}
}
function nuProcessAfterSave() {
if (window.nuTimesSaved > 0) {
if (window.nuAfterSaveGlobal) nuAfterSaveGlobal();
if (window.nuAfterSave) nuAfterSave();
}
}
function nuSetFormProperties(formObj) {
const properties = ['form_id',
'record_id', 'session_id',
'user_id',
'redirect_form_id',
'redirect_other_form_id', 'title',
'row_height', 'rows',
'browse_columns', 'browse_sql',
'browse_rows', 'browse_table_id',
'browse_filtered_rows',
'browse_title_multiline',
'browse_autoresize_columns',
'mobile_view', 'pages',
'form_code', 'form_description',
'form_group', 'form_type',
'run_code', 'run_description',
'data_mode'
];
var currentForm = window.nuFORM.getCurrent();
properties.forEach(prop => {
currentForm[prop] = formObj[prop];
});
return currentForm;
}
function nuEditDoCloseAfterSave(formObj) {
if (nuHasBeenSaved() < 1 || nuGetProperty('nuEditCloseAfterSave') == '0') {
return false;
}
const closeAfterSave = window.nuUXOptions.nuEditCloseAfterSave.toLowerCase()
const isUserForm = !formObj.form_id.startsWith('nu');
const shouldCloseAllForms = closeAfterSave === 'allforms';
const shouldCloseUserForms = closeAfterSave === 'userforms' && isUserForm;
const shouldCloseSystemForms = closeAfterSave === 'systemforms' && !isUserForm;
if (shouldCloseAllForms || shouldCloseUserForms || shouldCloseSystemForms) {
return nuCloseAfterSave();
}
return false;
}
function nuInitShowJSErrors() {
if (window.nuUXOptions.nuShowJSErrors) {
const nuShowJSErrors = window.nuUXOptions.nuShowJSErrors;
let enableShowJSErrors = false;
switch (nuShowJSErrors.toLowerCase()) {
case "globeadmin":
enableShowJSErrors = nuGlobalAccess()
break;
case "everyone":
enableShowJSErrors = true;
break;
}
if (enableShowJSErrors) {
nuConsoleErrorsToMessage();
}
}
}
function nuAddHome() {
if (window.nuLoginH != '') {
let breadCrumb = $('#nuBreadcrumb0').length > 0 ? $('#nuBreadcrumb0') : $('#nuHomeGap');
breadCrumb
.html('')
.attr('title', nuTranslate('Home'))
.attr('onclick', '')
.attr('onclick', 'nuForm("' + window.nuLoginH + '", -1, "", "", 1);')
.css('cursor', 'pointer');
window.nuLoginH = '';
}
}
function nuNeedToLoginAgain(f) {
let result = f.tableSchema === null;
if (result) {
$('body').addClass('nuBrowseBody').removeClass('nuEditBody');
sessionStorage.logout = 'true';
window.top.location.reload();
nuCursor('default');
}
return result;
}
function nuSetDefaultWindowProperties(f, formType) {
if (formType == 'edit' && nuCurrentProperties().form_type !== 'launch') {
window.nuTimesSaved ++;
if (window.nuLastForm != f.form_id || (window.nuLastRecordId != f.record_id && window.nuLastRecordId !== "-1")) {
window.nuTimesSaved = 0;
}
} else {
window.nuTimesSaved = -1;
}
window.nuLastForm = f.form_id;
window.nuLastRecordId = f.record_id;
window.nuSubformRow = -1;
window.nuBrowseNoData = false;
window.nuBrowseNoSearchResults = false;
window.nuBeforeSave = null;
window.nuAfterSave = null;
window.nuBeforeDelete = null;
window.nuAfterDelete = null;
window.nuOnSearchAction = null;
window.nuOnClone = null;
window.nuOnEditorLoad = null;
window.nuOnBeforeGetBreadcrumb = null;
window.nuOnSetSaved = null;
window.nuOnTabSelected = null;
window.nuOnSelectTab = null;
window.nuOnAddAction = false;
window.onSubformTitleClick = null;
window.nuOnMessage = null;
window.nuFormatValueCleared = null;
window.nuDisplayObjectRefreshed = null;
window.nuOnSetCalendarOptions = null;
window.nuOnLookupPopulated = null;
window.nuCalculated = null;
window.nuOnPropertySet = null;
window.nuEnableCalculation = null;
window.nuPortraitScreenShowTabTitles = true;
window.nuBrowseFunction = window.nuDefaultBrowseFunction;
window.nuCLONE = false;
window.nuSERVERRESPONSELU = [];
window.nuSESSION = f.session_id;
window.nuSUBFORMROW = [];
window.nuHASH = []; //-- remove any hash variables previously set.
window.nuTABHELP = [];
window.nuFORMHELP = [];
window.nuLOOKUPSTATE = [];
window.nuBROWSEROW = -1;
window.nuBROWSECLICKED = false;
window.nuUniqueID = 'c' + String(Date.now());
window.global_access = f.global_access == '1';
window.nuVerticalTabs = false;
}
function nuFormModification() {
if (nuFormType() == 'browse') {
if (!nuIsIframe()) {
$record = $('#nuRECORD');
$record.css({
'width': '99.7vw',
'height': '80vh',
'overflow-x': 'auto',
'overflow-y': 'auto'
});
$('#nuActionHolder').css({
'width': '100vw'
});
$('.nuBrowseTitle, .nuBrowseTitleMultiline').wrapAll('
(.*?)<\/n>/g.exec(t);
t = r === null ? t : r[1];
let $div = $(div);
nuSetObjectBounds(div, obj.top, obj.left, obj.width, obj.height)
.css('text-align', obj.align)
.addClass('nuWord')
.html(nuTranslate(t));
if (nuGlobalAccess()) {
$div.attr('ondblclick', 'nuOptionsListAction("nuobject", "' + obj.object_id + '")');
}
if (r !== null) {
$div.css('font-weight', 'normal');
}
nuAddInputIcon(id, obj.input_icon);
nuSetAccess(id, obj.read);
nuAddStyle(id, obj);
return Number(obj.width);
}
function nuRUNGetOnClickEvent(obj) {
let result = '';
const runTarget = obj.run_target || '0';
const stopClick = runTarget == '0' ? 'nuStopClick(event);' : '';
const jsPopup = `nuPopup('${obj.form_id}','${obj.record_id}','${obj.filter}')`;
const jsForm = `nuForm('${obj.form_id}','${obj.record_id}','${obj.filter}', '','${runTarget}')`;
const runAction = runTarget == '3' ? jsPopup : jsForm;
const runType = obj.run_type;
if (runType == 'F') {
result = stopClick + runAction;
} else
if (runType == 'R') {
result = "nuRunReport('" + obj.record_id + "')";
} else
if (runType == 'P') {
result = obj.run_hidden
? `nuRunPHPHidden('${obj.record_id}')`
: `nuRunPHP('${obj.record_id}')`;
}
return result;
}
function nuRUN(w, i, l, p, prop) {
let obj = prop.objects[i];
let id = p + obj.id;
let tagName = 'button';
if (obj.parent_type == 'g') {
obj.left = l;
obj.top = 3;
}
if (obj.run_method != 'b') {
tagName = 'iframe';
if (obj.parent_type !== 'g') {
nuLabel(w, i, p, prop);
}
}
const div = nuCreateElementWithId(tagName, id, p + 'nuRECORD');
const $div = $(div);
nuAddDataTab(id, obj.tab, p);
nuSetObjectBounds(div, obj.top, obj.left, obj.width, obj.height).css('text-align', obj.align)
.attr('data-nu-object-id', w.objects[i].object_id)
.attr('data-nu-prefix', p);
if (obj.run_method == 'b') {
$div.attr({
'type': 'button',
'value': nuTranslate(obj.label),
'onclick': nuRUNGetOnClickEvent(obj)
})
.html(nuTranslate(obj.label))
.addClass('nuButton');
$('#' + id).attr("data-nu-org-label", obj.label);
nuAddInputIcon(id, obj.input_icon);
} else {
window.nuOPENER.push(new nuOpener(obj.run_type, obj.form_id, obj.record_id, obj.filter, obj.parameters));
const open = window.nuOPENER[window.nuOPENER.length - 1];
const url = window.location.pathname + '?i=2&opener=' + open.id;
$div.attr('src', url).removeClass('').addClass('nuIframe');
}
nuAddJSObjectEvents(id, obj.js);
nuSetAccess(id, obj.read);
nuAddStyle(id, obj);
return Number(obj.width);
}
function nuSELECT(w, i, l, p, prop) {
let obj = prop.objects[i];
const id = p + obj.id;
obj = nuLabelOrPosition(obj, w, i, l, p, prop);
const sel = nuCreateElementWithId('select', id, p + 'nuRECORD');
let $sel = $(sel);
if (w.objects[i].value != '' && nuRecordId() == '-1') {
$sel.addClass('nuEdited');
}
nuAddDataTab(id, obj.tab, p);
if (obj.multiple == 1) {
$sel.attr('multiple', 'multiple');
}
if (obj.select2 == 1) {
let select2Id = nuSetSelect2(id, obj);
nuAddDataTab(select2Id, obj.tab, p);
};
$sel.css({
'top': Number(obj.top),
'left': Number(obj.left),
'width': Number(obj.width),
'position': 'absolute'
})
.attr('onfocus', 'nuLookupFocus(event)')
.attr('onchange', 'nuChange(event)')
.attr('data-nu-field', obj.id)
.attr('data-nu-object-id', w.objects[i].object_id)
.attr('data-nu-format', '')
.attr('data-nu-subform-sort', 1)
.attr('data-nu-data', '')
.attr('data-nu-label', w.objects[i].label)
.attr('data-nu-prefix', p);
$sel.css('height', Number(obj.height));
var s = String(w.objects[i].value);
var a = [];
if (w.objects[i].multiple == 0 || w.objects[i].multiple === null) {
a = [s];
}
// Check if the string starts and ends with '[]'
if (/^\[.*\]$/.test(s)) {
eval('a = ' + s);
}
$sel.append('');
let hasSelected = false;
if (obj.options !== null) {
for (let n = 0; n < obj.options.length; n++) {
const opt = String(obj.options[n][1]); // .replaceAll(' ', ' ');
if (a.indexOf(String(obj.options[n][0])) == -1) {
$sel.append('');
} else {
$sel.append('');
hasSelected = true;
}
}
}
nuAddJSObjectEvents(id, obj.js);
nuSetAccess(id, obj.read);
if (obj.read == 1) {
nuDisable(id);
}
nuAddStyle(id, obj);
return Number(obj.width);
}
function nuSUBFORMAddCSS(id, SF) {
nuSetObjectBounds($('#' + id), SF.top, SF.left, SF.width, Number(SF.height) + 2)
.css({
'overflow-x': 'hidden',
'overflow-y': 'hidden'
})
.attr('data-nu-object-id', SF.object_id)
.attr('data-nu-foreign-key-name', SF.foreign_key_name)
.attr('data-nu-primary-key-name', SF.primary_key_name)
.attr('data-nu-subform', 'true')
.attr('data-nu-add', SF.add)
.attr('data-nu-delete', SF.delete)
.addClass('nuSubform');
}
function nuSUBFORMScrollDivAddCSS(id, SF, scrId, rowTop, rowWidth) {
nuSetObjectBounds($('#' + scrId), rowTop, 0, Number(rowWidth) + 1, Number(SF.height) - rowTop + 1)
.css({
'border-width': 10,
'overflow-x': 'hidden',
'overflow-y': 'scroll',
'position': 'absolute'
});
if (rowWidth > Number(SF.width)) {
$('#' + id).css('overflow-x', 'scroll');
$('#' + scrId).css('height', SF.height - rowTop - 25);
}
}
function nuSUBFORMnuTabHolderAddCSS(tabId, rowTop, rowWidth) {
nuSetObjectBounds($('#' + tabId), 0, 0, rowWidth, rowTop)
.css({
'overflow-x': 'hidden',
'overflow-y': 'hidden',
'position': 'absolute',
'padding': '12px 0px 0px 0px'
})
.addClass('nuTabHolder')
.attr('data-nu-subform', tabId)
.prepend(' ');
}
function nuSUBFORMnuRECORDAddCSS(frmId, rowTop, rowWidth, rowHeight, even) {
nuSetObjectBounds($('#' + frmId), rowTop, 0, rowWidth, rowHeight)
.addClass('nuSubform' + even);
}
function nuCreateElementWithId(tagName, id, parentElement) {
const newElement = document.createElement(tagName);
newElement.setAttribute('id', id);
if (parentElement !== undefined) {
document.getElementById(parentElement).appendChild(newElement);
}
return newElement;
}
function nuGetSubformDimensions(SF) {
let sfTypeGrid = SF.subform_type == 'g';
let sfType = sfTypeGrid ? 'grid' : 'edit';
let rowHeight = Number(SF.dimensions[sfType].height + (sfTypeGrid ? 0 : 10));
let rowWidth = Number(SF.dimensions[sfType].width + (sfTypeGrid ? 55 : 10));
rowWidth = SF.delete == '1' ? rowWidth - 3 : rowWidth - 25;
rowTop = sfTypeGrid ? 52 : 33;
return { rowHeight, rowWidth, rowTop };
}
function nuSUBFORM(w, i, l, p, prop) {
var SF = prop.objects[i]; //-- First row
var subformRows = w.objects[i]; //-- All rows
let id = p + SF.id;
nuCreateElementWithId('div', id, p + 'nuRECORD'); //-- Edit Form Id
nuLabelOrPosition(SF, w, i, l, p, prop)
nuAddDataTab(id, SF.tab, p);
nuSUBFORMAddCSS(id, SF);
nuAddJSObjectEvents(id, SF.js);
if (SF.forms[0] !== undefined) {
nuGetSubformRowSize(SF.forms[0].objects, SF, id);
}
let sfDimensions = nuGetSubformDimensions(SF);
let rowHeight = sfDimensions.rowHeight;
let rowWidth = sfDimensions.rowWidth;
let rowTop = sfDimensions.rowTop;
var tabId = id + 'nuTabHolder';
var tabDiv = document.createElement('div');
tabDiv.setAttribute('id', tabId);
$('#' + id).prepend(tabDiv);
nuSUBFORMnuTabHolderAddCSS(tabId, rowTop, rowWidth);
if (SF.subform_type == 'f') {
nuAddEditTabs(id, SF.forms[0]);
} else {
if (subformRows.forms.length > 0) {
let tab0 = subformRows.forms[0].tabs[0];
nuTABHELP[tab0.id] = tab0.help;
nuFORMHELP[SF.id] = tab0.help;
}
}
nuOptions(SF.sf_form_id, id, 'subform', w.global_access);
var scrId = id + 'scrollDiv';
let scrDiv = nuCreateElementWithId('div', scrId, id);
scrDiv.setAttribute('class', 'nuSubformScrollDiv');
nuSUBFORMScrollDivAddCSS(id, SF, scrId, rowTop, rowWidth);
rowTop = 0;
let prefix;
for (var c = 0; c < subformRows.forms.length; c++) {
prefix = id + nuPad3(c);
const frmId = prefix + 'nuRECORD';
nuCreateElementWithId('div', frmId, scrId);
nuSUBFORMnuRECORDAddCSS(frmId, rowTop, rowWidth, rowHeight, c%2 == 0 ? '1' : '0');
nuBuildEditObjects(subformRows.forms[c], prefix, SF, SF.forms[0]);
SF.forms[c].deletable = SF.delete == '1' ? '1' : '0';
nuRecordProperties(SF.forms[c], prefix, rowWidth - 40);
rowTop = Number(rowTop) + Number(rowHeight);
}
if (prefix != '') {
if (SF.add == 1) {
nuNewRowObject(String(prefix));
} else {
$('#' + prefix + 'nuRECORD').hide();
}
}
nuSetAccess(id, SF.read);
nuAddStyle(id, SF);
return Number(SF.width);
}
// DEV:
function nuWrapWithForm(element, formAction, formMethod) {
// 1. Create the form element
const form = document.createElement('form');
// form.onsubmit = function() { return false; }; // Add the onsubmit handler
form.setAttribute('onsubmit', 'return false'); // Add onsubmit attribute
form.id = 'myForm'; // Set the desired ID
// form.action = formAction;
// form.method = formMethod;
// 2. Get the element's parent (to insert the form before it)
const parent = element.parentNode;
// 3. Insert the form before the original element
parent.insertBefore(form, element);
// 4. Move the original element inside the form
form.appendChild(element);
}
function nuNewRowObject(p) {
const sf = p.substr(0, p.length - 3);
if ($('#' + p + 'nuRECORD').length == 0) {
return;
}
let html = document.getElementById(p + 'nuRECORD').outerHTML;
window.nuSUBFORMROW[sf] = String(html.nuReplaceAll(p, '#nuSubformRowNumber#', true));
$("[id^='" + p + "']").addClass('nuEdit');
}
function nuSubformObject(id) {
return nuFORM.subform(id);
}
function nuSubformRowId(t) {
return $(t).parent().attr('data-nu-primary-key');
}
function nuSubformRowNumber(id) {
return $('#' + id).attr('data-nu-prefix').slice(-3);
}
function nuSubformRowObject(id, column) {
const formCode = $('#' + id).attr('data-nu-form');
return $('#' + formCode + nuSubformRowNumber(id) + column);
}
function nuSubformValue(t, id) {
const p = $(t).attr('data-nu-prefix');
return $('#' + p + id).val();
}
function nuSubformColumnArray(id, column, includeDeleted = false) {
var a = [];
const sf = nuSubformObject(id);
const c = Number.isInteger(column) ? column : sf.fields.indexOf(column);
for (let i = 0; i < sf.rows.length; i++) {
if (sf.deleted[i] == 0 || includeDeleted) {
var rv = sf.rows[i][c];
a.push(rv);
}
}
return a;
}
function nuSubformDisable(sf, ob) {
if (ob === undefined || ob === '') {
$("[data-nu-form='" + sf + "']").nuDisable();
return;
}
for (let i = 0; i < nuSubformObject(sf).rows.length; i++) {
nuDisable(sf + nuPad3(i) + ob);
}
}
function nuSubformEnable(sf, ob, enable) {
if (ob === undefined || ob === '') {
$("[data-nu-form='" + sf + "']").nuEnable(enable);
return;
}
for (let i = 0; i < nuSubformObject(sf).rows.length; i++) {
nuEnable(sf + nuPad3(i) + ob, enable);
}
}
function nuSubformHide(sf, ob) {
if (ob === undefined || ob === '') {
$("[data-nu-form='" + sf + "']").nuHide();
return;
}
for (let i = 0; i < nuSubformObject(sf).rows.length; i++) {
nuHide(sf + nuPad3(i) + ob);
}
}
function nuSubformShow(sf, ob, show) {
if (ob === undefined || ob === '') {
$("[data-nu-form='" + sf + "']").nuShow(true, false);
return;
}
for (let i = 0; i < nuSubformObject(sf).rows.length; i++) {
nuShow(sf + nuPad3(i) + ob, show, false);
}
}
function nuSubformHideHeader(id) {
const scrollDiv = $('#' + id + 'scrollDiv');
scrollDiv.css({top: 0, height: $('#' + id).nuCSSNumber('height')});
}
function nuSubformLastRow(t) {
const i = String($('#' + t.id).parent().attr('id'));
const p = i.substr(0, i.length - 17);
const s2 = parseInt(i.substring(11, 14), 10) + 1;
const n = $('#' + p + nuPad3(s) + 'nuRECORD').length;
return n == 0;
}
function nuSubformFocusLastRow(id, f) {
const sf = nuSubformObject(id);
const c = f === undefined ? sf.fields[1] : sf.fields.indexOf(f);
const r = sf.rows.length - 1;
$('#' + id + nuPad3(r) + c).trigger("focus");
}
function nuSubformSetHeight(i, height, minHeight, maxHeight) {
let div = $('#' + i + 'scrollDiv');
let sf = $('#' + i);
let h = sf.data('nu-org-height');
if (h === undefined || h === null) {
div.data('nu-org-height', div.height());
sf.data('nu-org-height', sf.height());
sf.data('nu-org-z-index', sf.css('z-index'));
if (height === undefined || height === null) {
h = window.innerHeight - sf.nuCSSNumber('Top') - nuDialogHeadersHeight() - 50;
} else {
h = height;
}
if (maxHeight !== undefined && h > maxHeight) h = maxHeight;
if (minHeight !== undefined && h < minHeight) h = minHeight;
sf.height(h);
let hh = $('#' + i + 'nuTabHolder').height() + 1;
div.height(h - hh);
sf.css('z-index', 1);
} else {
sf.height(h);
div.height(div.data('nu-org-height'));
sf.data('nu-org-height', null);
sf.css('z-index', div.data('nu-org-z-index'));
}
}
function nuSubformRearrangeColumns(sf, fields, row, maintainWidth) {
function obj(p) {
return $("[id$='" + p + "']");
}
let width = 3;
let totalwidth = $('#' + sf).nuCSSNumber('width');
if (row !== '') row = nuPad3(row);
nuHide(sf);
for (let i = 1; i < fields.length; i++) {
let p = row + fields[i][0];
let p0 = '000' + fields[i][0];
if (fields[i][1] == '0') {
let h0 = obj(p0);
if (!h0.is('[nu-subform-column-hidden]')) {
h0.attr('nu-subform-column-hidden', '');
let h = obj(p);
totalwidth -= h.nuCSSNumber('width');
h.nuHide();
}
} else {
if (obj(p0).attr('data-nu-type') == 'lookup') {
obj(p + 'code').css('left', width);
width = obj('code').nuCSSNumber('width') + width + 6;
obj(p + 'button').css('left', width);
width += 19;
obj(p + 'description').css('left', width);
width = obj('description').nuCSSNumber('width') + width + 6;
} else {
obj(p).css('left', width);
width = obj(p0).nuCSSNumber('width') + width + 6;
}
}
}
if (maintainWidth !== false) {
$('#' + sf + 'scrollDiv').css('width', totalwidth - 1);
$('#' + sf).css('width', totalwidth);
}
nuShow(sf);
}
function nuSubformHideColumns(sfId, columns, maintainWidth) {
let fields = [];
nuSubformObject(sfId).fields.forEach(function (col) {
fields.push([col, columns.indexOf(col) !== -1 ? '0' : '1']);
});
nuSubformRearrangeColumns(sfId, fields, '', maintainWidth);
}
function nuSubformColumnUnique(id, column, label) {
let arr = nuSubformColumnArray(id, column);
if (arr.includes('') || !nuArrayIsUnique(arr)) {
return nuTranslate(label) + ' ' + nuTranslate('must be both unique and not blank');
}
return true;
}
function nuSubformTitleArray(sfName) {
$arr =
$('#' + sfName).children().filter('.nuSubformTitle').map(function() {
return this.getAttribute("data-nu-field");
}).get();
return $arr;
}
function nuSubformMoveFocus(activeElement, d) {
let row = activeElement.attr('data-nu-prefix').slice(-3);
let nextRow = $('#' + activeElement.attr('data-nu-form') + nuPad3(Number(row) + d) + activeElement.attr('id').substr(activeElement.attr('data-nu-form').length + 3));
if (nextRow.length == 1 && !nextRow.prop('disabled')) nextRow.trigger("focus");
return true;
}
function nuSubformHandleArrowKeyEvent(e) {
let activeElement = $(document.activeElement);
let nuScroll = activeElement.hasClass('nuScroll');
var result;
switch (e.key) {
case 'ArrowUp':
result = !nuScroll && nuSubformMoveFocus(activeElement, -1);
break;
case 'Enter':
result = nuSubformMoveFocus(activeElement, 1);
break;
case 'ArrowDown':
result = !nuScroll && nuSubformMoveFocus(activeElement, 1);
break;
default:
result = false;
}
return result;
}
// Subform filtering
function nuSubformAddFilter(filter) {
for (const sfName in filter) {
if (Object.prototype.hasOwnProperty.call(filter, sfName)) {
nuSubformFiltersAdd(sfName, filter[sfName]);
}
}
function nuSubformFilterId(sfName, columnId) {
return sfName + columnId + '_filter';
}
function nuSubformFilterValue(sfName, columnId, type) {
let filterId = nuSubformFilterId(sfName, columnId);
return nuGetValue(filterId, type === 'select' ? 'text' : 'value');
}
function nuSubformFilterOptionAll(sfName, columnId) {
let filterId = nuSubformFilterId(sfName, columnId);
return $("#" + filterId + " option:selected").attr('data-nu-all') === 'true';
}
function nuSubformFilterArray(sfName, arrColumns) {
let arr = {};
let isArray = Array.isArray(arrColumns);
for (let columnId in arrColumns) {
if (isArray) columnId = arrColumns[columnId];
arr[columnId] = {};
arr[columnId].type = isArray ? 'select' : arrColumns[columnId].type;
arr[columnId].value = nuSubformFilterValue(sfName, columnId, arr[columnId].type);
arr[columnId].all = nuSubformFilterOptionAll(sfName, columnId);
}
return arr;
}
function nuSubformFilterSortOptions(sfName, columnId) {
let filterId = nuSubformFilterId(sfName, columnId);
$(filterId).html($(filterId + " option:not('[data-nu-persistent]')").sort(function (a, b) {
return a.text == b.text ? 0 : a.text < b.text ? -1 : 1;
}));
}
function nuSubformFiltersAdd(sfName, arrColumns) {
let isArray = Array.isArray(arrColumns);
for (let columnId in arrColumns) {
if (Object.prototype.hasOwnProperty.call(arrColumns, columnId)) {
if (isArray)
columnId = arrColumns[columnId];
const prop = arrColumns[columnId];
const float = prop === undefined || prop.float === undefined ? 'center' : prop.float;
let width = $('#' + sfName + '000' + columnId).width() - 3;
width = prop === undefined || prop.width === undefined ? width : prop.width;
let style = {
'width': width + 'px',
'float': float
};
const columnTitle = '#title_' + sfName + columnId;
const filterId = nuSubformFilterId(sfName, columnId);
const type = prop === undefined || prop.type === undefined ? 'select' : prop.type;
let obj = nuSubformFilterAddObject(type, sfName, columnId, filterId, prop);
$(columnTitle).append("
");
obj.appendTo(columnTitle).css(style);
if (prop !== undefined && prop.placeholder) obj.nuSetPlaceholder(prop.placeholder);
}
}
}
function nuSubformFilterAddObject(type, sfName, columnId, filterId, prop) {
var obj;
if (type == 'select') {
obj = nuSubformFilterAddSelect(sfName, columnId, filterId, prop);
} else if (type === 'search') {
obj = nuSubformFilterAddSearch(sfName, columnId, filterId, prop);
}
return obj;
}
function nuSubformFilterAddSelect(sfName, columnId, filterId, prop) {
let propAll = prop === undefined || prop.all === undefined ? '(' + nuTranslate('All') + ')' : prop.all;
let optionAll = [];
if (propAll !== false)
optionAll = nuSubformFilterCreateSelectOption('', propAll, true, true, true);
let propBlank = prop === undefined || prop.blank === undefined ? true : prop.blank;
let optionBlank = [];
if (propBlank !== false)
optionBlank = nuSubformFilterCreateSelectOption('', '', true, false, false);
return $('', {
id: filterId,
class: 'nuSubformFilter',
on: {
change: function () {
nuSubformFilterRows(sfName, nuSubformFilterArray(sfName, filter[sfName]));
},
focus: function () {
nuSubformFilterAddValues(sfName, 'select', columnId);
nuSubformFilterSortOptions(sfName, columnId);
},
},
append: [
optionAll,
optionBlank
]
});
}
function nuSubformFilterAddSearch(sfName, columnId, filterId, prop) {
let propDatalist = prop === undefined || prop.datalist === undefined ? true : prop.datalist;
return $("", {
type: "search",
class: "nuSubformFilter",
on: {
input: function () {
nuSubformFilterRows(sfName, nuSubformFilterArray(sfName, filter[sfName]));
},
focus: function () {
if (propDatalist === true)
nuSubformFilterAddValues(sfName, 'search', columnId);
},
},
id: filterId
});
}
function nuSubformFilterCreateSelectOption(_value, _text, persistent, all, _selected) {
return $('', {
value: _value,
text: _text,
'data-nu-persistent': persistent,
'data-nu-all': all,
selected: _selected === true ? 'selected' : false
});
}
function nuSubformFilterCellValue(sfName, columnId, row) {
let id = sfName + nuPad3(row) + columnId;
let obj = $('#' + id);
let text = obj.nuGetValue(obj.is("select") ? 'text' : 'value');
if (obj.hasClass('nuHiddenLookup')) {
text = $('#' + id + 'code').nuGetValue();
}
return text;
}
function nuSubformFilterAddValues(sfName, type, columnId) {
let sf = nuSubformObject(sfName);
let columnIndex = sf.fields.indexOf(columnId);
let filterId = nuSubformFilterId(sfName, columnId);
let filterObj = $('#' + filterId);
let selectedIndex = filterObj.prop('selectedIndex');
let arr = [];
filterObj.find('option').not('[data-nu-persistent]').remove();
for (let row = 0; row < sf.rows.length - 1; row++) {
let value = sf.rows[row][columnIndex];
let text = nuSubformFilterCellValue(sfName, columnId, row);
if (type === 'select') {
if ($("#" + filterId + " option[value='" + value + "']").length == 0) {
let add = true;
if (window.nuSubformFilterOnAddValue) {
let result = nuSubformFilterOnAddValue(sfName, add, text, value);
value = result.value;
text = result.text;
add = result.add;
}
if (add) $("#" + filterId).append(new Option(text, value));
}
} else if (type === 'search') {
if (arr.indexOf(text) === -1) {
arr.push(text);
}
}
}
if (window.nuSubformFilterOnAddValues) {
nuSubformFilterOnAddValues(sfName, filterId);
}
if (type === 'select') {
filterObj.prop('selectedIndex', selectedIndex);
} else if (type === 'search') {
arr.sort(nuAscendingSortColumn);
nuAddDatalist(filterId, arr);
}
}
function nuSubformSortTop(a, b) {
if (a.top < b.top) {
return -1;
}
if (a.top > b.top) {
return 1;
}
return 0;
}
function nuSubformFilterRows(sfName, arrFilter) {
let arr = [];
let lastRow = nuSubformObject(sfName).rows.length;
let nuNoAdd = $('#' + sfName).attr('data-nu-add') == '0' ? 1 : 0;
let r = 0;
$("[ID^='" + sfName + "'][ID$='nuRECORD']").each(function () {
let rec = $(this);
// Restore positions:
let top = rec.data('nu-top-position');
if (top) {
rec.css("top", top);
if (nuNoAdd == '1' && lastRow !== r) rec.show();
}
// Get positions
top = rec.nuCSSNumber('top');
let o = { 'obj': rec.attr('id'), 'top': top };
rec.data('nu-top-position', top); // save top position
arr.push(o);
r++;
});
let rows = arr.sort(nuSubformSortTop);
let rowHeight = $('#' + sfName + '000nuRECORD').nuCSSNumber('height');
let rowTop = 0;
let hideCount = 0;
for (let row = 0; row < rows.length - nuNoAdd; row++) {
let hide = false;
let rec = $('#' + rows[row].obj);
if (arrFilter !== null) {
for (let columnId in arrFilter) {
let data = [];
data.val = nuSubformFilterCellValue(sfName, columnId, row);
data.filter = arrFilter[columnId].value;
data.type = arrFilter[columnId].type;
data.optionAll = arrFilter[columnId].all;
data.optionBlank = data.filter == '' && data.type == 'search';
data.isMatch = (data.type == 'search' && data.val.toLowerCase().includes(data.filter.toLowerCase())) ||
(data.type == 'select' && (data.val.toLowerCase() == data.filter.toLowerCase() || data.optionAll));
if (window.nuSubformOnFilterRows) {
hide = nuSubformOnFilterRows(sfName, data, row, rows.length);
} else {
if (!data.isMatch && !data.optionBlank && rows.length - 1 !== row) {
hide = true;
break;
} else {
hide = false;
}
}
}
}
if (hide === false) {
rec.css("top", rowTop).show();
rowTop = rowTop + rowHeight + 1;
} else {
hideCount++;
rec.hide();
}
}
$('#' + sfName).data('nu-filtered', hideCount > 0);
}
}
// END Subform filtering
function nuSortSubform(sfName, c, e) {
if (!e.target.classList.contains('nuSubformTitle')) return;
var sf = [];
const obj = nuSubformObject(sfName);
const so = obj.fields[c];
const count = obj.rows.length;
var h = 0;
var t = false;
const objSf = $('#' + sfName);
var noAdd = objSf.attr('data-nu-add') == '0';
const records = $("[ID^='" + sfName + "'][ID$='nuRECORD']");
const newRecord = records.last();
const newRecordId = newRecord.attr('id');
records.each(function (index) {
var id = this.id;
if (id !== newRecordId) { // exclude new record
const f = this.id.replaceAll('nuRECORD', '');
h = parseInt($(this).css('height'), 10);
const objF = $('#' + f + so);
t = objF.hasClass('input_number') || objF.hasClass('input_nuNumber') || objF.hasClass('nuCalculator');
let v = objF.val();
let m = objF.attr('data-nu-format');
const l = objF.hasClass('nuHiddenLookup');
if (m != '') {
v = nuFORM.removeFormatting(v, m);
}
if (l) {
v = $('#' + f + so + 'code').val();
}
const o = { 'form': id, 'value': v };
if (!(index == count && noAdd)) sf.push(o);
}
});
let rows;
if ($(e.target).attr('data-nu-order') == 'asc') {
rows = t ? sf.sort(nuDecendingSortNumberColumn) : sf.sort(nuDecendingSortColumn);
$(e.target).attr('data-nu-order', 'desc');
} else {
rows = t ? sf.sort(nuAscendingSortNumberColumn) : sf.sort(nuAscendingSortColumn);
$(e.target).attr('data-nu-order', 'asc');
}
let top = 0;
for (let i = 0; i < rows.length; i++) {
$('#' + rows[i].form).css('top', top).data('nu-top-position', top); // save top position
top = top + h;
}
newRecord.css('top', top).data('nu-top-position', top);
if (objSf.data('nu-filtered') === true) {
objSf.find('.nuSubformFilter').first().trigger("change");
}
}
function nuRefreshSelectObject(selectId, formId, removeBlank) {
nuSubformRefreshSelectObject('', selectId, formId, removeBlank);
}
function nuSubformRefreshSelectObject(prefix, selectId, formId, removeBlank) {
formId = nuDefine(formId);
const p = 'NUREFRESHSELECTOBJECT';
nuSetProperty(p + '_prefix', prefix);
nuSetProperty(p + '_selectid', selectId);
nuSetProperty(p + '_formid', formId);
nuSetProperty(p + '_removeblank', removeBlank === true ? '1' : '0');
nuRunPHPHidden(p);
}
function nuRefreshDisplayObject(displayId, formId) {
nuSubformRefreshDisplayObject('', displayId, formId);
}
function nuSubformRefreshDisplayObject(prefix, displayId, formId) {
formId = nuDefine(formId);
const p = 'NUREFRESHDISPLAYOBJECT';
nuSetProperty(p + '_prefix', prefix);
nuSetProperty(p + '_displayid', displayId);
nuSetProperty(p + '_formid', formId);
nuRunPHPHidden(p);
}
function nuGetClipboardText(e) {
const cb = (e.clipboardData || e.originalEvent.clipboardData || window.clipboardData);
const dataFormat = cb?.getData ? (window.clipboardData ? 'Text' : 'text/plain') : '';
return cb && dataFormat ? cb.getData(dataFormat) : '';
}
function nuSubformUndoPaste(t) {
if (confirm(nuTranslate("Undo the last paste? (The values before the insertion will be restored)?"))) {
$("[data-prevalue]").each(function () {
var v = $(this).attr("data-prevalue");
$(this).val(v).trigger("change");
});
nuHide($(this).attr('id'));
}
}
function nuSubformPaste(e, jsonObj) {
const id = e.target.id;
$id = $('#' + id);
const sfId = $id.attr('data-nu-form');
const field = $id.attr('data-nu-field');
const dRow = parseInt($('#' + String(id)).attr('data-nu-prefix').slice(-3), 10);
const obj = nuSubformObject(sfId);
const dColStart = obj.fields.indexOf(field);
const sNumRows = jsonObj.length;
const sNumCols = Object.keys(jsonObj[0]).length;
let sc = 0;
let modifiedObjects = [];
for (let c = dColStart; c < (dColStart + sNumCols); c++) {
var sr = 0;
for (let r = dRow; r < parseInt(dRow + sNumRows, 10); r++) {
let dest = $('#' + sfId + nuPad3(r) + obj.fields[c]);
dest.attr("data-prevalue", dest.val());
dest.val(jsonObj[sr][sc]).trigger("change");
modifiedObjects.push(dest);
sr++;
}
sc++;
}
return modifiedObjects;
}
function nuGetClipboardRows(clipText) {
let clipRows = clipText.split('\n');
for (let i = 0; i < clipRows.length; i++) {
clipRows[i] = clipRows[i].split('\t');
}
return clipRows;
}
function nuGetClipboardJson(clipRows) {
var jsonObj = [];
for (let i = 0; i < clipRows.length - 1; i++) {
var item = {};
for (let j = 0; j < clipRows[i].length; j++) {
if (clipRows[i][j] != '\r') {
item[j] = clipRows[i][j];
}
}
jsonObj.push(item);
}
return jsonObj;
}
function nuSubformEnableMultiPaste(subformId, selector, undoButton, callback) {
$(selector).not(".nuReadonly").on('paste', function (e) {
var clipText = nuGetClipboardText(e);
if (clipText.indexOf('\t') >= 0 || clipText.indexOf('\n') >= 0) {
var clipRows = nuGetClipboardRows(clipText);
var jsonObj = nuGetClipboardJson(clipRows);
e.stopPropagation();
e.preventDefault();
if (confirm(nuTranslate("Paste Data? Existing data might get overwritten"))) {
$('[data-nu-form="' + subformId + '"]').removeAttr("data-prevalue");
const modifiedObjects = nuSubformPaste(e, jsonObj);
if (undoButton) {
nuShow(undoButton);
}
if (callback !== undefined) {
callback(modifiedObjects);
}
window.nuNEW = 0;
}
}
});
}
function nuSubformHeaderToSeparatedString(fields, delimiter, includeId) {
var start = includeId == true ? 0 : 1;
var h = '';
for (var i = start; i < fields.length - 1; i++) {
h += fields[i] + delimiter;
}
return h + '\n';
}
function nuSubformRowToSeparatedString(rows, delimiter, includeId) {
var processRow = function (row, includeId) {
var finalVal = '';
var start = includeId == true ? 0 : 1;
for (var j = start; j < row.length - 1; j++) {
var innerValue = row[j] === null ? '' : row[j].toString();
if (row[j] instanceof Date) {
innerValue = row[j].toLocaleString();
}
var result = innerValue.replace(/"/g, '""');
if (result.search(/("|,|\n)/g) >= 0)
result = '"' + result + '"';
if (j > start)
finalVal += delimiter;
finalVal += result;
}
return finalVal + '\n';
};
var output = "";
for (var i = 0; i < rows.length - 1; i++) {
output += processRow(rows[i], includeId);
}
return output;
}
function nuCopyToClipboard(s) {
navigator.clipboard.writeText(s).then(function () {
return true;
}, function () {
return false;
});
}
/**
* Copy the data of a Subform to the Clipboard
*
* @param {string} i - Subform Object ID
* @param {string} delimiter - Delimiter for the data. Default: \t (tabulator)
* @param {bool} [includeHeader] - true to include the header (titles)
* @param {bool} [includeId] - true to include the Id (Primary Key)
*
*/
function nuSubformToClipboard(i, delimiter, includeHeader, includeId) {
var obj = nuSubformObject(i);
var s = "";
if (!delimiter) {
delimiter = '\t';
}
if (!includeId) {
includeId = false;
}
if (includeHeader === true) {
s = nuSubformHeaderToSeparatedString(obj.fields, delimiter, includeId);
}
s += nuSubformRowToSeparatedString(obj.rows, delimiter, includeId);
nuCopyToClipboard(s);
}
function nuRecordHolderObject(t) {
var h = 'nuRECORD';
var p = $('#' + t.id).parent();
var i = String(p.attr('id'));
var c = 0;
this.form = i.substring(0, i.length - 3 - h.length);
this.strNo = i.substring(this.form.length, this.form.length + 3);
this.intNo = Number(this.strNo);
while ($('#' + this.form + nuPad3(this.intNo + c) + h).length != 0) { c++; }
this.rows = this.intNo + c;
this.top = (p.outerHeight() * this.rows);
var s = this.form + nuPad3(this.intNo + 1) + h;
this.last = $('#' + s).length == 0;
s = this.form + nuPad3(this.rows - 1);
this.html = window.nuSUBFORMROW[s];
this.even = parseInt(this.rows / 2, 10) == this.rows / 2 ? '0' : '1';
}
function nuAddSubformRow(t, e) {
if ($('#' + t.id).parent().parent().parent().attr('data-nu-add') == 0) { return; }
var sfid = $('#' + t.id).parent().parent().parent()[0].id;
var before = $('#' + sfid).attr('data-nu-beforeinsertrow');
var after = $('#' + sfid).attr('data-nu-afterinsertrow');
var nuCancel = false;
eval(before);
if (nuCancel) { return; }
if (e !== false) { e.stopPropagation(); }
var o = new nuRecordHolderObject(t);
if (!o.last) { return; }
var h = window.nuSUBFORMROW[o.form].nuReplaceAll('#nuSubformRowNumber#', o.form + nuPad3(o.rows), true);
$('#' + o.form + 'scrollDiv').append(h);
$('#' + o.form + nuPad3(o.rows) + 'nuRECORD').addClass('nuSubform' + o.even).css('top', o.top);
$('#' + o.form + nuPad3(o.rows)).attr('data-nu-primary-key', '-1');
$('#' + o.form + nuPad3(o.rows) + 'nuDelete').prop('checked', true);
$('#' + o.form + nuPad3(o.rows - 1) + 'nuDelete').prop('checked', false);
$("[id^='" + o.form + nuPad3(o.rows) + "']").removeClass('nuEdited');
let ts = $('.nuTabSelected');
ts.attr('nu-data-clicked-by-system', '');
ts.trigger( "click" );
$('#' + o.form + nuPad3(o.rows) + 'nuRECORD > .nuLookupButton')
.on("click", function () {
nuBuildLookup(this, "");
});
// Copy Datalist from previous row
let objlist1 = $('#' + o.form + nuPad3(o.rows - 1) + 'nuRECORD').children().filter('[list]');
if (objlist1.length !== 0) {
let objlist2 = $('#' + o.form + nuPad3(o.rows) + 'nuRECORD').children().filter('[list]');
objlist2.each(function (i) {
$(this).attr('list', objlist1.eq(i).attr('list'));
});
}
let objSelect = $('#' + o.form + nuPad3(o.rows) + 'nuRECORD > .select2-hidden-accessible');
if (objSelect.length > 0) {
objSelect.each(function () {
let objSelect2 = $('#' + this.id + '_select2');
let pos = objSelect2.position();
let obj = {
width: objSelect2.width(),
top: pos.top,
left: pos.left
};
objSelect2.remove();
nuSetSelect2(this.id, obj);
});
}
eval(after);
}
function nuLabelGetValidationClass(validationId) {
const classMap = {
0: 'nuNone',
1: 'nuBlank',
2: 'nuDuplicate',
3: 'nuDuplicateOrBlank'
};
return classMap[validationId];
}
function nuLabel(w, i, p, prop) {
let obj = prop.objects[i];
if (obj.label == '' || obj.display == 0 || obj.label == "Insert-Snippet") {
return;
}
const id = 'label_' + p + obj.id;
// Workaround: Prevent label from being added twice for Editor
let objLabel = document.getElementById(id);
if (objLabel) {
return objLabel;
}
objLabel = nuCreateElementWithId('label', id, p + 'nuRECORD');
const label = nuTranslate(String(obj.label));
const lwidth = nuGetWordWidth(label, 'label');
const forId = obj.type == 'lookup' ? p + obj.id + 'code' : p + obj.id;
if(!['subform','html'].includes(obj.type)){
objLabel.setAttribute('for', forId);
}
nuAddDataTab(id, obj.tab, p);
nuSetObjectBounds(objLabel, obj.top, Number(obj.left) - lwidth + -17, Number(lwidth + 12)).html(label);
if (nuGlobalAccess())
$('#' + id).attr('ondblclick', 'nuOptionsListAction("nuobject", "' + obj.object_id + '")');
if (label == ' ') {
label.innerHTML = ' ';
}
$('#' + id).attr("data-nu-org-label", obj.label);
objLabel.classList.add(nuLabelGetValidationClass(obj.valid), 'nuLabel');
return objLabel;
}
function nuPopulateLookup3(v, p) {
for (var i = 0; i < v.length; i++) {
var fieldname = String(v[i][0]).replace('#ROW#', p);
$('#' + fieldname).val(v[i][1]);
}
}
function nuAddHolder(t) {
var d = document.createElement('div');
d.setAttribute('id', t);
$('body').append(d);
$('#' + t).addClass(t);
return $('#' + t);
}
function nuGetWordWidth(w, objClass) {
if (!objClass) {
objClass = 'nuSection';
}
const W = 'nuTestWidth';
const h = "<" + 'div' + " id='" + W + "' style='position:absolute;visible:hidden;width:auto'>" + nuEscapeHTML(w) + "" + 'div' + ">";
$('body').append(h);
let obj = $('#' + W);
obj.addClass(objClass);
let l = parseInt(obj.css('width'), 10);
obj.remove();
return l + 5;
}
function nuGetSubformRowSize(o, SF, id) {
var l = -3;
var w = 0;
for (var i = 0; i < o.length; i++) {
var descriptionWidth = Number(o[i].description_width);
const oType = o[i].type;
var B = oType == 'lookup' ? 26 : 0; //-- lookup button
var D = oType == 'lookup' ? descriptionWidth : 0; //-- lookup description
if (oType == 'select') {
w = Number(o[i].width) + B + D - 4;
} else {
w = Number(o[i].width) + B + D;
}
if (SF.subform_type == 'g') { //-- grid
nuBuildSubformTitle(o[i], l, w, id, i);
l = l + w + (o[i].read == 2 ? 0 : 6);
}
}
}
function nuBuildSubformTitle(o, l, w, id, col) {
var titleId = 'title_' + id + o.id;
var div = document.createElement('div');
var label = nuTranslate(o.label);
if (o.read == 2) {
label = '';
}
div.setAttribute('id', titleId);
$('#' + id).append(div);
var oTitle = $('#' + titleId);
oTitle.css({
'top': 0,
'left': Number(l) + 9,
'width': Number(w),
'height': 50,
'text-align': 'center',
'position': 'absolute'
})
.html(label)
.attr('data-nu-field', o.id)
.attr('data-nu-subform', id)
.attr('data-nu-order', 'asc')
.addClass('nuTabHolder nuSubformTitle')
.addClass(o.input == 'number' || o.input == 'nuNumber' ? 'number' : 'text');
oTitle.on('click', e => {
if (window.onSubformTitleClick) {
if (onSubformTitleClick(e.target.parentElement.id, e) !== false) {
nuSortSubform(id, col + 1, e);
}
} else {
nuSortSubform(id, col + 1, e);
}
});
if (nuGlobalAccess()) {
oTitle.on('dblclick', e => {
nuOptionsListAction("nuobject", o.object_id);
});
}
if (o.valid == 1) { oTitle.addClass('nuBlank'); }
if (o.valid == 2) { oTitle.addClass('nuDuplicate'); }
}
function nuBuildSubformDeleteTitle(l, id, subform_id) {
var titleId = id + 'DeleteSF';
var div = document.createElement('div');
div.setAttribute('id', titleId);
$('#' + id).append(div);
$('#' + titleId).css({
'top': 0,
'left': Number(l) - 12,
'width': 52,
'height': 50,
'text-align': 'center',
'font-size': '10px',
'padding': 0,
'position': 'absolute'
})
.html('
Delete')
.addClass('nuTabHolder')
.attr('onclick', 'nuPopup("' + subform_id + '", "-2");');
}
function nuAddBreadcrumbs() {
const breadcrumbLength = window.nuFORM.breadcrumbs.length;
const iStart = nuMainForm() ? 1 : 0;
for (let i = iStart; i < breadcrumbLength; i++) {
nuAddBreadcrumb(i);
}
}
function nuGetTitleNew(bc, title = 'New') {
if (nuFormType() == 'edit' && bc.form_type != 'launch' && nuIsNewRecord()) {
const fId = bc.form_id;
const breadcrumbLength = nuFORM.breadcrumbs.length;
const pId = breadcrumbLength < 2 ? '' : nuFORM.breadcrumbs[breadcrumbLength - 2].form_id;
return fId !== pId ? `${nuTranslate(bc.form_description)} (${title})` : title;
}
return false;
}
function nuAddBreadcrumb(i) {
const isLast = (i + 1 == window.nuFORM.breadcrumbs.length); //-- last breadcrumb
const bc = window.nuFORM.breadcrumbs[i];
const id = 'nuBreadcrumb' + i;
var div = document.createElement('div');
const h = '
';
div.setAttribute('id', id);
$('#nuBreadcrumbHolder').append(div);
var $id = $('#' + id);
let title = bc.title;
/* DEV
if (bc.form_code.startsWith('nu')) {
title = nuGetTitleNew('New') || title;
}
*/
$id.css('font-size', '14px')
.html(h + nuTranslate(title));
if (isLast) {
$id.addClass('nuNotBreadcrumb');
} else {
$id.addClass('nuBreadcrumb')
.attr('onclick', 'nuGetBreadcrumb(' + i + ')')
}
if (i == 0) {
$('#nuarrow0').remove();
}
}
function nuMainForm() {
if (opener) {
try {
return nuDocumentID == opener.nuDocumentID;
} catch (error) {
return false;
}
}
return nuDocumentID == parent.nuDocumentID;
}
function nuSetBrowseTitle(title) {
nuSetTitle(title, true);
}
function nuSetTitle(title, browse) {
if (nuFormType() == 'browse' && !browse == true) {
return;
}
title = nuEscapeHTML(title);
nuFORM.setProperty('title', title);
const b = $('.nuBreadcrumb').length;
let h = '
';
if (nuFORM.breadcrumbs.length == 1) {
h = '';
}
$('#nuBreadcrumb' + b).html(h + title);
}
function nuAddEditTabs(p, w) {
if (nuFormType() === 'edit') {
nuSetStartingTab(p, w);
}
w.tabs.forEach(function(tab, i) {
nuEditTab(p, tab, i);
});
let browseTitleMaxLength = 7;
w.browse_columns.forEach(function(column, i) {
browseTitleMaxLength = nuBrowseTitle(w.browse_columns, i, browseTitleMaxLength, w.browse_title_multiline);
if (column.width !== '0') {
p = i;
}
});
const noSearchColumns = nuFORM.getProperty('nosearch_columns');
noSearchColumns.forEach(function(column) {
const nuSortElement = document.getElementById(`nusort_${column}`);
if (nuSortElement) {
nuSortElement.classList.add('nuNoSearch');
}
});
window.nuBrowseWidth = browseTitleMaxLength;
nuDetach();
if (w.browse_columns.length > 0) {
nuBrowseTable();
nuOptions(w.form_id, `nuBrowseTitle${p}`, 'browse', w.global_access);
}
}
function nuSetStartingTab(p, w) {
var t = window.nuFORM.getProperty('tab_start');
if (w.tabs.length == 0) {
nuFORMHELP[p] = '';
return;
}
nuFORMHELP[p] = nuTABHELP[w.tabs[0].id];
for (var i = 0; i < t.length; i++) {
nuFORMHELP[p] = nuTABHELP[w.tabs[0].id];
if (t[i].prefix == p) { return; }
}
t.push(new nuStartingTab(p));
}
function nuGetStartingTab() {
let w = nuRecordId() == -2 ? parent.window : window;
let t = w.nuFORM.getProperty('tab_start');
for (let i = 0; i < t.length; i++) {
let ts = $('#' + t[i].prefix + 'nuTab' + t[i].tabNumber);
ts.addClass('nuTabSelected');
ts.attr('nu-data-clicked-by-system', '');
ts.trigger( "click" );
}
}
function nuSetTab(pthis) {
const tabStart = window.nuFORM.getProperty('tab_start');
const prefix = pthis.getAttribute('data-nu-form-filter');
for (let i = 0; i < tabStart.length; i++) {
if (tabStart[i].prefix === prefix) {
const tabSelector = `#${tabStart[i].prefix}nuTab${tabStart[i].tabNumber}`;
const ts = document.querySelector(tabSelector);
ts.classList.add('nuTabSelected');
ts.setAttribute('nu-data-clicked-by-system', '');
ts.trigger( "click" );
break;
}
}
}
function nuStartingTab(p) {
this.prefix = p;
this.tabNumber = 0;
}
function nuEditTab(p, t, i) {
const tabId = p + 'nuTab' + i;
let div = document.createElement('div');
div.setAttribute('id', tabId);
$('#' + p + 'nuTabHolder').append(div);
$('#' + tabId)
.html(nuTranslate(t.title))
.addClass('nuTab')
.addClass('nuDragNoSelect')
.attr('data-nu-tab-filter', i)
.attr('data-nu-form-filter', p)
.attr('data-nu-tab-id', t.id)
.attr('onclick', 'nuSelectTab(this, true)')
.attr("data-nu-org-label", t.title);
if (t.access !== undefined) {
if (t.access == '2') nuHide('nuTab' + i);
if (t.access == '3') {
if (!nuGlobalAccess()) {
nuHide('nuTab' + i);
} else {
$('#' + 'nuTab' + i).addClass('nuTabAccessHiddenUser');
}
}
}
window.nuTABHELP[t.id] = t.help;
}
function nuOptions(formId, subformId, t, access) {
if (nuRecordId() != '-2') {
var id = subformId + 'nuOptions';
var img = document.createElement('l');
img.setAttribute('id', id);
if (t == 'subform') {
if (nuAllowChanges(formId) && nuGlobalAccess()) {
$('#' + subformId).prepend(img);
$('#' + id)
.attr('title', nuTranslate('Options'))
.attr('onclick', 'nuGetOptionsList("' + formId + '", "' + subformId + '", "' + access + '", "' + t + '")')
.addClass('nuIcon nuOptionsSubform fa-fw');
}
} else {
$('#nuBreadcrumbHolder').prepend('').prepend(img);
$('#' + id)
.attr('title', 'Options')
.attr('onclick', 'nuGetOptionsList("' + formId + '", "' + subformId + '", "' + access + '", "' + t + '")')
.addClass('nuIcon nuOptions fa-fw');
}
}
}
function nuAllowChanges(f) {
return nuSERVERRESPONSE.form_access == 0 || !String(f).startsWith('nu') || f == 'nuuserhome';
}
function nuHideOptionsItemShortcutKeys() {
$('.nuOptionsItemShortcutKey').css('visibility','hidden');
}
function nuGetOptionsList(formId, subformId, globalAccess, type) {
const id = 'nuOptionsListBox';
if ($('#' + id).length !== 0) {
$('#nuOptionsListBox').remove();
return;
}
let list = [];
const buttons = nuSERVERRESPONSE.buttons;
const canChange = nuAllowChanges(formId);
const admin = globalAccess == 1;
const hasHelp = nuFORMHELP[subformId] != '' && nuFORMHELP[subformId] !== undefined && type != 'subform';
const formType = nuFormType()[0];
const typeEdit = formType == 'e';
const typeBrowse = formType == 'b';
const typeSf = type == 'subform';
const typeLaunch = nuFORM.getCurrent().form_type != 'launch';
const labelId = '#label_' + $('#' + subformId + 'scrollDiv').parent().attr('id');
const items = {
Divider : ['', '', '', ''],
AddObject : ['Add Object', 'nuPopup("nuobject","-1","")', 'fa fa-plus', 'H'],
ArrangeObjects : ['Arrange Objects', 'nuPopup("' + formId + '", "-2")', 'fas fa-arrows-alt', 'A'],
FormProperties : ['Form Properties', 'nuOptionsListAction("nuform", "' + formId + '")', 'fa-cog', 'F'],
SearchableColumns : ['Searchable Columns', 'nuGetSearchList()', 'fa-columns', 'C'],
SubformObject : [nuTranslate('Subform Object'), '$("' + labelId + '").trigger("dblclick");', 'fa-cog', ''],
FormObjectList : ['Form Object List', 'nuOptionsListAction("nuobject", "", "' + formId + '")', 'fa-th-list', 'O'],
Search : ['Search', 'nuSearchAction();', 'fas fa-search', 'S'],
Add : ['Add', 'nuAddAction();', 'fas fa-plus', 'A'],
Print : ['Print', 'nuPrintAction();', 'fas fa-print', 'P'],
Save : ['Save', 'nuSaveAction();', 'far fa-save', 'S'],
Delete : ['Delete', 'nuDeleteAction();', 'far fa-trash-alt', 'Y'],
Clone : ['Clone', 'nuCloneAction();', 'far fa-clone', 'C'],
Refresh : ['Refresh', 'if (nuGlobalAccess()) {nuRunPHPHidden("NUSETREFRESHCACHE");} else {nuGetBreadcrumb();}', 'fas fa-sync-alt', 'R'],
Help : ['Help', nuFORMHELP[subformId], 'fa-question-circle', '?'],
ChangePassword : ['Change Password', 'nuPopup("nupassword", "", "")', 'fa-password', 'Q'],
DebugResults : ['nuDebug Results', 'nuOptionsListAction("nudebug", "")', 'fa-bug', 'D'],
Database : ['Database', 'nuVendorLogin("PMA")', 'fa-database', 'E'],
Sessions : ['Sessions', 'nuForm("nusession","","", "", 2)', 'fas fa-key', 'J'],
FileManager : ['File Manager', 'nuVendorLogin("TFM");', 'far fa-file-code', 'Q'],
Backup : ['Backup', 'nuRunBackup();', 'far fa-hdd', 'B'],
Setup : ['Setup', 'nuForm("nusetup","1","", "", 2)', 'fa-cogs', 'U'],
FormInfo : ['Form Info', 'nuShowFormInfo();', 'fa-info', 'M'],
VersionInfo : ['Version Info', 'nuShowVersionInfo();', 'fa-info', 'V'],
Logout: ['Log out', 'nuAskLogout();', 'fas fa-sign-out-alt', 'L']
};
if (typeEdit && admin && canChange) {
if (nuCanArrangeObjects()) {
list.push(items.ArrangeObjects);
}
if (!typeSf) {
list.push(items.AddObject);
list.push(items.Divider);
}
}
if (typeBrowse) list.push(items.SearchableColumns);
if (admin && canChange) list.push(items.FormProperties);
if (typeSf && canChange) {
list.push(items.SubformObject);
}
if (admin && canChange) list.push(items.FormObjectList);
if (!typeSf && admin) list.push(items.Divider);
if (typeBrowse) {
list.push(items.Search);
if (buttons.Add == '1') { list.push(items.Add); }
if (buttons.Print == '1' && nuFORM.getCurrent().browse_rows.length > 0) { list.push(items.Print); }
}
if (typeLaunch && typeEdit && type != 'subform') {
const data_mode = nuFORM.getCurrent().data_mode;
if (buttons.Save == '1' && data_mode !== 0) { list.push(items.Save); }
if (buttons.Delete == '1' && !nuIsNewRecord()) { list.push(items.Delete); }
if (buttons.Clone == '1' && !nuIsNewRecord()) { list.push(items.Clone); }
}
if (hasHelp) {
list.push(items.Help);
}
if (!typeSf) {
list.push(items.Refresh);
if (admin) list.push(items.Divider);
}
if (!admin) {
list.push(items.Divider);
list.push(items.ChangePassword);
}
if (admin && !typeSf) {
list.push(items.DebugResults);
list.push(items.Divider);
list.push(items.Database);
list.push(items.Sessions);
list.push(items.FileManager);
list.push(items.Backup);
list.push(items.Setup);
list.push(items.FormInfo);
list.push(items.VersionInfo);
}
if (!typeSf && nuIsMobile()) {
list.push(items.Divider);
list.push(items.Logout);
}
if (list.length == 0) { return; }
let div = document.createElement('div');
div.setAttribute('id', id);
$('body').append(div);
$('#' + id)
.css({
'top': 0,
'height': 20 + (list.length * 20),
'width': 30
})
.html(' ' + nuTranslate('Options') + '<\span>')
.addClass('nuOptionsList');
nuBuildOptionsList(list, subformId, type);
if (nuIsMobile()) nuHideOptionsItemShortcutKeys();
$('[data-nu-option-title]').css('padding', 3);
nuDragElement($('#nuOptionsListBox')[0], 30);
}
function nuBuildOptionsList(l, p, type) { //-- loop through adding options to menu
var iprop = { 'position': 'absolute', 'text-align': 'left', 'width': 15, 'height': 15 };
var width = 0;
for (let i = 0; i < l.length; i++) {
if (l[i][0] != '') l[i][0] = nuTranslate(l[i][0]); // Text
l[i][3] = nuCtrlCmdShiftName(l[i][3]); // Shortcut
}
for (let i = 0; i < l.length; i++) {
width = Math.max((nuGetWordWidth(l[i][0]) + nuGetWordWidth(l[i][3])), width);
}
for (let i = 0; i < l.length; i++) {
var t = l[i][0]; // Text
var f = l[i][1]; // onclick
var c = l[i][2]; // Icon
var k = l[i][3]; // Shortcut
var itemtop = 30 + (i * 20);
// Add Icon
var icon = document.createElement('i');
var icon_id = 'nuOptionList' + i.toString();
icon.setAttribute('id', icon_id);
$('#nuOptionsListBox').append(icon);
$('#' + icon.id)
.css(iprop)
.css({ 'top': itemtop, 'left': 9 })
.addClass('fa')
.addClass(c)
.addClass('nuOptionList');
// Add Option Text
const isDivider = t == '' ? true : false;
var desc = document.createElement(isDivider ? 'hr' : 'div');
var desc_id = 'nuOptionText' + i.toString();
desc.setAttribute('id', desc_id);
$('#nuOptionsListBox').append(desc);
var style = { 'position': 'absolute', 'text-align': 'left', 'height': (isDivider ? 0 : 15) };
if (isDivider) {
$('#' + desc.id)
.css(style)
.css({ 'top': itemtop - 4, 'left': 30 })
.html(t)
.attr('onclick', f)
.addClass('nuOptionsItem-divider');
} else {
$('#' + desc.id)
.css(style)
.css({ 'top': itemtop - 4, 'left': 30 })
.html(t)
.attr('onclick', f)
.attr('data-nu-option-title', t)
.addClass('nuOptionsItem');
}
// Add ahortcut
if (k !== '') {
var shortcut_key = document.createElement('div');
var shortcut_key_id = 'nuOptionTextShortcutKey' + i.toString();
shortcut_key.setAttribute('id', shortcut_key_id);
if (type !== 'subform') {
$('#nuOptionsListBox').append(shortcut_key);
}
style = { 'position': 'absolute', 'text-align': 'left', 'height': 15, 'width': 50 };
$('#' + shortcut_key.id)
.css(style)
.css({ 'top': itemtop - 2, 'right': 10 })
.html(k)
.attr('onclick', f)
.addClass('nuOptionsItemShortcutKey');
}
}
var off = $('#' + p + 'nuOptions').offset();
var top = off.top;
var left = off.left;
var reduce = 0;
if (type == 'browse') {
left = 12;
}
if (type == 'form') {
top = off.top - 6;
left = 10;
}
if (type == 'subform') {
top = off.top - 70;
left = off.left;
reduce = 55;
}
$('#nuOptionsListBox').css({
'height': 40 + (l.length * 20),
'width': 50 + width - reduce,
'left': left,
'top': top + 70
});
$('.nuOptionsItem').css({ 'width': width - 57, 'padding': '0px 0px 0px 3px' });
$('.nuOptionsItem-divider').css({ 'width': 35 + width - reduce - 7, 'left': 0 });
}
function nuSelectAllTabs(pthis) {
var t = pthis.value;
window.nuRESPONSIVE.setTabsColumn(t);
if (t != '') {
nuSelectTab($('#' + t)[0]);
}
}
function nuSelectTab(tab, byUser = false) {
if (window.nuOnSelectTab) {
if (nuOnSelectTab(tab) == false) return;
}
let $tabId = $('#' + tab.id);
byUser = byUser && !$tabId.is('[nu-data-clicked-by-system]');
if (byUser) nuSaveScrollPositions();
$tabId.removeAttr('nu-data-clicked-by-system');
$('.nuTabTitleColumn').remove();
const filt = $tabId.attr('data-nu-tab-filter');
const form = $tabId.attr('data-nu-form-filter');
const tabId = $tabId.attr('data-nu-tab-id');
window.nuFORMHELP[form] = window.nuTABHELP[tabId];
let tabStart = nuFORM.getProperty('tab_start');
for (let i = 0; i < tabStart.length; i++) {
if (tabStart[i].prefix == form) {
tabStart[i].tabNumber = filt;
}
}
let selector = "[data-nu-form='" + form + "']";
$(selector + ":not('.nuIframe, .nuHtml')").hide();
$(".nuIframe" + selector + ", .nuHtml" + selector).css('visibility', 'hidden');
$("[data-nu-form-filter='" + form + "']").removeClass('nuTabSelected');
selector = "[data-nu-form='" + form + "'][data-nu-tab='" + filt + "']";
$(selector + ":not([data-nu-lookup-id]):not('.nuIframe, .nuHtml')").show();
$(".nuIframe" + selector + ", .nuHtml" + selector).css('visibility', 'visible');
$('#' + tab.id).addClass('nuTabSelected');
if (byUser) {
nuRestoreScrollPositions();
let s = $('.nuTabSelected');
let obj = null;
let ae = document.activeElement;
if (s.is("[nu-data-active-element]")) {
let id = s.attr('nu-data-active-element');
if (id !== '' && ae.id !== id) $('#' + id).nuFocusWithoutScrolling();
} else {
obj = nuGetFirstObject(nuSERVERRESPONSE.objects, tab.id.replace('nuTab', ''));
if (obj !== null && ae.id !== obj.attr('id')) {
obj.nuFocusWithoutScrolling();
try {
if ((obj.is('textarea') || obj.is('input')) && !obj.is(':checkbox')) {
obj.prop({ 'selectionStart': 0, 'selectionEnd': 0 });
}
} catch (e) {
console.log('Failed to set selectionStart', obj);
}
}
}
}
if (window.nuOnTabSelectedGlobal) {
nuOnTabSelectedGlobal(tab);
}
if (window.nuOnTabSelected) {
nuOnTabSelected(tab);
}
}
function nuGetTabIndexByTitle(title) {
const tabs = nuSERVERRESPONSE.tabs;
return tabs.findIndex(data => data.title.replace(/\|/g, "") === title);
}
function nuSelectTabByTitle(title) {
const index = nuGetTabIndexByTitle(title);
if (index > -1) {
nuSelectTab($('#nuTab' + index)[0]);
}
}
function nuRemoveTabByTitle(title) {
const index = nuGetTabIndexByTitle(title);
if (index > -1) {
$('#nuTab' + index).remove();
}
}
function nuShowTabByTitle(title, visible) {
const index = nuGetTabIndexByTitle(title);
if (index > -1) {
nuShow('nuTab' + index, visible);
}
}
function nuRemoveTabs(t) {
for (let i = 0; i < arguments.length; i++) {
$('#nuTab' + arguments[i]).remove();
}
}
function nuRemoveTabById(id) {
let obj = $('div#' + id);
if (obj.length == 1) {
obj.remove();
} else {
$('div[data-nu-tab-id=' + id + ']').filter('.nuTab').remove();
}
}
function nuHideTabById(id) {
nuShowTabById(id, false);
}
function nuShowTabById(id, visible) {
let obj = $('div#' + id);
if (obj.length == 1) {
obj.nuShow(visible);
} else {
$('div[data-nu-tab-id=' + id + ']').filter('.nuTab').nuShow(visible);
}
}
function nuHideTabByTitle(s) {
nuShowTabByTitle(s, false);
}
function nuHideTabs() {
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] === parseInt(arguments[i], 10)) {
$('#nuTab' + arguments[i]).hide();
} else {
nuHideTabByTitle(arguments[i]);
}
}
}
function nuAddDataTab(id, tabNr, formIdPrefix) {
let formId = '';
if (formIdPrefix) {
let formIdPrefixStr = String(formIdPrefix);
formId = formIdPrefixStr.substr(0, formIdPrefixStr.length - 3);
}
$('#' + id).attr('data-nu-tab', tabNr).attr('data-nu-form', formId);
}
function nuAlignmentStyle(alignment) {
const alignmentOptions = { l: 'left', c: 'center', r: 'right' };
return alignmentOptions[alignment];
}
function nuBrowseTitle(columns, index, left, multiline) {
function nuGenerateSortSpan(index, title, sortDirection) {
const sortIconClass = sortDirection === 'asc' ? 'fa-caret-up' : 'fa-caret-down';
return `
${nuTranslate(title)}
`;
}
const currentForm = window.nuFORM.getCurrent();
const columnIndex = currentForm.nosearch_columns.indexOf(index);
const elementId = 'nuBrowseTitle' + index;
const container = nuCreateElementWithId('div', elementId, 'nuRECORD');
const spanContent = ` ${nuTranslate(columns[index].title)} `;
const sortedSpan = currentForm.sort === index ? nuGenerateSortSpan(index, columns[index].title, currentForm.sort_direction) : spanContent;
const titleClass = multiline === '1' ? 'nuBrowseTitleMultiline nuBrowseTitle' : 'nuBrowseTitle';
const columnWidth = Number(columns[index].width);
const element = $(container);
element
.html(sortedSpan)
.addClass(titleClass)
.css({
'text-align': nuAlignmentStyle(columns[index].align),
'overflow': 'visible',
'width': columnWidth,
'left': left
})
.attr('data-nu-title-id', columns[index].id);
if (columnWidth === 0) {
element.hide();
}
$('#nusearch_' + index).attr('checked', columnIndex === -1);
return left + nuTotalWidth(elementId);
}
function nuTitleDrag(i) {
const bc = window.nuFORM.getCurrent();
const h = bc.row_height;
const div = document.createElement('div');
div.setAttribute('id', 'nuTitleDrag' + i);
$('#' + 'nuBrowseTitle' + i).append(div);
$('#' + div.id)
.addClass('nuDragLineV')
.css('height', h)
.attr('onmousedown', 'nuDragBrowseDown(event)')
.attr('onmousemove', 'nuDragBrowseMove(event)')
.attr('onmouseup', 'nuDragBrowseUp(event)');
}
function nuDragBrowseDown(e) {
const t = parseInt($('#nuBrowseTitle0').css('top'), 10);
const f = parseInt($('#nuBrowseFooter').css('top'), 10);
window.nuDRAGLINEVSTART = e.pageX;
window.nuDRAGLINEVID = e.target.id;
$('#' + e.target.id).css('height', f - t);
}
function nuDragBrowseMove(e) {
if (window.nuDRAGLINEVID == '' || e.buttons != 1) { return; }
$('#' + nuDRAGLINEVID).css('left', e.x);
}
function nuDragBrowseUp(e) {
let h = parseInt($('#nuBrowseTitle0').css('height'), 10);
$('#' + e.target.id).css('height', h);
window.nuDRAGLINEVID = '';
}
function nuBrowseColumnSize(e) {
$('#' + e.target.id).css('height', 400);
}
function nuResizeBrowseColumns(force){
const currentForm = nuFORM.getCurrent();
const columnWidths = nuArrayColumn(nuSERVERRESPONSE.browse_columns,'width').map(Number);
const padding = nuTotalWidth('nucell_0_0') - $('#nucell_0_0').width();
if((currentForm.refreshed != 0 && force !== true) && nuMainForm()){
return;
}
if(nuMainForm()){
let totalWidth = 0;
for(let i = 0 ; i < columnWidths.length ; i++){
totalWidth = totalWidth + columnWidths[i];
}
for(let i = 0 ; i < columnWidths.length ; i++){
columnWidths[i] = parseInt((window.innerWidth - 30) * columnWidths[i] / totalWidth) - padding;
}
nuSetBrowseColumns(columnWidths);
}else{
const browseFooterWidth = nuTotalWidth('nuBrowseFooter') + 22;
const bodyWidth = `${browseFooterWidth}px`;
$('#nuDragDialog', window.parent.document).css('width', browseFooterWidth + 14);
$('#nuWindow', window.parent.document).css('width', browseFooterWidth);
document.body.style.width = bodyWidth;
}
}
function nuSetBrowseColumns(columnWidths) {
const padding = nuTotalWidth('nucell_0_0') - $('#nucell_0_0').width();
let left = 7;
columnWidths.forEach((width, i) => {
const columnElements = document.querySelectorAll(`[data-nu-column="${i}"], #nuBrowseTitle${i},#nuBrowseTitle${i}_select`);
columnElements.forEach(element => {
element.style.left = `${left}px`;
element.style.width = `${width}px`;
});
left += width + (width === 0 ? 0 : padding);
});
const browseFooterWidth = left - 7;
$('#nuBrowseFooter').css('width', `${browseFooterWidth}px`);
nuFORM.breadcrumbs[nuFORM.breadcrumbs.length - 1].column_widths = columnWidths;
if (nuCurrentProperties().browse_filtered_rows === 0) {
const nucell00 = document.getElementById('nucell_0_0');
nucell00.style.width = `${browseFooterWidth - 22}px`;
nucell00.style.zIndex = '2';
$("div[id^='nucell_']").not('#nucell_0_0').hide();
}
}
function nuGetColumWidths() {
let a = [];
$("div[id^='nuBrowseTitle']").each(function (index) {
a.push(parseInt($(this).css('width'), 10));
});
return a;
}
function nuDownBrowseResize(e, source) {
if (e.target.tagName === 'I') {
return;
}
const id = e.target.id.replace('nusort_', 'nuBrowseTitle');
window.nuBROWSERESIZE.mouse_down = true;
window.nuBROWSERESIZE.pointer = source;
window.nuBROWSERESIZE.moving_element = id;
window.nuBROWSERESIZE.x_position = e.clientX;
$('#' + id).addClass('nuBrowseResize');
}
function nuEndBrowseResize(e) {
window.nuBROWSERESIZE.mouse_down = false;
window.nuBROWSERESIZE.moving_element = '';
$('.nuBrowseTitle').removeClass('nuBrowseResize');
}
function nuDragBrowseColumn(e, p) {
const targetId = e.target.id;
if (targetId === '' || targetId === 'nuSearchField') { // ctxmenu or Search field
return;
}
// e.preventDefault();
if (window.nuBROWSERESIZE.mouse_down) {
window.nuBROWSERESIZE.pointer = p; // added
const id = window.nuBROWSERESIZE.moving_element;
const offset_limit = 100000000;
const min_offset = 2;
var x = e.pageX;
if (window.nuBROWSERESIZE.pointer == "finger_touch") {
x = e.changedTouches[0].clientX;
}
var x_offset = x - window.nuBROWSERESIZE.x_position;
window.nuBROWSERESIZE.x_position = x;
if (x !== 0 && Math.abs(x_offset) > min_offset) {
if (x_offset < offset_limit) {
let c = Number(id.substr(13));
let m = nuFORM.breadcrumbs[nuFORM.breadcrumbs.length - 1].column_widths[c] + x_offset
if (m < 40) { m = 40; }
nuFORM.breadcrumbs[nuFORM.breadcrumbs.length - 1].column_widths[c] = m;
nuSetBrowseColumns(nuFORM.breadcrumbs[nuFORM.breadcrumbs.length - 1].column_widths)
}
}
}
}
function nuAlign(a) {
const alignmentMap = {
l: 'left',
r: 'right',
c: 'center'
};
return alignmentMap[a] || '';
}
function nuBrowseTableHoverIn() {
if (window.nuBROWSERESIZE.moving_element == '') {
if (this.offsetWidth < this.scrollWidth && !$(this).is('[title]')) {
$(this).attr('title', $(this).html().replace(/(<([^>]+)>)/ig, '')); // Remove HTML tags
}
$("[data-nu-row]").addClass('nuBrowseTable').removeClass('nuSelectBrowse');
window.nuBROWSEROW = -1;
const dataRow = $(this).attr('data-nu-row');
$("[data-nu-row='" + dataRow + "']").not('.nuCellColored').addClass('nuSelectBrowse').removeClass('nuBrowseTable');
}
}
function nuBrowseTableHoverOut() {
if (window.nuBROWSERESIZE.moving_element == '') {
$("[data-nu-row]").addClass('nuBrowseTable').removeClass('nuSelectBrowse');
window.nuBROWSEROW = -1;
const dataRow = $(this).attr('data-nu-row');
$("[data-nu-row='" + dataRow + "']").addClass('nuBrowseTable').removeClass('nuSelectBrowse');
}
}
function nuBrowseTable() {
const currentForm = window.nuFORM.getCurrent();
const browseColumns = currentForm.browse_columns;
const browseRows = currentForm.browse_rows;
const browseRowCount = browseRows.length;
const rowHeight = currentForm.row_height;
const $record = $('#nuRECORD');
let incrementalWidth = 0;
let topOffset = parseInt($('#nuBrowseTitle0').css('height'), 10) - rowHeight - 2;
let leftOffset = 7;
for (let rowIndex = 0; rowIndex < currentForm.rows; rowIndex++) {
leftOffset = 7;
topOffset += rowHeight + 7;
if (browseRowCount === 0 && rowIndex > 0) {
const searchLengthZero = nuCurrentProperties().search.length === 0;
const noDataMessage = searchLengthZero ? 'No data to display' : 'No search results found';
const firstCellClass = searchLengthZero ? 'nuBrowseNoData' : 'nuBrowseNoResults';
$('#nucell_0_0').html(nuTranslate(noDataMessage)).addClass(firstCellClass);
window[`nuBrowseNo${firstCellClass === 'nuBrowseNoData' ? 'Data' : 'SearchResults'}`] = true;
break;
}
for (let colIndex = 0; colIndex < browseColumns.length; colIndex++) {
const columnWidth = Number(browseColumns[colIndex].width);
const id = `nucell_${rowIndex}_${colIndex}`;
const div = nuCreateElementWithId('div', id, 'nuRECORD');
const $div = nuSetObjectBounds(div, topOffset, leftOffset, columnWidth, rowHeight, true);
div.setAttribute('data-nu-row', rowIndex);
div.setAttribute('data-nu-column', colIndex);
div.style.textAlign = nuAlign(browseColumns[colIndex].align);
div.style.overflow = 'hidden';
div.style.padding = (columnWidth < 0 ? 0 : undefined) + 'px';
div.style.borderWidth = (columnWidth < 0 ? 0 : undefined) + 'px';
div.classList.add(`nuCell${(rowIndex / 2 === parseInt(rowIndex / 2, 10)) ? 'Even' : 'Odd'}`);
if (columnWidth === 0) {
$div.hide();
} else {
div.classList.add('nuBrowseTable', 'nuCell');
}
if (rowIndex < browseRows.length) {
const currentColumn = browseColumns[colIndex];
const value = currentColumn.format === '' ? browseRows[rowIndex][colIndex + 1] : nuFORM.addFormatting(browseRows[rowIndex][colIndex + 1], currentColumn.format);
$div.html(value)
.attr('data-nu-primary-key', browseRows[rowIndex][0])
.on('click', (event) => nuInternalSelectBrowse(event, $div[0]))
.on('mouseenter', nuBrowseTableHoverIn)
.on('mouseleave', nuBrowseTableHoverOut);
}
if (rowIndex === 0 && colIndex === 0) {
incrementalWidth = nuTotalWidth(id) - columnWidth;
}
leftOffset += (columnWidth === 0 ? 0 : columnWidth + incrementalWidth);
}
}
const last = `◄`;
const next = `►`;
const pageLabel = ' Page ';
const currentPageInput = ``;
const totalPagesLabel = ' / ' + (currentForm.pages === 0 ? 1 : currentForm.pages) + ' ';
const footerTopOffset = topOffset + rowHeight + 10;
const divFooter = nuCreateElementWithId('div', 'nuBrowseFooter', 'nuRECORD');
$(divFooter)
.addClass('nuBrowseFooter')
.html(last + pageLabel + currentPageInput + totalPagesLabel + next)
.css({
'text-align': 'center'
, width: leftOffset - 7
, top: footerTopOffset
, left: 7
, height: 25
, position: 'absolute'
, padding: '5px 0px'
});
nuHighlightSearch();
nuBrowseBorders();
const totalHeight = footerTopOffset + 130;
const parentDocument = window.parent.document;
$('#nuDragDialog', parentDocument).css({
height: totalHeight + 30
, visibility: 'visible'
, overflow: 'hidden'
});
$('#nuWindow', parentDocument).css({
height: totalHeight - 14
});
$('body').css('height', totalHeight - 30);
$record.css({
height: 0
, width: 0
});
}
function nuBrowseTitleMultiLine() {
$('#nuActionHolder').css({ 'height': '40px' });
$('.nuBrowseTitle').css('top', "-20px");
}
function nuSetBrowseColumnWidth(column, width) {
var cw = this;
if (nuIsIframe()) {
cw = parent.$("#" + window.frameElement.id)[0].contentWindow;
}
cw.nuFORM.breadcrumbs[cw.nuFORM.breadcrumbs.length - 1].column_widths[column] = width;
cw.nuSetBrowseColumns(cw.nuFORM.breadcrumbs[cw.nuFORM.breadcrumbs.length - 1].column_widths);
}
function nuBrowseAdditionalNavButtons() {
if (nuFormType() !== 'browse') {
return;
}
const currentPage = Number($('#browsePage').val());
const lastPage = nuCurrentProperties().pages;
const disabledStyle = {
opacity: '0.3',
'pointer-events': 'none'
};
const firstBtn = ' ';
$(firstBtn).insertBefore('#nuLast');
const endBtn = ` `;
$(endBtn).insertAfter('#nuNext');
if (currentPage === 1) {
$('#nuFirst, #nuLast').css(disabledStyle);
}
if (currentPage === lastPage) {
$('#nuNext, #nuEnd').css(disabledStyle);
}
}
function nuClickSearchColumn(e) {
var c = e.target.id.substr(12);
$('#nuSearchList' + c).trigger( "click" );
nuSetSearchColumn();
}
function nuSetSearchColumn() {
var nosearch = [];
$('.nuSearchCheckbox').each(function (index) {
if (!$(this).is(':checked')) {
nosearch.push(index);
$('#nusort_' + index)
.addClass('nuNoSearch');
} else {
$('#nusort_' + index)
.removeClass('nuNoSearch');
}
});
window.nuFORM.setProperty('nosearch_columns', nosearch);
}
function nuSetNoSearchColumns(columnsArr) {
const s = nuFORM.getCurrent().nosearch_columns;
columnsArr = s.concat(columnsArr);
for (let i = 0; i < columnsArr.length; i++) {
$('#nusort_' + columnsArr[i]).addClass('nuNoSearch');
}
nuFORM.setProperty('nosearch_columns', columnsArr);
}
function nuSetSearchColumns(columnsArr) {
const numBrowseColumns = $(".nuBrowseTitle").length;
let arr = [];
for (let i = 0; i <= numBrowseColumns; i++) {
if (!columnsArr.includes(i)) {
arr.push(i);
}
}
nuSetNoSearchColumns(arr);
}
function nuSearchColumnsReset() {
for (let i = 0; i < $(".nuBrowseTitle").length; i++) {
$('#nusort_' + i).removeClass('nuNoSearch');
}
nuFORM.setProperty('nosearch_columns', []);
}
function nuSearchPressed(e) {
e = e || window.event;
if (e.key !== 'Enter') {
window.nuBROWSEROW = -1;
$('[data-nu-row]').addClass('nuBrowseTable').removeClass('nuSelectBrowse');
return;
}
e.preventDefault();
if (window.nuBROWSEROW === -1) {
$('#nuSearchButton').trigger( "click" );
return;
}
const cellId = `#nucell_${window.nuBROWSEROW}_0`;
nuSelectBrowse('', $(cellId)[0]);
}
function nuArrowPressed(e) {
if (!e) {
e = window.event;
}
if (e.key == 'ArrowUp' || e.key == 'ArrowDown') {
const rows = $("[data-nu-column='0'][data-nu-primary-key]").length - 1;
const targetRow = window.nuBROWSEROW + (e.key === 'ArrowUp' ? -1 : 1);
window.nuBROWSEROW = (targetRow < 0 || targetRow > rows) ? window.nuBROWSEROW : targetRow;
$("[data-nu-row]").addClass('nuBrowseTable').removeClass('nuSelectBrowse');
$("[data-nu-row='" + window.nuBROWSEROW + "']").addClass('nuSelectBrowse').removeClass('nuBrowseTable');
}
}
function nuSearchAction(S, F) {
if (arguments.length > 0) {
$('#nuSearchField').val(S);
}
if (arguments.length == 2) {
$('#nuFilter').val(F);
}
var s = String($('#nuSearchField').val()).nuReplaceAll("'", "'", true);
var f = String($('#nuFilter').val()).nuReplaceAll("'", "'", true);
if (window.nuOnSearchActionGlobal) {
let o = { search: s, filter: f };
if (nuOnSearchActionGlobal(o) === false) { return; }
s = o.search;
f = o.filter;
}
if (window.nuOnSearchAction) {
let o = { search: s, filter: f };
if (nuOnSearchAction(o) === false) { return; }
s = o.search;
f = o.filter;
}
window.nuFORM.setProperty('search', s);
window.nuFORM.setProperty('filter', f);
const caller = nuSearchAction.caller === null ? '' : nuSearchAction.caller.name;
if ((arguments.length === 0 && caller != 'nuGetPage') || arguments.length >= 1) {
window.nuFORM.setProperty('page_number', 0);
}
nuDisable('nuSearchField');
nuGetBreadcrumb();
}
function nuAddAction() {
const bc = window.nuFORM.getCurrent();
if (window.nuOnAddAction) {
if (nuOnAddAction(bc) == false) return;
}
nuForm(bc.redirect_form_id, '-1');
}
function nuRunPHPAction(code) {
nuRunPHP(code);
}
function nuRunReportAction(code) {
nuRunReport(code);
}
function nuEmailReportAction(code) {
nuEmailReport(code);
}
function nuSortBrowse(c) {
var l = window.nuFORM.getCurrent();
l.filter = $('#nuFilter').val();
l.page_number = 0;
if (c == l.sort) {
l.sort_direction = l.sort_direction == 'asc' ? 'desc' : 'asc';
} else {
l.sort = c;
l.sort_direction = 'asc';
}
nuSearchAction();
}
function nuGetPage(p) {
let P = parseInt('00' + p, 10);
if (p > nuCurrentProperties().pages || p === 0) return;
let current = window.nuFORM.getCurrent();
if (P == 0) {
P = 1;
}
if (P > current.pages) {
P = current.pages;
}
current.page_number = P - 1;
nuSearchAction();
}
function nuPopulateLookup(fm, target, setFocus) {
var p = String($('#' + target).attr('data-nu-prefix'));
var f = fm.lookup_values;
window.nuSubformRow = Number(p.slice(-3));
for (var i = 0; i < f.length; i++) {
var id = String(f[i][0]);
var $id = $('#' + id);
if (id.substring(0, p.length) != p) {
$id = $('#' + p + id);
}
$id.addClass('nuEdited');
if ($id.attr('type') == 'checkbox') {
$id.prop('checked', f[i][1] == '1');
} else {
$id.val(f[i][1]);
if ($id.attr('data-nu-format') !== undefined) {
nuReformat($id[0]);
$id.addClass('nuEdited');
$('#' + p + 'nuDelete').prop('checked', false);
if (window.nuOnLookupPopulatedGlobal) {
nuOnLookupPopulatedGlobal(id, p);
}
if (window.nuOnLookupPopulated) {
nuOnLookupPopulated(id, p);
}
}
}
if (i == 1 && setFocus !== false) {
$id.trigger("focus");
}
}
window.nuLOOKUPSTATE[$('#' + target).attr('data-nu-object-id')] = 'found';
nuCalculateForm();
eval(fm.lookup_javascript);
$('#dialogClose').trigger( "click" );
if (window.nuaction == 'save' && !nuLookingUp()) {
nuSaveAction();
}
}
function nuChooseOneLookupRecord(e, fm) {
var o = new nuLookupObject(e.target.id);
var i = o.id_id;
var t = document.getElementById(e.target.id);
var like = nuEncode(fm.lookup_like);
if (fm.lookup_values.length == 0) {
nuGetLookupId('', i);
}
if (fm.lookup_values.length == 1) {
if (e.target.value.toUpperCase() == String(fm.lookup_values[0][1]).toUpperCase()) {
nuGetLookupId(fm.lookup_values[0][0], i);
} else {
nuBuildLookup(t, e.target.value);
}
}
if (fm.lookup_values.length > 1) {
nuBuildLookup(t, e.target.value, like);
}
}
function nuLookupObject(id, set, value) {
const el = $('#' + id);
if (!el.length) {
nuResetLookupProperties(this);
return;
}
const i = nuValidLookupId(nuValidLookupId(id, 'code'), 'description');
nuUpdateLookupProperties(this, i);
if (nuLookupShouldSetValue(value)) {
$('#' + this[set]).val(value);
}
function nuResetLookupProperties(obj) {
const props = ['id_id', 'code_id', 'description_id', 'id_value', 'code_value', 'description_value'];
props.forEach(prop => obj[prop] = '');
}
function nuUpdateLookupProperties(obj, i) {
Object.assign(obj, {
id_id: i,
code_id: i + 'code',
description_id: i + 'description',
id_value: $('#' + i).val(),
code_value: $('#' + i + 'code').val(),
description_value: $('#' + i + 'description').val()
});
}
function nuLookupShouldSetValue(value) {
return value !== undefined && ['id', 'code', 'description'].includes(set);
}
}
function nuValidLookupId(id, fld) {
const i = String(id);
const f = String(fld);
const fl = f.length;
if (i.endsWith(f)) {
const iWithoutF = i.slice(0, -fl);
const elWithF = $('#' + i + f);
const elWithFF = $('#' + i + f + f);
if (elWithF.length === 1 && elWithFF.length === 1) {
return iWithoutF + f;
}
}
return i;
}
function nuHighlightSearch() {
const bc = window.nuFORM.getCurrent().search;
if (!bc || !bc.length) {
return;
}
const exclude = new Set(window.nuFORM.getCurrent().nosearch_columns || []);
const search = bc
.split(' ')
.filter(a => a && a[0] !== '-')
.sort((a, b) => a.length - b.length);
$('.nuBrowseTable').each(function() {
const col = Number($(this).attr('data-nu-column'));
if (!exclude.has(col)) {
search.forEach(term => $(this).nuHighlight(term));
}
});
}
function nuOnSubformDeleteClick(event) {
const id = event.target.id;
const sf = $('#' + id).attr('data-nu-checkbox');
const row = id.substring(sf.length, sf.length + 3);
const checked = $('#' + id).is(":checked");
$('[id^=' + sf + nuPad3(row) + ']')
.not(':button, :checkbox')
.toggleClass('nuSubformDeleteTicked', checked)
.toggleClass('nuReadonly', checked)
.nuEnable(!checked);
}
function nuChangeDeleteClicked(e) {
const sfid = $(e.target).attr('data-nu-checkbox');
const click = $('#' + sfid).attr('data-nu-clickdelete');
nuOnSubformDeleteClick(e);
if (click) eval(click);
nuHasBeenEdited();
nuCalculateForm();
}
function nuChange(e) {
if (e.target.id.endsWith('nuDelete')) {
nuChangeDeleteClicked(e);
return;
}
const t = $('#' + e.target.id)[0];
const $id = $(t);
const prefix = $id.attr('data-nu-prefix');
nuReformat(t);
$('#' + prefix + 'nuDelete').prop('checked', false);
$id.addClass('nuEdited');
$('#nuCalendar').remove();
$id.removeClass('nuValidate');
nuCalculateForm();
if (prefix !== '') {
nuAddSubformRow(t, e);
}
if ($id.attr('data-nu-table-column') != '0') {
nuSetSaved(false);
nuHasBeenEdited();
}
}
function nuChooseEventList() {
if ($('#sob_all_type').val() == 'subform') {
return ['beforeinsertrow', 'afterinsertrow', 'clickdelete'];
}
return ['onchange', 'oninput', 'onclick', 'onblur', 'onnuload', 'onfocus', 'onkeydown'];
}
function nuChangeFile(e) {
if (e.target.id.substr(-8) == 'nuDelete') {
nuHasBeenEdited();
return;
}
var theFile = e.target.id;
var theTextarea = theFile.substr(0, theFile.length - 5);
if ($('#' + theFile).val() == '') { return; }
var a = $('#' + theFile)[0].files[0];
var r = new FileReader();
r.onload = function () {
var f = btoa(r.result);
var o = { 'file': f, 'name': a.name, 'size': a.size, 'type': a.type };
var j = JSON.stringify(o);
if (window.nuOnFileLoad) {
if (nuOnFileLoad(theFile, o) === false) { return; }
} else {
if (j.length > 600000) {
nuMessage([nuTranslate('File is too large, cannot be saved. Must be under 300Kb')]);
return;
}
}
$('#' + theTextarea).val(j).addClass('nuEdited');
};
r.readAsDataURL(a);
var t = $('#' + theFile)[0];
var p = $('#' + theTextarea).attr('data-nu-prefix');
$('#' + p + 'nuDelete').prop('checked', false);
$('#' + theTextarea).addClass('nuEdited');
nuHasBeenEdited();
if (p == '') { return; }
nuAddSubformRow(t, e);
}
function nuCalculateForm(setAsEdited) {
if (window.nuEnableCalculation == false) return;
const subformFirst = (a, b) => {
const A = $('#' + a.id).hasClass('nuSubformObject') ? 0 : 1000;
const B = $('#' + b.id).hasClass('nuSubformObject') ? 0 : 1000;
const orderA = parseInt($('#' + a.id).attr('data-nu-calc-order'), 10);
const orderB = parseInt($('#' + b.id).attr('data-nu-calc-order'), 10);
if (setAsEdited === undefined) {
$('#' + a.id).addClass('nuEdited');
}
return (orderA + A) - (orderB + B);
};
const formulas = $("[data-nu-formula]").toArray();
formulas.sort(subformFirst);
formulas.forEach((formula) => {
$(formula).addClass('nuEdited');
const formulaString = $(formula).attr('data-nu-formula');
const format = $(formula).attr('data-nu-format');
let value = 0;
if (formulaString) {
const computeFormula = new Function('return ' + formulaString);
value = computeFormula();
}
const formattedValue = nuFORM.addFormatting(value, format);
$(formula).val(formattedValue);
if (window.nuCalculated) {
nuCalculated(formula, value, formattedValue);
}
});
}
function nuHasBeenEdited() {
$('.nuSaveButton').addClass('nuSaveButtonEdited');
nuFORM.edited = true;
nuSetSaved(false);
}
function nuHasNotBeenEdited() {
$('.nuSaveButton').removeClass('nuSaveButtonEdited');
nuFORM.edited = false;
nuSetSaved(true);
}
function nuDeleteAction() {
const formCode = nuCurrentProperties().form_code;
const isNuRecord = String(nuRecordId()).startsWith('nu');
const isNuForm = formCode === 'nuform';
if (isNuForm && isNuRecord) {
nuMessage(nuTranslate("nuBuilder's core forms cannot be deleted."));
return ;
}
const confirmMessage = isNuForm ?
nuTranslate("Are you sure you want to delete this form and all its associated objects, events and codes?") :
nuTranslate("Delete This Record?");
if (confirm(confirmMessage)) {
$('#nuDelete').prop('checked', true);
nuUpdateData('delete');
}
}
function nuDeleteAllAction() {
if (confirm(nuTranslate("Delete All Records?"))) {
$('#nuDelete').prop('checked', true);
nuUpdateData('delete', 'all');
}
}
function nuCloneAction() {
window.nuTimesSaved = 0;
$('[data-nu-primary-key]').each(function () {
$(this).attr('data-nu-primary-key', '-1');
});
$('[data-nu-field]').each(function () {
$(this).addClass('nuEdited');
});
window.nuFORM.setProperty('record_id', -1);
$('#nuCloneButton').css('visibility', 'hidden');
$('#nuDeleteButton').css('visibility', 'hidden');
$('.nuSaveButton')
.css('background-color', 'red')
.css('visibility', 'visible');
nuCLONE = true;
nuEmptyNoClone();
var b = $('.nuBreadcrumb').length;
var nb = $('.nuNotBreadcrumb').not('#nuLogout').length;
var bc = b == 0 && nb == 0 ? $('#nuHomeGap') : $('#nuBreadcrumb' + b);
bc.append(' ' + nuTranslate('Cloning') + ' ');
if (window.nuOnClone) {
nuOnClone();
}
}
function nuEmptyNoClone() {
const noclone = nuSERVERRESPONSE.noclone;
if (!noclone || !Array.isArray(noclone)) return;
noclone.forEach(function(item) {
if (item.subform) {
$('#' + item.id + 'scrollDiv .nuSubform1, #' + item.id + 'scrollDiv .nuSubform0').each(function() {
if (this.id !== item.id + '000nuRECORD') {
$(this).remove();
}
});
$('#' + item.id + '000nuRECORD').children().each(function() {
if ($(this).hasClass('nuEdited')) {
$(this).val('');
if ($('#' + this.id + 'button').length) {
$('#' + this.id + 'code, #' + this.id + 'description').val('');
}
}
});
$('#' + item.id + '000nuDelete').prop('checked', true);
$('#' + item.id + '001nuRECORD').remove();
} else {
$('#' + item.id).val('').trigger("change");
}
});
}
function nuIsClone() {
return nuCLONE;
}
function nuIsNewRecord() {
return nuRecordId() == -1 && !nuCLONE;
}
function nuSaveAction(close) {
if (nuCurrentProperties().form_type == 'launch') {
return;
}
window.nuaction = 'save';
if (nuLookingUp()) {
return;
}
if (nuNoDuplicates()) {
nuSaveScrollPositions();
nuUpdateData('save', close ? 'close' : null);
}
window.nuaction = '';
}
function nuSavingProgressMessage() {
$('.nuUpdateMessageProgress').remove();
let div = nuCreateElementWithId('div', 'nuProgressUpdate','nuActionHolder');
$div = $(div);
$div.html('').addClass('nuUpdateMessageProgress');
const left = ($('#nuActionHolder').width() / 2) - ($div.width() / 2);
const top = ($('#nuBreadcrumbHolder').outerHeight() - $div.outerHeight()) / 2;
nuSetObjectBounds(div, top, left, null, null, true);
$('.nuActionButton').hide();
}
function nuShowLastUpdatedMessage() {
if (window.last_action) {
nuUpdateMessage(window.last_action);
window.last_action = "";
}
}
function nuUpdateMessage(actionMessage) {
let msgClass = '';
let msg = actionMessage;
if (actionMessage === 'delete') {
msg = 'Record Deleted';
msgClass = 'nuUpdateMessageDelete';
} else if (actionMessage === 'save') {
msg = 'Record Saved';
msgClass = 'nuUpdateMessageSave';
}
$("#nuProgressUpdate").hide();
let div = nuCreateElementWithId('div', 'nuNowUpdated','nuActionHolder');
$div = $(div);
$div.html(nuTranslate(msg));
$div.addClass('nuUpdateMessage').addClass(msgClass);
const left = ($('#nuActionHolder').width() / 2) - ($div.width() / 2);
const top = ($('#nuBreadcrumbHolder').outerHeight() - $div.outerHeight()) / 2;
nuSetObjectBounds(div, top, left, null, null, true);
$("#nuNowUpdated").fadeToggle(3000);
$('.nuActionButton').show();
}
function nuAbortSave() {
$("#nuProgressUpdate").hide();
$('.nuActionButton').show();
}
function nuSetSaved(v) {
if (window.nuOnSetSaved) {
nuOnSetSaved(v);
}
window.nuSAVED = v;
}
function nuFormsUnsaved() {
let c = 0;
$.each($('iframe'), function () {
let t = $(this)[0];
try {
if (typeof t.contentWindow.nuIsSaved === 'function') {
if (!t.contentWindow.nuIsSaved()) {
c++;
}
}
} catch (e) {
// catch "DOMException: Blocked a frame with origin"
}
})
if (!nuIsSaved()) c++;
return c;
}
function nuAddJavaScript(js) {
var s = document.createElement('script');
s.innerHTML = "\n\n" + js + "\n\n";
$('body').append(s);
}
function nuAddFormStyle(style) {
if (style !== '') {
style = style.replace(/((';
$('#nuRECORD').append(span);
}
}
function nuHashFromEditForm() {
var A = {};
var S = nuSubformObject('');
var B = nuFORM.getCurrent();
if (S.rows.length == 0) { return A; }
for (var key in B) {
A[key] = B[key];
}
for (var i = 0; i < S.fields.length; i++) {
A[S.fields[i]] = S.rows[0][i];
}
return A;
}
function nuDetach() {
$('.nuDragLineV').each(function () {
$(this).appendTo('body')
});
}
function nuSearchableList() {
const bc = window.nuFORM.getCurrent();
const col = bc.browse_columns;
const no = bc.nosearch_columns;
var div = document.createElement('div');
div.setAttribute('id', 'nuSearchableDialog');
$('body').append(div);
$('#nuSearchableDialog')
.addClass('nuSearchableDialog')
.css('width', 150)
.css('height', 30 + (col.length * 20))
.css('top', 10)
.css('left', 10);
for (let i = 0; i < col.length; i++) {
var input = document.createElement('input');
const search = no.indexOf(i) == -1 ? false : true;
input.setAttribute('id', 'nuSearchableCheckbox' + i);
$('#nuSearchableDialog').append(input);
$('#' + 'nuSearchableCheckbox' + i)
.append(input)
.addClass('nuSearchableDialog')
.css('left', 5)
.css('height', 25)
.css('top', 10 + (i * 27))
.checked = search;
if (search) {
$('#' + 'nuSearchableCheckbox' + i)
.addClass('nuNoSearch');
}
var span = document.createElement('span');
span.setAttribute('id', 'nuSearchableTitle' + i);
$('#nuSearchableDialog').append(input);
$('#' + 'nuSearchableTitle' + i)
.append(span)
.addClass('nuSearchableDialog')
.css('width', 25)
.css('left', 25)
.css('height', 25)
.css('top', 10 + (i * 20))
.html(col[i].title);
}
}
function nuWidestTitle(c) {
var w = 120;
for (let i = 0; i < c.length; i++) {
const t = String(c[i].title).replaceAll('
', ' ').replaceAll('', ' ');
w = Math.max(nuGetWordWidth(t), w);
}
return w + 70;
}
function nuGetSearchList() {
var c = nuFORM.getProperty('browse_columns');
var d = document.createElement('div');
$('#nuOptionsListBox').remove();
var widest = nuWidestTitle(c) + 20;
d.setAttribute('id', 'nuSearchList');
$('body').append(d);
$('#' + d.id).css({
'width': widest + 20,
'height': 10 + (c.length * 30),
'top': 138,
'left': (window.innerWidth - widest) < 0 ? 0 : 50,
'position': 'absolute',
'text-align': 'left'
})
.html(' ' + nuTranslate('Include When Searching') + '<\span>')
.addClass('nuOptionsList');
for (var i = 0; i < c.length; i++) {
var isChecked = true;
if ($.inArray(i, nuFORM.getCurrent().nosearch_columns) != '-1') {
isChecked = false;
}
var p = document.createElement('input');
p.setAttribute('id', 'nuSearchList' + i);
p.setAttribute('type', 'checkbox');
$('#' + d.id).append(p);
$('#' + p.id).css({
'width': 20,
'height': 25,
'top': 30 + (i * 25),
'left': 5,
'position': 'absolute',
'text-align': 'left'
})
.prop('checked', isChecked)
.attr('onclick', 'nuSetSearchColumn();')
.addClass('nuSearchCheckbox');
var t = document.createElement('div');
var nobr = String(c[i].title).nuReplaceAll('
', ' ').nuReplaceAll('', ' ');;
t.setAttribute('id', 'nuSearchText' + i);
$('#' + d.id).append(t);
$('#' + t.id).css({
'height': 25,
'top': 33 + (i * 25),
'left': 40,
'position': 'absolute',
'text-align': 'left'
})
.attr('onclick', 'nuClickSearchColumn(event);')
.addClass('nuOptionsItem')
.html(nobr)
.click(function () {
var cb = $('#nuSearchList' + i).attr('checked');
$('#' + 'nuSearchList' + i).attr('checked', !cb);
nuSetSearchColumn();
});
if (i < 9) {
var shortcut_key = document.createElement('div');
var shortcut_key_id = 'nuSearchTextShortcutKey' + i.toString();
shortcut_key.setAttribute('id', shortcut_key_id);
$('#nuSearchList').append(shortcut_key);
var prop = { 'position': 'absolute', 'text-align': 'left', 'height': 15, 'width': 50 };
$('#' + shortcut_key.id)
.css(prop)
.css({ 'top': 37 + (i * 25), 'right': 10 })
.html(nuCtrlCmdShiftName(i+1))
.addClass('nuOptionsItemShortcutKey');
}
}
$('.nuOptionsItem').css({ 'width': widest - 90, 'padding': '3px 0px 0px 3px' });
$('#nuSearchList').css({ 'height': 50 + (c.length * 25) });
nuDragElement($('#nuSearchList')[0], 30);
if (nuIsMobile()) nuHideOptionsItemShortcutKeys();
}
function nuTotal(f) {
return Number(nuFORM.calc(f));
}
function nuMessage(o, timeout, callback) {
window.nuHideMessage = false;
const par = window.document;
$('#nuMessageDiv', par).remove();
if (o.length == 0) { return; }
if (!Array.isArray(o)) {
let tmp = o;
o = [];
o.push(tmp);
}
let widest = 5;
for (let i = 0; i < o.length; i++) {
widest = Math.max(widest, nuGetWordWidth(o[i]));
}
widest = Math.min(widest + 200, 1000);
let w = window.visualViewport.width - 42; //-- subtract padding, border
let l = Math.max(0, $(this).scrollLeft() + (w - widest) / 2);
w = Math.min(w, widest);
$('body', par).append("
");
let msgDiv = $('#nuMessageDiv', par);
for (let i = 0; i < o.length; i++) {
msgDiv.append(o[i]).append('
');
}
if (timeout !== undefined) {
setTimeout(function () {
$('#nuMessageDiv', par).fadeOut("slow");
if (callback !== undefined) {
callback();
}
}, timeout);
}
nuDragElement(msgDiv[0], 30);
return msgDiv;
}
function nuWindowPosition() {
const p = window.parent.document;
let d = $('#nuDragDialog', p);
let {l, t, w, h} = nuObjectPosition(d);
window.nuDialogSize = { left: l, top: t, width: w, height: h };
d = $('#nuWindow', p);
w = parseInt(d.css('width'), 10);
h = parseInt(d.css('height'), 10);
window.nuWindowSize = { width: w, height: h };
}
function nuNoDuplicates() {
window.nuDuplicate = true;
$('.nuTabHolder.nuDuplicate').each(function () {
const $this = $(this);
const tabHolderHtml = $this.html();
const fieldName = $this.attr('data-nu-field');
const sfId = $this.attr('data-nu-subform');
const sfObj = nuSubformObject(sfId);
const uniqueValues = [];
const fieldIndex = sfObj.fields.indexOf(fieldName);
for (let rowIndex = 0; rowIndex < sfObj.rows.length; rowIndex++) {
if (sfObj.deleted[rowIndex] == 0) {
const rowValue = sfObj.rows[rowIndex][fieldIndex];
if (uniqueValues.includes(rowValue)) {
nuMessage([`Duplicate ${tabHolderHtml} on row ${rowIndex}`]);
window.nuDuplicate = false;
return;
}
uniqueValues.push(rowValue);
}
}
});
return window.nuDuplicate;
}
function nuFormType() {
if (nuFORM.getCurrent() == undefined) { return ''; }
return nuRecordId() == '' ? 'browse' : 'edit';
}
function nuFormId() {
if (nuFORM.getCurrent() == undefined) { return ''; }
return nuFORM.getCurrent().form_id;
}
function nuRecordId() {
if (nuFORM.getCurrent() == undefined) { return ''; }
return nuFORM.getCurrent().record_id;
}
function nuBuildFastReport() {
var sf = nuSubformObject('fast_report_sf');
var left = 3;
var rows = sf.rows;
window.nuNextID = 0;
window.nuREPORT = JSON.parse(JSON.stringify(window.nuREPORTdefault));
for (var i = 0; i < rows.length; i++) {
if (sf.deleted[i] == '0') {
var title = rows[i][1];
var field = rows[i][2];
var width = Number(rows[i][3]);
var sum = rows[i][4];
var align = sum == 0 ? 'left' : 'right';
var o = JSON.parse(JSON.stringify(window.nuOBJECT)); //-- title
o.left = Number(left);
o.width = width;
o.top = 70;
o.fieldName = title;
o.objectType = 'label';
o.textAlign = align;
nuFastObject(2, 0, o);
o = JSON.parse(JSON.stringify(window.nuOBJECT)); //-- field
o.left = Number(left);
o.width = width;
o.fieldName = field;
o.textAlign = align;
nuFastObject(0, 0, o);
if (align == 'right') {
o = JSON.parse(JSON.stringify(window.nuOBJECT)); //-- sum
o.left = Number(left);
o.width = width;
o.fieldName = 'SUM(' + field + ')';
o.textAlign = align;
nuFastObject(1, 1, o);
}
left = left + width + 2;
}
}
nuFastReportFormat(left);
$('#fieldlist').val(JSON.stringify(window.nuREPORT));
nuFORM.setProperty('nuREPORT', window.nuREPORT);
}
function nuFastObject(g, s, o) {
o.id = 'obj' + nuPad3(window.nuNextID);
o.name = o.id;
o.left = Number(o.left) + 2;
nuREPORT.groups[g].sections[s].objects.push(o);
window.nuNextID++;
}
function nuNewFastObject() {
var o = JSON.parse(JSON.stringify(window.nuOBJECT));
o.id = 'obj' + nuPad3(window.nuNextID);
o.name = o.id;
window.nuNextID++;
return o;
}
function nuFastReportFormat(width) {
var o = nuNewFastObject(); //-- report title
o.left = 2;
o.top = 10;
o.width = 300;
o.height = 30;
o.fontWeight = 'b';
o.fontSize = '20';
o.objectType = 'label';
nuREPORT.width = 297;
nuREPORT.height = 210;
var pageWidth = 290 * 4;
var sf = nuSubformObject('fast_report_sf');
nuREPORT.orientation = 'L';
nuREPORT.groups[3].sortField = sf.rows[0][2];
nuREPORT.groups[2].sections[0].height = 100;
nuREPORT.groups[2].sections[0].objects.push(o);
o = nuNewFastObject(); //-- underline titles
o.left = 2;
o.top = 93;
o.width = width;
o.height = 1;
o.borderWidth = 1;
o.objectType = 'label';
o.fieldName = 'KEEP EXACT HEIGHT';
nuREPORT.groups[2].sections[0].objects.push(o);
o = nuNewFastObject(); //-- page footer
o.left = 2;
o.top = 3;
o.width = pageWidth;
o.height = 1;
o.borderWidth = 1;
o.objectType = 'label';
o.fieldName = 'KEEP EXACT HEIGHT';
nuREPORT.groups[2].sections[1].objects.push(o);
o = nuNewFastObject(); //-- page footer date
o.left = 2;
o.top = 9;
o.width = 600;
o.fieldName = 'Printed : #day#-#month#-20#year# #hour#:#minute#:#second#';
o.objectType = 'label';
nuREPORT.groups[2].sections[1].objects.push(o);
o = nuNewFastObject(); //-- page footer page no.
o.top = 9;
o.left = pageWidth - 200;
o.width = 200;
o.textAlign = 'right';
o.fieldName = 'Page #page# of #pages#';
o.objectType = 'label';
nuREPORT.groups[2].sections[1].objects.push(o);
if (nuREPORT.groups[1].sections[1].objects.length > 0) {
nuNewFastObject(); //-- overline sums
o.left = 2;
o.top = 3;
o.width = width;
o.height = 1;
o.borderWidth = 1;
o.objectType = 'label';
o.fieldName = 'KEEP EXACT HEIGHT';
nuREPORT.groups[1].sections[1].objects.push(o);
}
}
function nuIsDoubleClick(event, element) {
const now = event.timeStamp;
const lastClickTime = parseInt(element.getAttribute('nu-last-clicked-time')) || 0;
const doubleClickThreshold = 1000;
if (now - lastClickTime > doubleClickThreshold) {
element.setAttribute('nu-last-clicked-time', now.toString());
return false;
} else {
return true;
}
}
function nuInternalSelectBrowse(event, element) {
if (! nuIsDoubleClick(event, element)) {
return nuSelectBrowse(event, element);
}
}
function nuRedefineNuSelectBrowse() {
nuSelectBrowse = function (e, t) {
const y = window.nuBrowseFunction; //-- browse, lookup or custom function name
const pk = $('#' + t.id).attr('data-nu-primary-key');
const formId = window.nuFORM.getProperty('form_id');
const formIdRedirect = window.nuFORM.getProperty('redirect_form_id');
const formType = window.nuFORM.getProperty('form_type');
const ro = window.nuFORM.getProperty('redirect_other_form_id');
if (formType == 'browse' && ro == '' && parent.$('#nuDragDialog').length == 0) {
nuSelectBrowse = function (e, t) { }
return;
}
nuCursor('progress');
if (y == 'browse') {
nuForm(formIdRedirect == '' ? formId : formIdRedirect, pk);
} else if (y == 'lookup') {
window.parent.nuGetLookupId(pk, window.nuTARGET); //-- called from parent window
} else {
window[y](e);
}
if ((nuIsMacintosh() ? e.metaKey : e.ctrlKey) == false) {
nuSelectBrowse = function (e, t) { } //-- so that it doesn't run twice.
}
}
}
function nuSetVerticalTabs() {
let tabHolder = $('#nuTabHolder');
tabHolder.css('display', 'inline-block');
$('.nuTab').css('display', 'block');
$('#nuRecord').css('display', 'inline-block');
$('.nuTab').css('padding', '8px 2px 0px 2px');
tabHolder.css('height', window.innerHeight);
var w = 0;
var s = ' ';
$('.nuTab').each(function () {
$(this).html($(this).html().includes(s) ? $(this).html() : s + $(this).html());
w = Math.max(w, nuGetWordWidth($(this).html()));
});
tabHolder.css('width', w + 30);
$('.nuTab').css('width', w + 30);
window.nuVerticalTabs = true;
}
function nuHasBeenSaved() {
return window.nuTimesSaved;
}
function nuResponseDefault() {
if (nuFormType() == 'edit') {
nuRESPONSIVE.resetDefault('', false);
}
}
function nuResponseWrap() {
if (nuFormType() == 'edit') {
nuRESPONSIVE.setTabsColumn('', false);
}
}
function nuResponseNoWrap() {
if (nuFormType() == 'edit') {
nuRESPONSIVE.setTabsColumn('', true);
}
}
function nuResponsiveWrap(width, wrap) {
if (window.innerWidth >= width) {
nuResponseDefault();
}
if (window.innerWidth < width) {
if (window.innerWidth < wrap) {
nuResponseWrap();
} else {
nuResponseNoWrap();
}
}
}
function nuBrowseBorders() {
var r = nuSERVERRESPONSE.rows;
var c = nuSERVERRESPONSE.browse_columns.length;
for (var i = 0; i < c; i++) {
$('#nucell_0_' + i).addClass('nuBrowseBorderTop');
$('#nucell_' + (r - 1) + '_' + i).addClass('nuBrowseBorderBottom');
}
}
function nuObjectPosition(id) {
const $id = nujQueryObj(id);
const t = parseInt($id.css('top'), 10);
const l = parseInt($id.css('left'), 10);
const h = parseInt($id.css('height'), 10);
const w = parseInt($id.css('width'), 10);
const b = t + h; // bottom
const r = l + w; // right
return {t, l, h, w, b, r};
}
function nuFormWH() {
let width = 0;
let height = 0;
let s = '[data-nu-object-id][data-nu-prefix=""], [data-nu-subform=true]';
if (nuSERVERRESPONSE.record_id == -2) {
s = '[data-nu-object-id]';
}
$(s).each(function () {
let {t, l, h, w} = nuObjectPosition($(this).attr('id'));
width = Math.max(width, w + l);
height = Math.max(height, h + t);
});
return { 'width': width, 'height': height };
}
function nuResizeFormDialogCoordinates() {
const wh = nuFormWH();
let w = wh.width;
let h = wh.height;
w = w + 40;
h = h + nuDialogHeadersHeight() + 50;
const parentDocument = window.parent.document;
const windowInnerHeight = window.innerHeight;
const $body = $('body');
let dragDlg = $('#nuDragDialog', parentDocument);
if (dragDlg.length == 0) { return; }
dragDlg.css('visibility', 'visible');
dragDlg.css('width', w + 12);
$('#nuWindow', parentDocument).css('width', w);
$body.css('width', w);
dragDlg.css('height', h + 50).css('visibility', 'visible');
$('#nuWindow', parentDocument).css('height', h + 10);
$body.css('height', windowInnerHeight);
if (h < windowInnerHeight) {
$body.css('height', '100%');
} else {
$body.css('height', h);
}
if (w > window.innerWidth) {
let html = window.innerHTML;
$('#nuBreadcrumbHolder').css('width', html);
$('#nuTabHolder').css('width', html);
$('#nuActionHolder').css('width', html);
}
}
function nuClickTab(t, s) {
t = "nuTab" + t;
if (arguments.length == 2) {
t = s + t;
}
nuSelectTab($('#' + t)[0]);
}
function nuFilterRun(id, filter) {
const r = JSON.parse(JSON.stringify(nuSERVERRESPONSE));
let o = -1;
for (let i = 0; i < r.objects.length; i++) {
const obj = r.objects[i];
if (obj.id == id) {
if (filter) {
if (obj.filter == filter) { return; }
obj.filter = filter;
}
o = i;
}
}
if (o == -1) { return; }
nuRUN(r, o, '', '', r);
}
function nuRecordRun(id, filter) {
const r = JSON.parse(JSON.stringify(nuSERVERRESPONSE));
let o = -1;
for (let i = 0; i < r.objects.length; i++) {
const obj = r.objects[i];
if (obj.id == id) {
if (filter) {
if (obj.record_id == filter) { return; }
obj.record_id = filter;
}
o = i;
}
}
if (o == -1) { return; }
nuRUN(r, o, '', '', r);
}
function nuGetIframeValue(f, o, method) {
const obj = $('#' + f).contents().find('#' + o)
return (!method || method == 'val') ? obj.val() : obj.html();
}
function nuSetIframeValue(f, o, v, method) {
const obj = $('#' + f).contents().find('#' + o)
return (!method || method == 'val') ? obj.val(v) : obj.html(v);
}
function nuLookingUp() {
for (let lu in window.nuLOOKUPSTATE) {
if (window.nuLOOKUPSTATE[lu] == 'looking') {
// nuMessage([nuTranslate('A Lookup is still being populated...')]);
return true;
}
}
return false;
}
function nuPortraitScreen(columns) {
function nuPortraitScreenObjDimensions(id, jId) {
let height = jId.outerHeight()
if (jId.is('[data-select2-id]')) {
height = jId.data('nu-org-height') + 50;
}
if (!jId.is("[nu-mobileview-hidden]")) {
width = Math.max(width, jId.outerWidth());
}
let heightLabel = $('#label_' + id).length == 0 ? 0 : $('#label_' + id).outerHeight()
return { height, width, heightLabel }
}
$('#nubody').css('transform', 'scale(1)');
if (nuFormType() == 'browse') { return; }
window.nuPORTRAITSCREEN = true;
$('.nuBuilderLink').remove();
if (arguments.length == 0) { columns = 1; }
$('.nuPortraitTab').remove();
const obj = nuSERVERRESPONSE.objects;
var lw = columns == 1 ? 0 : nuPortraitLabelWidth(obj);
var top = 0;
var b = -1;
var width = 0;
let oWidth = 0;
let oTop = 0;
for (let i = 0; i < obj.length; i++) {
let oType = obj[i].type;
let id = obj[i].id;
let jId = $('#' + id);
let { height, width, heightLabel } = nuPortraitScreenObjDimensions(id, jId)
const jtab = $('#nuTab' + obj[i].tab);
let tabVisible = jtab.nuIsVisible()
if (obj[i].tab != b && tabVisible && ! window.nuPortraitScreenShowTabTitles == false ) {
if ($('.nuTab').length > 1) {
b = obj[i].tab;
const l = jtab.html();
const d = '' + l + '
';
$('#nuRECORD').append(d);
const OH = $('#nuPort' + b).outerHeight()
top = top + OH + 5;
}
}
tabVisible = jtab.nuIsVisible() || $('.nuTab').length == 1;
if (jId.is("[nu-mobileview-hidden]") || !tabVisible) {
let {componentIds} = nuObjectComponents(id);
for (let c = 0; c < componentIds.length; c++) {
let comp = $('#' + componentIds[c]);
comp.attr('nu-mobileview-hidden', '');
comp.hide();
}
} else {
if (obj[i].read != 2) {
if (oType == 'contentbox') {
jId.attr('nu-mobileview-hidden', '');
jId.hide();
} else {
$('#label_' + id).css({ 'top': top + 2, 'left': 7, 'text-align': 'left', 'font-weight': 700 });
const sameRow = jId.is('[data-nu-same-row]');
if (columns == 1 && !sameRow) {
top = top + heightLabel + 5;
}
if (jId.is('[data-select2-id]')) {
jId = $('#' + id + '_select2');
}
if (sameRow) {
const spacing = jId.attr('data-nu-same-row') || 0
jId.css({ 'top': oTop, 'left': Number(oWidth) + Number(spacing) });
} else {
jId.css({ 'top': top, 'left': lw + 10 });
}
if (oType == 'lookup') {
const w = $('#' + id + 'code').outerWidth()
const d = $('#' + id + 'description').outerWidth()
width = Math.max(width, w + d + 30);
$('#' + id + 'code').css({ 'top': top, 'left': lw + 10 });
$('#' + id + 'button').css({ 'top': top, 'left': lw + w + 15 });
top += 35;
$('#' + id + 'description').css({ 'top': top, 'left': lw + 10, 'width': w - 5 });
} else if (obj[i].input == 'file') {
top += 5;
$('#' + id + '_file').css({ 'top': top, 'left': lw + 10 });
top += 5;
}
oWidth = lw + 10 + Number(obj[i].width);
oTop = top;
if (!sameRow) {
top = top + height + 5;
}
}
}
}
}
$("[data-nu-tab!='x'][data-nu-form='']:not([data-nu-lookup-id]):not([nu-mobileview-hidden])").show();
$('#nuTabHolder').hide();
top = top + 50;
$('#nuRECORD').append('
');
if (columns == 1) {
$('label').css('text-align', 'right').css({ 'width': width, 'text-align': 'left', 'left': 12 });
} else {
$('label').css('text-align', 'left').css('width', lw);
}
var objectWidth = width + lw + 50;
var screenWidth = window.innerWidth;
var scale = screenWidth / (objectWidth);
$('#nubody').css('width', objectWidth).css('transform', 'scale(' + scale + ')')
$('html,body').scrollTop(0).scrollLeft(0);
window.scrollTo(0, 0);
$('#nuBreadcrumbHolder').css('width', window.visualViewport.width);
return scale;
}
function nuMobileView(mobileView) {
if (nuUXOptions.nuMobileView && mobileView == '1') {
if (nuFormType() == 'edit') {
nuPortraitScreen();
$('button').css('text-align', 'left');
} else {
$('#nuBreadcrumbHolder').css('width', window.visualViewport.width);
}
}
}
function nuPortraitLabelWidth(o) {
var w = 0
$('label').css('width', '');
for (var i = 0; i < o.length; i++) {
w = nuGetWordWidth($('#label_' + o[i].id).html());
}
return w + 15;
}
function nuGetBrowsePaginationInfo() {
// Number of rows displayed per page
const rowsPerPage = $("div[id^='nucell_']" + "[id$='_1']").length;
// Get current form data
const currentFormData = nuFORM.getCurrent();
// Extract relevant pagination details
const currentPageNumber = currentFormData.page_number;
const totalFilteredRows = currentFormData.browse_filtered_rows;
const totalPages = currentFormData.pages;
// Variables to hold calculated values
let startRow;
let endRow;
// Logic to determine start and end rows based on pagination state
if (currentPageNumber == 0 && totalFilteredRows > 0 && totalPages == 1) {
// Special case: Single page with results
startRow = 1;
endRow = totalFilteredRows;
} else if (totalPages == currentPageNumber + 1 || totalFilteredRows == 0) {
// Last page or no results
startRow = totalFilteredRows == 0 ? 0 : currentPageNumber * rowsPerPage + 1;
endRow = totalFilteredRows;
} else if (currentPageNumber == 0 && totalPages > 1) {
// First page with multiple pages
startRow = 1;
endRow = rowsPerPage;
} else if (currentPageNumber > 0 && currentPageNumber < totalPages) {
// Any middle page
endRow = (currentPageNumber + 1) * rowsPerPage;
startRow = endRow - rowsPerPage + 1;
}
// Return the calculated pagination details
return {
startRow: startRow,
endRow: endRow,
totalRows: totalFilteredRows
};
}
function nuShowBrowsePaginationInfo(f) {
if (nuFormType() == 'browse') {
var {
startRow
, endRow
, totalRows
} = nuGetBrowsePaginationInfo();
if (f === 'default')
f = '{StartRow} - {EndRow} ' + nuTranslate('of') + ' ' + '{TotalRows}';
const p = f.nuFormat({ StartRow: startRow, EndRow: endRow, TotalRows: totalRows });
$('#nuBrowseFooter').append('');
}
}
function nuPrintEditForm(hideObjects, showObjects) {
// hide some elements before calling the print dialog
$('#nuBreadcrumbHolder').hide();
$('#nuTabHolder').hide();
$('.nuActionButton').hide();
if (!hideObjects) {
hideObjects = [];
}
if (!showObjects) {
showObjects = [];
}
for (let i = 0; i < hideObjects.length; i++) {
nuHide(hideObjects[i]);
}
for (let i = 0; i < showObjects.length; i++) {
nuShow(hideObjects[i]);
}
window.onafterprint = function () {
$(window).off('mousemove', window.onafterprint);
// Show the elements again when the dialog closes
$('#nuBreadcrumbHolder').show();
$('#nuTabHolder').show();
$('.nuActionButton').show();
for (let i = 0; i < hideObjects.length; i++) {
nuShow(hideObjects[i]);
}
for (let i = 0; i < showObjects.length; i++) {
nuHide(hideObjects[i]);
}
};
window.print();
setTimeout(function () {
$(window).one('mousemove', window.onafterprint);
}, 1);
}
function nuAddBrowseAdditionalNavButtons() {
if (nuFormType() == 'browse') {
var disabled = {
'opacity': '0.3',
'pointer-events': 'none'
};
var currentPage = Number($('#browsePage').val());
var lastPage = nuCurrentProperties().pages;
var html = ' ';
$(html).insertBefore("#nuLast");
html = ' ';
$(html).insertAfter("#nuNext");
if (currentPage == 1) {
$('#nuFirst').css(disabled);
$('#nuLast').css(disabled);
}
if (currentPage == lastPage) {
$('#nuNext').css(disabled);
$('#nuEnd').css(disabled);
}
}
}
class nuPromptModal {
constructor() {
this.modalElement = document.getElementById('nupromptmodal');
this.promptElement = document.getElementById('nuprompt');
this.headElement = document.getElementById('nuprompthead');
this.bodyElement = document.getElementById('nupromptbody');
this.footElement = document.getElementById('nupromptfoot');
}
displayModal(visible = false) {
const displayStyle = visible ? "block" : "none";
this.modalElement.style.display = this.promptElement.style.display = displayStyle;
}
setPosition() {
const winW = window.innerWidth;
const winH = window.innerHeight;
this.modalElement.style.height = `${winH}px`;
this.promptElement.style.left = `${(winW / 2) - (560 / 2)}px`;
this.promptElement.style.top = "5px";
}
render(text, caption, defaultValue, format, fctn) {
this.setPosition();
this.displayModal(true);
this.headElement.innerHTML = caption;
this.bodyElement.innerHTML =
`${text}
`;
this.footElement.innerHTML =
` `;
const inputElement = document.getElementById("prompt_value1");
inputElement.value = nuDefine(defaultValue,'')
inputElement.onkeyup = (e) => this.handleKeyup(e, fctn);
inputElement.focus();
}
handleKeyup(e, fctn) {
if (e.key === "Enter") {
this.ok(fctn);
} else if (e.key === "Escape") {
this.cancel(fctn);
}
}
cancel(fctn) {
window[fctn](null, false);
this.displayModal(false);
}
ok(fctn) {
const value = document.getElementById('prompt_value1')
.value;
window[fctn](value, true);
this.displayModal(false);
}
}
function nuPrompt(text, caption, defaultValue, format, fctn) {
if (!document.getElementById('nupromptmodal')) {
const nuPromptDiv =
`
`;
document.body.insertAdjacentHTML('beforeend', nuPromptDiv);
nuPromptWindow = new nuPromptModal();
}
fctn = nuDefine(fctn, 'nuOnPromptClose');
nuPromptWindow.render(text, caption, defaultValue, format, fctn);
}
function nuOnPromptClose(val, ok) {
}
function nuAddBrowseTitleSelect(index, data, w) {
if (!Array.isArray(data)) return;
var id = "nuBrowseTitle" + index + "_select";
var list = document.createElement('select');
list.setAttribute("id", id);
if (w === undefined) {
w = nuCurrentProperties().column_widths == 0 ? nuCurrentProperties().browse_columns[index].width : nuCurrentProperties().column_widths[index] - 3;
}
list.setAttribute('style', 'width:' + w + 'px');
var is1DArray = data[0][0] === undefined;
data.forEach(function (a) {
var opt = document.createElement('option');
opt.value = is1DArray ? a : a[0];
opt.innerHTML = is1DArray ? a : a[1];
list.appendChild(opt);
});
var obj = $('#nuBrowseTitle' + index);
obj.append('
').append(list);
$('#' + id).on('change', function () {
nuSetProperty(this.id, this.value);
nuSearchAction();
});
obj.on('mousedown', '> select', function (e) {
e.stopPropagation();
});
$("#" + id).val(nuGetProperty(id));
return $('#' + id);
}
function nuDatalistValueRestoreValue(i) {
let t = $('#' + i);
if (t.val() === '') {
if (t.attr('org-placeholder') !== t.attr('placeholder')) {
t.val(t.attr('placeholder'));
}
t.attr('placeholder', '');
if (t.val() === '') {
t.attr('placeholder', t.attr('org-placeholder'));
}
}
}
// Show all dropdown items when clicking on the datalist arrow down button
function nuDatalistShowAllOnArrowClick(i) {
$('#' + i)
.on('click', function (e) {
let t = $(this);
if ((t.width() - (e.clientX - t.offset().left)) < 14) {
if (t.val() !== "") {
t.attr('placeholder', t.val());
t.val('');
}
} else {
nuDatalistValueRestoreValue(i)
}
})
.on('mouseleave', function () {
nuDatalistValueRestoreValue(this.id);
})
.on('mouseenter', function () {
if (!$(this).is("[org-placeholder]")) $(this).attr('org-placeholder', $(this).attr('placeholder'));
})
}
function nuSetSelect2(id, obj) {
let $id = $('#' + id);
$id.attr('date-nu-select2', 1);
let select2Id = $('#' + id).attr('id') + "_select2";
let lang = (nuSERVERRESPONSE.language === null ? 'en' : nuSERVERRESPONSE.language.toLowerCase());
let select2OptionsDefault = {
dropdownParent: $('#nuRECORD'),
selectionCssClass: select2Id,
theme: nuUXOptions.nuSelect2Theme ? nuUXOptions.nuSelect2Theme : 'default',
language: lang
// placeholder: $id.attr('placeholder')
};
let objSelect2OptionsDefault = { options: select2OptionsDefault };
let select2UserOptions = [];
if (typeof window.nuOnSetSelect2Options === 'function') {
select2UserOptions = window.nuOnSetSelect2Options(id, objSelect2OptionsDefault);
}
let select2Options = Object.assign(select2UserOptions, objSelect2OptionsDefault.options);
// select2Options = {...objSelect2OptionsDefault.options, ...select2UserOptions};
$id.data('nu-org-height', $id.outerHeight());
$id.select2(select2Options);
$('.' + select2Id).parent().parent().css({
position: 'absolute',
width: Number(obj.width),
top: Number(obj.top),
left: Number(obj.left)
}).attr('id', select2Id);
return select2Id;
}
function nuSelectAddEnglishOption(id) {
var lang = $('#' + id);
if (lang.val() === '') {
lang.append($('