From a312dbd87821a7a16d22b5035995b3309a426a58 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 25 Feb 2026 08:57:10 +0000 Subject: [PATCH 1/3] Move declarations before use & alongside other declarations --- .../@node-red/editor-client/src/js/ui/palette-editor.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js index e2773f4f6..cba3f4ba6 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js @@ -40,6 +40,12 @@ RED.palette.editor = (function() { // Install tab - search input let searchInput; + // Core and Package Updates + /** @type {Array<{package: string, current: string, available: string}>} */ + const moduleUpdates = [] + const updateStatusState = { version: null, moduleCount: 0 } + + const SMALL_CATALOGUE_SIZE = 40 const typesInUse = {}; @@ -1825,8 +1831,6 @@ RED.palette.editor = (function() { const updateStatusWidget = $(''); let updateStatusWidgetPopover; - const updateStatusState = { moduleCount: 0 } - let updateAvailable = []; function addUpdateInfoToStatusBar() { updateStatusWidgetPopover = RED.popover.create({ From a8422099ba73c1ceaa2eb272e2d4a2deea732dfe Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 25 Feb 2026 09:13:33 +0000 Subject: [PATCH 2/3] Add RED.palette.editor.updates prop and event registry:updates-available --- .../editor-client/src/js/ui/palette-editor.js | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js index cba3f4ba6..0546c315e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js @@ -1839,7 +1839,7 @@ RED.palette.editor = (function() { interactive: true, direction: "bottom", content: function () { - const count = updateAvailable.length || 0; + const count = moduleUpdates.length || 0 const content = $('
'); if (updateStatusState.version) { $(`${RED._("telemetry.updateAvailableDesc", updateStatusState)}`).appendTo(content) @@ -1849,7 +1849,7 @@ RED.palette.editor = (function() { updateStatusWidgetPopover.close() RED.actions.invoke("core:manage-palette", { view: "nodes", - filter: '"' + updateAvailable.join('", "') + '"' + filter: '"' + moduleUpdates.map(u => u.package).join('", "') + '"' }); }).appendTo(content) } @@ -1871,7 +1871,7 @@ RED.palette.editor = (function() { function refreshUpdateStatus() { clearTimeout(pendingRefreshTimeout) pendingRefreshTimeout = setTimeout(() => { - updateAvailable = []; + moduleUpdates.length = 0 for (const module of Object.keys(nodeEntries)) { if (loadedIndex.hasOwnProperty(module)) { const moduleInfo = nodeEntries[module].info; @@ -1879,35 +1879,49 @@ RED.palette.editor = (function() { // Module updated continue; } + const current = moduleInfo.version + const latest = loadedIndex[module].version if (updateAllowed && - semVerCompare(loadedIndex[module].version, moduleInfo.version) > 0 && + semVerCompare(latest, current) > 0 && RED.utils.checkModuleAllowed(module, null, updateAllowList, updateDenyList) ) { - updateAvailable.push(module); + moduleUpdates.push({ package: module, current, latest }) } } } - updateStatusState.moduleCount = updateAvailable.length; + updateStatusState.moduleCount = moduleUpdates.length updateStatus(); }, 200) } function updateStatus() { - if (updateStatusState.moduleCount || updateStatusState.version) { + const updates = RED.palette.editor.updates + if (updates.count > 0) { updateStatusWidget.empty(); - let count = updateStatusState.moduleCount || 0; - if (updateStatusState.version) { - count ++ - } - $(` ${RED._("telemetry.updateAvailable", { count: count })}`).appendTo(updateStatusWidget); + $(` ${RED._("telemetry.updateAvailable", { count: updates.count })}`).appendTo(updateStatusWidget); RED.statusBar.show("red-ui-status-package-update"); } else { RED.statusBar.hide("red-ui-status-package-update"); } + RED.events.emit("registry:updates-available", updates) } return { init: init, - install: install + install: install, + get updates() { + const palette = [...moduleUpdates] + let core = null + let count = palette.length + if (updateStatusState.version) { + core = { current: RED.settings.version, latest: updateStatusState.version } + count ++ + } + return { + count, + core, + palette + } + } } })(); From 5b3eb78103c33b139a6a6bab864789328b8a66b6 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 25 Feb 2026 15:46:55 +0000 Subject: [PATCH 3/3] Change getter to explicit function: `getAvailableUpdates` --- .../editor-client/src/js/ui/palette-editor.js | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js index 0546c315e..1a34d1927 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js @@ -1895,7 +1895,7 @@ RED.palette.editor = (function() { } function updateStatus() { - const updates = RED.palette.editor.updates + const updates = RED.palette.editor.getAvailableUpdates() if (updates.count > 0) { updateStatusWidget.empty(); $(` ${RED._("telemetry.updateAvailable", { count: updates.count })}`).appendTo(updateStatusWidget); @@ -1906,22 +1906,24 @@ RED.palette.editor = (function() { RED.events.emit("registry:updates-available", updates) } - return { - init: init, - install: install, - get updates() { - const palette = [...moduleUpdates] - let core = null - let count = palette.length - if (updateStatusState.version) { - core = { current: RED.settings.version, latest: updateStatusState.version } - count ++ - } - return { - count, - core, - palette - } + function getAvailableUpdates () { + const palette = [...moduleUpdates] + let core = null + let count = palette.length + if (updateStatusState.version) { + core = { current: RED.settings.version, latest: updateStatusState.version } + count ++ + } + return { + count, + core, + palette } } + + return { + init, + install, + getAvailableUpdates + } })();