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 1ab148217..f297d87f8 100755
--- 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
@@ -149,7 +149,10 @@
"toggle-navigator": "Toggle navigator",
"zoom-out": "Zoom out",
"zoom-reset": "Reset zoom",
- "zoom-in": "Zoom in"
+ "zoom-in": "Zoom in",
+ "search-flows": "Search flows",
+ "search-prev": "Previous",
+ "search-next": "Next"
},
"user": {
"loggedInAs": "Logged in as __name__",
diff --git a/packages/node_modules/@node-red/editor-client/src/js/keymap.json b/packages/node_modules/@node-red/editor-client/src/js/keymap.json
index f1f3f46e7..23e6eb42e 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/keymap.json
+++ b/packages/node_modules/@node-red/editor-client/src/js/keymap.json
@@ -90,6 +90,8 @@
"alt-a m": "core:align-selection-to-middle",
"alt-a c": "core:align-selection-to-center",
"alt-a h": "core:distribute-selection-horizontally",
- "alt-a v": "core:distribute-selection-vertically"
+ "alt-a v": "core:distribute-selection-vertically",
+ "shift-f": "core:search-prev",
+ "f": "core:search-next"
}
}
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js
index 52eee6c67..270e8b90d 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js
@@ -25,6 +25,7 @@ RED.search = (function() {
var searchHistory = [];
var index = {};
var currentResults = [];
+ var currentIndex = 0;
var previousActiveElement;
function indexProperty(node,label,property) {
@@ -324,7 +325,8 @@ RED.search = (function() {
}
} else if (!$(children[selected]).hasClass("red-ui-search-historyHeader")) {
if (currentResults.length > 0) {
- reveal(currentResults[Math.max(0,selected)].node);
+ currentIndex = Math.max(0,selected);
+ reveal(currentResults[currentIndex].node);
}
}
}
@@ -408,6 +410,7 @@ RED.search = (function() {
div.on("click", function(evt) {
evt.preventDefault();
+ currentIndex = i;
reveal(node);
});
}
@@ -428,8 +431,50 @@ RED.search = (function() {
RED.view.reveal(node.id);
}
+ function revealPrev() {
+ if(disabled) {
+ updateSearchToolbar();
+ return;
+ }
+ if(!searchResults || !currentResults.length) {
+ show();
+ return;
+ }
+ if(currentIndex > 0) {
+ currentIndex--;
+ } else {
+ currentIndex = currentResults.length-1;
+ }
+ const n = currentResults[currentIndex];
+ if(n && n.node && n.node.id) {
+ RED.view.reveal(n.node.id);
+ }
+ updateSearchToolbar();
+ }
+ function revealNext() {
+ if(disabled) {
+ updateSearchToolbar();
+ return;
+ }
+ if(!searchResults || !currentResults.length) {
+ show();
+ return;
+ }
+ if(currentIndex < currentResults.length-1) {
+ currentIndex++
+ } else {
+ currentIndex = 0;
+ }
+ const n = currentResults[currentIndex];
+ if(n && n.node && n.node.id) {
+ RED.view.reveal(n.node.id);
+ }
+ updateSearchToolbar();
+ }
+
function show(v) {
if (disabled) {
+ updateSearchToolbar();
return;
}
if (!visible) {
@@ -475,8 +520,16 @@ RED.search = (function() {
previousActiveElement = null;
}
}
+ updateSearchToolbar();
+ }
+ function updateSearchToolbar() {
+ if(!disabled && currentIndex >= 0 && currentResults && currentResults.length ) {
+ $("#red-ui-view-searchtools-counter").text((currentIndex+1) + " of " + currentResults.length )
+ $("#view-search-tools > :not(:first-child)").show(); //show other tools
+ } else {
+ $("#view-search-tools > :not(:first-child)").hide(); //hide all but search button
+ }
}
-
function clearIndex() {
index = {};
}
@@ -501,6 +554,8 @@ RED.search = (function() {
function init() {
RED.actions.add("core:search",show);
+ RED.actions.add("core:search-prev",revealPrev);
+ RED.actions.add("core:search-next",revealNext);
RED.events.on("editor:open",function() { disabled = true; });
RED.events.on("editor:close",function() { disabled = false; });
@@ -516,6 +571,11 @@ RED.search = (function() {
$("#red-ui-palette-shade").on('mousedown',hide);
$("#red-ui-sidebar-shade").on('mousedown',hide);
+ $("#red-ui-view-searchtools-close").on("click", function close() {
+ currentResults = [];
+ updateSearchToolbar();
+ });
+ $("#red-ui-view-searchtools-close").trigger("click");
RED.events.on("workspace:clear", clearIndex);
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js
index 4c9156207..7fde232c3 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js
@@ -31,6 +31,7 @@ RED.statusBar = (function() {
function addWidget(options) {
widgets[options.id] = options;
var el = $('');
+ el.prop('id', options.id);
options.element.appendTo(el);
if (options.align === 'left') {
leftBucket.append(el);
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js
index 5b9285152..0bdc63768 100755
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js
@@ -443,6 +443,33 @@ RED.view = (function() {
}
});
+ //add search to status-toolbar
+ RED.statusBar.add({
+ id: "view-search-tools",
+ align: "left",
+ hidden: false,
+ element: $(''+
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '')
+ })
+ $("#red-ui-view-searchtools-search").on("click", searchFlows);
+ RED.popover.tooltip($("#red-ui-view-searchtools-search"),RED._('actions.search-flows'),'core:search');
+ $("#red-ui-view-searchtools-prev").on("click", searchPrev);
+ RED.popover.tooltip($("#red-ui-view-searchtools-prev"),RED._('actions.search-prev'),'core:search-prev');
+ $("#red-ui-view-searchtools-next").on("click", searchNext);
+ RED.popover.tooltip($("#red-ui-view-searchtools-next"),RED._('actions.search-next'),'core:search-next');
+ RED.popover.tooltip($("#red-ui-view-searchtools-close"),RED._('common.label.close'));
+
// Handle nodes dragged from the palette
chart.droppable({
accept:".red-ui-palette-node",
@@ -1997,6 +2024,9 @@ RED.view = (function() {
}
}
function zoomZero() { zoomView(1); }
+ function searchFlows() { RED.actions.invoke("core:search"); }
+ function searchPrev() { RED.actions.invoke("core:search-prev"); }
+ function searchNext() { RED.actions.invoke("core:search-next"); }
function zoomView(factor) {
diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss
index 2adfb89ba..0ca7c2f84 100644
--- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss
+++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss
@@ -135,6 +135,13 @@
margin-top: -1px;
}
}
+
+ .search-counter {
+ display: inline-block;
+ font-size: smaller;
+ font-weight: 600;
+ white-space: nowrap;
+ }
}
a.red-ui-footer-button,