Fix bug in login functionality***

***Refactor code for better performance***

***Add new feature to search functionality***

***Update UI design for better user experience***

***Fix typo in variable name***

***Implement error handling for edge case scenario***

***Optimize database queries for faster response time***

***Add unit tests for improved code coverage***

***Update dependencies to latest versions***

***Remove unused code and files
This commit is contained in:
buzzcode2007 2024-04-03 15:27:39 +08:00
parent eeb4de89cc
commit c34b3df700

View file

@ -11,7 +11,7 @@ import logging from "/gui/scripts/logging.JS";
@param {string} PARAMETER_CHECK Determine which parameter to check via regular expressions. @param {string} PARAMETER_CHECK Determine which parameter to check via regular expressions.
@return {object} the data @return {object} the data
*/ */
export async function read(DATA_NAME, CLOUD = 0, PARAMETER_TEST = null) { export async function read(DATA_NAME, CLOUD = 0) {
// Initialize the selected pref data. // Initialize the selected pref data.
let DATA = {}, let DATA = {},
DATA_ALL = {}, DATA_ALL = {},
@ -77,11 +77,10 @@ export async function read(DATA_NAME, CLOUD = 0, PARAMETER_TEST = null) {
@param {dictionary} DATA_ALL the data @param {dictionary} DATA_ALL the data
@param {object} DATA_PATH the path of the data @param {object} DATA_PATH the path of the data
@param {object} PARAMETER_TEST what among the value to test
@return {object} the data @return {object} the data
*/ */
function find_data(DATA_ALL, DATA_PATH, PARAMETER_TEST) { function find_data(DATA_ALL, DATA_PATH) {
let DATA_SELECTED = DATA_ALL; let DATA = DATA_ALL;
// Pull the data out. // Pull the data out.
if ( if (
@ -90,59 +89,19 @@ export async function read(DATA_NAME, CLOUD = 0, PARAMETER_TEST = null) {
let DATA_PATH_SELECTED = String(DATA_PATH.shift()).trim(); let DATA_PATH_SELECTED = String(DATA_PATH.shift()).trim();
// Get the selected data. // Get the selected data.
DATA_SELECTED = DATA_ALL[DATA_PATH_SELECTED]; DATA = DATA_ALL[DATA_PATH_SELECTED];
// must run if there is actually a parameter to test // must run if there is actually a parameter to test
if ( if (DATA_PATH.length > 0) {
DATA_PATH.length > 0 ||
((PARAMETER_TEST != null ? PARAMETER_TEST.length > 0 : false)
? PARAMETER_TEST[`field`]
: false)
) {
// Recursively run to make use of the existing data. // Recursively run to make use of the existing data.
DATA_SELECTED = find_data(DATA_SELECTED, DATA_PATH, PARAMETER_TEST); DATA = find_data(DATA, DATA_PATH);
}
} else if (
PARAMETER_TEST
? !!PARAMETER_TEST[`field`] && !!PARAMETER_TEST[`test value`]
: false
) {
let QUALIFIED = false;
let DATA_SELECTED_KEYS = Object.keys(DATA_SELECTED);
// Perform a sequential search.
for (
let DATA_SELECTED_KEY_INDEX = 0;
DATA_SELECTED_KEY_INDEX < DATA_SELECTED_KEYS.length && !QUALIFIED;
DATA_SELECTED_KEY_INDEX++
) {
PARAMETER_TEST[`value`] =
DATA_SELECTED[DATA_SELECTED_KEYS[DATA_SELECTED_KEY_INDEX]][
PARAMETER_TEST[`field`]
];
if (PARAMETER_TEST[`value`]) {
QUALIFIED =
new RegExp(String(PARAMETER_TEST[`value`])).test(
PARAMETER_TEST[`test value`],
) || PARAMETER_TEST[`test value`].includes(PARAMETER_TEST[`value`]);
}
if (QUALIFIED) {
DATA_SELECTED =
DATA_SELECTED[DATA_SELECTED_KEYS[DATA_SELECTED_KEY_INDEX]];
break;
}
}
if (!QUALIFIED) {
DATA_SELECTED = null;
} }
} else { } else {
return null; return null;
} }
// Now return the data. // Now return the data.
return DATA_SELECTED; return DATA;
} }
// Read data from local and sync storage (asynchronous operations) // Read data from local and sync storage (asynchronous operations)
@ -161,7 +120,7 @@ export async function read(DATA_NAME, CLOUD = 0, PARAMETER_TEST = null) {
Object.keys(DATA_ALL).forEach((DATA_SOURCE) => { Object.keys(DATA_ALL).forEach((DATA_SOURCE) => {
if (DATA_ALL[DATA_SOURCE]) { if (DATA_ALL[DATA_SOURCE]) {
DATA[DATA_SOURCE] = DATA_NAME DATA[DATA_SOURCE] = DATA_NAME
? find_data(DATA_ALL[DATA_SOURCE], DATA_NAME, PARAMETER_TEST) ? find_data(DATA_ALL[DATA_SOURCE], DATA_NAME)
: DATA_ALL[DATA_SOURCE]; : DATA_ALL[DATA_SOURCE];
} }
}); });
@ -187,8 +146,8 @@ export async function read(DATA_NAME, CLOUD = 0, PARAMETER_TEST = null) {
@param {Array} ADDITIONAL_PLACES additional places to search @param {Array} ADDITIONAL_PLACES additional places to search
@return {Array} the results @return {Array} the results
*/ */
export function search(SOURCE, TERM, VALUE, ADDITIONAL_PLACES, STRICT = false) { export async function search(SOURCE, TERM, ADDITIONAL_PLACES, STRICT = false) {
let DATA = read(SOURCE); let DATA = await read(SOURCE);
let RESULTS; let RESULTS;
if (DATA) { if (DATA) {
@ -196,16 +155,20 @@ export function search(SOURCE, TERM, VALUE, ADDITIONAL_PLACES, STRICT = false) {
if (TERM) { if (TERM) {
// Sequentially search through the data, first by key. // Sequentially search through the data, first by key.
for (let DATA_NAME in Object.keys(DATA)) { let key_number = {"total": (Object.keys(DATA)).length, "current": 0};
if (STRICT) {
while (key_number[`current`] < key_number[`total`]) {
let DATA_NAME = (Object.keys(DATA))[key_number[`current`]]
if ( if (
STRICT STRICT
? DATA_NAME == TERM ? DATA_NAME == TERM
: DATA_NAME.includes(TERM) || TERM.includes(DATA_NAME) : (DATA_NAME.includes(TERM) || TERM.includes(DATA_NAME))
) { ) {
RESULTS[`DATA_NAME`] = DATA[DATA_NAME]; RESULTS[DATA_NAME] = DATA[DATA_NAME];
}
} }
key_number[`current`]++;
} }
// Then, get the additional places. // Then, get the additional places.
@ -214,34 +177,44 @@ export function search(SOURCE, TERM, VALUE, ADDITIONAL_PLACES, STRICT = false) {
? ADDITIONAL_PLACES.length > 0 ? ADDITIONAL_PLACES.length > 0
: false : false
) { ) {
for (let FIELD_NAME in ADDITIONAL_PLACES) { for (let PARAMETER_PRIORITY_NUMBER = 0; PARAMETER_PRIORITY_NUMBER < ADDITIONAL_PLACES.length; PARAMETER_PRIORITY_NUMBER++) {
let RESULT = read(SOURCE, 0, { // Recursively search
field: FIELD_NAME, RESULTS = Object.assign({}, RESULTS, search(SOURCE, TERM, ADDITIONAL_PLACES[PARAMETER_PRIORITY_NUMBER], STRICT));
"test value": TERM, };
});
if (RESULT) {
RESULTS = Object.assign(
{},
RESULTS,
search(SOURCE, null, RESULT, null, true),
);
} }
} else if (((typeof ADDITIONAL_PLACES).includes(`str`) && (ADDITIONAL_PLACES)) ? ADDITIONAL_PLACES.trim() : false) {
// Perform a sequential search on the data.
if ((typeof DATA).includes(`obj`) && !Array.isArray(DATA) && SOURCE != null) {
let VALUE = {};
VALUE[`test`] = TERM;
for (let DICTIONARY_INDEX = 0; DICTIONARY_INDEX < (Object.keys(DATA)).length; DICTIONARY_INDEX) {
VALUE[`parent`] = DATA[(Object.keys(DATA))[DICTIONARY_INDEX]];
if (((typeof VALUE[`parent`]).includes(`obj`) && !Array.isArray(VALUE[`parent`]) && VALUE[`parent`] != null) ? (Object.keys(VALUE[`parent`])).length > 0 : false ) {
VALUE[`current`] = (VALUE[`parent`])[`test`];
} }
if (VALUE[`current`]) {
// Add the data.
RESULTS[(Object.keys(DATA))[DICTIONARY_INDEX]] = DATA;
} }
} else if (VALUE) { };
for (let ENTRY in (typeof SOURCE).includes(`obj`) && } else {
!Array.isArray(SOURCE) && for (let ELEMENT_INDEX = 0; ELEMENT_INDEX < DATA.length; ELEMENT_INDEX++) {
SOURCE != null
? Object.keys(SOURCE)
: SOURCE) {
if ( if (
(typeof SOURCE).includes(`obj`) && !Array.isArray(SOURCE) ((STRICT || (typeof DATA[ELEMENT_INDEX]).includes(`num`)) && DATA[ELEMENT_INDEX] == TERM) ||
? SOURCE[ENTRY] == VALUE ((!STRICT && !((typeof DATA[ELEMENT_INDEX]).includes(`num`)))
? (TERM.includes(DATA[ELEMENT_INDEX]) || DATA[ELEMENT_INDEX].includes(TERM) ||
(typeof(DATA[ELEMENT_INDEX])).includes(`str`)
? new RegExp(DATA[ELEMENT_INDEX]).test(TERM)
: false : false
) : false
)
) { ) {
RESULTS[ENTRY] = VALUE; RESULTS[SOURCE] = DATA;
} else if (SOURCE[ENTRY] == VALUE) { break;
RESULTS[SOURCE.indexOf(ENTRY)] = VALUE; }
} }
} }
} }