From 9a07fc03c605c55f4528cddd2b237a9e340534c1 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Mon, 25 Mar 2024 20:47:55 +0100 Subject: [PATCH 1/5] Retain palette collapse and filter to localStorage --- .../@node-red/editor-client/src/js/ui/palette.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 23f30fc61..27f6bb6df 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -73,11 +73,15 @@ 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); } else { categoryContainers[category].open(); + collapse.splice(collapse.indexOf(category), 1); } + localStorage.setItem("palette-collapse", JSON.stringify(collapse.filter((c, i, array) => array.indexOf(c) === i))); } }; @@ -602,8 +606,9 @@ RED.palette = (function() { delay: 100, change: function() { filterChange($(this).val()); + localStorage.setItem("palette-filter", $(this).val()); } - }) + }); sidebarControls = $('
').appendTo($("#red-ui-palette")); RED.popover.tooltip(sidebarControls,RED._("keyboard.togglePalette"),"core:toggle-palette"); @@ -669,6 +674,12 @@ RED.palette = (function() { togglePalette(state); } }); + + const collapse = JSON.parse(localStorage.getItem("palette-collapse") || "[]"); + setTimeout(function () { + collapse.forEach((category) => categoryContainers[category]?.close()); + $("#red-ui-palette-search input").searchBox("value", (localStorage.getItem("palette-filter") || "")); + }, 1000); } function togglePalette(state) { if (!state) { From 4788b81220b58d3c5fea25280587ad778aca0b94 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Tue, 26 Mar 2024 13:05:38 +0100 Subject: [PATCH 2/5] Replace setTimeout with a listener --- .../@node-red/editor-client/src/js/ui/palette.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 27f6bb6df..10654fdda 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -676,10 +676,12 @@ RED.palette = (function() { }); const collapse = JSON.parse(localStorage.getItem("palette-collapse") || "[]"); - setTimeout(function () { + const callback = function () { collapse.forEach((category) => categoryContainers[category]?.close()); $("#red-ui-palette-search input").searchBox("value", (localStorage.getItem("palette-filter") || "")); - }, 1000); + RED.events.off("runtime-state", callback); + }; + RED.events.on("runtime-state", callback); } function togglePalette(state) { if (!state) { From bffd1d61b22001fcf498be9648615ee055818745 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Tue, 26 Mar 2024 16:58:45 +0100 Subject: [PATCH 3/5] Improve with error handling, storage cleanup and centralization in one object --- .../editor-client/src/js/ui/palette.js | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 10654fdda..6400a746b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -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") || "[]"); - const callback = function () { - collapse.forEach((category) => categoryContainers[category]?.close()); - $("#red-ui-palette-search input").searchBox("value", (localStorage.getItem("palette-filter") || "")); - RED.events.off("runtime-state", callback); - }; - RED.events.on("runtime-state", callback); + 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 () { + // 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, From f5fd6e3a3645811794f4722bf283244c09dd63d6 Mon Sep 17 00:00:00 2001 From: Nick O'Leary