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 485b43d98..b38017c60 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 @@ -498,6 +498,13 @@ RED.clipboard = (function() { $("#red-ui-clipboard-dialog-import-text").on("keyup", validateImport); $("#red-ui-clipboard-dialog-import-text").on('paste',function() { setTimeout(validateImport,10)}); + if (RED.workspaces.active() === 0) { + $("#red-ui-clipboard-dialog-import-opt-current").addClass('disabled').removeClass("selected"); + $("#red-ui-clipboard-dialog-import-opt-new").addClass("selected"); + } else { + $("#red-ui-clipboard-dialog-import-opt-current").removeClass('disabled').addClass("selected"); + $("#red-ui-clipboard-dialog-import-opt-new").removeClass("selected"); + } $("#red-ui-clipboard-dialog-import-opt > a").on("click", function(evt) { evt.preventDefault(); if ($(this).hasClass('disabled') || $(this).hasClass('selected')) { @@ -611,9 +618,6 @@ RED.clipboard = (function() { activeLibraries[tabId] = browser; }) - - - $("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename); $("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)}); $("#red-ui-clipboard-dialog-export").button("enable"); @@ -636,7 +640,6 @@ RED.clipboard = (function() { label: RED._("editor.types.json") }); - var previewList = $("#red-ui-clipboard-dialog-export-tab-clipboard-preview-list").css({position:"absolute",top:0,right:0,bottom:0,left:0}).treeList({ data: [] }) @@ -738,16 +741,22 @@ RED.clipboard = (function() { $("#red-ui-clipboard-dialog-export").hide(); $("#red-ui-clipboard-dialog-import-conflict").hide(); - var selection = RED.workspaces.selection(); - if (selection.length > 0) { - $("#red-ui-clipboard-dialog-export-rng-selected").trigger("click"); + if (RED.workspaces.active() === 0) { + $("#red-ui-clipboard-dialog-export-rng-selected").addClass('disabled').removeClass('selected'); + $("#red-ui-clipboard-dialog-export-rng-flow").addClass('disabled').removeClass('selected'); + $("#red-ui-clipboard-dialog-export-rng-full").trigger("click"); } else { - selection = RED.view.selection(); - if (selection.nodes) { + var selection = RED.workspaces.selection(); + if (selection.length > 0) { $("#red-ui-clipboard-dialog-export-rng-selected").trigger("click"); } else { - $("#red-ui-clipboard-dialog-export-rng-selected").addClass('disabled').removeClass('selected'); - $("#red-ui-clipboard-dialog-export-rng-flow").trigger("click"); + selection = RED.view.selection(); + if (selection.nodes) { + $("#red-ui-clipboard-dialog-export-rng-selected").trigger("click"); + } else { + $("#red-ui-clipboard-dialog-export-rng-selected").addClass('disabled').removeClass('selected'); + $("#red-ui-clipboard-dialog-export-rng-flow").trigger("click"); + } } } if (format === "red-ui-clipboard-dialog-export-fmt-full") { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js index 41c6e704c..4185dad78 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js @@ -337,6 +337,11 @@ RED.tabs = (function() { if (link.length === 0) { return; } + var wasUnhidden = false; + if (link.parent().hasClass("hide")) { + wasUnhidden = true; + link.parent().removeClass("hide"); + } if (!link.parent().hasClass("active")) { ul.children().removeClass("active"); ul.children().css({"transition": "width 100ms"}); @@ -353,7 +358,7 @@ RED.tabs = (function() { } } if (options.onchange) { - options.onchange(tabs[link.attr('href').slice(1)]); + options.onchange(tabs[link.attr('href').slice(1)],wasUnhidden); } updateTabWidths(); setTimeout(function() { @@ -362,13 +367,13 @@ RED.tabs = (function() { } } function activatePreviousTab() { - var previous = ul.find("li.active").prev(); + var previous = findPreviousVisibleTab(); if (previous.length > 0) { activateTab(previous.find("a")); } } function activateNextTab() { - var next = ul.find("li.active").next(); + var next = findNextVisibleTab(); if (next.length > 0) { activateTab(next.find("a")); } @@ -378,7 +383,10 @@ RED.tabs = (function() { if (options.vertical) { return; } - var tabs = ul.find("li.red-ui-tab"); + var allTabs = ul.find("li.red-ui-tab"); + var tabs = allTabs.filter(":not(.hide)"); + var hiddenTabs = allTabs.filter(".hide"); + var width = wrapper.width(); var tabCount = tabs.length; var tabWidth; @@ -446,6 +454,7 @@ RED.tabs = (function() { // } tabs.css({width:currentTabWidth}); + hiddenTabs.css({width:"0px"}); if (tabWidth < 50) { // ul.find(".red-ui-tab-close").hide(); ul.find(".red-ui-tab-icon").hide(); @@ -486,11 +495,17 @@ RED.tabs = (function() { } var li = ul.find("a[href='#"+id+"']").parent(); if (li.hasClass("active")) { - var tab = li.prev(); + var tab = findPreviousVisibleTab(li); if (tab.length === 0) { - tab = li.next(); + tab = findNextVisibleTab(li); + } + if (tab.length > 0) { + activateTab(tab.find("a")); + } else { + if (options.onchange) { + options.onchange(null); + } } - activateTab(tab.find("a")); } li.remove(); if (tabs[id].pinned) { @@ -507,6 +522,27 @@ RED.tabs = (function() { } } + function findPreviousVisibleTab(li) { + if (!li) { + li = ul.find("li.active").parent(); + } + var previous = li.prev(); + while(previous.length > 0 && previous.hasClass("hide")) { + previous = previous.prev(); + } + return previous; + } + function findNextVisibleTab(li) { + if (!li) { + li = ul.find("li.active").parent(); + } + var next = ul.find("li.active").next(); + while(next.length > 0 && next.hasClass("hide")) { + next = next.next(); + } + return next; + } + var tabAPI = { addTab: function(tab,targetIndex) { if (options.onselect) { @@ -787,7 +823,7 @@ RED.tabs = (function() { previousTab: activatePreviousTab, resize: updateTabWidths, count: function() { - return ul.find("li.red-ui-tab").length; + return ul.find("li.red-ui-tab:not(.hide)").length; }, activeIndex: function() { return ul.find("li.active").index() @@ -795,6 +831,45 @@ RED.tabs = (function() { contains: function(id) { return ul.find("a[href='#"+id+"']").length > 0; }, + showTab: function(id) { + if (tabs[id]) { + var li = ul.find("a[href='#"+id+"']").parent(); + if (li.hasClass("hide")) { + li.removeClass("hide"); + if (ul.find("li.red-ui-tab:not(.hide)").length === 1) { + activateTab(li.find("a")) + } + updateTabWidths(); + return true; + } + } + return false; + }, + hideTab: function(id) { + if (tabs[id]) { + var li = ul.find("a[href='#"+id+"']").parent(); + if (!li.hasClass("hide")) { + if (li.hasClass("active")) { + var tab = findPreviousVisibleTab(li); + if (tab.length === 0) { + tab = findNextVisibleTab(li); + } + if (tab.length > 0) { + activateTab(tab.find("a")); + } else { + if (options.onchange) { + options.onchange(null); + } + } + } + li.removeClass("active"); + li.addClass("hide"); + updateTabWidths(); + return true; + } + } + return false; + }, renameTab: function(id,label) { tabs[id].label = label; var tab = ul.find("a[href='#"+id+"']"); @@ -802,6 +877,9 @@ RED.tabs = (function() { tab.find("span.red-ui-text-bidi-aware").text(label).attr('dir', RED.text.bidi.resolveBaseTextDir(label)); updateTabWidths(); }, + listTabs: function() { + return $.makeArray(ul.children().map(function() { return $(this).data('tabId');})); + }, selection: getSelection, order: function(order) { preferredOrder = order; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js index c16be54e2..492600f91 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js @@ -229,7 +229,7 @@ RED.sidebar.config = (function() { var globalConfigNodes = []; var configList = {}; RED.nodes.eachConfig(function(cn) { - if (cn.z) {//} == RED.workspaces.active()) { + if (cn.z) { configList[cn.z.replace(/\./g,"-")] = configList[cn.z.replace(/\./g,"-")]||[]; configList[cn.z.replace(/\./g,"-")].push(cn); } else if (!cn.z) { 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 a7e157282..da799c2cd 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 @@ -122,11 +122,20 @@ RED.sidebar.info.outliner = (function() { }) RED.popover.tooltip(triggerButton,RED._("sidebar.info.triggerAction")); } - // $('').appendTo(controls).on("click",function(evt) { - // evt.preventDefault(); - // evt.stopPropagation(); - // RED.view.reveal(n.id); - // }) + + if (n.type === "tab") { + var toggleVisibleButton = $('').appendTo(controls).on("click",function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + var isHidden = !div.hasClass("red-ui-info-outline-item-hidden"); + div.toggleClass("red-ui-info-outline-item-hidden",isHidden); + if (isHidden) { + RED.workspaces.hide(n.id); + } else { + RED.workspaces.show(n.id, null, true); + } + }); + } if (n.type !== 'subflow') { var toggleButton = $('').appendTo(controls).on("click",function(evt) { evt.preventDefault(); @@ -316,13 +325,27 @@ RED.sidebar.info.outliner = (function() { RED.events.on("groups:remove",onObjectRemove); RED.events.on("groups:change",onNodeChange); - RED.events.on("workspace:clear", onWorkspaceClear) + RED.events.on("workspace:show", onWorkspaceShow); + RED.events.on("workspace:hide", onWorkspaceHide); + RED.events.on("workspace:clear", onWorkspaceClear); return container; } function onWorkspaceClear() { treeList.treeList('data',getFlowData()); } + function onWorkspaceShow(event) { + var existingObject = objects[event.workspace]; + if (existingObject) { + existingObject.element.removeClass("red-ui-info-outline-item-hidden") + } + } + function onWorkspaceHide(event) { + var existingObject = objects[event.workspace]; + if (existingObject) { + existingObject.element.addClass("red-ui-info-outline-item-hidden") + } + } function onFlowAdd(ws) { objects[ws.id] = { id: ws.id, 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 15b705448..017172a23 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 @@ -180,6 +180,10 @@ RED.sidebar.info = (function() { if (node === null) { RED.sidebar.info.outliner.select(null); + propertiesPanelHeaderIcon.empty(); + propertiesPanelHeaderLabel.text(""); + propertiesPanelHeaderReveal.hide(); + propertiesPanelHeaderHelp.hide(); return; } else if (Array.isArray(node)) { // Multiple things selected 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 afbf5f5f7..0ed147c96 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 @@ -345,8 +345,8 @@ RED.view = (function() { activeSubflow = RED.nodes.subflow(event.workspace); - RED.menu.setDisabled("menu-item-workspace-edit", activeSubflow); - RED.menu.setDisabled("menu-item-workspace-delete",RED.workspaces.count() == 1 || activeSubflow); + RED.menu.setDisabled("menu-item-workspace-edit", activeSubflow || event.workspace === 0); + RED.menu.setDisabled("menu-item-workspace-delete",event.workspace === 0 || RED.workspaces.count() == 1 || activeSubflow); if (workspaceScrollPositions[event.workspace]) { chart.scrollLeft(workspaceScrollPositions[event.workspace].left); @@ -653,24 +653,29 @@ RED.view = (function() { function updateActiveNodes() { var activeWorkspace = RED.workspaces.active(); + if (activeWorkspace !== 0) { + activeNodes = RED.nodes.filterNodes({z:activeWorkspace}); - activeNodes = RED.nodes.filterNodes({z:activeWorkspace}); + activeLinks = RED.nodes.filterLinks({ + source:{z:activeWorkspace}, + target:{z:activeWorkspace} + }); - activeLinks = RED.nodes.filterLinks({ - source:{z:activeWorkspace}, - target:{z:activeWorkspace} - }); - - activeGroups = RED.nodes.groups(activeWorkspace)||[]; - activeGroups.forEach(function(g) { - if (g.g) { - g._root = g.g; - g._depth = 1; - } else { - g._root = g.id; - g._depth = 0; - } - }); + activeGroups = RED.nodes.groups(activeWorkspace)||[]; + activeGroups.forEach(function(g) { + if (g.g) { + g._root = g.g; + g._depth = 1; + } else { + g._root = g.id; + g._depth = 0; + } + }); + } else { + activeNodes = []; + activeLinks = []; + activeGroups = []; + } var changed = false; do { changed = false; @@ -1939,93 +1944,94 @@ RED.view = (function() { function updateSelection() { var selection = {}; var activeWorkspace = RED.workspaces.active(); - var workspaceSelection = RED.workspaces.selection(); - if (workspaceSelection.length === 0) { - selection = getSelection(); - activeLinks = RED.nodes.filterLinks({ - source:{z:activeWorkspace}, - target:{z:activeWorkspace} - }); - var tabOrder = RED.nodes.getWorkspaceOrder(); - var currentLinks = activeLinks; - var addedLinkLinks = {}; - activeFlowLinks = []; - var activeLinkNodeIds = Object.keys(activeLinkNodes); - activeLinkNodeIds.forEach(function(n) { - activeLinkNodes[n].dirty = true; - }) - activeLinkNodes = {}; - for (var i=0;i 0) { - activeFlowLinks.push({ - refresh: Math.floor(Math.random()*10000), - node: linkNode, - links: offFlowLinks//offFlows.map(function(i) { return {id:i,links:offFlowLinks[i]};}) }); + var offFlows = Object.keys(offFlowLinks); + // offFlows.sort(function(A,B) { + // return tabOrder.indexOf(A) - tabOrder.indexOf(B); + // }); + if (offFlows.length > 0) { + activeFlowLinks.push({ + refresh: Math.floor(Math.random()*10000), + node: linkNode, + links: offFlowLinks//offFlows.map(function(i) { return {id:i,links:offFlowLinks[i]};}) + }); + } } } + if (activeFlowLinks.length === 0 && selected_link !== null && selected_link.link) { + activeLinks.push(selected_link); + activeLinkNodes[selected_link.source.id] = selected_link.source; + selected_link.source.dirty = true; + activeLinkNodes[selected_link.target.id] = selected_link.target; + selected_link.target.dirty = true; + } + } else { + selection.flows = workspaceSelection; } - if (activeFlowLinks.length === 0 && selected_link !== null && selected_link.link) { - activeLinks.push(selected_link); - activeLinkNodes[selected_link.source.id] = selected_link.source; - selected_link.source.dirty = true; - activeLinkNodes[selected_link.target.id] = selected_link.target; - selected_link.target.dirty = true; - } - } else { - selection.flows = workspaceSelection; } var selectionJSON = activeWorkspace+":"+JSON.stringify(selection,function(key,value) { if (key === 'nodes' || key === 'flows') { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index a7a4e024f..3027379e2 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -245,15 +245,25 @@ RED.workspaces = (function() { function createWorkspaceTabs() { workspace_tabs = RED.tabs.create({ id: "red-ui-workspace-tabs", - onchange: function(tab) { + onchange: function(tab, wasUnhidden) { var event = { old: activeWorkspace } - activeWorkspace = tab.id; + if (tab) { + $("#red-ui-workspace-chart").show(); + activeWorkspace = tab.id; + window.location.hash = 'flow/'+tab.id; + $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!tab.disabled); + } else { + $("#red-ui-workspace-chart").hide(); + activeWorkspace = 0; + window.location.hash = ''; + } event.workspace = activeWorkspace; + if (wasUnhidden) { + RED.events.emit("workspace:show",event); + } RED.events.emit("workspace:change",event); - window.location.hash = 'flow/'+tab.id; - $("#red-ui-workspace").toggleClass("red-ui-workspace-disabled",!!tab.disabled); RED.sidebar.config.refresh(); RED.view.focus(); }, @@ -278,7 +288,7 @@ RED.workspaces = (function() { if (tab.disabled) { $("#red-ui-tab-"+(tab.id.replace(".","-"))).addClass('red-ui-workspace-disabled'); } - RED.menu.setDisabled("menu-item-workspace-delete",workspaceTabCount <= 1); + RED.menu.setDisabled("menu-item-workspace-delete",activeWorkspace === 0 || workspaceTabCount <= 1); if (workspaceTabCount === 1) { showWorkspace(); } @@ -287,7 +297,7 @@ RED.workspaces = (function() { if (tab.type === "tab") { workspaceTabCount--; } - RED.menu.setDisabled("menu-item-workspace-delete",workspaceTabCount <= 1); + RED.menu.setDisabled("menu-item-workspace-delete",activeWorkspace === 0 || workspaceTabCount <= 1); if (workspaceTabCount === 0) { hideWorkspace(); } @@ -373,6 +383,22 @@ RED.workspaces = (function() { RED.actions.add("core:enable-flow",enableWorkspace); RED.actions.add("core:disable-flow",disableWorkspace); + RED.actions.add("core:hide-tab", function() { RED.workspaces.hide(); }) + RED.actions.add("core:hide-all-tabs", function() { + var currentTabs = workspace_tabs.listTabs(); + currentTabs.forEach(function(id) { + RED.workspaces.hide(id) + }) + }) + RED.actions.add("core:show-all-tabs", function() { + var currentTabs = workspace_tabs.listTabs(); + currentTabs.forEach(function(id) { + RED.workspaces.show(id, null, true) + }) + }) + + RED.actions.add("core:hide-tab", function() { RED.workspaces.hide(); }) + RED.actions.add("core:list-flows",function() { RED.actions.invoke("core:search","type:tab "); }) @@ -392,8 +418,6 @@ RED.workspaces = (function() { RED.workspaces.show(viewStack[++viewStackPos],true); } }) - - hideWorkspace(); } @@ -445,7 +469,6 @@ RED.workspaces = (function() { } } - function removeWorkspace(ws) { if (!ws) { deleteWorkspace(RED.nodes.workspace(activeWorkspace)); @@ -489,7 +512,17 @@ RED.workspaces = (function() { selection: function() { return workspace_tabs.selection(); }, - show: function(id,skipStack) { + hide: function(id) { + if (!id) { + id = activeWorkspace; + } + if (workspace_tabs.contains(id)) { + if (workspace_tabs.hideTab(id)) { + RED.events.emit("workspace:hide",{workspace: id}) + } + } + }, + show: function(id,skipStack,unhideOnly) { if (!workspace_tabs.contains(id)) { var sf = RED.nodes.subflow(id); if (sf) { @@ -502,10 +535,16 @@ RED.workspaces = (function() { return; } } - if (!skipStack && activeWorkspace !== id) { - addToViewStack(activeWorkspace) + if (unhideOnly) { + if (workspace_tabs.showTab(id)) { + RED.events.emit("workspace:show",{workspace: id}) + } + } else { + if (!skipStack && activeWorkspace !== id) { + addToViewStack(activeWorkspace) + } + workspace_tabs.activateTab(id); } - workspace_tabs.activateTab(id); }, refresh: function() { RED.nodes.eachWorkspace(function(ws) { 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 d4d86cd89..2b8f17d4b 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 @@ -435,6 +435,12 @@ div.red-ui-info-table { border: none; background: none; } + .fa-circle-thin { + display: none; + } + .fa-eye { + display: none; + } } .red-ui-info-outline-item-control-reveal, .red-ui-info-outline-item-control-action { @@ -446,7 +452,17 @@ div.red-ui-info-table { display: inline-block; } } - + .fa-eye-slash { + display: none; + } + .red-ui-info-outline-item.red-ui-info-outline-item-hidden & { + .fa-eye-slash { + display: inline-block; + } + .fa-eye { + display: none; + } + } .fa-ban { display: none; }