Merge pull request #4634 from node-red/pr_4623

Retain Palette categories collapsed and filter to localStorage
This commit is contained in:
Nick O'Leary 2024-03-28 14:53:15 +00:00 committed by GitHub
commit 28e9ccd372
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -35,6 +35,8 @@ RED.palette = (function() {
var categoryContainers = {}; var categoryContainers = {};
var sidebarControls; var sidebarControls;
let paletteState = { 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);
@ -60,20 +62,57 @@ RED.palette = (function() {
catDiv.data('label',label); catDiv.data('label',label);
categoryContainers[category] = { categoryContainers[category] = {
container: catDiv, container: catDiv,
close: function() { hide: function (instant) {
if (instant) {
catDiv.hide()
} else {
catDiv.slideUp()
}
},
show: function () {
catDiv.show()
},
isOpen: function () {
return !!catDiv.hasClass("red-ui-palette-open")
},
getNodeCount: function (visibleOnly) {
const nodes = catDiv.find(".red-ui-palette-node")
if (visibleOnly) {
return nodes.filter(function() { return $(this).css('display') !== 'none'}).length
} else {
return nodes.length
}
},
close: function(instant, skipSaveState) {
catDiv.removeClass("red-ui-palette-open"); catDiv.removeClass("red-ui-palette-open");
catDiv.addClass("red-ui-palette-closed"); catDiv.addClass("red-ui-palette-closed");
if (instant) {
$("#red-ui-palette-base-category-"+category).hide();
} else {
$("#red-ui-palette-base-category-"+category).slideUp(); $("#red-ui-palette-base-category-"+category).slideUp();
}
$("#red-ui-palette-header-"+category+" i").removeClass("expanded"); $("#red-ui-palette-header-"+category+" i").removeClass("expanded");
if (!skipSaveState) {
if (!paletteState.collapsed.includes(category)) {
paletteState.collapsed.push(category);
savePaletteState();
}
}
}, },
open: function() { open: function(skipSaveState) {
catDiv.addClass("red-ui-palette-open"); catDiv.addClass("red-ui-palette-open");
catDiv.removeClass("red-ui-palette-closed"); catDiv.removeClass("red-ui-palette-closed");
$("#red-ui-palette-base-category-"+category).slideDown(); $("#red-ui-palette-base-category-"+category).slideDown();
$("#red-ui-palette-header-"+category+" i").addClass("expanded"); $("#red-ui-palette-header-"+category+" i").addClass("expanded");
if (!skipSaveState) {
if (paletteState.collapsed.includes(category)) {
paletteState.collapsed.splice(paletteState.collapsed.indexOf(category), 1);
savePaletteState();
}
}
}, },
toggle: function() { toggle: function() {
if (catDiv.hasClass("red-ui-palette-open")) { if (categoryContainers[category].isOpen()) {
categoryContainers[category].close(); categoryContainers[category].close();
} else { } else {
categoryContainers[category].open(); categoryContainers[category].open();
@ -415,7 +454,11 @@ RED.palette = (function() {
var categoryNode = $("#red-ui-palette-container-"+rootCategory); var categoryNode = $("#red-ui-palette-container-"+rootCategory);
if (categoryNode.find(".red-ui-palette-node").length === 1) { if (categoryNode.find(".red-ui-palette-node").length === 1) {
if (!paletteState?.collapsed?.includes(rootCategory)) {
categoryContainers[rootCategory].open(); categoryContainers[rootCategory].open();
} else {
categoryContainers[rootCategory].close(true);
}
} }
} }
@ -528,16 +571,26 @@ RED.palette = (function() {
} }
}); });
for (var category in categoryContainers) { for (let category in categoryContainers) {
if (categoryContainers.hasOwnProperty(category)) { if (categoryContainers.hasOwnProperty(category)) {
if (categoryContainers[category].container const categorySection = categoryContainers[category]
.find(".red-ui-palette-node") if (categorySection.getNodeCount(true) === 0) {
.filter(function() { return $(this).css('display') !== 'none'}).length === 0) { categorySection.hide()
categoryContainers[category].close();
categoryContainers[category].container.slideUp();
} else { } else {
categoryContainers[category].open(); categorySection.show()
categoryContainers[category].container.show(); if (val) {
// There is a filter being applied and it has matched
// something in this category - show the contents
categorySection.open(true)
} else {
// No filter. Only show the category if it isn't in lastState
if (!paletteState.collapsed.includes(category)) {
categorySection.open(true)
} else if (categorySection.isOpen()) {
// This section should be collapsed but isn't - so make it so
categorySection.close(true, true)
}
}
} }
} }
} }
@ -553,6 +606,9 @@ RED.palette = (function() {
$("#red-ui-palette > .red-ui-palette-spinner").show(); $("#red-ui-palette > .red-ui-palette-spinner").show();
RED.events.on('logout', function () {
RED.settings.removeLocal('palette-state')
})
RED.events.on('registry:node-type-added', function(nodeType) { RED.events.on('registry:node-type-added', function(nodeType) {
var def = RED.nodes.getType(nodeType); var def = RED.nodes.getType(nodeType);
@ -596,14 +652,14 @@ 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());
paletteState.filter = $(this).val();
savePaletteState();
} }
}) });
sidebarControls = $('<div class="red-ui-sidebar-control-left"><i class="fa fa-chevron-left"></i></div>').appendTo($("#red-ui-palette")); sidebarControls = $('<div class="red-ui-sidebar-control-left"><i class="fa fa-chevron-left"></i></div>').appendTo($("#red-ui-palette"));
RED.popover.tooltip(sidebarControls,RED._("keyboard.togglePalette"),"core:toggle-palette"); RED.popover.tooltip(sidebarControls,RED._("keyboard.togglePalette"),"core:toggle-palette");
@ -669,7 +725,18 @@ RED.palette = (function() {
togglePalette(state); togglePalette(state);
} }
}); });
try {
paletteState = JSON.parse(RED.settings.getLocal("palette-state") || '{"filter":"", "collapsed": []}');
if (paletteState.filter) {
// Apply the category filter
$("#red-ui-palette-search input").searchBox("value", paletteState.filter);
} }
} 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");
@ -689,6 +756,15 @@ RED.palette = (function() {
}) })
return categories; return categories;
} }
function savePaletteState() {
try {
RED.settings.setLocal("palette-state", JSON.stringify(paletteState));
} catch (error) {
console.error("Unexpected error saving palette state to localStorage: ", error);
}
}
return { return {
init: init, init: init,
add:addNodeType, add:addNodeType,