From 46fdf56c7932a23085105a460edff74b3e9aeed3 Mon Sep 17 00:00:00 2001
From: Nick O'Leary <nick.oleary@gmail.com>
Date: Mon, 20 May 2024 16:41:44 +0100
Subject: [PATCH 1/2] Allow nodes to return additional history entries in
 onEditSave

---
 .../editor-client/src/js/ui/editor.js         | 20 +++++++++++--
 .../@node-red/nodes/core/common/60-link.html  | 30 +++++++++++++++----
 2 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js
index 705743b34..a7c797c17 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js
@@ -741,9 +741,16 @@ RED.editor = (function() {
             }
 
             try {
-                var rc = editing_node._def.oneditsave.call(editing_node);
+                const rc = editing_node._def.oneditsave.call(editing_node);
                 if (rc === true) {
                     editState.changed = true;
+                } else if (typeof rc === 'object' && rc !== null ) {
+                    if (rc.changed === true) {
+                        editState.changed = true
+                    }
+                    if (Array.isArray(rc.history) && rc.history.length > 0) {
+                        editState.history = rc.history
+                    }
                 }
             } catch(err) {
                 console.warn("oneditsave",editing_node.id,editing_node.type,err.toString());
@@ -1015,7 +1022,7 @@ RED.editor = (function() {
                                     }
                                 });
                             }
-                            var historyEvent = {
+                            let historyEvent = {
                                 t:'edit',
                                 node:editing_node,
                                 changes:editState.changes,
@@ -1031,6 +1038,15 @@ RED.editor = (function() {
                                     instances:subflowInstances
                                 }
                             }
+
+                            if (editState.history) {
+                                historyEvent = {
+                                    t: 'multi',
+                                    events: [ historyEvent, ...editState.history ],
+                                    dirty: wasDirty
+                                }
+                            }
+
                             RED.history.push(historyEvent);
                         }
                         editing_node.dirty = true;
diff --git a/packages/node_modules/@node-red/nodes/core/common/60-link.html b/packages/node_modules/@node-red/nodes/core/common/60-link.html
index 73ce86ccf..748ccb42b 100644
--- a/packages/node_modules/@node-red/nodes/core/common/60-link.html
+++ b/packages/node_modules/@node-red/nodes/core/common/60-link.html
@@ -194,27 +194,46 @@
                 nodeMap[node.links[i]].new = true;
             }
         }
-        var n;
-        for (var id in nodeMap) {
+
+        let editHistories = []
+        let n;
+        for (let id in nodeMap) {
             if (nodeMap.hasOwnProperty(id)) {
                 n = RED.nodes.node(id);
                 if (n) {
+                    editHistories.push({
+                        t:'edit',
+                        node: n,
+                        changes: {
+                            links: [...n.links]
+                        },
+                        changed: n.changed
+                    })
                     if (nodeMap[id].old && !nodeMap[id].new) {
                         // Removed id
                         i = n.links.indexOf(node.id);
                         if (i > -1) {
                             n.links.splice(i,1);
+                            n.changed = true
+                            n.dirty = true
                         }
                     } else if (!nodeMap[id].old && nodeMap[id].new) {
                         // Added id
                         i = n.links.indexOf(id);
                         if (i === -1) {
                             n.links.push(node.id);
+                            n.changed = true
+                            n.dirty = true
                         }
                     }
                 }
             }
         }
+        if (editHistories.length > 0) {
+            return {
+                history: editHistories
+            }
+        }
     }
 
     function onAdd() {
@@ -254,13 +273,14 @@
             onEditPrepare(this,"link out");
         },
         oneditsave: function() {
-            onEditSave(this);
+            const result = onEditSave(this);
             // In case the name has changed, ensure any link call nodes on this
             // tab are redrawn with the updated name
             var localCallNodes = RED.nodes.filterNodes({z:RED.workspaces.active(), type:"link call"});
             localCallNodes.forEach(function(node) {
                 node.dirty = true;
             });
+            return result
         },
         onadd: onAdd,
         oneditresize: resizeNodeList
@@ -329,7 +349,7 @@
             onEditPrepare(this,"link in");
         },
         oneditsave: function() {
-            onEditSave(this);
+            return onEditSave(this);
         },
         oneditresize: resizeNodeList
     });
@@ -373,7 +393,7 @@
 
         },
         oneditsave: function() {
-            onEditSave(this);
+            return onEditSave(this);
         },
         onadd: onAdd,
         oneditresize: resizeNodeList

From 5538f6dd8afa0d83ca61df3ac97a3b984189a28f Mon Sep 17 00:00:00 2001
From: GogoVega <92022724+GogoVega@users.noreply.github.com>
Date: Tue, 21 May 2024 12:58:29 +0200
Subject: [PATCH 2/2] Add missing tooltips to Sidebar

---
 .../@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/tab-config.js       | 4 +++-
 .../@node-red/editor-client/src/js/ui/tab-help.js         | 8 +++++++-
 4 files changed, 12 insertions(+), 2 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 34ed30cef..1c4c66240 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
@@ -719,6 +719,7 @@
             "nodeHelp": "Node Help",
             "showHelp": "Show help",
             "showInOutline": "Show in outline",
+            "hideTopics": "Hide topics",
             "showTopics": "Show topics",
             "noHelp": "No help topic selected",
             "changeLog": "Change Log"
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 6faa1ed24..bf077b3f7 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
@@ -719,6 +719,7 @@
       "nodeHelp": "Aide sur les noeuds",
       "showHelp": "Afficher l'aide",
       "showInOutline": "Afficher dans les grandes lignes",
+      "hideTopics": "Masquer les sujets",
       "showTopics": "Afficher les sujets",
       "noHelp": "Aucune rubrique d'aide sélectionnée",
       "changeLog": "Journal des modifications"
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js
index e2c8185cb..b8e3aa0ba 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js
@@ -382,9 +382,11 @@ RED.sidebar.config = (function() {
                 refreshConfigNodeList();
             }
         });
+
         RED.popover.tooltip($('#red-ui-sidebar-config-filter-all'), RED._("sidebar.config.showAllConfigNodes"));
         RED.popover.tooltip($('#red-ui-sidebar-config-filter-unused'), RED._("sidebar.config.showAllUnusedConfigNodes"));
-
+        RED.popover.tooltip($('#red-ui-sidebar-config-collapse-all'), RED._("palette.actions.collapse-all"));
+        RED.popover.tooltip($('#red-ui-sidebar-config-expand-all'), RED._("palette.actions.expand-all"));
     }
 
     function flashConfigNode(el) {
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js
index 8bfc5526e..b3d06f701 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js
@@ -36,7 +36,13 @@ RED.sidebar.help = (function() {
         toolbar = $("<div>", {class:"red-ui-sidebar-header red-ui-info-toolbar"}).appendTo(content);
         $('<span class="button-group"><a id="red-ui-sidebar-help-show-toc" class="red-ui-button red-ui-button-small selected" href="#"><i class="fa fa-list-ul"></i></a></span>').appendTo(toolbar)
         var showTOCButton = toolbar.find('#red-ui-sidebar-help-show-toc')
-        RED.popover.tooltip(showTOCButton,RED._("sidebar.help.showTopics"));
+        RED.popover.tooltip(showTOCButton, function () {
+            if ($(showTOCButton).hasClass('selected')) {
+                return RED._("sidebar.help.hideTopics");
+            } else {
+                return RED._("sidebar.help.showTopics");
+            }
+        });
         showTOCButton.on("click",function(e) {
             e.preventDefault();
             if ($(this).hasClass('selected')) {