UNIFIAPI v0.3
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled

This commit is contained in:
jokob-sk
2025-08-10 21:24:17 +10:00
parent dce8c34064
commit 1319c3380d
5 changed files with 207 additions and 94 deletions

View File

@@ -11,7 +11,7 @@ on:
- rewrite - rewrite
jobs: jobs:
docker_dev: docker_rewrite:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 30 timeout-minutes: 30
permissions: permissions:

View File

@@ -182,10 +182,6 @@ function showModalPopupForm(
$(`#${prefix}-cancel`).html(btnCancel); $(`#${prefix}-cancel`).html(btnCancel);
$(`#${prefix}-OK`).html(btnOK); $(`#${prefix}-OK`).html(btnOK);
if (callbackFunction != null) {
modalCallbackFunction = callbackFunction;
}
if (triggeredBy != null) { if (triggeredBy != null) {
$('#'+prefix).attr("data-myparam-triggered-by", triggeredBy) $('#'+prefix).attr("data-myparam-triggered-by", triggeredBy)
} }
@@ -242,6 +238,31 @@ function showModalPopupForm(
// $(`#${prefix}-field`).focus(); // $(`#${prefix}-field`).focus();
// }, 500); // }, 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 // Show modal
$(`#${prefix}`).modal("show"); $(`#${prefix}`).modal("show");
} }

View File

@@ -993,6 +993,96 @@ function genListWithInputSet(options, valuesArray, targetField, transformers, pl
$("#" + placeholder).replaceWith(listHtml); $("#" + 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 // Generate the form control for setting

View File

@@ -133,7 +133,7 @@
<div class="modal-footer"> <div class="modal-footer">
<button id="modal-form-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button> <button id="modal-form-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
<button id="modal-form-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" onclick="modalDefaultForm()"> OK </button> <button id="modal-form-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" > OK </button>
</div> </div>
</div> </div>

View File

@@ -553,7 +553,7 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX
}, 1500); }, 1500);
} else { } else {
var settingsArray = []; let settingsArray = [];
// collect values for each of the different input form controls // collect values for each of the different input form controls
// get settings to determine setting type to store values appropriately // 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"] setType = set["setType"]
setCodeName = set["setKey"] setCodeName = set["setKey"]
// console.log(prefix); settingsArray = collectSetting(prefix, setCodeName, setType, settingsArray)
const setTypeObject = JSON.parse(processQuotes(setType)) // // console.log(prefix);
// console.log(setTypeObject);
const dataType = setTypeObject.dataType; // const setTypeObject = JSON.parse(processQuotes(setType))
// // console.log(setTypeObject);
// get the element with the input value(s) // const dataType = setTypeObject.dataType;
let elements = setTypeObject.elements.filter(element => element.elementHasInputValue === 1);
// if none found, take last // // get the element with the input value(s)
if(elements.length == 0) // let elements = setTypeObject.elements.filter(element => element.elementHasInputValue === 1);
{
elementWithInputValue = setTypeObject.elements[setTypeObject.elements.length - 1]
} else
{
elementWithInputValue = elements[0]
}
const { elementType, elementOptions = [], transformers = [] } = elementWithInputValue; // // if none found, take last
const { // if(elements.length == 0)
inputType, // {
readOnly, // elementWithInputValue = setTypeObject.elements[setTypeObject.elements.length - 1]
isMultiSelect, // } else
isOrdeable, // {
cssClasses, // elementWithInputValue = elements[0]
placeholder, // }
suffix,
sourceIds,
separator,
editable,
valRes,
getStringKey,
onClick,
onChange,
customParams,
customId,
columns,
base64Regex,
elementOptionsBase64
} = handleElementOptions('none', elementOptions, transformers, val = "");
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`) // if (dataType === "string" && elementWithInputValue.elementType === "datatable" ) {
settingsArray.push([prefix, setCodeName, dataType, btoa(JSON.stringify(value))]);
} else if (dataType === "string" || // value = collectTableData(`#${setCodeName}_table`)
(dataType === "integer" && (inputType === "number" || inputType === "text"))) { // settingsArray.push([prefix, setCodeName, dataType, btoa(JSON.stringify(value))]);
value = $('#' + setCodeName).val(); // } else if (dataType === "string" ||
value = applyTransformers(value, transformers); // (dataType === "integer" && (inputType === "number" || inputType === "text"))) {
settingsArray.push([prefix, setCodeName, dataType, value]); // value = $('#' + setCodeName).val();
// value = applyTransformers(value, transformers);
} else if (inputType === 'checkbox') { // settingsArray.push([prefix, setCodeName, dataType, value]);
value = $(`#${setCodeName}`).is(':checked') ? 1 : 0; // } else if (inputType === 'checkbox') {
if(dataType === "boolean") // value = $(`#${setCodeName}`).is(':checked') ? 1 : 0;
{
value = value == 1 ? "True" : "False";
}
value = applyTransformers(value, transformers); // if(dataType === "boolean")
settingsArray.push([prefix, setCodeName, dataType, value]); // {
// value = value == 1 ? "True" : "False";
// }
} else if (dataType === "array" ) { // value = applyTransformers(value, transformers);
// settingsArray.push([prefix, setCodeName, dataType, value]);
let temps = []; // } else if (dataType === "array" ) {
if(isOrdeable) // let temps = [];
{
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() { // if(isOrdeable)
const vl = $(this).val(); // {
if (vl !== '') { // temps = $(`#${setCodeName}`).val()
temps.push(applyTransformers(vl, transformers)); // } else
} // {
}); // // make sure to collect all if set as "editable" or selected only otherwise
} // $(`#${setCodeName}`).attr("my-editable") == "true" ? additionalSelector = "" : additionalSelector = ":selected";
value = JSON.stringify(temps); // $(`#${setCodeName} option${additionalSelector}`).each(function() {
// const vl = $(this).val();
// if (vl !== '') {
// temps.push(applyTransformers(vl, transformers));
// }
// });
// }
settingsArray.push([prefix, setCodeName, dataType, value]); // value = JSON.stringify(temps);
// settingsArray.push([prefix, setCodeName, dataType, value]);
} else if (dataType === "none") { // } else if (dataType === "none") {
// no value to save // // no value to save
value = "" // value = ""
settingsArray.push([prefix, setCodeName, dataType, value]); // settingsArray.push([prefix, setCodeName, dataType, value]);
} else if (dataType === "json") { // } else if (dataType === "json") {
value = $('#' + setCodeName).val(); // value = $('#' + setCodeName).val();
value = applyTransformers(value, transformers); // value = applyTransformers(value, transformers);
value = JSON.stringify(value, null, 2) // value = JSON.stringify(value, null, 2)
settingsArray.push([prefix, setCodeName, dataType, value]); // 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 = $('#' + setCodeName).val();
value = applyTransformers(value, transformers); // value = applyTransformers(value, transformers);
console.error(`[saveSettings] Saving value "${value}"`); // console.error(`[saveSettings] Saving value "${value}"`);
settingsArray.push([prefix, setCodeName, dataType, value]); // settingsArray.push([prefix, setCodeName, dataType, value]);
} // }
}); });
// sanity check to make sure settings were loaded & collected correctly // sanity check to make sure settings were loaded & collected correctly