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 categoryContainers = {};
var sidebarControls; var sidebarControls;
let lastState = { filter: "", collapsed: [] };
function createCategory(originalCategory,rootCategory,category,ns) { function createCategory(originalCategory,rootCategory,category,ns) {
if ($("#red-ui-palette-base-category-"+rootCategory).length === 0) { if ($("#red-ui-palette-base-category-"+rootCategory).length === 0) {
createCategoryContainer(originalCategory,rootCategory, ns+":palette.label."+rootCategory); createCategoryContainer(originalCategory,rootCategory, ns+":palette.label."+rootCategory);
@ -73,15 +75,16 @@ RED.palette = (function() {
$("#red-ui-palette-header-"+category+" i").addClass("expanded"); $("#red-ui-palette-header-"+category+" i").addClass("expanded");
}, },
toggle: function() { toggle: function() {
const collapse = JSON.parse(localStorage.getItem("palette-collapse") || "[]");
if (catDiv.hasClass("red-ui-palette-open")) { if (catDiv.hasClass("red-ui-palette-open")) {
categoryContainers[category].close(); categoryContainers[category].close();
collapse.push(category); if (!lastState.collapsed.includes(category)) {
lastState.collapsed.push(category);
}
} else { } else {
categoryContainers[category].open(); 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.events.on("subflows:change",refreshSubflow);
$("#red-ui-palette-search input").searchBox({ $("#red-ui-palette-search input").searchBox({
delay: 100, delay: 100,
change: function() { change: function() {
filterChange($(this).val()); 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 callback = function () { const stateFromStorage = JSON.parse(localStorage.getItem("palette-state") || "{}");
collapse.forEach((category) => categoryContainers[category]?.close());
$("#red-ui-palette-search input").searchBox("value", (localStorage.getItem("palette-filter") || "")); for (const prop in stateFromStorage) {
RED.events.off("runtime-state", callback); if (Object.prototype.hasOwnProperty.call(lastState, prop)) {
}; lastState[prop] = stateFromStorage[prop];
RED.events.on("runtime-state", callback); }
}
// Remove old/unknown category from localStorage
lastState.collapsed = lastState.collapsed.filter((c, i, a) => a.indexOf(c) === i && categoryContainers[c]);
const callback = function () {
// 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) { function togglePalette(state) {
if (!state) { if (!state) {
$("#red-ui-main-container").addClass("red-ui-palette-closed"); $("#red-ui-main-container").addClass("red-ui-palette-closed");
@ -702,6 +723,15 @@ RED.palette = (function() {
}) })
return categories; 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 { return {
init: init, init: init,
add:addNodeType, add:addNodeType,