diff --git a/front/js/settings_utils.js b/front/js/settings_utils.js index 4b903728..cfc0f7ff 100755 --- a/front/js/settings_utils.js +++ b/front/js/settings_utils.js @@ -245,18 +245,28 @@ function settingsCollectedCorrectly(settingsArray, settingsJSON_DB) { // ------------------------------------------------------------------- // --------------------------------------------------------- -function addList(element) +function addList(element, clearInput = true) { const fromId = $(element).attr('my-input-from'); const toId = $(element).attr('my-input-to'); + + input = $(`#${fromId}`).val(); + + console.log(input); + console.log(toId); + console.log($(`#${toId}`)); + $(`#${toId}`).append($("").attr("value", input).text(input)); // clear input - $(`#${fromId}`).val(""); - + if (clearInput) + { + $(`#${fromId}`).val(""); + } + settingsChanged(); } // --------------------------------------------------------- @@ -340,6 +350,8 @@ function initListInteractionOptions(selectorId) { // Perform action based on click count if (clickCounter === 1) { // Single-click action + // btoa(iconHtml.replace(/"/g, "'") <-- encode + // atob() <--- decode showModalFieldInput( ` ${getString('Gen_Update_Value')}`, getString('settings_update_item_warning'), @@ -480,7 +492,7 @@ function getParam(targetId, key, skipCache = false) { // --------------------------------------------------------- // generate a list of options for a input select - function generateInputOptions(pluginsData, set, input, isMultiSelect = false) + function generateOptions(pluginsData, set, input, isMultiSelect = false, isValueSource = true) { multi = isMultiSelect ? "multiple" : ""; @@ -492,15 +504,19 @@ function getParam(targetId, key, skipCache = false) { var targetLocation = set['Code_Name'] + "_initSettingDropdown"; // execute AJAX callabck + SQL query resolution - initSettingDropdown(set['Code_Name'] , valuesArray, targetLocation, generateDropdownOptions) + initSettingDropdown(set['Code_Name'] , valuesArray, targetLocation, generateDropdownOptions); + // generate different ID depending on if it's the source for the value to be saved or only used as an input + isValueSource ? id = set['Code_Name'] : id = set['Code_Name'] + '_input'; + // main selection dropdown wrapper input += ` `; } else if (setType === 'integer.select') { - inputHtml = generateInputOptions(pluginsData, set, inputHtml) + inputHtml = generateOptions(pluginsData, set, inputHtml) } else if (setType === 'subnets') { // --- process subnets --- @@ -543,18 +538,20 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX ${getString("Gen_Remove_All")} `; - } else if (setType === 'list' || setType === 'list.select' || setType === 'list.readonly') { + } else if (setType.startsWith('list')) { // --- process list --- - settingKeyOfLists.push(codeName); - inputHtml += `
` if(setType.includes(".select")) // not tested { - inputHtml += generateInputOptions(pluginsData, set, inputHtml, isMultiSelect = false) + inputHtml += generateOptions(pluginsData, set, inputHtml, isMultiSelect = false, isValueSource = false) + } + else if(setType.includes(".multiselect")) + { + inputHtml += generateOptions(pluginsData, set, inputHtml, isMultiSelect = true) } else { @@ -565,7 +562,7 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX inputHtml += `
- +
@@ -623,7 +620,7 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX $(`#${prefix} .panel-body`).append(setHtml); // init remove and edit listitem click gestures - if(['subnets', 'list' ].includes(setType)) + if(['subnets'].includes(setType) || setType.startsWith('list')) { initListInteractionOptions(codeName) } @@ -640,8 +637,6 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX } - - // display the name of the first person // echo $settingsJson[0]->name; var settingsNumberDB = ; @@ -671,52 +666,58 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX var settingsArray = []; // collect values for each of the different input form controls - const noConversion = ['text', 'integer', 'string', 'password', 'readonly', 'text.select', 'list.select', 'integer.select', 'text.multiselect']; + const noConversion = ['text', 'integer', 'string', 'password', 'readonly', 'text.select', 'integer.select', 'text.multiselect']; // get settings to determine setting type to store values appropriately $.get('api/table_settings.json?nocache=' + Date.now(), function(res) { - - settingsJSON = res; + // loop through the settings definitions from the json + res["data"].forEach(set => { + + prefix = set["Group"] + setType = set["Type"] + setCodeName = set["Code_Name"] + + if (noConversion.includes(setType)) { + + settingsArray.push([prefix, setCodeName, setType, $('#'+setCodeName).val()]); + + } else if (setType === 'boolean' || setType === 'integer.checkbox') { - data = settingsJSON["data"]; - - data.forEach(set => { - if (noConversion.includes(set['Type'])) { - - settingsArray.push([set["Group"], set["Code_Name"], set["Type"], $('#'+set["Code_Name"]).val()]); - - } else if (set['Type'] === 'boolean' || set['Type'] === 'integer.checkbox') { - - const temp = $(`#${set["Code_Name"]}`).is(':checked') ? 1 : 0; - settingsArray.push([set["Group"], set["Code_Name"], set["Type"], temp]); + const temp = $(`#${setCodeName}`).is(':checked') ? 1 : 0; + settingsArray.push([prefix, setCodeName, setType, temp]); - } else if (set['Type'] === 'list' || set['Type'] === 'subnets') { + } else if (setType.startsWith('list') || setType === 'subnets') { + const temps = []; - $(`#${set["Code_Name"]} option`).each(function (i, selected) { + $(`#${setCodeName} option`).each(function (i, selected) { const vl = $(selected).val(); if (vl !== '') { temps.push(vl); } }); - settingsArray.push([set["Group"], set["Code_Name"], set["Type"], JSON.stringify(temps)]); - } else if (set['Type'] === 'json') { - const temps = $('#'+set["Code_Name"]).val(); - settingsArray.push([set["Group"], set["Code_Name"], set["Type"], temps]); - } else if (set['Type'] === 'password.SHA256') { + + settingsArray.push([prefix, setCodeName, setType, JSON.stringify(temps)]); + } else if (setType === 'json') { + const temps = $('#'+setCodeName).val(); + settingsArray.push([prefix, setCodeName, setType, temps]); + } else if (setType === 'password.SHA256') { // save value as SHA256 if value isn't SHA256 already - var temps = $('#'+set["Code_Name"]).val(); + var temps = $('#'+setCodeName).val(); if(temps != "" && !isSHA256(temps)) { temps = CryptoJS.SHA256(temps).toString(CryptoJS.enc.Hex); } - settingsArray.push([set["Group"], set["Code_Name"], set["Type"], temps]); + settingsArray.push([prefix, setCodeName, setType, temps]); } }); // sanity check to make sure settings were loaded & collected correctly if(settingsCollectedCorrectly(settingsArray, settingsJSON_DB)) { + + // console.log(settingsArray); + // trigger a save settings event in the backend $.ajax({ method: "POST", diff --git a/server/helper.py b/server/helper.py index 13b82320..77b7420e 100755 --- a/server/helper.py +++ b/server/helper.py @@ -314,7 +314,7 @@ def get_setting_value(key): # Convert the setting value to the corresponding python type def setting_value_to_python_type(set_type, set_value): - value = '' + value = '----not processed----' # Handle different types of settings if set_type in ['text', 'string', 'password', 'password.SHA256', 'readonly', 'text.select']: @@ -332,23 +332,35 @@ def setting_value_to_python_type(set_type, set_value): elif set_type in ['integer.select', 'integer']: value = int(set_value) - # belwo covers 'text.multiselect', 'list', 'subnets', 'list.select', 'textarea.list', 'list' - elif set_type in ['text.multiselect', 'list', 'subnets', 'list.select', 'textarea.list'] or 'list' in set_type: - # Handle string + # belwo covers 'text.multiselect', 'list', 'subnets', 'list.select', 'list' + elif set_type in ['subnets' ] or 'list' in set_type: mylog('debug', [f'[SETTINGS] Handling set_type: "{set_type}", set_value: "{set_value}"']) + # Handle string if isinstance(set_value, str): value = json.loads(set_value.replace("'", "\"")) - # Assuming set_value is a list in this case - elif isinstance(set_value, list): + + # Assuming set_value is a list at this point + if isinstance(set_value, list): + if 'base64' in set_type: + tmp_value = [] + for item in set_value: + tmp_value.append(base64.b64decode(item)) + + set_value = tmp_value + value = set_value + elif set_type == '.template': # Assuming set_value is a JSON object in this case value = json.loads(set_value) - else: + + # log debug info if not processed + if value == '----not processed----': mylog('none', [f'[SETTINGS] ⚠ ERROR - set_type not handled:{set_type}']) - mylog('none', [f'[SETTINGS] ⚠ ERROR - setting json:{json.dumps(setting)}']) + mylog('none', [f'[SETTINGS] ⚠ ERROR - setting json:{json.dumps(set_value)}']) + value = '' return value