/** * Copyright JS Foundation and other contributors, http://js.foundation * * 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.workspaces = (function() { var activeWorkspace = 0; var workspaceIndex = 0; function addWorkspace(ws,skipHistoryEntry,targetIndex) { if (ws) { workspace_tabs.addTab(ws,targetIndex); workspace_tabs.resize(); } else { var tabId = RED.nodes.id(); do { workspaceIndex += 1; } while ($("#red-ui-workspace-tabs a[title='"+RED._('workspace.defaultName',{number:workspaceIndex})+"']").size() !== 0); ws = {type:"tab",id:tabId,disabled: false,info:"",label:RED._('workspace.defaultName',{number:workspaceIndex})}; RED.nodes.addWorkspace(ws,targetIndex); workspace_tabs.addTab(ws,targetIndex); workspace_tabs.activateTab(tabId); if (!skipHistoryEntry) { RED.history.push({t:'add',workspaces:[ws],dirty:RED.nodes.dirty()}); RED.nodes.dirty(true); } } RED.view.focus(); return ws; } function deleteWorkspace(ws) { if (workspaceTabCount === 1) { return; } var workspaceOrder = RED.nodes.getWorkspaceOrder(); ws._index = workspaceOrder.indexOf(ws.id); removeWorkspace(ws); var historyEvent = RED.nodes.removeWorkspace(ws.id); historyEvent.t = 'delete'; historyEvent.dirty = RED.nodes.dirty(); historyEvent.workspaces = [ws]; RED.history.push(historyEvent); RED.nodes.dirty(true); RED.sidebar.config.refresh(); } function showEditWorkspaceDialog(id) { var workspace = RED.nodes.workspace(id); RED.view.state(RED.state.EDITING); var tabflowEditor; var trayOptions = { title: RED._("workspace.editFlow",{name: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); 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(); var selection = RED.view.selection(); if (!selection.nodes && !selection.links) { RED.sidebar.info.refresh(workspace); } if (changes.hasOwnProperty('disabled')) { RED.nodes.eachNode(function(n) { if (n.z === workspace.id) { n.dirty = true; } }); RED.view.redraw(); } } RED.tray.close(); } } ], resize: function(dimensions) { var rows = $("#dialog-form>div:not(.node-text-editor-row)"); var editorRow = $("#dialog-form>div.node-text-editor-row"); var height = $("#dialog-form").height(); for (var i=0; i').appendTo(trayBody); $('
'+ ''+ ''+ '
').appendTo(dialogForm); $('
'+ ''+ ''+ '
').appendTo(dialogForm); var row = $('
'+ ''+ '
'+ '
').appendTo(dialogForm); tabflowEditor = RED.editor.createEditor({ id: 'node-input-info', mode: 'ace/mode/markdown', value: "" }); $('#node-info-input-info-expand').on("click", function(e) { e.preventDefault(); var value = tabflowEditor.getValue(); RED.editor.editMarkdown({ value: value, width: "Infinity", cursor: tabflowEditor.getCursorPosition(), complete: function(v,cursor) { tabflowEditor.setValue(v, -1); tabflowEditor.gotoLine(cursor.row+1,cursor.column,false); setTimeout(function() { tabflowEditor.focus(); },300); } }) }); if (workspace.hasOwnProperty("disabled")) { $("#node-input-disabled").prop("checked",workspace.disabled); } else { workspace.disabled = false; } $("#node-input-disabled").toggleButton({invertState: true}) $('').prependTo(dialogForm); dialogForm.on("submit", function(e) { e.preventDefault();}); $("#node-input-name").val(workspace.label); RED.text.bidi.prepareInput($("#node-input-name")); tabflowEditor.getSession().setValue(workspace.info || "", -1); dialogForm.i18n(); }, close: function() { if (RED.view.state() != RED.state.IMPORT_DRAGGING) { RED.view.state(RED.state.DEFAULT); } RED.sidebar.info.refresh(workspace); tabflowEditor.destroy(); } } RED.tray.show(trayOptions); } var workspace_tabs; var workspaceTabCount = 0; function createWorkspaceTabs() { workspace_tabs = RED.tabs.create({ id: "red-ui-workspace-tabs", onchange: function(tab) { var event = { old: activeWorkspace } activeWorkspace = tab.id; event.workspace = activeWorkspace; 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(); }, onclick: function(tab) { RED.view.focus(); }, ondblclick: function(tab) { if (tab.type != "subflow") { showEditWorkspaceDialog(tab.id); } else { RED.editor.editSubflow(RED.nodes.subflow(tab.id)); } }, onadd: function(tab) { if (tab.type === "tab") { workspaceTabCount++; } $(' ').prependTo("#red-ui-tab-"+(tab.id.replace(".","-"))+" .red-ui-tab-label"); if (tab.disabled) { $("#red-ui-tab-"+(tab.id.replace(".","-"))).addClass('red-ui-workspace-disabled'); } RED.menu.setDisabled("menu-item-workspace-delete",workspaceTabCount <= 1); if (workspaceTabCount === 1) { showWorkspace(); } }, onremove: function(tab) { if (tab.type === "tab") { workspaceTabCount--; } RED.menu.setDisabled("menu-item-workspace-delete",workspaceTabCount <= 1); if (workspaceTabCount === 0) { hideWorkspace(); } }, onreorder: function(oldOrder, newOrder) { RED.history.push({t:'reorder',order:oldOrder,dirty:RED.nodes.dirty()}); RED.nodes.dirty(true); setWorkspaceOrder(newOrder); }, onselect: function(selectedTabs) { RED.view.select(false) if (selectedTabs.length === 0) { $("#red-ui-workspace-chart svg").css({"pointer-events":"auto",filter:"none"}) $("#red-ui-workspace-toolbar").css({"pointer-events":"auto",filter:"none"}) $("#red-ui-palette-container").css({"pointer-events":"auto",filter:"none"}) $(".red-ui-sidebar-shade").hide(); } else { RED.view.select(false) $("#red-ui-workspace-chart svg").css({"pointer-events":"none",filter:"opacity(60%)"}) $("#red-ui-workspace-toolbar").css({"pointer-events":"none",filter:"opacity(60%)"}) $("#red-ui-palette-container").css({"pointer-events":"none",filter:"opacity(60%)"}) $(".red-ui-sidebar-shade").show(); } }, minimumActiveTabWidth: 150, scrollable: true, addButton: "core:add-flow", addButtonCaption: RED._("workspace.addFlow"), searchButton: "core:list-flows", searchButtonCaption: RED._("workspace.listFlows") }); workspaceTabCount = 0; } function showWorkspace() { $("#red-ui-workspace .red-ui-tabs").show() $("#red-ui-workspace-chart").show() $("#red-ui-workspace-footer").children().show() } function hideWorkspace() { $("#red-ui-workspace .red-ui-tabs").hide() $("#red-ui-workspace-chart").hide() $("#red-ui-workspace-footer").children().hide() } function init() { $('').appendTo("#red-ui-workspace"); $('
').appendTo("#red-ui-workspace"); $('
').appendTo("#red-ui-workspace"); $('
').appendTo("#red-ui-workspace"); $('').appendTo("#red-ui-workspace"); $('
').appendTo("#red-ui-workspace"); createWorkspaceTabs(); RED.events.on("sidebar:resize",workspace_tabs.resize); RED.actions.add("core:show-next-tab",workspace_tabs.nextTab); RED.actions.add("core:show-previous-tab",workspace_tabs.previousTab); RED.menu.setAction('menu-item-workspace-delete',function() { deleteWorkspace(RED.nodes.workspace(activeWorkspace)); }); $(window).on("resize", function() { workspace_tabs.resize(); }); RED.actions.add("core:add-flow",function(opts) { addWorkspace(undefined,undefined,opts?opts.index:undefined)}); RED.actions.add("core:edit-flow",editWorkspace); RED.actions.add("core:remove-flow",removeWorkspace); RED.actions.add("core:list-flows",function() { RED.actions.invoke("core:search","type:tab "); }) hideWorkspace(); } function editWorkspace(id) { showEditWorkspaceDialog(id||activeWorkspace); } function removeWorkspace(ws) { if (!ws) { deleteWorkspace(RED.nodes.workspace(activeWorkspace)); } else { if (workspace_tabs.contains(ws.id)) { workspace_tabs.removeTab(ws.id); } if (ws.id === activeWorkspace) { activeWorkspace = 0; } } } function setWorkspaceOrder(order) { RED.nodes.setWorkspaceOrder(order.filter(function(id) { return RED.nodes.workspace(id) !== undefined; })); workspace_tabs.order(order); } return { init: init, add: addWorkspace, remove: removeWorkspace, order: setWorkspaceOrder, edit: editWorkspace, contains: function(id) { return workspace_tabs.contains(id); }, count: function() { return workspaceTabCount; }, active: function() { return activeWorkspace }, selection: function() { return workspace_tabs.selection(); }, show: function(id) { if (!workspace_tabs.contains(id)) { var sf = RED.nodes.subflow(id); if (sf) { addWorkspace({type:"subflow",id:id,icon:"red/images/subflow_tab.png",label:sf.name, closeable: true}); } else { return; } } workspace_tabs.activateTab(id); }, refresh: function() { RED.nodes.eachWorkspace(function(ws) { workspace_tabs.renameTab(ws.id,ws.label); }) RED.nodes.eachSubflow(function(sf) { if (workspace_tabs.contains(sf.id)) { workspace_tabs.renameTab(sf.id,sf.name); } }); RED.sidebar.config.refresh(); }, resize: function() { workspace_tabs.resize(); } } })();