Improve with error handling, storage cleanup and centralization in one object

This commit is contained in:
GogoVega 2024-03-26 16:58:45 +01:00
parent 4788b81220
commit bffd1d61b2
No known key found for this signature in database
GPG Key ID: E1E048B63AC5AC2B

View File

@ -35,6 +35,8 @@ RED.palette = (function() {
var categoryContainers = {};
var sidebarControls;
let lastState = { filter: "", collapsed: [] };
function createCategory(originalCategory,rootCategory,category,ns) {
if ($("#red-ui-palette-base-category-"+rootCategory).length === 0) {
createCategoryContainer(originalCategory,rootCategory, ns+":palette.label."+rootCategory);
@ -73,15 +75,16 @@ RED.palette = (function() {
$("#red-ui-palette-header-"+category+" i").addClass("expanded");
},
toggle: function() {
const collapse = JSON.parse(localStorage.getItem("palette-collapse") || "[]");
if (catDiv.hasClass("red-ui-palette-open")) {
categoryContainers[category].close();
collapse.push(category);
if (!lastState.collapsed.includes(category)) {
lastState.collapsed.push(category);
}
} else {
categoryContainers[category].open();
collapse.splice(collapse.indexOf(category), 1);
lastState.collapsed.splice(lastState.collapsed.indexOf(category), 1);
}
localStorage.setItem("palette-collapse", JSON.stringify(collapse.filter((c, i, array) => array.indexOf(c) === i)));
savePaletteState();
}
};
@ -600,13 +603,12 @@ RED.palette = (function() {
RED.events.on("subflows:change",refreshSubflow);
$("#red-ui-palette-search input").searchBox({
delay: 100,
change: function() {
filterChange($(this).val());
localStorage.setItem("palette-filter", $(this).val());
lastState.filter = $(this).val();
savePaletteState();
}
});
@ -675,14 +677,33 @@ RED.palette = (function() {
}
});
const collapse = JSON.parse(localStorage.getItem("palette-collapse") || "[]");
try {
const stateFromStorage = JSON.parse(localStorage.getItem("palette-state") || "{}");
for (const prop in stateFromStorage) {
if (Object.prototype.hasOwnProperty.call(lastState, prop)) {
lastState[prop] = stateFromStorage[prop];
}
}
// Remove old/unknown category from localStorage
lastState.collapsed = lastState.collapsed.filter((c, i, a) => a.indexOf(c) === i && categoryContainers[c]);
const callback = function () {
collapse.forEach((category) => categoryContainers[category]?.close());
$("#red-ui-palette-search input").searchBox("value", (localStorage.getItem("palette-filter") || ""));
// Hide categories previously hidded
lastState.collapsed.forEach((category) => categoryContainers[category].close());
// Apply the category filter
$("#red-ui-palette-search input").searchBox("value", lastState.filter);
RED.events.off("runtime-state", callback);
};
savePaletteState();
RED.events.on("runtime-state", callback);
} catch (error) {
console.error("Unexpected error loading palette state from localStorage: ", error);
}
}
function togglePalette(state) {
if (!state) {
$("#red-ui-main-container").addClass("red-ui-palette-closed");
@ -702,6 +723,15 @@ RED.palette = (function() {
})
return categories;
}
function savePaletteState() {
try {
localStorage.setItem("palette-state", JSON.stringify(lastState));
} catch (error) {
console.error("Unexpected error saving palette state to localStorage: ", error);
}
}
return {
init: init,
add:addNodeType,