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 a2841cdde..3b61b861a 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 @@ -529,7 +529,7 @@ RED.editor = (function() { done(activeEditPanes); } } - if (definition.credentials || /^subflow:/.test(definition.type) || (node.type === "group")) { + if (definition.credentials || /^subflow:/.test(definition.type) || node.type === "group" || node.type === "tab") { if (node.credentials) { populateCredentialsInputs(node, definition.credentials, node.credentials, prefix); completePrepare(); @@ -1646,6 +1646,7 @@ RED.editor = (function() { var nodeEditPanes = [ 'editor-tab-properties', + 'editor-tab-envProperties', 'editor-tab-description' ]; prepareEditDialog(trayBody, nodeEditPanes, group,group._def,"node-input", null, function(_activeEditPanes) { @@ -1679,6 +1680,137 @@ RED.editor = (function() { RED.tray.show(trayOptions); } + function showEditFlowDialog(workspace) { + if (buildingEditDialog) { return } + buildingEditDialog = true; + var activeEditPanes = []; + RED.view.state(RED.state.EDITING); + var trayOptions = { + title: RED._("workspace.editFlow",{name:RED.utils.sanitize(workspace.label)}), + buttons: [ + { + id: "node-dialog-delete", + class: 'leftButton'+((RED.workspaces.count() === 1)?" disabled":""), + text: RED._("common.label.delete"), //'', + click: function() { + RED.workspaces.delete(workspace); + RED.tray.close(); + } + }, + { + id: "node-dialog-cancel", + text: RED._("common.label.cancel"), + click: function() { + RED.tray.close(); + } + }, + { + id: "node-dialog-ok", + class: "primary", + text: RED._("common.label.done"), + click: function() { + var editState = { + changes: {}, + changed: false, + outputMap: null + } + var wasDirty = RED.nodes.dirty(); + + activeEditPanes.forEach(function(pane) { + if (pane.apply) { + pane.apply.call(pane, workspace, editState); + } + }) + + var disabled = $("#node-input-disabled").prop("checked"); + if (workspace.disabled !== disabled) { + editState.changes.disabled = workspace.disabled; + editState.changed = true; + workspace.disabled = disabled; + } + + + if (editState.changed) { + var historyEvent = { + t: "edit", + changes: editState.changes, + node: workspace, + dirty: wasDirty + } + workspace.changed = true; + RED.history.push(historyEvent); + RED.nodes.dirty(true); + if (editState.changes.hasOwnProperty('disabled')) { + RED.nodes.eachNode(function(n) { + if (n.z === workspace.id) { + n.dirty = true; + } + }); + RED.view.redraw(); + } + RED.workspaces.refresh(); + RED.events.emit("flows:change",workspace); + } + RED.tray.close(); + } + } + ], + resize: function(dimensions) { + $(".red-ui-tray-content").height(dimensions.height - 50); + var form = $(".red-ui-tray-content form").height(dimensions.height - 50 - 40); + var size = {width:form.width(),height:form.height()}; + activeEditPanes.forEach(function(pane) { + if (pane.resize) { + pane.resize.call(pane,editing_node, size); + } + }) + }, + open: function(tray, done) { + var trayFooter = tray.find(".red-ui-tray-footer"); + var trayBody = tray.find('.red-ui-tray-body'); + trayBody.parent().css('overflow','hidden'); + var trayFooterLeft = $('
').appendTo(trayFooter) + + var nodeEditPanes = [ + 'editor-tab-flow-properties', + 'editor-tab-envProperties' + ]; + + if (!workspace.hasOwnProperty("disabled")) { + workspace.disabled = false; + } + $('').prop("checked",workspace.disabled).appendTo(trayFooterLeft).toggleButton({ + enabledIcon: "fa-circle-thin", + disabledIcon: "fa-ban", + invertState: true + }) + + prepareEditDialog(trayBody, nodeEditPanes, workspace, {}, "node-input", null, function(_activeEditPanes) { + activeEditPanes = _activeEditPanes; + trayBody.i18n(); + trayFooter.i18n(); + buildingEditDialog = false; + done(); + }); + }, + close: function() { + if (RED.view.state() != RED.state.IMPORT_DRAGGING) { + RED.view.state(RED.state.DEFAULT); + } + activeEditPanes.forEach(function(pane) { + if (pane.close) { + pane.close.call(pane,editing_node); + } + }) + var selection = RED.view.selection(); + if (!selection.nodes && !selection.links && workspace.id === RED.workspaces.active()) { + RED.sidebar.info.refresh(workspace); + } + } + } + RED.tray.show(trayOptions); + } + function showTypeEditor(type, options) { if (customEditTypes.hasOwnProperty(type)) { if (editStack.length > 0) { @@ -1713,6 +1845,7 @@ RED.editor = (function() { }, edit: showEditDialog, editConfig: showEditConfigNodeDialog, + editFlow: showEditFlowDialog, editSubflow: showEditSubflowDialog, editGroup: showEditGroupDialog, editJavaScript: function(options) { showTypeEditor("_js",options) }, diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/subflowProperties.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/envVarProperties.js similarity index 94% rename from packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/subflowProperties.js rename to packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/envVarProperties.js index f9071fac8..9d6fda1ea 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/subflowProperties.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/envVarProperties.js @@ -21,7 +21,10 @@ }, apply: function(node, editState) { var old_env = node.env; - var new_env = RED.subflow.exportSubflowInstanceEnv(node); + var new_env = []; + if (/^subflow:/.test(node.type)) { + new_env = RED.subflow.exportSubflowInstanceEnv(node); + } // Get the values from the Properties table tab var items = this.list.editableList('items'); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/flowProperties.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/flowProperties.js new file mode 100644 index 000000000..c72eed7a6 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/panes/flowProperties.js @@ -0,0 +1,63 @@ +;(function() { + + RED.editor.registerEditorPane("editor-tab-flow-properties", function() { + return { + label: RED._("editor-tab.properties"), + name: RED._("editor-tab.properties"), + iconClass: "fa fa-cog", + create: function(container, node) { + var content = $('').i18n(),{fixed: true}) - },800); - - $.ajax({ - url: "credentials/tab/" + id, - dataType: 'json', - success: function(data) { - if (timeoutNotification) { - timeoutNotification.close(); - timeoutNotification = null; - } - clearTimeout(intialTimeout); - done(data); - }, - error: function(jqXHR,status,error) { - if (timeoutNotification) { - timeoutNotification.close(); - timeoutNotification = null; - } - clearTimeout(intialTimeout); - RED.notify(RED._("editor.errors.credentialLoadFailed"),"error") - done(null); - }, - timeout: 30000, - }); - } - function showEditWorkspaceDialog(id) { var workspace = RED.nodes.workspace(id); if (!workspace) { @@ -157,207 +82,9 @@ RED.workspaces = (function() { if (subflow) { RED.editor.editSubflow(subflow); } - return; + } else { + RED.editor.editFlow(workspace); } - RED.view.state(RED.state.EDITING); - var trayOptions = { - title: RED._("workspace.editFlow",{name:RED.utils.sanitize(workspace.label)}), - buttons: [ - { - id: "node-dialog-delete", - class: 'leftButton'+((workspaceTabCount === 1)?" disabled":""), - text: RED._("common.label.delete"), //'', - click: function() { - deleteWorkspace(workspace); - RED.tray.close(); - } - }, - { - id: "node-dialog-cancel", - text: RED._("common.label.cancel"), - click: function() { - RED.tray.close(); - } - }, - { - id: "node-dialog-ok", - class: "primary", - text: RED._("common.label.done"), - click: function() { - var label = $( "#node-input-name" ).val(); - var changed = false; - var changes = {}; - if (workspace.label != label) { - changes.label = workspace.label; - changed = true; - workspace.label = label; - workspace_tabs.renameTab(workspace.id,label); - } - var disabled = $("#node-input-disabled").prop("checked"); - if (workspace.disabled !== disabled) { - changes.disabled = workspace.disabled; - changed = true; - workspace.disabled = disabled; - } - var info = tabflowEditor.getValue(); - if (workspace.info !== info) { - changes.info = workspace.info; - changed = true; - workspace.info = info; - } - $("#red-ui-tab-"+(workspace.id.replace(".","-"))).toggleClass('red-ui-workspace-disabled',!!workspace.disabled); - $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!workspace.disabled); - - var old_env = workspace.env; - var new_env = RED.subflow.exportSubflowInstanceEnv(workspace); - if (new_env && (new_env.length > 0)) { - new_env.forEach(function(prop) { - if (prop.type === "cred") { - workspace.credentials = workspace.credentials || {_:{}}; - workspace.credentials[prop.name] = prop.value; - workspace.credentials['has_'+prop.name] = (prop.value !== ""); - if (prop.value !== '__PWRD__') { - changed = true; - } - delete prop.value; - } - }); - } - if (!isSameObj(old_env, new_env)) { - workspace.env = new_env; - changes.env = old_env; - changed = true; - } - - if (changed) { - var historyEvent = { - t: "edit", - changes:changes, - node: workspace, - dirty: RED.nodes.dirty() - } - workspace.changed = true; - RED.history.push(historyEvent); - RED.nodes.dirty(true); - RED.sidebar.config.refresh(); - if (changes.hasOwnProperty('disabled')) { - RED.nodes.eachNode(function(n) { - if (n.z === workspace.id) { - n.dirty = true; - } - }); - RED.view.redraw(); - } - RED.events.emit("flows:change",workspace); - } - RED.tray.close(); - } - } - ], - resize: function(dimensions) { - var height = dimensions.height; - - var rows = $("#dialog-form>div:not(.node-text-editor-row)"); - var editorRow = $("#dialog-form>div.node-text-editor-row"); - for (var i=0; i