diff --git a/CHANGELOG.md b/CHANGELOG.md index 747f78261..9eabbaaac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ +#### 2.2.2: Maintenance Release + +Nodes + + - Fix "close timed out" error when performing full deploy or modifying broker node. (#3451) @Steve-Mcl + + +#### 2.2.1: Maintenance Release + +Editor + + - Handle mixed-cased filter terms in keyboard shortcut dialog (#3444) @knolleary + - Prevent duplicate links being added between nodes (#3442) @knolleary + - Fix to hide tooltip after removing subflow tab (#3391) @HiroyasuNishiyama + - Fix node validation to be applied to config node (#3397) @HiroyasuNishiyama + - Fix: Dont add wires to undo buffer twice (#3437) @Steve-Mcl + +Runtime + + - Improve module location parsing (of stack info) when adding hook (#3447) @Steve-Mcl + - Fix substitution of NR_NODE_PATH (#3445) @HiroyasuNishiyama + - Remove console.log when ignoring disabled module (#3439) @knolleary + - Improve "Unexpected Node Error" logging (#3446) @Steve-Mcl + +Nodes + + - Debug: Fix no-prototype-builtins bug in debug node and utils (#3394) @Alkarex + - Delay: Fix Japanese message of delay node (#3434) + - Allow nbRateUnits to be undefined when validating (#3443) @knolleary + - Coding help for recently added node-red Predefined Environment Variables (#3440) @Steve-Mcl + + #### 2.2.0: Milestone Release Editor diff --git a/package.json b/package.json index d3b1c7b14..df031ca2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "2.2.0", + "version": "2.2.2", "description": "Low-code programming for event-driven applications", "homepage": "http://nodered.org", "license": "Apache-2.0", @@ -28,7 +28,7 @@ "dependencies": { "acorn": "8.7.0", "acorn-walk": "8.2.0", - "ajv": "8.9.0", + "ajv": "8.10.0", "async-mutex": "0.3.2", "basic-auth": "2.0.1", "bcryptjs": "2.4.3", @@ -36,7 +36,7 @@ "cheerio": "1.0.0-rc.10", "clone": "2.1.2", "content-type": "1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-parser": "1.4.6", "cors": "2.8.5", "cronosjs": "1.7.1", @@ -50,32 +50,32 @@ "hash-sum": "2.0.0", "hpagent": "0.1.2", "https-proxy-agent": "5.0.0", - "i18next": "21.6.10", + "i18next": "21.6.11", "iconv-lite": "0.6.3", "is-utf8": "0.2.1", "js-yaml": "3.14.1", "json-stringify-safe": "5.0.1", - "jsonata": "1.8.5", + "jsonata": "1.8.6", "lodash.clonedeep": "^4.5.0", "media-typer": "1.1.0", - "memorystore": "1.6.6", + "memorystore": "1.6.7", "mime": "3.0.0", "moment-timezone": "0.5.34", - "mqtt": "4.3.4", + "mqtt": "4.3.5", "multer": "1.4.4", "mustache": "4.2.0", - "node-red-admin": "^2.2.2", + "node-red-admin": "^2.2.3", "nopt": "5.0.0", "oauth2orize": "1.11.1", "on-headers": "1.0.2", "passport": "0.5.2", "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", - "raw-body": "2.4.2", + "raw-body": "2.4.3", "semver": "7.3.5", "tar": "6.1.11", "tough-cookie": "4.0.0", - "uglify-js": "3.15.0", + "uglify-js": "3.15.1", "uuid": "8.3.2", "ws": "7.5.6", "xml2js": "0.4.23" @@ -84,7 +84,7 @@ "bcrypt": "5.0.1" }, "devDependencies": { - "dompurify": "2.3.4", + "dompurify": "2.3.5", "grunt": "1.4.1", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.4.3", @@ -113,11 +113,11 @@ "node-red-node-test-helper": "^0.2.7", "nodemon": "2.0.15", "proxy": "^1.0.2", - "sass": "1.49.0", + "sass": "1.49.7", "should": "13.2.3", "sinon": "11.1.2", "stoppable": "^1.1.0", - "supertest": "6.2.1" + "supertest": "6.2.2" }, "engines": { "node": ">=12" diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 0436f2871..468585284 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "2.2.0", + "version": "2.2.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,15 +16,15 @@ } ], "dependencies": { - "@node-red/util": "2.2.0", - "@node-red/editor-client": "2.2.0", + "@node-red/util": "2.2.2", + "@node-red/editor-client": "2.2.2", "bcryptjs": "2.4.3", "body-parser": "1.19.1", "clone": "2.1.2", "cors": "2.8.5", "express-session": "1.17.2", "express": "4.17.2", - "memorystore": "1.6.6", + "memorystore": "1.6.7", "mime": "3.0.0", "multer": "1.4.4", "mustache": "4.2.0", diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index 8e1b86cf8..222606df0 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -634,14 +634,7 @@ "empty": "leer", "globalConfig": "Globale Konfigurations-Nodes", "triggerAction": "Auslösen", - "find": "Suche im Arbeitsbereich", - "search": { - "configNodes": "Konfigurations-Nodes", - "unusedConfigNodes": "Unbenutzte Konfigurations-Nodes", - "invalidNodes": "Ungültige Nodes", - "uknownNodes": "Unbekannte Nodes", - "unusedSubflows": "Unbenutzte Subflows" - } + "find": "Suche im Arbeitsbereich" }, "help": { "name": "Hilfe", @@ -863,7 +856,14 @@ }, "search": { "empty": "Keine Übereinstimmungen gefunden", - "addNode": "Node hinzufügen ..." + "addNode": "Node hinzufügen ...", + "options": { + "configNodes": "Konfigurations-Nodes", + "unusedConfigNodes": "Unbenutzte Konfigurations-Nodes", + "invalidNodes": "Ungültige Nodes", + "uknownNodes": "Unbekannte Nodes", + "unusedSubflows": "Unbenutzte Subflows" + } }, "expressionEditor": { "functions": "Funktionen", 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 7419e4b9e..93e847066 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 @@ -501,7 +501,8 @@ "redoChange": "Redo", "searchBox": "Open search box", "managePalette": "Manage palette", - "actionList":"Action list" + "actionList": "Action list", + "splitWiresWithLinks": "Split selection with Link nodes" }, "library": { "library": "Library", @@ -671,15 +672,7 @@ "empty": "empty", "globalConfig": "Global Configuration Nodes", "triggerAction": "Trigger action", - "find": "Find in workspace", - "search": { - "configNodes": "Configuration nodes", - "unusedConfigNodes": "Unused configuration nodes", - "invalidNodes": "Invalid nodes", - "uknownNodes": "Unknown nodes", - "unusedSubflows": "Unused subflows", - "hiddenFlows": "Hidden flows" - } + "find": "Find in workspace" }, "help": { "name": "Help", @@ -903,7 +896,16 @@ "history": "Search history", "clear": "clear all", "empty": "No matches found", - "addNode": "add a node..." + "addNode": "add a node...", + "options": { + "configNodes": "Configuration nodes", + "unusedConfigNodes": "Unused configuration nodes", + "invalidNodes": "Invalid nodes", + "uknownNodes": "Unknown nodes", + "unusedSubflows": "Unused subflows", + "hiddenFlows": "Hidden flows", + "modifiedNodes": "Modified nodes and flows" + } }, "expressionEditor": { "functions": "Functions", diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index 04818601e..c45162246 100644 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -667,15 +667,7 @@ "empty": "空", "globalConfig": "グローバル設定ノード", "triggerAction": "アクションを実行", - "find": "ワークスペース内を検索", - "search": { - "configNodes": "設定ノード", - "unusedConfigNodes": "未使用の設定ノード", - "invalidNodes": "不正なノード", - "uknownNodes": "未知のノード", - "unusedSubflows": "未使用のサブフロー", - "hiddenFlows": "非表示のフロー" - } + "find": "ワークスペース内を検索" }, "help": { "name": "ヘルプ", @@ -899,7 +891,15 @@ "history": "検索履歴", "clear": "全て削除", "empty": "一致したものが見つかりませんでした", - "addNode": "ノードを追加..." + "addNode": "ノードを追加...", + "options": { + "configNodes": "設定ノード", + "unusedConfigNodes": "未使用の設定ノード", + "invalidNodes": "不正なノード", + "uknownNodes": "未知のノード", + "unusedSubflows": "未使用のサブフロー", + "hiddenFlows": "非表示のフロー" + } }, "expressionEditor": { "functions": "関数", diff --git a/packages/node_modules/@node-red/editor-client/locales/ru/editor.json b/packages/node_modules/@node-red/editor-client/locales/ru/editor.json index 04ff361ba..7f4a000a9 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ru/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ru/editor.json @@ -650,14 +650,7 @@ "empty": "пусто", "globalConfig": "Глобальные конфиг узлы", "triggerAction": "Вызвать действие", - "find": "Найти в рабочей области", - "search": { - "configNodes": "Узлы конфигурации", - "unusedConfigNodes": "Неиспользуемые узлы конфигурации", - "invalidNodes": "Недействительные узлы", - "uknownNodes": "Неизвестные узлы", - "unusedSubflows": "Неиспользуемые подпотоки" - } + "find": "Найти в рабочей области" }, "help": { "name": "Справка", @@ -888,7 +881,14 @@ }, "search": { "empty": "Ничего не найдено", - "addNode": "добавить узел..." + "addNode": "добавить узел...", + "options": { + "configNodes": "Узлы конфигурации", + "unusedConfigNodes": "Неиспользуемые узлы конфигурации", + "invalidNodes": "Недействительные узлы", + "uknownNodes": "Неизвестные узлы", + "unusedSubflows": "Неиспользуемые подпотоки" + } }, "expressionEditor": { "functions": "Функции", diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json index 3252563b7..17323875f 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json @@ -614,14 +614,7 @@ "empty": "空的", "globalConfig": "全局配置节点", "triggerAction": "触发动作", - "find": "在工作区中查找", - "search": { - "configNodes": "配置节点", - "unusedConfigNodes": "未使用的配置节点", - "invalidNodes": "无效的节点", - "uknownNodes": "未知的节点", - "unusedSubflows": "未使用的子流程" - } + "find": "在工作区中查找" }, "help": { "name": "帮助", @@ -842,7 +835,14 @@ }, "search": { "empty": "找不到匹配", - "addNode": "添加一个节点..." + "addNode": "添加一个节点...", + "options": { + "configNodes": "配置节点", + "unusedConfigNodes": "未使用的配置节点", + "invalidNodes": "无效的节点", + "uknownNodes": "未知的节点", + "unusedSubflows": "未使用的子流程" + } }, "expressionEditor": { "functions": "功能", diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json index 54b884682..bbc9328a8 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json @@ -614,14 +614,7 @@ "empty": "空的", "globalConfig": "全局配置節點", "triggerAction": "觸發動作", - "find": "在工作區中查找", - "search": { - "configNodes": "配置節點", - "unusedConfigNodes": "未使用的配置節點", - "invalidNodes": "無效的節點", - "uknownNodes": "未知的節點", - "unusedSubflows": "未使用的子流程" - } + "find": "在工作區中查找" }, "help": { "name": "幫助", @@ -842,7 +835,14 @@ }, "search": { "empty": "找不到匹配", - "addNode": "添加一個節點..." + "addNode": "添加一個節點...", + "options": { + "configNodes": "配置節點", + "unusedConfigNodes": "未使用的配置節點", + "invalidNodes": "無效的節點", + "uknownNodes": "未知的節點", + "unusedSubflows": "未使用的子流程" + } }, "expressionEditor": { "functions": "功能", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 03bba0d2a..347fe9112 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "2.2.0", + "version": "2.2.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/editor-client/src/js/history.js b/packages/node_modules/@node-red/editor-client/src/js/history.js index a8ffe581b..59531c48a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/history.js +++ b/packages/node_modules/@node-red/editor-client/src/js/history.js @@ -13,6 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ + +/** + * An API for undo / redo history buffer + * @namespace RED.history +*/ RED.history = (function() { var undoHistory = []; var redoHistory = []; 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 439ed5c8a..62a1f4414 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 @@ -92,6 +92,8 @@ "alt-a h": "core:distribute-selection-horizontally", "alt-a v": "core:distribute-selection-vertically", "shift-f": "core:search-previous", - "f": "core:search-next" + "f": "core:search-next", + "alt-l l": "core:split-wire-with-link-nodes" + } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/nodes.js b/packages/node_modules/@node-red/editor-client/src/js/nodes.js index 78b9deae6..0643f7e33 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/nodes.js +++ b/packages/node_modules/@node-red/editor-client/src/js/nodes.js @@ -13,6 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ + +/** + * An Interface to nodes and utility functions for creating/adding/deleting nodes and links + * @namespace RED.nodes +*/ RED.nodes = (function() { var PORT_TYPE_INPUT = 1; @@ -600,6 +605,14 @@ RED.nodes = (function() { RED.events.emit('nodes:add',n); } function addLink(l) { + if (nodeLinks[l.source.id]) { + const isUnique = nodeLinks[l.source.id].out.every(function(link) { + return link.sourcePort !== l.sourcePort || link.target.id !== l.target.id + }) + if (!isUnique) { + return + } + } links.push(l); if (l.source) { // Possible the node hasn't been added yet @@ -2676,7 +2689,6 @@ RED.nodes = (function() { getType: registry.getNodeType, getNodeHelp: getNodeHelp, convertNode: convertNode, - add: addNode, remove: removeNode, clear: clear, diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 2b1c8f2e4..ca3f17241 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -602,7 +602,10 @@ var RED = (function() { null, {id: "menu-item-edit-select-all", label:RED._("keyboard.selectAll"), onselect: "core:select-all-nodes"}, {id: "menu-item-edit-select-connected", label:RED._("keyboard.selectAllConnected"), onselect: "core:select-connected-nodes"}, - {id: "menu-item-edit-select-none", label:RED._("keyboard.selectNone"), onselect: "core:select-none"} + {id: "menu-item-edit-select-none", label:RED._("keyboard.selectNone"), onselect: "core:select-none"}, + null, + {id: "menu-item-edit-split-wire-with-links", label:RED._("keyboard.splitWireWithLinks"), onselect: "core:split-wire-with-link-nodes"}, + ]}); menuOptions.push({id:"menu-item-view-menu",label:RED._("menu.label.view.view"),options:[ diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js index f060af37d..5871abcde 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js @@ -350,6 +350,15 @@ RED.popover = (function() { } } + target.on("remove", function (ev) { + if (timer) { + clearTimeout(timer); + } + if (active) { + active = false; + setTimeout(closePopup,delay.hide); + } + }); if (trigger === 'hover') { target.on('mouseenter',function(e) { clearTimeout(timer); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index a407fc6cd..592075dfd 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -334,6 +334,9 @@ RED.deploy = (function() { var invalidNodes = []; RED.nodes.eachConfig(function(node) { + if (node.valid === undefined) { + RED.editor.validateNode(node); + } if (!node.valid && !node.d) { invalidNodes.push(getNodeInfo(node)); } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js index 35ca607a0..0e17fec75 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js @@ -577,7 +577,7 @@ RED.editor.codeEditor.monaco = (function() { createMonacoCompletionItem("set (flow context)", 'flow.set("${1:name}", ${1:value});','Set a value in flow context',range), createMonacoCompletionItem("get (global context)", 'global.get("${1:name}");','Get a value from global context',range), createMonacoCompletionItem("set (global context)", 'global.set("${1:name}", ${1:value});','Set a value in global context',range), - createMonacoCompletionItem("get (env)", 'env.get("${1:name}");','Get env variable value',range), + createMonacoCompletionItem("get (env)", 'env.get("${1|NR_NODE_ID,NR_NODE_NAME,NR_NODE_PATH,NR_GROUP_ID,NR_GROUP_NAME,NR_FLOW_ID,NR_FLOW_NAME|}");','Get env variable value',range), createMonacoCompletionItem("cloneMessage (RED.util)", 'RED.util.cloneMessage(${1:msg});', ["```typescript", "RED.util.cloneMessage(msg: T): T", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js index cecb408bd..d9511269d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js @@ -625,7 +625,7 @@ RED.keyboard = (function() { pane.find("#red-ui-settings-tab-keyboard-filter").searchBox({ delay: 100, change: function() { - var filterValue = $(this).val().trim(); + var filterValue = $(this).val().trim().toLowerCase(); if (filterValue === "") { shortcutList.editableList('filter', null); } else { 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 5927bc31b..f814f3619 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 @@ -121,6 +121,7 @@ RED.search = (function() { val = extractFlag(val,"config",flags); val = extractFlag(val,"subflow",flags); val = extractFlag(val,"hidden",flags); + val = extractFlag(val,"modified",flags); // uses: val = extractValue(val,"uses",flags); @@ -166,6 +167,11 @@ RED.search = (function() { continue; } } + if (flags.hasOwnProperty("modified")) { + if (!node.node.changed && !node.node.moved) { + continue; + } + } if (flags.hasOwnProperty("hidden")) { // Only tabs can be hidden if (node.node.type !== 'tab') { @@ -263,9 +269,8 @@ RED.search = (function() { } else { searchResults.editableList('addItem',{}); } - - - } + }, + options: getSearchOptions() }); var copySearchContainer = $('').appendTo(searchDiv).on('click', function(evt) { evt.preventDefault(); @@ -564,6 +569,17 @@ RED.search = (function() { addItemToIndex(item); } + function getSearchOptions() { + return [ + {label:RED._("search.options.configNodes"), value:"is:config"}, + {label:RED._("search.options.unusedConfigNodes"), value:"is:config is:unused"}, + {label:RED._("search.options.modifiedNodes"), value:"is:modified"}, + {label:RED._("search.options.invalidNodes"), value: "is:invalid"}, + {label:RED._("search.options.uknownNodes"), value: "type:unknown"}, + {label:RED._("search.options.unusedSubflows"), value:"is:subflow is:unused"}, + {label:RED._("search.options.hiddenFlows"), value:"is:hidden"}, + ] + } function init() { RED.actions.add("core:search",show); @@ -615,7 +631,8 @@ RED.search = (function() { init: init, show: show, hide: hide, - search: search + search: search, + getSearchOptions: getSearchOptions }; })(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js index fb393156e..32491f297 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js @@ -268,14 +268,7 @@ RED.sidebar.info.outliner = (function() { } }, - options: [ - {label:RED._("sidebar.info.search.configNodes"), value:"is:config"}, - {label:RED._("sidebar.info.search.unusedConfigNodes"), value:"is:config is:unused"}, - {label:RED._("sidebar.info.search.invalidNodes"), value: "is:invalid"}, - {label:RED._("sidebar.info.search.uknownNodes"), value: "type:unknown"}, - {label:RED._("sidebar.info.search.unusedSubflows"), value:"is:subflow is:unused"}, - {label:RED._("sidebar.info.search.hiddenFlows"), value:"is:hidden"}, - ] + options: RED.search.getSearchOptions() }); projectInfo = $('
').hide().appendTo(container) @@ -287,15 +280,18 @@ RED.sidebar.info.outliner = (function() { data:getFlowData() }) treeList.on('treelistselect', function(e,item) { - var node = RED.nodes.node(item.id) || RED.nodes.group(item.id); + var node = RED.nodes.node(item.id) || RED.nodes.group(item.id) || RED.nodes.workspace(item.id) || RED.nodes.subflow(item.id); if (node) { - if (node.type === 'group' || node._def.category !== "config") { - // RED.view.select({nodes:[node]}) - } else if (node._def.category === "config") { - RED.sidebar.info.refresh(node); - } else { - // RED.view.select({nodes:[]}) - } + RED.sidebar.info.refresh(node); + // if (node.type === 'group' || node._def.category !== "config") { + // // RED.view.select({nodes:[node]}) + // } else if (node._def.category === "config") { + // RED.sidebar.info.refresh(node); + // } else { + // // RED.view.select({nodes:[]}) + // } + } else { + RED.sidebar.info.refresh(null); } }) treeList.on('treelistconfirm', function(e,item) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js index 017172a23..9236e55b2 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js @@ -163,6 +163,7 @@ RED.sidebar.info = (function() { }); return el; } + function refresh(node) { if (node === undefined) { refreshSelection(); @@ -271,7 +272,7 @@ RED.sidebar.info = (function() { objectType = "group"; } $(propRow.children()[0]).text(RED._("sidebar.info."+objectType)) - RED.utils.createObjectElement(node.id).appendTo(propRow.children()[1]); + RED.utils.createObjectElement(node.id,{sourceId: node.id}).appendTo(propRow.children()[1]); if (node.type === "tab" || node.type === "subflow") { // If nothing is selected, but we're on a flow or subflow tab. @@ -365,7 +366,7 @@ RED.sidebar.info = (function() { } } else { - RED.utils.createObjectElement(val).appendTo(propRow.children()[1]); + RED.utils.createObjectElement(val,{sourceId: node.id}).appendTo(propRow.children()[1]); } } } @@ -431,6 +432,7 @@ RED.sidebar.info = (function() { } + function setInfoText(infoText,target) { var info = addTargetToExternalLinks($('
'+infoText+'
')).appendTo(target); info.find(".red-ui-text-bidi-aware").contents().filter(function() { return this.nodeType === 3 && this.textContent.trim() !== "" }).wrap( "" ); @@ -447,6 +449,7 @@ RED.sidebar.info = (function() { $(this).toggleClass('expanded',!isExpanded); }) } + var tips = (function() { var enabled = true; var startDelay = 1000; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js index 33f6c3ea1..183c807b8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js @@ -365,7 +365,16 @@ RED.utils = (function() { } } - function buildMessageElement(obj,options) { + /** + * Create a DOM element representation of obj - as used by Debug sidebar etc + * + * @params obj - the data to display + * @params options - a bag of options + * + * - If you want the Copy Value button, then set `sourceId` + * - If you want the Copy Path button, also set `path` to the value to be copied + */ + function createObjectElement(obj,options) { options = options || {}; var key = options.key; var typeHint = options.typeHint; @@ -555,7 +564,7 @@ RED.utils = (function() { if (fullLength <= 10) { for (i=0;i