From 57ec983dbd5f8f43961b51ae78e3f1679fded686 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Tue, 28 Oct 2025 11:58:36 +0100 Subject: [PATCH 1/5] Adds node actions to the context menu --- .../@node-red/editor-client/locales/en-US/editor.json | 1 + .../@node-red/editor-client/locales/fr/editor.json | 1 + .../@node-red/editor-client/src/js/ui/contextMenu.js | 7 +++++++ 3 files changed, 9 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index c1c9316d8..825408c6d 100644 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -131,6 +131,7 @@ "other": "Other", "showTips": "Show tips", "showNodeHelp": "Show node help", + "showNodeActions": "Show node actions", "enableSelectedNodes": "Enable selected nodes", "disableSelectedNodes": "Disable selected nodes", "showSelectedNodeLabels": "Show selected node labels", diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json index a205002d9..601ed0661 100644 --- a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json @@ -131,6 +131,7 @@ "other": "Autre", "showTips": "Afficher les astuces", "showNodeHelp": "Afficher l'aide du noeud", + "showNodeActions": "Afficher les actions du noeud", "enableSelectedNodes": "Activer les noeuds sélectionnés", "disableSelectedNodes": "Désactiver les noeuds sélectionnés", "showSelectedNodeLabels": "Afficher les étiquettes des noeuds sélectionnés", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index c70757dfa..8e6891866 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -148,8 +148,15 @@ RED.contextMenu = (function () { if (hasSelection && canEdit) { const nodeOptions = [] if (!hasMultipleSelection && !isGroup) { + // Add node actions to the context menu + let nodeContextMenu = selection.nodes[0]._def?.contextMenu || []; + if (!Array.isArray(nodeContextMenu)) { + // Ensure the context menu is an array + nodeContextMenu = []; + } nodeOptions.push( { onselect: 'core:show-node-help', label: RED._('menu.label.showNodeHelp') }, + { label: RED._('menu.label.showNodeActions'), options: nodeContextMenu, disabled: !nodeContextMenu.length }, null ) } From d8b20c034a8a3a2729cae7101d3c12a038ba4b61 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Tue, 28 Oct 2025 12:01:54 +0100 Subject: [PATCH 2/5] Fix the Caret Arrow alignment --- .../@node-red/editor-client/src/sass/dropdownMenu.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss b/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss index f6a2d6fde..7f9f1e412 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss @@ -60,7 +60,7 @@ } &.red-ui-menu-dropdown-noicons > li > a, &.red-ui-menu-dropdown-noicons > li > a:focus { - padding: 4px 12px 4px 12px; + padding: 4px 20px 4px 12px; } &.red-ui-menu-dropdown-submenus.red-ui-menu-dropdown-direction-right > li > a, From 4f7d1d166c0e5438faac14d8f0721e9dac4c67da Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Tue, 28 Oct 2025 12:03:11 +0100 Subject: [PATCH 3/5] Do not show empty submenu --- .../@node-red/editor-client/src/js/ui/common/menu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js index 8d0f1dbd3..7f38ca6f2 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js @@ -130,7 +130,7 @@ RED.menu = (function() { event.preventDefault(); }); } - if (opt.options) { + if (opt.options && opt.options.length) { item.addClass("red-ui-menu-dropdown-submenu"+(opt.direction!=='right'?" pull-left":"")); var submenu = $('').appendTo(item); var hasIcons = false From 2e041958686fc8628123171a40b222dd42cc1bc9 Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Tue, 28 Oct 2025 15:11:25 +0100 Subject: [PATCH 4/5] Allow `contextMenu` to be a function --- .../@node-red/editor-client/src/js/ui/contextMenu.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index 8e6891866..1663d25da 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -150,6 +150,9 @@ RED.contextMenu = (function () { if (!hasMultipleSelection && !isGroup) { // Add node actions to the context menu let nodeContextMenu = selection.nodes[0]._def?.contextMenu || []; + if (typeof nodeContextMenu === "function") { + nodeContextMenu = nodeContextMenu.call(selection.nodes[0]); + } if (!Array.isArray(nodeContextMenu)) { // Ensure the context menu is an array nodeContextMenu = []; From ebfc8ad9ab2595b895c234a916f22e67e4e9f57f Mon Sep 17 00:00:00 2001 From: GogoVega <92022724+GogoVega@users.noreply.github.com> Date: Sat, 13 Dec 2025 16:23:21 +0100 Subject: [PATCH 5/5] Move node actions to the end of node submenu --- .../editor-client/locales/en-US/editor.json | 1 - .../editor-client/locales/fr/editor.json | 1 - .../editor-client/src/js/ui/contextMenu.js | 30 +++++++++++-------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 825408c6d..c1c9316d8 100644 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -131,7 +131,6 @@ "other": "Other", "showTips": "Show tips", "showNodeHelp": "Show node help", - "showNodeActions": "Show node actions", "enableSelectedNodes": "Enable selected nodes", "disableSelectedNodes": "Disable selected nodes", "showSelectedNodeLabels": "Show selected node labels", diff --git a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json index 601ed0661..a205002d9 100644 --- a/packages/node_modules/@node-red/editor-client/locales/fr/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/fr/editor.json @@ -131,7 +131,6 @@ "other": "Autre", "showTips": "Afficher les astuces", "showNodeHelp": "Afficher l'aide du noeud", - "showNodeActions": "Afficher les actions du noeud", "enableSelectedNodes": "Activer les noeuds sélectionnés", "disableSelectedNodes": "Désactiver les noeuds sélectionnés", "showSelectedNodeLabels": "Afficher les étiquettes des noeuds sélectionnés", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js index 1663d25da..90a99e113 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/contextMenu.js @@ -147,7 +147,19 @@ RED.contextMenu = (function () { if (hasSelection && canEdit) { const nodeOptions = [] + nodeOptions.push( + { onselect: 'core:enable-selected-nodes', label: RED._('menu.label.enableSelectedNodes'), disabled: !hasDisabledNode }, + { onselect: 'core:disable-selected-nodes', label: RED._('menu.label.disableSelectedNodes'), disabled: !hasEnabledNode }, + null, + { onselect: 'core:show-selected-node-labels', label: RED._('menu.label.showSelectedNodeLabels'), disabled: !hasUnlabeledNode }, + { onselect: 'core:hide-selected-node-labels', label: RED._('menu.label.hideSelectedNodeLabels'), disabled: !hasLabeledNode } + ) if (!hasMultipleSelection && !isGroup) { + nodeOptions.unshift( + { onselect: 'core:show-node-help', label: RED._('menu.label.showNodeHelp') }, + null + ) + // Add node actions to the context menu let nodeContextMenu = selection.nodes[0]._def?.contextMenu || []; if (typeof nodeContextMenu === "function") { @@ -157,19 +169,13 @@ RED.contextMenu = (function () { // Ensure the context menu is an array nodeContextMenu = []; } - nodeOptions.push( - { onselect: 'core:show-node-help', label: RED._('menu.label.showNodeHelp') }, - { label: RED._('menu.label.showNodeActions'), options: nodeContextMenu, disabled: !nodeContextMenu.length }, - null - ) + if (nodeContextMenu.length) { + nodeOptions.push( + null, + ...nodeContextMenu + ); + } } - nodeOptions.push( - { onselect: 'core:enable-selected-nodes', label: RED._('menu.label.enableSelectedNodes'), disabled: !hasDisabledNode }, - { onselect: 'core:disable-selected-nodes', label: RED._('menu.label.disableSelectedNodes'), disabled: !hasEnabledNode }, - null, - { onselect: 'core:show-selected-node-labels', label: RED._('menu.label.showSelectedNodeLabels'), disabled: !hasUnlabeledNode }, - { onselect: 'core:hide-selected-node-labels', label: RED._('menu.label.hideSelectedNodeLabels'), disabled: !hasLabeledNode } - ) menuItems.push({ label: RED._('sidebar.info.node'), options: nodeOptions