Setting template work + vendors fix

This commit is contained in:
Jokob-sk
2023-08-05 09:37:32 +10:00
parent 4fbaccc0f2
commit d5f8cdda7d
7 changed files with 115 additions and 51 deletions

View File

@@ -173,66 +173,111 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
// go thru all settings and collect settings per settings group
settingsData.forEach((set) => {
let val = set['Value'];
const codeName = set['Code_Name'];
const setType = set['Type'].toLowerCase();
const isMetadata = codeName.includes('__metadata');
// is this isn't a metadata entry, get corresponding metadata object from the dummy setting
const setObj = isMetadata ? {} : JSON.parse(getSetting(`${codeName}__metadata`));
// constructing final HTML for the setting
setHtml = ""
if(set["Group"] == group)
{
// hide metadata by default by assigning it a special class
const isMetadata = set['Code_Name'].includes('__metadata');
// hide metadata by default by assigning it a special class
isMetadata ? metadataClass = 'metadata' : metadataClass = '';
isMetadata ? infoIcon = '' : infoIcon = `<i
my-to-toggle="row_${set['Code_Name']}__metadata"
my-to-toggle="row_${codeName}__metadata"
title="${getString("Settings_Metadata_Toggle")}"
class="fa fa-circle-question pointer"
onclick="toggleMetadata(this)">
</i>` ;
// NAME & DESCRIPTION columns
setHtml += `
<div class="row table_row ${metadataClass}" id="row_${set['Code_Name']}">
<div class="row table_row ${metadataClass}" id="row_${codeName}">
<div class="table_cell setting_name bold">
<label>${getString(set['Code_Name'] + '_name', set['Display_Name'])}</label>
<label>${getString(codeName + '_name', set['Display_Name'])}</label>
<div class="small">
<code>${set['Code_Name']}</code>${infoIcon}
<code>${codeName}</code>${infoIcon}
</div>
</div>
<div class="table_cell setting_description">
${getString(set['Code_Name'] + '_description', set['Description'])}
${getString(codeName + '_description', set['Description'])}
</div>
<div class="table_cell setting_input input-group">
`;
// Render different input types based on the settings type
let input = "";
// OVERRIDE
// surface settings override functionality if the setting is a template that can be overriden with user defined values
// if the setting is a json of the correct structure, handle like a template setting
const setType = set['Type'].toLowerCase();
let overrideHtml = "";
//pre-check if this is a json object that needs value extraction
let overridable = false;
let override = false;
let overrideValue = val;
// TODO finish
if ('override_value' in setObj) {
overridable = true;
const overrideObj = setObj["override_value"]
const override = overrideObj["override"];
overrideValue = overrideObj["value"];
console.log(isJsonObject(val))
console.log(setObj)
console.log(group)
}
if(overridable)
{
let checked = override;
overrideHtml = `<div class="override">
<span class="overrideText" title="${getString("Setting_Override_Description")}">
${getString("Setting_Override")}
</span>
<span class="overrideCheck">
<input onChange="overrideToggle()" my-data-type="${setType}" class="checkbox" id="${codeName}_override" type="checkbox" ${checked} />
</span>
</div>`;
}
// INPUT
// pre-processing done, render setting based on type
let inputHtml = "";
if (setType.startsWith('text') || setType.startsWith('string') || setType.startsWith('date-time') ) {
if(setType.includes(".select"))
{
input = generateInputOptions(set, input, isMultiSelect = false)
inputHtml = generateInputOptions(set, inputHtml, isMultiSelect = false)
} else if(setType.includes(".multiselect"))
{
input = generateInputOptions(set, input, isMultiSelect = true)
inputHtml = generateInputOptions(set, inputHtml, isMultiSelect = true)
} else{
input = `<input class="form-control" onChange="settingsChanged()" my-data-type="${setType}" id="${set['Code_Name']}" value="${set['Value']}"/>`;
inputHtml = `<input class="form-control" onChange="settingsChanged()" my-data-type="${setType}" id="${codeName}" value="${val}"/>`;
}
} else if (setType === 'integer') {
input = `<input onChange="settingsChanged()" my-data-type="${setType}" class="form-control" id="${set['Code_Name']}" type="number" value="${set['Value']}"/>`;
inputHtml = `<input onChange="settingsChanged()" my-data-type="${setType}" class="form-control" id="${codeName}" type="number" value="${val}"/>`;
} else if (setType === 'password') {
input = `<input onChange="settingsChanged()" my-data-type="${setType}" class="form-control input" id="${set['Code_Name']}" type="password" value="${set['Value']}"/>`;
inputHtml = `<input onChange="settingsChanged()" my-data-type="${setType}" class="form-control input" id="${codeName}" type="password" value="${val}"/>`;
} else if (setType === 'readonly') {
input = `<input class="form-control input" my-data-type="${setType}" id="${set['Code_Name']}" value="${set['Value']}" readonly/>`;
inputHtml = `<input class="form-control input" my-data-type="${setType}" id="${codeName}" value="${val}" readonly/>`;
} else if (setType === 'boolean' || setType === 'integer.checkbox') {
let checked = set['Value'] === 'True' || set['Value'] === '1' ? 'checked' : '';
input = `<input onChange="settingsChanged()" my-data-type="${setType}" class="checkbox" id="${set['Code_Name']}" type="checkbox" value="${set['Value']}" ${checked} />`;
let checked = val === 'True' || val === '1' ? 'checked' : '';
inputHtml = `<input onChange="settingsChanged()" my-data-type="${setType}" class="checkbox" id="${codeName}" type="checkbox" value="${val}" ${checked} />`;
} else if (setType === 'integer.select') {
input = generateInputOptions(set, input)
inputHtml = generateInputOptions(set, inputHtml)
} else if (setType === 'subnets') {
input = `
inputHtml = `
<div class="row form-group">
<div class="col-xs-5">
<input class="form-control" id="ipMask" type="text" placeholder="192.168.1.0/24"/>
@@ -245,55 +290,55 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
</div>
</div>
<div class="form-group">
<select class="form-control" my-data-type="${setType}" name="${set['Code_Name']}" id="${set['Code_Name']}" multiple readonly>`;
<select class="form-control" my-data-type="${setType}" name="${codeName}" id="${codeName}" multiple readonly>`;
options = createArray(set['Value']);
options = createArray(val);
options.forEach(option => {
input += `<option value="${option}" disabled>${option}</option>`;
inputHtml += `<option value="${option}" disabled>${option}</option>`;
});
input += '</select></div>' +
inputHtml += '</select></div>' +
'<div><button class="btn btn-primary" onclick="removeInterfaces()">Remove all</button></div>';
} else if (setType === 'list') {
} else if (setType === 'list' || setType === 'list.readonly') {
settingKeyOfLists.push(set['Code_Name']);
settingKeyOfLists.push(codeName);
input = `
inputHtml = `
<div class="row form-group">
<div class="col-xs-9">
<input class="form-control" type="text" id="${set['Code_Name']}_input" placeholder="Enter value"/>
<input class="form-control" type="text" id="${codeName}_input" placeholder="Enter value"/>
</div>
<div class="col-xs-3">
<button class="btn btn-primary" my-input-from="${set['Code_Name']}_input" my-input-to="${set['Code_Name']}" onclick="addList(this)">Add</button>
<button class="btn btn-primary" my-input-from="${codeName}_input" my-input-to="${codeName}" onclick="addList(this)">Add</button>
</div>
</div>
<div class="form-group">
<select class="form-control" my-data-type="${setType}" name="${set['Code_Name']}" id="${set['Code_Name']}" multiple readonly>`;
<select class="form-control" my-data-type="${setType}" name="${codeName}" id="${codeName}" multiple readonly>`;
let options = createArray(set['Value']);
let options = createArray(val);
options.forEach(option => {
input += `<option value="${option}" disabled>${option}</option>`;
inputHtml += `<option value="${option}" disabled>${option}</option>`;
});
input += '</select></div>' +
`<div><button class="btn btn-primary" my-input="${set['Code_Name']}" onclick="removeFromList(this)">Remove last</button></div>`;
inputHtml += '</select></div>' +
`<div><button class="btn btn-primary" my-input="${codeName}" onclick="removeFromList(this)">Remove last</button></div>`;
} else if (setType === 'json') {
input = `<textarea class="form-control input" my-data-type="${setType}" id="${set['Code_Name']}" readonly>${JSON.stringify(set['Value'], null, 2)}</textarea>`;
inputHtml = `<textarea class="form-control input" my-data-type="${setType}" id="${codeName}" readonly>${JSON.stringify(val, null, 2)}</textarea>`;
}
// EVENTS
// process events (e.g. run ascan, or test a notification) if associated with the setting
let eventsHtml = "";
const eventsList = createArray(set['Events']);
console.log(eventsList)
const eventsList = createArray(set['Events']);
if (eventsList.length > 0) {
eventsList.forEach(event => {
eventsHtml += `<span class="input-group-addon pointer"
data-myparam="${set['Code_Name']}"
data-myparam="${codeName}"
data-myevent="${event}"
onclick="handleEvent(this)"
>
@@ -302,8 +347,9 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
</span>`;
});
}
setHtml += input + eventsHtml + `
// construct final HTML for the setting
setHtml += inputHtml + eventsHtml + overrideHtml + `
</div>
</div>
`
@@ -318,7 +364,11 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
}
//
// ---------------------------------------------------------
// generate a list of options for a input select
function generateInputOptions(set, input, isMultiSelect = false)
{
@@ -338,7 +388,8 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
return input;
}
// todo fix
// ---------------------------------------------------------
// Generate an array object from a string representation of an array
function createArray(input) {
// Empty array
if (input === '[]') {