diff --git a/front/deviceDetails.php b/front/deviceDetails.php index 7608c181..bcd49102 100755 --- a/front/deviceDetails.php +++ b/front/deviceDetails.php @@ -627,7 +627,7 @@ - + diff --git a/front/devices.php b/front/devices.php index e00bed5c..53ec392e 100755 --- a/front/devices.php +++ b/front/devices.php @@ -25,7 +25,6 @@ checkPermissions([$dbPath, $confPath]); ?> -
@@ -251,7 +250,11 @@ function main () { handleLoadingDialog() // Hide UI elements as per settings - hideUIelements("UI_DEV_SECTIONS") + // setTimeout(() => { + hideUIelements("UI_DEV_SECTIONS") + + // }, 10); + // get from cookie if available (need to use decodeURI as saved as part of URI in PHP) cookieColumnsVisibleStr = decodeURI(getCookie("Front_Devices_Columns_Visible")).replaceAll('%2C',',') diff --git a/front/js/common.js b/front/js/common.js index c7a2e1ba..2d375826 100755 --- a/front/js/common.js +++ b/front/js/common.js @@ -1043,167 +1043,127 @@ function arraysContainSameValues(arr1, arr2) { // ----------------------------------------------------------------------------- // Define a unique key for storing the flag in sessionStorage -var sessionStorageKey = "myScriptExecuted_common_js"; - -// ----------------------------------------------------------------------------- -// Clearing all the caches -function clearCache() -{ - showSpinner() - resetInitializedFlag() - window.location.reload() -} - - -// ----------------------------------------------------------------------------- -function resetInitializedFlag() -{ - // Clear local storage - localStorage.clear(); - // Set the flag in sessionStorage to indicate that the code and cahce needs to be reloaded - sessionStorage.setItem(sessionStorageKey, "false"); -} - - - -// ----------------------------------------------------------------------------- -// check if cache needs to be refreshed because of setting changes -$.get('api/app_state.json?nocache=' + Date.now(), function(appState) { - - console.log(appState["settingsImported"]*1000) - - importedMiliseconds = parseInt((appState["settingsImported"]*1000)); - - lastReloaded = parseInt(sessionStorage.getItem(sessionStorageKey + '_time')); - - if(importedMiliseconds > lastReloaded) - { - console.log("Cache needs to be refreshed because of setting changes"); - setTimeout(() => { - resetInitializedFlag() - location.reload(); - - }, 500); - - } - -}); - -// ----------------------------------------------------------------------------- -// Display spinner and reload page if not yet initialized -function handleFirstLoad(callback) -{ - if(!isAppInitialized()) - { - setTimeout(function() { - - callback(); - }, 1000); - } -} - - -// ----------------------------------------------------------------------------- -// Check if the code has been executed before by checking sessionStorage +const sessionStorageKey = "myScriptExecuted_common_js"; var completedCalls = [] var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices']; - // ----------------------------------------------------------------------------- -function isAppInitialized() -{ - return arraysContainSameValues(getCache("completedCalls").split(',').filter(Boolean), completedCalls_final) +// Clearing all the caches +function clearCache() { + showSpinner(); + resetInitializedFlag(); + window.location.reload(); } -// Define a function that will execute the code only once -function executeOnce() { +// ----------------------------------------------------------------------------- +function resetInitializedFlag() { + // Clear both sessionStorage and localStorage + sessionStorage.clear(); + localStorage.clear(); +} - showSpinner('') +// ----------------------------------------------------------------------------- +// Function to check if cache needs to be refreshed because of setting changes +function checkSettingChanges() { + $.get('api/app_state.json?nocache=' + Date.now(), function(appState) { + const importedMilliseconds = parseInt(appState["settingsImported"] * 1000); + const lastReloaded = parseInt(sessionStorage.getItem(sessionStorageKey + '_time')); - if ( !isAppInitialized()) { - - // Use cache to keep track of completed AJAX calls - var tmp_completedCalls = getCache("completedCalls") - - // initialize from cache if values present - if(tmp_completedCalls != "") - { - completedCalls = tmp_completedCalls.split(','); + if (importedMilliseconds > lastReloaded) { + console.log("Cache needs to be refreshed because of setting changes"); + setTimeout(() => { + resetInitializedFlag(); + location.reload(); + }, 500); } + }); +} - // cache everything in the right order - cacheStrings() - .then(cacheSettings) - .then(cacheDevices) - .then(() => { - // All callbacks have completed - console.log("✅ All AJAX callbacks have completed"); - // location.reload() - onAllCallsComplete(); - }) - .catch((error) => { - console.error("Error:", error); - }); - +// ----------------------------------------------------------------------------- +// Display spinner and reload page if not yet initialized +async function handleFirstLoad(callback) { + if (!isAppInitialized()) { + await new Promise(resolve => setTimeout(resolve, 1000)); + callback(); } } +// ----------------------------------------------------------------------------- +// Check if the code has been executed before by checking sessionStorage +function isAppInitialized() { + return arraysContainSameValues(getCache("completedCalls").split(',').filter(Boolean), completedCalls_final); +} + +// Define a function that will execute the code only once +async function executeOnce() { + showSpinner(); + + if (!isAppInitialized()) { + try { + await cacheStrings(); + await cacheSettings(); + await cacheDevices(); + console.log("✅ All AJAX callbacks have completed"); + onAllCallsComplete(); + } catch (error) { + console.error("Error:", error); + } + } +} // ----------------------------------------------------------------------------- // Function to handle successful completion of an AJAX call const handleSuccess = (callName) => { - console.log(`AJAX call successful: ${callName} `); - // store completed call - completedCalls.push(callName) - - setCache('completedCalls', mergeUniqueArrays(getCache('completedCalls').split(','), [callName])) - + console.log(`AJAX call successful: ${callName}`); + completedCalls.push(callName); + setCache('completedCalls', mergeUniqueArrays(getCache('completedCalls').split(','), [callName])); }; // ----------------------------------------------------------------------------- // Function to handle failure of an AJAX call const handleFailure = (callName, callback) => { - // Handle AJAX call failure here console.error(`AJAX call ${callName} failed`); - - // try until successful - // callback() + // Implement retry logic here if needed }; // ----------------------------------------------------------------------------- // Function to execute when all AJAX calls have completed const onAllCallsComplete = () => { - - // Merge local completedCalls with completedCalls_cached array - ensure uniqueness - // if cache contains values, merge those two arrays - completedCalls = mergeUniqueArrays(getCache('completedCalls').split(','), completedCalls) - - // Update cache with merged completedCalls + completedCalls = mergeUniqueArrays(getCache('completedCalls').split(','), completedCalls); setCache('completedCalls', completedCalls); - // Set the flag in sessionStorage to indicate that the code has been executed - // and save time when last time the page was initialized - sessionStorage.setItem(sessionStorageKey, "true"); - const millisecondsNow = Date.now(); - sessionStorage.setItem(sessionStorageKey + '_time', millisecondsNow); + // Check if all necessary strings are initialized + if (areAllStringsInitialized()) { + sessionStorage.setItem(sessionStorageKey, "true"); + const millisecondsNow = Date.now(); + sessionStorage.setItem(sessionStorageKey + '_time', millisecondsNow); - console.log('✔ Cache intialized'); + console.log('✔ Cache initialized'); + } else { + // If not all strings are initialized, retry initialization + console.log('❌ Not all strings are initialized. Retrying...'); + executeOnce(); + return; + } - location.reload(); + // Call any other initialization functions here if needed + // No need for location.reload() here +}; + +// Function to check if all necessary strings are initialized +const areAllStringsInitialized = () => { + // Implement logic to check if all necessary strings are initialized + // Return true if all strings are initialized, false otherwise + return getString('UI_LANG') != "" }; // Call the function to execute the code executeOnce(); -// Set timer for page refresh if configured -setTimeout(() => { - const refreshTime = getSetting("UI_REFRESH"); - if (refreshTime && refreshTime !== "0" && refreshTime !== "") { - newTimerRefreshData(clearCache, parseInt(refreshTime)*1000); - } -}, 10000); +// Set timer for page refresh if configured +setTimeout(checkSettingChanges, 10000); console.log("init common.js"); @@ -1212,3 +1172,4 @@ console.log("init common.js"); + diff --git a/front/js/ui_components.js b/front/js/ui_components.js index d50e0c39..536389da 100755 --- a/front/js/ui_components.js +++ b/front/js/ui_components.js @@ -13,13 +13,13 @@ // ----------------------------------------------------------------------------- function initDeviceSelectors() { - console.log(devicesList) + // console.log(devicesList) // Retrieve device list from session variable var devicesListAll_JSON = getCache('devicesListAll_JSON'); var devicesList = JSON.parse(devicesListAll_JSON); - console.log(devicesList); + // console.log(devicesList); // Check if both device list exists @@ -78,35 +78,8 @@ function initDeviceSelectors() { } -// -------------------------------------------------------- -//Initialize Select2 Elements and make them sortable -$(function () { - // Iterate over each Select2 dropdown - $('.select2').each(function() { - var selectEl = $(this).select2(); - // Apply sortable functionality to the dropdown's dropdown-container - selectEl.next().children().children().children().sortable({ - containment: 'parent', - update: function () { - var sortedValues = $(this).children().map(function() { - return $(this).attr('title'); - }).get(); - - var sortedOptions = selectEl.find('option').sort(function(a, b) { - return sortedValues.indexOf($(a).text()) - sortedValues.indexOf($(b).text()); - }); - - // Replace all options in selectEl - selectEl.empty().append(sortedOptions); - - // Trigger change event on Select2 - selectEl.trigger('change'); - } - }); - }); -}); @@ -281,6 +254,43 @@ function updateIconPreview (inputId) { // initialize // ----------------------------------------------------------------------------- -initDeviceSelectors(); + +setTimeout(() => { + + initDeviceSelectors(); + + + // -------------------------------------------------------- + //Initialize Select2 Elements and make them sortable + + $(function () { + // Iterate over each Select2 dropdown + $('.select2').each(function() { + var selectEl = $(this).select2(); + + // Apply sortable functionality to the dropdown's dropdown-container + selectEl.next().children().children().children().sortable({ + containment: 'parent', + update: function () { + var sortedValues = $(this).children().map(function() { + return $(this).attr('title'); + }).get(); + + var sortedOptions = selectEl.find('option').sort(function(a, b) { + return sortedValues.indexOf($(a).text()) - sortedValues.indexOf($(b).text()); + }); + + // Replace all options in selectEl + selectEl.empty().append(sortedOptions); + + // Trigger change event on Select2 + selectEl.trigger('change'); + } + }); + }); + }); + +}, 500); + console.log("init ui_components.js") \ No newline at end of file diff --git a/front/maintenance.php b/front/maintenance.php index a57eb46a..1d46c5a8 100755 --- a/front/maintenance.php +++ b/front/maintenance.php @@ -948,8 +948,6 @@ window.onload = function asyncFooter() - - - + diff --git a/front/multiEditCore.php b/front/multiEditCore.php index b47a32b2..bb3db868 100755 --- a/front/multiEditCore.php +++ b/front/multiEditCore.php @@ -15,7 +15,7 @@

-
+