diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cb1464cc..cc175a79b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,69 @@ +### 1.3.4 Maintenance Release + +Editor + - Allow nodes to access resolved theme files Fixes #2968 + - Fix importing node to currently flow rather than match its old z value + - Don't let 'escape' whilst moving nodes interrupt things Fixes #2960 + - Sort context stores in TypedInput and ensure default first Fixes #2954 + - Fix margin between nodes on palette (#2947) @kazuhitoyokoi + - Ensure typedInput option is selected in dropdown menu Part of #2945 + - Ensure typedInput without value has focus class removed Closes #2945 + - TreeList: Fix remove item when depth=0 and wrong gutter calc (#2967) @hanc2006 + +Runtime + - Handle subflow modules that contain subflows + - Timeout http upgrade requests that are not otherwise handled Fixes #2956 + - Fix error on auto commit for no flow change (#2957) @HiroyasuNishiyama + +Nodes + + - CSV: Fix CSV handling of special chars as separators + - Delay: Give delay node random mina nd max more space so you can see complete value + - Exec: fix grunt fail on exec node test (#2964) @HiroyasuNishiyama + - Function: Ensure function expand button is above vertical scrollbar Fixes #2955 + - Inject: Fix inject node output tooltip extra property count + + +### 1.3.3: Maintenance Release + +Editor + + - Fix package semver comparison to allow >1 version increment + - Prevent TypedInput label overflowing element Fixes #2941 + - Remove TypedInput from tab focus when only one type available + - Make typedInput.disable more consistent in behaviour Fixes #2942 + - Fix project credential secret reset handling Part of #2868 + +Runtime + + - Export package version in Grunt file so docs template can access + +Nodes + + - CSV: ensure CSV node can send false as string + - HTTPIn: handle application/x-protobuf as Buffer type (#2935 #2938) @hardillb + - MQTT: Ensure mqtt-close message is published when closing mqtt nodes + + +### 1.3.2: Maintenance Release + +Runtime + - Handle package.json without dependencies section + +Editor + + - Fix variable reference error in editableList Fixes #2933 + - Fix handling of user-provided keymap Fixes #2926 + - Ensure theme login image is passed through to api response Fixes #2929 + - Add Japanese translations for Node-RED v1.3.1 (#2930) @kazuhitoyokoi + +Nodes + + - CSV: Fix CSV parsing with other than , separator + - File out: Fix timing of msg.send to be after close + - Function: describe `node.outputCount` in help text + - MQTT: Fix MQTT Broker TLS config row layout Fixes #2927 + - Split: add comment to info re $N being number of messages arriving ### 1.3.1: Maintenance Release diff --git a/Gruntfile.js b/Gruntfile.js index 3cecfccd4..99edc4c1f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -471,7 +471,8 @@ module.exports = function(grunt) { ], options: { destination: 'docs', - configure: './jsdoc.json' + configure: './jsdoc.json', + fred: "hi there" } }, _editor: { diff --git a/packages/node_modules/@node-red/editor-api/lib/auth/index.js b/packages/node_modules/@node-red/editor-api/lib/auth/index.js index d4ec10f08..fb95ede7b 100644 --- a/packages/node_modules/@node-red/editor-api/lib/auth/index.js +++ b/packages/node_modules/@node-red/editor-api/lib/auth/index.js @@ -90,7 +90,7 @@ function getToken(req,res,next) { return server.token()(req,res,next); } -function login(req,res) { +async function login(req,res) { var response = {}; if (settings.adminAuth) { var mergedAdminAuth = Object.assign({}, settings.adminAuth, settings.adminAuth.module); @@ -116,8 +116,9 @@ function login(req,res) { response.prompts[0].image = theme.serveFile('/login/',mergedAdminAuth.strategy.image); } } - if (theme.context().login && theme.context().login.image) { - response.image = theme.context().login.image; + let themeContext = await theme.context(); + if (themeContext.login && themeContext.login.image) { + response.image = themeContext.login.image; } } res.json(response); diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js index 3ea4ede73..de0106dbe 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js @@ -129,6 +129,14 @@ module.exports = { } themeContext.page.title = theme.page.title || themeContext.page.title; + + // Store the resolved urls to these resources so nodes (such as Debug) + // can access them + theme.page._ = { + css: themeContext.page.css, + scripts: themeContext.page.scripts, + favicon: themeContext.page.favicon + } } if (theme.header) { @@ -223,6 +231,8 @@ module.exports = { themePlugin.path ); themeContext.page.css = cssFiles.concat(themeContext.page.css || []) + theme.page = theme.page || {_:{}} + theme.page._.css = cssFiles.concat(theme.page._.css || []) } if (themePlugin.scripts) { const scriptFiles = serveFilesFromTheme( @@ -232,6 +242,8 @@ module.exports = { themePlugin.path ) themeContext.page.scripts = scriptFiles.concat(themeContext.page.scripts || []) + theme.page = theme.page || {_:{}} + theme.page._.scripts = cssFiles.concat(theme.page._.scripts || []) } } activeThemeInitialised = true; 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 6a7edb202..3870c9336 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 @@ -524,8 +524,8 @@ "title": "パレットの管理", "palette": "パレット", "times": { - "seconds": "秒前", - "minutes": "分前", + "seconds": "数秒前", + "minutes": "数分前", "minutesV": "__count__ 分前", "hoursV": "__count__ 時間前", "hoursV_plural": "__count__ 時間前", 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 174892d43..9b580f9a0 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 @@ -1424,6 +1424,8 @@ RED.nodes = (function() { nid = getID(); workspace_map[n.id] = nid; n.id = nid; + } else { + workspace_map[n.id] = n.id; } addWorkspace(n); RED.workspaces.add(n); @@ -1523,7 +1525,7 @@ RED.nodes = (function() { } } } else { - if (n.z && !workspaces[n.z] && !subflow_map[n.z]) { + if (n.z && !workspace_map[n.z] && !subflow_map[n.z]) { n.z = activeWorkspace; } } @@ -1621,7 +1623,7 @@ RED.nodes = (function() { node.id = getID(); } else { node.id = n.id; - if (node.z == null || (!workspaces[node.z] && !subflow_map[node.z])) { + if (node.z == null || (!workspace_map[node.z] && !subflow_map[node.z])) { if (createMissingWorkspace) { if (missingWorkspace === null) { missingWorkspace = RED.workspaces.add(null,true); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index 5b831a942..caffe5793 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -1186,22 +1186,6 @@ RED.clipboard = (function() { } } - function getNodeLabelText(n) { - var label = n.name || n.type+": "+n.id; - if (n._def.label) { - try { - label = (typeof n._def.label === "function" ? n._def.label.call(n) : n._def.label)||""; - } catch(err) { - console.log("Definition error: "+n.type+".label",err); - } - } - var newlineIndex = label.indexOf("\\n"); - if (newlineIndex > -1) { - label = label.substring(0,newlineIndex)+"..."; - } - return label; - } - function getFlowLabel(n) { n = JSON.parse(JSON.stringify(n)); n._def = RED.nodes.getType(n.type) || {}; @@ -1227,16 +1211,8 @@ RED.clipboard = (function() { if (n._def) { n._ = n._def._; } - var div = $('
',{class:"red-ui-info-outline-item"}); - RED.utils.createNodeIcon(n).appendTo(div); - var contentDiv = $('
',{class:"red-ui-search-result-description"}).appendTo(div); - var labelText = getNodeLabelText(n); - var label = $('
',{class:"red-ui-search-result-node-label red-ui-info-outline-item-label"}).appendTo(contentDiv); - if (labelText) { - label.text(labelText) - } else { - label.html(n.type) - } + var div = $('
',{class:"red-ui-node-list-item"}); + RED.utils.createNodeIcon(n,true).appendTo(div); return div; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js index 7f823289e..00666e5b4 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js @@ -71,7 +71,7 @@ var buttons = this.options.buttons || []; if (this.options.addButton !== false) { - var addLabel, addTittle; + var addLabel, addTitle; if (typeof this.options.addButton === 'string') { addLabel = this.options.addButton } else { @@ -102,7 +102,7 @@ button.click(evt); } }); - + if (button.title) { element.attr("title", button.title); } @@ -113,7 +113,7 @@ element.append($("").text(" " + button.label)); } }); - + if (this.element.css("position") === "absolute") { ["top","left","bottom","right"].forEach(function(s) { var v = that.element.css(s); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js index a6db02ffb..7f7eba1ba 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js @@ -312,7 +312,7 @@ } if (child.depth !== parent.depth+1) { child.depth = parent.depth+1; - var labelPaddingWidth = ((child.gutter?child.gutter.width()+2:0)+(child.depth*20)); + var labelPaddingWidth = ((child.gutter ? child.gutter[0].offsetWidth + 2 : 0) + (child.depth * 20)); child.treeList.labelPadding.width(labelPaddingWidth+'px'); if (child.element) { $(child.element).css({ @@ -348,6 +348,18 @@ that._selected.delete(item); delete item.treeList; delete that._items[item.id]; + if(item.depth === 0) { + for(var key in that._items) { + if (that._items.hasOwnProperty(key)) { + var child = that._items[key]; + if(child.parent && child.parent.id === item.id) { + delete that._items[key].treeList; + delete that._items[key]; + } + } + } + that._data = that._data.filter(function(data) { return data.id !== item.id}) + } } item.treeList.insertChildAt = function(newItem,position,select) { newItem.parent = item; @@ -480,7 +492,10 @@ if (item.treeList.container) { $(item.element).remove(); $(element).appendTo(item.treeList.label); - var labelPaddingWidth = (item.gutter?item.gutter.width()+2:0)+(item.depth*20); + // using the JQuery Object, the gutter width will + // be wrong when the element is reattached the second time + var labelPaddingWidth = (item.gutter ? item.gutter[0].offsetWidth + 2 : 0) + (item.depth * 20); + $(element).css({ width: "calc(100% - "+(labelPaddingWidth+20+(item.icon?20:0))+"px)" }) @@ -516,7 +531,7 @@ }).appendTo(label) } - var labelPaddingWidth = (item.gutter?item.gutter.width()+2:0)+(depth*20); + var labelPaddingWidth = (item.gutter ? item.gutter[0].offsetWidth + 2 : 0) + (depth * 20) item.treeList.labelPadding = $('').css({ display: "inline-block", width: labelPaddingWidth+'px' diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js index 1b5af5f13..0401be1b9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js @@ -15,7 +15,7 @@ **/ (function($) { var contextParse = function(v,defaultStore) { - var parts = RED.utils.parseContextKey(v, defaultStore); + var parts = RED.utils.parseContextKey(v, defaultStore&&defaultStore.value); return { option: parts.store, value: parts.key @@ -279,6 +279,14 @@ var contextStores = RED.settings.context.stores; var contextOptions = contextStores.map(function(store) { return {value:store,label: store, icon:''} + }).sort(function(A,B) { + if (A.value === RED.settings.context.default) { + return -1; + } else if (B.value === RED.settings.context.default) { + return 1; + } else { + return A.value.localeCompare(B.value); + } }) if (contextOptions.length < 2) { allOptions.flow.options = []; @@ -389,6 +397,11 @@ evt.stopPropagation(); }).on('focus', function() { that.uiSelect.addClass('red-ui-typedInput-focus'); + }).on('blur', function() { + var opt = that.typeMap[that.propertyType]; + if (opt.hasValue === false) { + that.uiSelect.removeClass('red-ui-typedInput-focus'); + } }) // explicitly set optionSelectTrigger display to inline-block otherwise jQ sets it to 'inline' @@ -438,7 +451,11 @@ }); this._showMenu(this.optionMenu,this.optionSelectTrigger); - var selectedOption = this.optionMenu.find("[value='"+this.optionValue+"']"); + var targetValue = this.optionValue; + if (this.optionValue === null || this.optionValue === undefined) { + targetValue = this.value(); + } + var selectedOption = this.optionMenu.find("[value='"+targetValue+"']"); if (selectedOption.length === 0) { selectedOption = this.optionMenu.children(":first"); } @@ -669,6 +686,11 @@ that.typeMap[result.value] = result; return result; }); + if (this.typeList.length < 2) { + this.selectTrigger.attr("tabindex", -1) + } else { + this.selectTrigger.attr("tabindex", 0) + } this.selectTrigger.toggleClass("disabled", this.typeList.length === 1); this.selectTrigger.find(".fa-caret-down").toggle(this.typeList.length > 1) if (this.menu) { @@ -768,6 +790,11 @@ if (opt.hasValue === false || (opt.showLabel !== false && !opt.icon)) { this.selectLabel.text(opt.label); } + if (opt.label) { + this.selectTrigger.attr("title",opt.label); + } else { + this.selectTrigger.attr("title",""); + } if (opt.hasValue === false) { this.selectTrigger.addClass("red-ui-typedInput-full-width"); } else { @@ -1004,16 +1031,17 @@ this.uiSelect.hide(); }, disable: function(val) { - if(val === true) { + if(val === undefined || !!val ) { this.uiSelect.attr("disabled", "disabled"); - } else if (val === false) { - this.uiSelect.attr("disabled", null); //remove attr } else { - this.uiSelect.attr("disabled", val); //user value + this.uiSelect.attr("disabled", null); //remove attr } }, + enable: function() { + this.uiSelect.attr("disabled", null); //remove attr + }, disabled: function() { - return this.uiSelect.attr("disabled"); + return this.uiSelect.attr("disabled") === "disabled"; } }); })(jQuery); 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 2c81cfe63..9e976e4fc 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 @@ -119,7 +119,7 @@ RED.keyboard = (function() { } else { mergedKeymap[action] = [{ scope: themeKeymap[action].scope || "*", - key: [themeKeymap[action].key], + key: themeKeymap[action].key, user: false }] if (mergedKeymap[action][0].scope === "workspace") { 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 2fe3d448e..e57a19349 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 @@ -331,7 +331,7 @@ RED.palette.editor = (function() { nodeEntry.versionSpan.html(moduleInfo.version+' '+moduleInfo.pending_version).appendTo(nodeEntry.metaRow) nodeEntry.updateButton.text(RED._('palette.editor.updated')).addClass('disabled').css('display', 'inline-block'); } else if (loadedIndex.hasOwnProperty(module)) { - if (semVerCompare(loadedIndex[module].version,moduleInfo.version) === 1) { + if (semVerCompare(loadedIndex[module].version,moduleInfo.version) > 0) { nodeEntry.updateButton.show(); nodeEntry.updateButton.text(RED._('palette.editor.update',{version:loadedIndex[module].version})); } else { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js index c39ac97be..336893a59 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js @@ -928,11 +928,11 @@ RED.projects.settings = (function() { saveDisabled = isFlowInvalid || credFileLabelText.text()===""; - if (credentialSecretExistingInput.is(":visible")) { + if (credentialSecretExistingRow.is(":visible")) { credentialSecretExistingInput.toggleClass("input-error", credentialSecretExistingInput.val() === ""); saveDisabled = saveDisabled || credentialSecretExistingInput.val() === ""; } - if (credentialSecretNewInput.is(":visible")) { + if (credentialSecretNewRow.is(":visible")) { credentialSecretNewInput.toggleClass("input-error", credentialSecretNewInput.val() === ""); saveDisabled = saveDisabled || credentialSecretNewInput.val() === ""; } @@ -1130,7 +1130,7 @@ RED.projects.settings = (function() { } if (credentialSecretResetButton.hasClass('selected') || credentialSecretEditButton.hasClass('selected')) { payload.credentialSecret = credentialSecretNewInput.val(); - if (credentialSecretExistingInput.is(":visible")) { + if (credentialSecretExistingRow.is(":visible")) { payload.currentCredentialSecret = credentialSecretExistingInput.val(); } } 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 2bc932b8c..61ac462f5 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 @@ -230,9 +230,8 @@ RED.sidebar.help = (function() { } function getNodeLabel(n) { - var div = $('
',{class:"red-ui-info-outline-item"}); + var div = $('
',{class:"red-ui-node-list-item"}); RED.utils.createNodeIcon(n).appendTo(div); - var contentDiv = $('
',{class:"red-ui-search-result-description"}).appendTo(div); var label = n.name; if (!label && n._def.paletteLabel) { try { @@ -241,7 +240,7 @@ RED.sidebar.help = (function() { } } label = label || n.type; - $('
',{class:"red-ui-search-result-node-label red-ui-info-outline-item-label"}).text(label).appendTo(contentDiv); + $('
',{class:"red-ui-node-label"}).text(n.name||n.type).appendTo(div); return div; } 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 891f9f7dc..a1ae6e48b 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 @@ -73,36 +73,11 @@ RED.sidebar.info.outliner = (function() { return item; } - function getNodeLabelText(n) { - var label = n.name || n.type+": "+n.id; - if (n._def.label) { - try { - label = (typeof n._def.label === "function" ? n._def.label.call(n) : n._def.label)||""; - } catch(err) { - console.log("Definition error: "+n.type+".label",err); - } - } - var newlineIndex = label.indexOf("\\n"); - if (newlineIndex > -1) { - label = label.substring(0,newlineIndex)+"..."; - } - return label; - } - function getNodeLabel(n) { - var div = $('
',{class:"red-ui-info-outline-item"}); - RED.utils.createNodeIcon(n).appendTo(div); - var contentDiv = $('
',{class:"red-ui-search-result-description"}).appendTo(div); - var labelText = getNodeLabelText(n); - var label = $('
',{class:"red-ui-search-result-node-label red-ui-info-outline-item-label"}).appendTo(contentDiv); - if (labelText) { - label.text(labelText) - } else { - label.html(" ") - } - + var div = $('
',{class:"red-ui-node-list-item red-ui-info-outline-item"}); + RED.utils.createNodeIcon(n, true).appendTo(div); + div.find(".red-ui-node-label").addClass("red-ui-info-outline-item-label") addControls(n, div); - return div; } @@ -430,7 +405,7 @@ RED.sidebar.info.outliner = (function() { var existingObject = objects[n.id]; var parent = n.g||n.z||"__global__"; - var nodeLabelText = getNodeLabelText(n); + var nodeLabelText = RED.utils.getNodeLabel(n,n.name || (n.type+": "+n.id)); if (nodeLabelText) { existingObject.element.find(".red-ui-info-outline-item-label").text(nodeLabelText); } else { 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 f81c98748..bb17ea395 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 @@ -1125,9 +1125,9 @@ RED.utils = (function() { imageIconElement.css("backgroundImage", "url("+iconUrl+")"); } - function createNodeIcon(node) { + function createNodeIcon(node, includeLabel) { var def = node._def; - var nodeDiv = $('
',{class:"red-ui-search-result-node"}) + var nodeDiv = $('
',{class:"red-ui-node-icon"}) if (node.type === "_selection_") { nodeDiv.addClass("red-ui-palette-icon-selection"); } else if (node.type === "group") { @@ -1147,8 +1147,20 @@ RED.utils = (function() { } var icon_url = RED.utils.getNodeIcon(def,node); - var iconContainer = $('
',{class:"red-ui-palette-icon-container"}).appendTo(nodeDiv); - RED.utils.createIconElement(icon_url, iconContainer, true); + RED.utils.createIconElement(icon_url, nodeDiv, true); + + if (includeLabel) { + var container = $(''); + nodeDiv.appendTo(container); + var labelText = RED.utils.getNodeLabel(node,node.name || (node.type+": "+node.id)); + var label = $('
',{class:"red-ui-node-label"}).appendTo(container); + if (labelText) { + label.text(labelText) + } else { + label.html(" ") + } + return container; + } return nodeDiv; } 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 e19387a1e..bffc6fd85 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 @@ -1751,7 +1751,6 @@ RED.view = (function() { } } if (mouse_mode == RED.state.IMPORT_DRAGGING) { - RED.keyboard.remove("escape"); updateActiveNodes(); RED.nodes.dirty(true); } @@ -1786,6 +1785,9 @@ RED.view = (function() { } function selectNone() { + if (mouse_mode === RED.state.MOVING || mouse_mode === RED.state.MOVING_ACTIVE) { + return; + } if (mouse_mode === RED.state.IMPORT_DRAGGING) { clearSelection(); RED.history.pop(); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss index 385ad761f..1b27f7a2a 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss @@ -134,7 +134,7 @@ &:not(.red-ui-palette-node-config):not(.red-ui-palette-node-small):first-child { margin-top: 15px; } - &:not(.red-ui-palette-node-config):not(.red-ui-palette-node-small):first-child { + &:not(.red-ui-palette-node-config):not(.red-ui-palette-node-small):last-child { margin-bottom: 15px; } } @@ -229,3 +229,47 @@ left: 1px; } } + +//////////////// + +.red-ui-node-list-item { + display: inline-block; + padding: 0; + font-size: 13px; + border: none; +} +.red-ui-node-icon { + display: inline-block; + float:left; + width: 24px; + height: 20px; + margin-top: 1px; + // width: 30px; + // height: 25px; + border-radius: 3px; + border: 1px solid $node-border; + background-position: 5% 50%; + background-repeat: no-repeat; + background-size: contain; + position: relative; + background-color: $node-icon-background-color; + text-align: center; + + .red-ui-palette-icon { + width: 20px; + } + + .red-ui-palette-icon-fa { + font-size: 14px; + position: relative; + top: -1px; + left: 0px; + } +} + +.red-ui-node-label { + margin-left: 32px; + line-height: 23px; + white-space: nowrap; + color: $secondary-text-color; +} diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss index 42d5462f7..07bbbae1c 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss @@ -326,13 +326,17 @@ div.red-ui-info-table { border-bottom: 1px solid $secondary-border-color; } } -.red-ui-info-outline,.red-ui-sidebar-help-toc, #red-ui-clipboard-dialog-import-conflicts-list, #red-ui-clipboard-dialog-export-tab-clipboard-preview { +.red-ui-info-outline, +// TODO: remove these classes for 2.0. Keeping in 1.x for backwards compatibility +// of theme generators. +.red-ui-sidebar-help-toc, #red-ui-clipboard-dialog-import-conflicts-list, #red-ui-clipboard-dialog-export-tab-clipboard-preview + { .red-ui-info-outline-item { display: inline-block; padding: 0; font-size: 13px; border: none; - .red-ui-palette-icon-fa { + &:not(.red-ui-node-list-item) .red-ui-palette-icon-fa { position: relative; top: 1px; left: 0px; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/ui/common/typedInput.scss b/packages/node_modules/@node-red/editor-client/src/sass/ui/common/typedInput.scss index 14cb3f70e..2b12fffea 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/ui/common/typedInput.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/ui/common/typedInput.scss @@ -24,7 +24,7 @@ margin: 0; vertical-align: middle; box-sizing: border-box; - overflow:visible; + overflow: hidden; position: relative; &[disabled] { input, button { @@ -33,7 +33,7 @@ cursor: not-allowed; } } - + .red-ui-typedInput-input-wrap { flex-grow: 1; } diff --git a/packages/node_modules/@node-red/nodes/core/common/20-inject.html b/packages/node_modules/@node-red/nodes/core/common/20-inject.html index c892c4867..a0838ec00 100644 --- a/packages/node_modules/@node-red/nodes/core/common/20-inject.html +++ b/packages/node_modules/@node-red/nodes/core/common/20-inject.html @@ -214,7 +214,7 @@ for (var i=0,l=props.length; i 0) lab += "\n"; if (i === 5) { - lab += " + "+(props.length-4); + lab += "... +"+(props.length-5); break; } lab += props[i].p+": "; diff --git a/packages/node_modules/@node-red/nodes/core/common/21-debug.js b/packages/node_modules/@node-red/nodes/core/common/21-debug.js index 0e00a8fff..8d2121580 100644 --- a/packages/node_modules/@node-red/nodes/core/common/21-debug.js +++ b/packages/node_modules/@node-red/nodes/core/common/21-debug.js @@ -2,7 +2,8 @@ module.exports = function(RED) { "use strict"; var util = require("util"); var events = require("events"); - //var path = require("path"); + const fs = require("fs-extra"); + const path = require("path"); var debuglength = RED.settings.debugMaxLength || 1000; var useColors = RED.settings.debugUseColors || false; util.inspect.styles.boolean = "red"; @@ -249,11 +250,34 @@ module.exports = function(RED) { } }); + let cachedDebugView; + RED.httpAdmin.get("/debug/view/view.html", function(req,res) { + if (!cachedDebugView) { + fs.readFile(path.join(__dirname,"lib","debug","view.html")).then(data => { + let customStyles = ""; + try { + let customStyleList = RED.settings.editorTheme.page._.css || []; + customStyleList.forEach(style => { + customStyles += `\n` + }) + } catch(err) {} + cachedDebugView = data.toString().replace("",customStyles) + res.set('Content-Type', 'text/html'); + res.send(cachedDebugView).end(); + }).catch(err => { + res.sendStatus(404); + }) + } else { + res.send(cachedDebugView).end(); + } + + }); + // As debug/view/debug-utils.js is loaded via