From 1319c3380d724a883bb8e04458d093c9d646f3fa Mon Sep 17 00:00:00 2001 From: jokob-sk Date: Sun, 10 Aug 2025 21:24:17 +1000 Subject: [PATCH] UNIFIAPI v0.3 --- .github/workflows/docker_rewrite.yml | 2 +- front/js/modal.js | 29 ++++- front/js/settings_utils.js | 90 ++++++++++++++ front/php/templates/modals.php | 2 +- front/settings.php | 178 ++++++++++++++------------- 5 files changed, 207 insertions(+), 94 deletions(-) diff --git a/.github/workflows/docker_rewrite.yml b/.github/workflows/docker_rewrite.yml index 72e0a835..df1e49c9 100755 --- a/.github/workflows/docker_rewrite.yml +++ b/.github/workflows/docker_rewrite.yml @@ -11,7 +11,7 @@ on: - rewrite jobs: - docker_dev: + docker_rewrite: runs-on: ubuntu-latest timeout-minutes: 30 permissions: diff --git a/front/js/modal.js b/front/js/modal.js index 404c06d9..eb6dfba7 100755 --- a/front/js/modal.js +++ b/front/js/modal.js @@ -182,10 +182,6 @@ function showModalPopupForm( $(`#${prefix}-cancel`).html(btnCancel); $(`#${prefix}-OK`).html(btnOK); - if (callbackFunction != null) { - modalCallbackFunction = callbackFunction; - } - if (triggeredBy != null) { $('#'+prefix).attr("data-myparam-triggered-by", triggeredBy) } @@ -242,6 +238,31 @@ function showModalPopupForm( // $(`#${prefix}-field`).focus(); // }, 500); + // Bind OK button click event + $(`#${prefix}-OK`).off("click").on("click", function() { + let settingsArray = []; + if (Array.isArray(popupFormJson)) { + popupFormJson.forEach(field => { + collectSetting( + `${parentSettingKey}_popupform`, // prefix + field.function + '_in', // setCodeName + sourceSuffixes + field.type, // setType (object) + settingsArray + ); + }); + } + + console.log("Collected popup form settings:", settingsArray); + + if (typeof modalCallbackFunction === "function") { + modalCallbackFunction(settingsArray); + } + + $(`#${prefix}`).modal("hide"); +}); + + + // Show modal $(`#${prefix}`).modal("show"); } diff --git a/front/js/settings_utils.js b/front/js/settings_utils.js index 10340c51..f639fb0e 100755 --- a/front/js/settings_utils.js +++ b/front/js/settings_utils.js @@ -993,6 +993,96 @@ function genListWithInputSet(options, valuesArray, targetField, transformers, pl $("#" + placeholder).replaceWith(listHtml); } +// ----------------------------------------------------------------- +// Collects a setting based on code name +function collectSetting(prefix, setCodeName, setType, settingsArray) { + // Parse setType if it's a JSON string + const setTypeObject = (typeof setType === "string") + ? JSON.parse(processQuotes(setType)) + : setType; + + const dataType = setTypeObject.dataType; + + // Pick element with input value + let elements = setTypeObject.elements.filter(el => el.elementHasInputValue === 1); + let elementWithInputValue = elements.length === 0 + ? setTypeObject.elements[setTypeObject.elements.length - 1] + : elements[0]; + + const { elementType, elementOptions = [], transformers = [] } = elementWithInputValue; + + const opts = handleElementOptions('none', elementOptions, transformers, val = ""); + + // Map of handlers + const handlers = { + datatableString: () => { + const value = collectTableData(`#${setCodeName}_table`); + return btoa(JSON.stringify(value)); + }, + simpleValue: () => { + let value = $(`#${setCodeName}`).val(); + return applyTransformers(value, transformers); + }, + checkbox: () => { + let value = $(`#${setCodeName}`).is(':checked') ? 1 : 0; + if (dataType === "boolean") { + value = value === 1 ? "True" : "False"; + } + return applyTransformers(value, transformers); + }, + array: () => { + let temps = []; + if (opts.isOrdeable) { + temps = $(`#${setCodeName}`).val(); + } else { + const sel = $(`#${setCodeName}`).attr("my-editable") === "true" ? "" : ":selected"; + $(`#${setCodeName} option${sel}`).each(function() { + const vl = $(this).val(); + if (vl !== '') { + temps.push(applyTransformers(vl, transformers)); + } + }); + } + return JSON.stringify(temps); + }, + none: () => "", + json: () => { + let value = $(`#${setCodeName}`).val(); + value = applyTransformers(value, transformers); + return JSON.stringify(value, null, 2); + }, + fallback: () => { + console.error(`[collectSetting] Couldn't determine how to handle (${setCodeName}|${dataType}|${opts.inputType})`); + let value = $(`#${setCodeName}`).val(); + return applyTransformers(value, transformers); + } + }; + + // Select handler key + let handlerKey; + if (dataType === "string" && elementType === "datatable") { + handlerKey = "datatableString"; + } else if (dataType === "string" || + (dataType === "integer" && (opts.inputType === "number" || opts.inputType === "text"))) { + handlerKey = "simpleValue"; + } else if (opts.inputType === "checkbox") { + handlerKey = "checkbox"; + } else if (dataType === "array") { + handlerKey = "array"; + } else if (dataType === "none") { + handlerKey = "none"; + } else if (dataType === "json") { + handlerKey = "json"; + } else { + handlerKey = "fallback"; + } + + const value = handlers[handlerKey](); + settingsArray.push([prefix, setCodeName, dataType, value]); + + return settingsArray; +} + // ------------------------------------------------------------------------------ // Generate the form control for setting diff --git a/front/php/templates/modals.php b/front/php/templates/modals.php index 59df01f3..f7432290 100755 --- a/front/php/templates/modals.php +++ b/front/php/templates/modals.php @@ -133,7 +133,7 @@ diff --git a/front/settings.php b/front/settings.php index 59ad87c3..3e4344b4 100755 --- a/front/settings.php +++ b/front/settings.php @@ -553,7 +553,7 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX }, 1500); } else { - var settingsArray = []; + let settingsArray = []; // collect values for each of the different input form controls // get settings to determine setting type to store values appropriately @@ -565,121 +565,123 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX setType = set["setType"] setCodeName = set["setKey"] - // console.log(prefix); + settingsArray = collectSetting(prefix, setCodeName, setType, settingsArray) - const setTypeObject = JSON.parse(processQuotes(setType)) - // console.log(setTypeObject); + // // console.log(prefix); - const dataType = setTypeObject.dataType; + // const setTypeObject = JSON.parse(processQuotes(setType)) + // // console.log(setTypeObject); - // get the element with the input value(s) - let elements = setTypeObject.elements.filter(element => element.elementHasInputValue === 1); + // const dataType = setTypeObject.dataType; - // if none found, take last - if(elements.length == 0) - { - elementWithInputValue = setTypeObject.elements[setTypeObject.elements.length - 1] - } else - { - elementWithInputValue = elements[0] - } + // // get the element with the input value(s) + // let elements = setTypeObject.elements.filter(element => element.elementHasInputValue === 1); - const { elementType, elementOptions = [], transformers = [] } = elementWithInputValue; - const { - inputType, - readOnly, - isMultiSelect, - isOrdeable, - cssClasses, - placeholder, - suffix, - sourceIds, - separator, - editable, - valRes, - getStringKey, - onClick, - onChange, - customParams, - customId, - columns, - base64Regex, - elementOptionsBase64 - } = handleElementOptions('none', elementOptions, transformers, val = ""); + // // if none found, take last + // if(elements.length == 0) + // { + // elementWithInputValue = setTypeObject.elements[setTypeObject.elements.length - 1] + // } else + // { + // elementWithInputValue = elements[0] + // } - let value; + // const { elementType, elementOptions = [], transformers = [] } = elementWithInputValue; + // const { + // inputType, + // readOnly, + // isMultiSelect, + // isOrdeable, + // cssClasses, + // placeholder, + // suffix, + // sourceIds, + // separator, + // editable, + // valRes, + // getStringKey, + // onClick, + // onChange, + // customParams, + // customId, + // columns, + // base64Regex, + // elementOptionsBase64 + // } = handleElementOptions('none', elementOptions, transformers, val = ""); - if (dataType === "string" && elementWithInputValue.elementType === "datatable" ) { + // let value; - value = collectTableData(`#${setCodeName}_table`) - settingsArray.push([prefix, setCodeName, dataType, btoa(JSON.stringify(value))]); + // if (dataType === "string" && elementWithInputValue.elementType === "datatable" ) { - } else if (dataType === "string" || - (dataType === "integer" && (inputType === "number" || inputType === "text"))) { + // value = collectTableData(`#${setCodeName}_table`) + // settingsArray.push([prefix, setCodeName, dataType, btoa(JSON.stringify(value))]); + + // } else if (dataType === "string" || + // (dataType === "integer" && (inputType === "number" || inputType === "text"))) { - value = $('#' + setCodeName).val(); - value = applyTransformers(value, transformers); + // value = $('#' + setCodeName).val(); + // value = applyTransformers(value, transformers); - settingsArray.push([prefix, setCodeName, dataType, value]); + // settingsArray.push([prefix, setCodeName, dataType, value]); - } else if (inputType === 'checkbox') { + // } else if (inputType === 'checkbox') { - value = $(`#${setCodeName}`).is(':checked') ? 1 : 0; + // value = $(`#${setCodeName}`).is(':checked') ? 1 : 0; - if(dataType === "boolean") - { - value = value == 1 ? "True" : "False"; - } + // if(dataType === "boolean") + // { + // value = value == 1 ? "True" : "False"; + // } - value = applyTransformers(value, transformers); - settingsArray.push([prefix, setCodeName, dataType, value]); + // value = applyTransformers(value, transformers); + // settingsArray.push([prefix, setCodeName, dataType, value]); - } else if (dataType === "array" ) { + // } else if (dataType === "array" ) { - let temps = []; + // let temps = []; - if(isOrdeable) - { - temps = $(`#${setCodeName}`).val() - } else - { - // make sure to collect all if set as "editable" or selected only otherwise - $(`#${setCodeName}`).attr("my-editable") == "true" ? additionalSelector = "" : additionalSelector = ":selected"; + // if(isOrdeable) + // { + // temps = $(`#${setCodeName}`).val() + // } else + // { + // // make sure to collect all if set as "editable" or selected only otherwise + // $(`#${setCodeName}`).attr("my-editable") == "true" ? additionalSelector = "" : additionalSelector = ":selected"; - $(`#${setCodeName} option${additionalSelector}`).each(function() { - const vl = $(this).val(); - if (vl !== '') { - temps.push(applyTransformers(vl, transformers)); - } - }); - } + // $(`#${setCodeName} option${additionalSelector}`).each(function() { + // const vl = $(this).val(); + // if (vl !== '') { + // temps.push(applyTransformers(vl, transformers)); + // } + // }); + // } - value = JSON.stringify(temps); + // value = JSON.stringify(temps); - settingsArray.push([prefix, setCodeName, dataType, value]); + // settingsArray.push([prefix, setCodeName, dataType, value]); - } else if (dataType === "none") { - // no value to save - value = "" - settingsArray.push([prefix, setCodeName, dataType, value]); + // } else if (dataType === "none") { + // // no value to save + // value = "" + // settingsArray.push([prefix, setCodeName, dataType, value]); - } else if (dataType === "json") { + // } else if (dataType === "json") { - value = $('#' + setCodeName).val(); - value = applyTransformers(value, transformers); - value = JSON.stringify(value, null, 2) - settingsArray.push([prefix, setCodeName, dataType, value]); + // value = $('#' + setCodeName).val(); + // value = applyTransformers(value, transformers); + // value = JSON.stringify(value, null, 2) + // settingsArray.push([prefix, setCodeName, dataType, value]); - } else { + // } else { - console.error(`[saveSettings] Couldn't determine how to handle (setCodeName|dataType|inputType):(${setCodeName}|${dataType}|${inputType})`); + // console.error(`[saveSettings] Couldn't determine how to handle (setCodeName|dataType|inputType):(${setCodeName}|${dataType}|${inputType})`); - value = $('#' + setCodeName).val(); - value = applyTransformers(value, transformers); - console.error(`[saveSettings] Saving value "${value}"`); - settingsArray.push([prefix, setCodeName, dataType, value]); - } + // value = $('#' + setCodeName).val(); + // value = applyTransformers(value, transformers); + // console.error(`[saveSettings] Saving value "${value}"`); + // settingsArray.push([prefix, setCodeName, dataType, value]); + // } }); // sanity check to make sure settings were loaded & collected correctly