diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js b/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js index 187bd823f..058053a29 100644 --- a/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js +++ b/packages/node_modules/@node-red/editor-api/lib/admin/nodes.js @@ -60,6 +60,7 @@ module.exports = { runtimeAPI.nodes.addModule(opts).then(function(info) { res.json(info); }).catch(function(err) { + console.log(err.stack); apiUtils.rejectHandler(req,res,err); }) }, 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 0b92fc18c..7894f1ed2 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 @@ -339,6 +339,17 @@ "deleteSubflow": "delete subflow", "info": "Description", "category": "Category", + "module": "Module", + "license": "License", + "licenseOther": "Other", + "type": "Node Type", + "version": "Version", + "versionPlaceholder": "x.y.z", + "keys": "Keywords", + "keysPlaceholder": "Comma-separated keywords", + "author": "Author", + "authorPlaceholder": "Your Name ", + "desc": "Description", "env": { "restore": "Restore to subflow default", "remove": "Remove environment variable" @@ -1079,6 +1090,7 @@ "editor-tab": { "properties": "Properties", "envProperties": "Environment Variables", + "module": "Module Properties", "description": "Description", "appearance": "Appearance", "preview": "UI Preview", 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 f5774d57d..5d6c6ebf6 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 @@ -339,6 +339,12 @@ "deleteSubflow": "サブフローを削除", "info": "詳細", "category": "カテゴリ", + "module": "モジュール", + "license": "ライセンス", + "version": "バージョン", + "keys": "キーワード", + "author": "作者", + "desc": "説明", "env": { "restore": "デフォルト値に戻す", "remove": "環境変数を削除" 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 0d664ce3c..3e513de08 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 @@ -670,6 +670,7 @@ RED.nodes = (function() { node.in = []; node.out = []; node.env = n.env; + node.meta = n.meta; if (exportCreds) { var credentialSet = {}; @@ -1920,6 +1921,18 @@ RED.nodes = (function() { RED.events.emit("groups:remove",group); } + function getNodeHelp(type) { + var helpContent = ""; + var helpElement = $("script[data-help-name='"+type+"']"); + if (helpElement) { + helpContent = helpElement.html(); + var helpType = helpElement.attr("type"); + if (helpType === "text/markdown") { + helpContent = RED.utils.renderMarkdown(helpContent); + } + } + return helpContent; + } return { init: function() { @@ -1999,6 +2012,7 @@ RED.nodes = (function() { registerType: registry.registerNodeType, getType: registry.getNodeType, + getNodeHelp: getNodeHelp, convertNode: convertNode, add: addNode, 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 4488f86c0..e8c0daa39 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 @@ -414,18 +414,20 @@ RED.editor = (function() { for (var cred in credDefinition) { if (credDefinition.hasOwnProperty(cred)) { var input = $("#" + prefix + '-' + cred); - var value = input.val(); - if (credDefinition[cred].type == 'password') { - node.credentials['has_' + cred] = (value !== ""); - if (value == '__PWRD__') { - continue; - } - changed = true; + if (input.length > 0) { + var value = input.val(); + if (credDefinition[cred].type == 'password') { + node.credentials['has_' + cred] = (value !== ""); + if (value == '__PWRD__') { + continue; + } + changed = true; - } - node.credentials[cred] = value; - if (value != node.credentials._[cred]) { - changed = true; + } + node.credentials[cred] = value; + if (value != node.credentials._[cred]) { + changed = true; + } } } } @@ -465,6 +467,7 @@ RED.editor = (function() { definition.oneditprepare.call(node); } catch(err) { console.log("oneditprepare",node.id,node.type,err.toString()); + console.log(err.stack); } } // Now invoke any change handlers added to the fields - passing true @@ -1192,7 +1195,7 @@ RED.editor = (function() { changed = true; } } catch(err) { - console.log("oneditsave",editing_node.id,editing_node.type,err.toString()); + console.warn("oneditsave",editing_node.id,editing_node.type,err.toString()); } for (d in editing_node._def.defaults) { @@ -1890,7 +1893,7 @@ RED.editor = (function() { try { configTypeDef.oneditsave.call(editing_config_node); } catch(err) { - console.log("oneditsave",editing_config_node.id,editing_config_node.type,err.toString()); + console.warn("oneditsave",editing_config_node.id,editing_config_node.type,err.toString()); } } @@ -2250,6 +2253,14 @@ RED.editor = (function() { changed = true; } + var newMeta = RED.subflow.exportSubflowModuleProperties(editing_node); + + if (!isSameObj(editing_node.meta,newMeta)) { + changes.meta = editing_node.meta; + editing_node.meta = newMeta; + changed = true; + } + if (changed) { var wasChanged = editing_node.changed; editing_node.changed = true; @@ -2356,6 +2367,16 @@ RED.editor = (function() { }; editorTabs.addTab(nodePropertiesTab); + var moduleTab = { + id: "editor-tab-module", + label: RED._("editor-tab.module"), + name: RED._("editor-tab.module"), + content: $('
', {class:"red-ui-tray-content"}).appendTo(editorContent).hide(), + iconClass: "fa fa-cube", + }; + editorTabs.addTab(moduleTab); + RED.subflow.buildModuleForm(moduleTab.content, editing_node); + var descriptionTab = { id: "editor-tab-description", label: RED._("editor-tab.description"), @@ -2457,7 +2478,7 @@ RED.editor = (function() { changed = true; } } catch(err) { - console.log("oneditsave",editing_node.id,editing_node.type,err.toString()); + console.warn("oneditsave",editing_node.id,editing_node.type,err.toString()); } for (d in editing_node._def.defaults) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index ecee89d70..bd0b55cba 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -147,7 +147,7 @@ RED.palette = (function() { var popOverContent; try { var l = "

"+RED.text.bidi.enforceTextDirectionWithUCC(label)+"

"; - popOverContent = $('
').append($(l+(info?info:$("script[data-help-name='"+type+"']").html()||"

"+RED._("palette.noInfo")+"

").trim()) + popOverContent = $('
').append($(l+(info?info:RED.nodes.getNodeHelp(type)||"

"+RED._("palette.noInfo")+"

").trim()) .filter(function(n) { return (this.nodeType == 1 && this.nodeName == "P") || (this.nodeType == 3 && this.textContent.trim().length > 0) }).slice(0,2)); @@ -264,27 +264,6 @@ RED.palette = (function() { d.data('popover',popover); - // $(d).popover({ - // title:d.type, - // placement:"right", - // trigger: "hover", - // delay: { show: 750, hide: 50 }, - // html: true, - // container:'body' - // }); - // d.on("click", function() { - // RED.view.focus(); - // var helpText; - // if (nt.indexOf("subflow:") === 0) { - // helpText = RED.utils.renderMarkdown(RED.nodes.subflow(nt.substring(8)).info||"")||(''+RED._("sidebar.info.none")+''); - // } else { - // helpText = $("script[data-help-name='"+d.attr("data-palette-type")+"']").html()||(''+RED._("sidebar.info.none")+''); - // } - // // Don't look too closely. RED.sidebar.info.set will set the 'Description' - // // section of the sidebar. Pass in the title of the Help section so it looks - // // right. - // RED.sidebar.type.show(helpText,RED._("sidebar.info.nodeHelp")); - // }); var chart = $("#red-ui-workspace-chart"); var chartSVG = $("#red-ui-workspace-chart>svg").get(0); var activeSpliceLink; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index e89f3c235..b4cf4be08 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -47,6 +47,37 @@ RED.subflow = (function() { '
'+ ''; + var _subflowModulePaneTemplate = '
'+ + '
'+ + ''+ + ''+ + '
'+ + '
'+ + ''+ + ''+ + '
'+ + '
'+ + ''+ + ''+ + '
'+ + '
'+ + ''+ + ''+ + '
'+ + '
'+ + ''+ + ''+ + '
'+ + '
'+ + ''+ + ''+ + '
'+ + '
'+ + ''+ + ''+ + '
'+ + '
'; + function findAvailableSubflowIOPosition(subflow,isInput) { var pos = {x:50,y:30}; if (!isInput) { @@ -993,6 +1024,7 @@ RED.subflow = (function() { icon: "", type: "cred" } + opt.ui.type = "cred"; } else { opt.ui = opt.ui || { icon: "", @@ -1488,6 +1520,7 @@ RED.subflow = (function() { var locale = RED.i18n.lang(); var labelText = lookupLabel(labels, labels["en-US"]||tenv.name, locale); var label = $('