diff --git a/Gruntfile.js b/Gruntfile.js index 136d25f30..1c38d0e92 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -118,7 +118,6 @@ module.exports = function(grunt) { "editor/js/ui/sidebar.js", "editor/js/ui/palette.js", "editor/js/ui/tab-info.js", - "editor/js/ui/tab-config.js", "editor/js/ui/editor.js", "editor/js/ui/clipboard.js", "editor/js/ui/library.js", diff --git a/editor/js/history.js b/editor/js/history.js index 7e5d978e0..0945f4246 100644 --- a/editor/js/history.js +++ b/editor/js/history.js @@ -189,7 +189,7 @@ RED.history = (function() { }); if (ev.node.type === 'subflow') { - $("#menu-item-workspace-menu-"+ev.node.id.replace(".","-")).text(ev.node.name); + $("#menu-item-flow-menu-"+ev.node.id.replace(".","-")).text(ev.node.name); } RED.palette.refresh(); diff --git a/editor/js/main.js b/editor/js/main.js index 305fb7092..1be68e8f1 100644 --- a/editor/js/main.js +++ b/editor/js/main.js @@ -152,6 +152,9 @@ var RED = (function() { statusEnabled = state; RED.view.status(statusEnabled); } + function toggleConfigNodes(state) { + RED.workspaces.toggleConfigNodes(state); + } function loadEditor() { RED.menu.init({id:"btn-sidemenu", @@ -161,6 +164,7 @@ var RED = (function() { null ]}, {id:"menu-item-status",label:RED._("menu.label.displayStatus"),toggle:true,onselect:toggleStatus, selected: true}, + {id:"menu-item-config-nodes",label:RED._("menu.label.displayConfig"),toggle:true,onselect:toggleConfigNodes, selected: false}, null, {id:"menu-item-import",label:RED._("menu.label.import"),options:[ {id:"menu-item-import-clipboard",label:RED._("menu.label.clipboard"),onselect:RED.clipboard.import}, @@ -171,18 +175,18 @@ var RED = (function() { {id:"menu-item-export-library",label:RED._("menu.label.library"),disabled:true,onselect:RED.library.export} ]}, null, + {id:"menu-item-flow",label:RED._("menu.label.flows"),options:[ + {id:"menu-item-flow-add",label:RED._("menu.label.add"),onselect:RED.workspaces.add}, + {id:"menu-item-flow-edit",label:RED._("menu.label.rename"),onselect:RED.workspaces.edit}, + {id:"menu-item-flow-delete",label:RED._("menu.label.delete"),onselect:RED.workspaces.remove}, + null + ]}, + null, {id:"menu-item-subflow",label:RED._("menu.label.subflows"), options: [ {id:"menu-item-subflow-create",label:RED._("menu.label.createSubflow"),onselect:RED.subflow.createSubflow}, {id:"menu-item-subflow-convert",label:RED._("menu.label.selectionToSubflow"),disabled:true,onselect:RED.subflow.convertToSubflow}, ]}, null, - {id:"menu-item-workspace",label:RED._("menu.label.workspaces"),options:[ - {id:"menu-item-workspace-add",label:RED._("menu.label.add"),onselect:RED.workspaces.add}, - {id:"menu-item-workspace-edit",label:RED._("menu.label.rename"),onselect:RED.workspaces.edit}, - {id:"menu-item-workspace-delete",label:RED._("menu.label.delete"),onselect:RED.workspaces.remove}, - null - ]}, - null, {id:"menu-item-keyboard-shortcuts",label:RED._("menu.label.keyboardShortcuts"),onselect:RED.keyboard.showHelp}, {id:"menu-item-help", label: RED.settings.theme("menu.menu-item-help.label","Node-RED Website"), diff --git a/editor/js/nodes.js b/editor/js/nodes.js index ed1101ed0..d1cc69cef 100644 --- a/editor/js/nodes.js +++ b/editor/js/nodes.js @@ -156,7 +156,6 @@ RED.nodes = (function() { } if (n._def.category == "config") { configNodes[n.id] = n; - RED.sidebar.config.refresh(); } else { n.dirty = true; var updatedConfigNode = false; @@ -176,7 +175,7 @@ RED.nodes = (function() { } } if (updatedConfigNode) { - RED.sidebar.config.refresh(); + // TODO: refresh config tab? } if (n._def.category == "subflows" && typeof n.i === "undefined") { var nextId = 0; @@ -215,7 +214,7 @@ RED.nodes = (function() { if (id in configNodes) { node = configNodes[id]; delete configNodes[id]; - RED.sidebar.config.refresh(); + RED.workspaces.refresh(); } else { node = getNode(id); if (node) { @@ -245,11 +244,11 @@ RED.nodes = (function() { } } if (updatedConfigNode) { - RED.sidebar.config.refresh(); + RED.workspaces.refresh(); } } } - if (node._def.onremove) { + if (node && node._def.onremove) { node._def.onremove.call(n); } return {links:removedLinks,nodes:removedNodes}; @@ -273,16 +272,26 @@ RED.nodes = (function() { var removedNodes = []; var removedLinks = []; var n; + var node; for (n=0;n'+ + .prepend('
'+ ''+ ''+ ''+ diff --git a/editor/js/ui/editor.js b/editor/js/ui/editor.js index 1158446aa..3a40f4f0b 100644 --- a/editor/js/ui/editor.js +++ b/editor/js/ui/editor.js @@ -391,7 +391,7 @@ RED.editor = (function() { if (editing_node) { RED.sidebar.info.refresh(editing_node); } - RED.sidebar.config.refresh(); + RED.workspaces.refresh(); var buttons = $( this ).dialog("option","buttons"); if (buttons.length == 3) { @@ -671,12 +671,18 @@ RED.editor = (function() { ns = node_def.set.id; } + var activeWorkspace = RED.nodes.workspace(RED.workspaces.active()); + if (!activeWorkspace) { + activeWorkspace = RED.nodes.subflow(RED.workspaces.active()); + } if (configNode == null) { configNode = { id: (1+Math.random()*4294967295).toString(16), _def: node_def, - type: type + type: type, + z: activeWorkspace.id, + users: [] } for (var d in node_def.defaults) { if (node_def.defaults[d].value) { @@ -710,7 +716,7 @@ RED.editor = (function() { buttons = buttons.splice(1); } buttons[0].text = "Add"; - $("#node-config-dialog-user-count").html("").hide(); + $("#node-config-dialog-user-count").find("span").html("").parent().hide(); } else { if (buttons.length == 2) { buttons.unshift({ @@ -747,8 +753,60 @@ RED.editor = (function() { }); } buttons[1].text = "Update"; - $("#node-config-dialog-user-count").html(RED._("editor.nodesUse", {count:configNode.users.length})).show(); + $("#node-config-dialog-user-count").find("span").html(RED._("editor.nodesUse", {count:configNode.users.length})).parent().show(); } + + if (configNode._def.exclusive) { + $("#node-config-dialog-scope").hide(); + } else { + $("#node-config-dialog-scope").show(); + } + $("#node-config-dialog-scope-warning").hide(); + + + var nodeUserFlows = {}; + configNode.users.forEach(function(n) { + nodeUserFlows[n.z] = true; + }); + var flowCount = Object.keys(nodeUserFlows).length; + + var tabSelect = $("#node-config-dialog-scope").empty(); + tabSelect.off("change"); + tabSelect.append(''); + tabSelect.append(''); + RED.nodes.eachWorkspace(function(ws) { + var workspaceLabel = ws.label; + if (nodeUserFlows[ws.id]) { + workspaceLabel = "* "+workspaceLabel; + } + tabSelect.append(''); + }); + tabSelect.append(''); + RED.nodes.eachSubflow(function(ws) { + var workspaceLabel = ws.name; + if (nodeUserFlows[ws.id]) { + workspaceLabel = "* "+workspaceLabel; + } + tabSelect.append(''); + }); + if (flowCount > 0) { + tabSelect.on('change',function() { + var newScope = $(this).val(); + if (newScope === '') { + // global scope - everyone can use it + $("#node-config-dialog-scope-warning").hide(); + } else if (!nodeUserFlows[newScope] || flowCount > 1) { + // a user will loose access to it + $("#node-config-dialog-scope-warning").show(); + } else { + $("#node-config-dialog-scope-warning").hide(); + } + }); + } + + //tabSelect.append(''); + tabSelect.i18n(); + $( "#node-config-dialog" ).dialog("option","buttons",buttons); $("#node-config-dialog").i18n(); @@ -776,17 +834,39 @@ RED.editor = (function() { var select = $("#node-input-"+name); var node_def = RED.nodes.getType(type); select.children().remove(); + + var activeWorkspace = RED.nodes.workspace(RED.workspaces.active()); + if (!activeWorkspace) { + activeWorkspace = RED.nodes.subflow(RED.workspaces.active()); + } + + var configNodes = []; + RED.nodes.eachConfig(function(config) { - if (config.type == type) { + if (config.type == type && (!config.z || config.z === activeWorkspace.id)) { var label = ""; if (typeof node_def.label == "function") { label = node_def.label.call(config); } else { label = node_def.label; } - select.append(''); + configNodes.push({id:config.id,label:label}); } }); + + configNodes.sort(function(A,B) { + if (A.label < B.label) { + return -1; + } else if (A.label > B.label) { + return 1; + } + return 0; + }); + + configNodes.forEach(function(cn) { + select.append(''); + }); + select.append(''); window.setTimeout(function() { select.change();},50); } @@ -813,7 +893,7 @@ RED.editor = (function() { var configNode; var d; var input; - + var scope = $("#node-config-dialog-scope").val(); if (configAdding) { configNode = {type:configType,id:configId,users:[]}; for (d in configTypeDef.defaults) { @@ -828,6 +908,7 @@ RED.editor = (function() { } configNode.label = configTypeDef.label; configNode._def = configTypeDef; + configNode.z = scope; RED.nodes.add(configNode); updateConfigNodeSelect(configProperty,configType,configNode.id); } else { @@ -842,6 +923,26 @@ RED.editor = (function() { } } } + if (scope) { + configNode.users = configNode.users.filter(function(n) { + var keep = true; + for (var d in n._def.defaults) { + if (n._def.defaults.hasOwnProperty(d)) { + if (n._def.defaults[d].type === configNode.type && + n[d] === configNode.id && + n.z !== scope) { + keep = false; + n[d] = null; + n.dirty = true; + n.changed = true; + validateNode(n); + } + } + } + return keep; + }); + } + configNode.z = scope; updateConfigNodeSelect(configProperty,configType,configId); } if (configTypeDef.credentials) { @@ -857,6 +958,7 @@ RED.editor = (function() { } RED.nodes.dirty(true); + RED.view.redraw(true); $(this).dialog("close"); } @@ -903,7 +1005,16 @@ RED.editor = (function() { if (RED.view.state() != RED.state.EDITING) { RED.keyboard.enable(); } - RED.sidebar.config.refresh(); + RED.workspaces.refresh(); + }, + create: function() { + $("#node-config-dialog").parent().find("div.ui-dialog-buttonpane") + .prepend('
'); + + $("#node-config-dialog").parent().find('.ui-dialog-titlebar').append(''); + $("#node-config-dialog").parent().draggable({ + cancel: '.ui-dialog-content, .ui-dialog-titlebar-close, #node-config-dialog-scope-container' + }); } }); } @@ -933,7 +1044,7 @@ RED.editor = (function() { changes['name'] = editing_node.name; editing_node.name = newName; changed = true; - $("#menu-item-workspace-menu-"+editing_node.id.replace(".","-")).text(newName); + $("#menu-item-flow-menu-"+editing_node.id.replace(".","-")).text(newName); } RED.palette.refresh(); @@ -996,6 +1107,7 @@ RED.editor = (function() { RED.view.state(RED.state.DEFAULT); } RED.sidebar.info.refresh(editing_node); + RED.workspaces.refresh(); editing_node = null; } }); diff --git a/editor/js/ui/palette.js b/editor/js/ui/palette.js index d042d5eca..5382d3801 100644 --- a/editor/js/ui/palette.js +++ b/editor/js/ui/palette.js @@ -61,7 +61,7 @@ RED.palette = (function() { } function setLabel(type, el,label) { - var nodeWidth = 80; + var nodeWidth = 82; var nodeHeight = 25; var lineHeight = 20; var portHeight = 10; diff --git a/editor/js/ui/sidebar.js b/editor/js/ui/sidebar.js index 5149a96dc..f1320782a 100644 --- a/editor/js/ui/sidebar.js +++ b/editor/js/ui/sidebar.js @@ -188,7 +188,6 @@ RED.sidebar = (function() { RED.keyboard.add(/* SPACE */ 32,{ctrl:true},function(){RED.menu.setSelected("menu-item-sidebar",!RED.menu.isSelected("menu-item-sidebar"));d3.event.preventDefault();}); showSidebar(); RED.sidebar.info.init(); - RED.sidebar.config.init(); // hide info bar at start if screen rather narrow... if ($(window).width() < 600) { toggleSidebar(); } } diff --git a/editor/js/ui/tab-config.js b/editor/js/ui/tab-config.js deleted file mode 100644 index b8de117d3..000000000 --- a/editor/js/ui/tab-config.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright 2013 IBM Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ -RED.sidebar.config = (function() { - - var content = document.createElement("div"); - content.style.paddingTop = "4px"; - content.style.paddingLeft = "4px"; - content.style.paddingRight = "4px"; - - var list = $("