mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Rename/Delete tab support
This commit is contained in:
parent
adc6b44840
commit
c810edc10e
@ -52,7 +52,7 @@
|
|||||||
<li class="dropdown-submenu pull-left"><a tabindex="-1" href="#"><i class="icon-th-large"></i> Workspaces</a>
|
<li class="dropdown-submenu pull-left"><a tabindex="-1" href="#"><i class="icon-th-large"></i> Workspaces</a>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a id="btn-workspace-add" tabindex="-1" href="#"><i class="icon-plus"></i> Add</a></li>
|
<li><a id="btn-workspace-add" tabindex="-1" href="#"><i class="icon-plus"></i> Add</a></li>
|
||||||
<li><a id="btn-workspace-edit" tabindex="-1" href="#"><i class="icon-edit"></i> Edit</a></li>
|
<li><a id="btn-workspace-edit" tabindex="-1" href="#"><i class="icon-edit"></i> Rename</a></li>
|
||||||
<li><a id="btn-workspace-delete" tabindex="-1" href="#"><i class="icon-minus"></i> Delete</a></li>
|
<li><a id="btn-workspace-delete" tabindex="-1" href="#"><i class="icon-minus"></i> Delete</a></li>
|
||||||
<li class="dropdown-submenu pull-left">
|
<li class="dropdown-submenu pull-left">
|
||||||
<a tabindex="-1" href="#"><i class="icon-share-alt"></i> Switch to...</a>
|
<a tabindex="-1" href="#"><i class="icon-share-alt"></i> Switch to...</a>
|
||||||
@ -246,6 +246,21 @@
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="node-dialog-rename-workspace" class="hide">
|
||||||
|
<form class="form-horizontal">
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-workspace-name" ><i class="icon-tag"></i> Name:</label>
|
||||||
|
<input type="text" id="node-input-workspace-name">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div id="node-dialog-delete-workspace" class="hide">
|
||||||
|
<form class="form-horizontal">
|
||||||
|
<div style="text-align: center; padding-top: 30px;">
|
||||||
|
Are you sure you want to delete '<span id="node-dialog-delete-workspace-name"></span>'?
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script type="text/x-red" data-template-name="export-clipboard-dialog">
|
<script type="text/x-red" data-template-name="export-clipboard-dialog">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
|
@ -98,7 +98,25 @@ RED.nodes = function() {
|
|||||||
function addWorkspace(ws) {
|
function addWorkspace(ws) {
|
||||||
workspaces[ws.id] = ws;
|
workspaces[ws.id] = ws;
|
||||||
}
|
}
|
||||||
|
function getWorkspace(id) {
|
||||||
|
return workspaces[id];
|
||||||
|
}
|
||||||
|
function removeWorkspace(id) {
|
||||||
|
delete workspaces[id];
|
||||||
|
var removedNodes = [];
|
||||||
|
var removedLinks = [];
|
||||||
|
for (var n in nodes) {
|
||||||
|
var node = nodes[n];
|
||||||
|
if (node.z == id) {
|
||||||
|
removedNodes.push(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var n in removedNodes) {
|
||||||
|
var rmlinks = removeNode(removedNodes[n].id);
|
||||||
|
removedLinks = removedLinks.concat(rmlinks);
|
||||||
|
}
|
||||||
|
return {nodes:removedNodes,links:removedLinks};
|
||||||
|
}
|
||||||
function getAllFlowNodes(node) {
|
function getAllFlowNodes(node) {
|
||||||
var visited = {};
|
var visited = {};
|
||||||
visited[node.id] = true;
|
visited[node.id] = true;
|
||||||
@ -226,7 +244,7 @@ RED.nodes = function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (defaultWorkspace == null) {
|
if (defaultWorkspace == null) {
|
||||||
defaultWorkspace = { type:"workspace", id:getID(), label:"default" };
|
defaultWorkspace = { type:"workspace", id:getID(), label:"Workspace 1" };
|
||||||
addWorkspace(defaultWorkspace);
|
addWorkspace(defaultWorkspace);
|
||||||
RED.view.addWorkspace(defaultWorkspace);
|
RED.view.addWorkspace(defaultWorkspace);
|
||||||
}
|
}
|
||||||
@ -322,6 +340,8 @@ RED.nodes = function() {
|
|||||||
remove: removeNode,
|
remove: removeNode,
|
||||||
removeLink: removeLink,
|
removeLink: removeLink,
|
||||||
addWorkspace: addWorkspace,
|
addWorkspace: addWorkspace,
|
||||||
|
removeWorkspace: removeWorkspace,
|
||||||
|
workspace: getWorkspace,
|
||||||
eachNode: function(cb) {
|
eachNode: function(cb) {
|
||||||
for (var n in nodes) {
|
for (var n in nodes) {
|
||||||
cb(nodes[n]);
|
cb(nodes[n]);
|
||||||
|
@ -32,7 +32,7 @@ RED.tabs = function() {
|
|||||||
|
|
||||||
function onTabDblClick() {
|
function onTabDblClick() {
|
||||||
if (options.ondblclick) {
|
if (options.ondblclick) {
|
||||||
options.ondblclick($(this).attr('href'));
|
options.ondblclick($(this).attr('href').slice(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ RED.tabs = function() {
|
|||||||
ul.children().removeClass("active");
|
ul.children().removeClass("active");
|
||||||
link.parent().addClass("active");
|
link.parent().addClass("active");
|
||||||
if (options.onchange) {
|
if (options.onchange) {
|
||||||
options.onchange(link.attr('href'));
|
options.onchange(link.attr('href').slice(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,6 +77,18 @@ RED.tabs = function() {
|
|||||||
activateTab(link);
|
activateTab(link);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
removeTab: function(id) {
|
||||||
|
var li = ul.find("a[href='#"+id+"']").parent();
|
||||||
|
if (li.hasClass("active")) {
|
||||||
|
var tab = li.prev();
|
||||||
|
if (tab.size() == 0) {
|
||||||
|
tab = li.next();
|
||||||
|
}
|
||||||
|
activateTab(tab.find("a"));
|
||||||
|
}
|
||||||
|
li.remove();
|
||||||
|
|
||||||
|
},
|
||||||
activateTab: activateTab,
|
activateTab: activateTab,
|
||||||
resize: updateTabWidths
|
resize: updateTabWidths
|
||||||
}
|
}
|
||||||
|
@ -70,10 +70,10 @@ RED.view = function() {
|
|||||||
var workspace_tabs = RED.tabs.create({
|
var workspace_tabs = RED.tabs.create({
|
||||||
id: "workspace-tabs",
|
id: "workspace-tabs",
|
||||||
onchange: function(id) {
|
onchange: function(id) {
|
||||||
RED.view.setWorkspace(id.slice(1));
|
RED.view.setWorkspace(id);
|
||||||
},
|
},
|
||||||
ondblclick: function(id) {
|
ondblclick: function(id) {
|
||||||
console.log("DC:",id);
|
showRenameWorkspaceDialog(id);
|
||||||
},
|
},
|
||||||
onadd: function(tab) {
|
onadd: function(tab) {
|
||||||
var menuli = $("<li/>");
|
var menuli = $("<li/>");
|
||||||
@ -87,14 +87,28 @@ RED.view = function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var workspaceIndex = 0;
|
||||||
$('#btn-workspace-add').on("click",function() {
|
$('#btn-workspace-add').on("click",function() {
|
||||||
var tabId = RED.nodes.id();
|
var tabId = RED.nodes.id();
|
||||||
var ws = {type:"workspace",id:tabId,label:"Workspace "+tabId};
|
do {
|
||||||
|
workspaceIndex += 1;
|
||||||
|
} while($("#workspace-tabs a[title='Workspace "+workspaceIndex+"']").size() != 0);
|
||||||
|
|
||||||
|
var ws = {type:"workspace",id:tabId,label:"Workspace "+workspaceIndex};
|
||||||
RED.nodes.addWorkspace(ws);
|
RED.nodes.addWorkspace(ws);
|
||||||
workspace_tabs.addTab(ws);
|
workspace_tabs.addTab(ws);
|
||||||
workspace_tabs.activateTab(tabId);
|
workspace_tabs.activateTab(tabId);
|
||||||
});
|
});
|
||||||
|
$('#btn-workspace-edit').on("click",function() {
|
||||||
|
showRenameWorkspaceDialog(activeWorkspace);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#btn-workspace-delete').on("click",function() {
|
||||||
|
var ws = RED.nodes.workspace(activeWorkspace);
|
||||||
|
$( "#node-dialog-delete-workspace" ).dialog('option','workspace',ws);
|
||||||
|
$( "#node-dialog-delete-workspace-name" ).text(ws.label);
|
||||||
|
$( "#node-dialog-delete-workspace" ).dialog('open');
|
||||||
|
});
|
||||||
|
|
||||||
//d3.select(window).on("keydown", keydown);
|
//d3.select(window).on("keydown", keydown);
|
||||||
|
|
||||||
@ -451,7 +465,6 @@ RED.view = function() {
|
|||||||
|
|
||||||
table += "<tr><td>Type</td><td> "+node.type+"</td></tr>";
|
table += "<tr><td>Type</td><td> "+node.type+"</td></tr>";
|
||||||
table += "<tr><td>ID</td><td> "+node.id+"</td></tr>";
|
table += "<tr><td>ID</td><td> "+node.id+"</td></tr>";
|
||||||
table += "<tr><td>WS</td><td> "+node.z+"</td></tr>";
|
|
||||||
table += '<tr class="blank"><td colspan="2"> Properties</td></tr>';
|
table += '<tr class="blank"><td colspan="2"> Properties</td></tr>';
|
||||||
for (var n in node._def.defaults) {
|
for (var n in node._def.defaults) {
|
||||||
if ((n != "func")&&(n != "template")) {
|
if ((n != "func")&&(n != "template")) {
|
||||||
@ -983,6 +996,71 @@ RED.view = function() {
|
|||||||
$("#node-input-import").val("");
|
$("#node-input-import").val("");
|
||||||
$( "#dialog" ).dialog("option","title","Import nodes").dialog( "open" );
|
$( "#dialog" ).dialog("option","title","Import nodes").dialog( "open" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showRenameWorkspaceDialog(id) {
|
||||||
|
var ws = RED.nodes.workspace(id);
|
||||||
|
$( "#node-dialog-rename-workspace" ).dialog("option","workspace",ws);
|
||||||
|
$( "#node-input-workspace-name" ).val(ws.label);
|
||||||
|
$( "#node-dialog-rename-workspace" ).dialog("open");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$("#node-dialog-rename-workspace form" ).submit(function(e) { e.preventDefault();});
|
||||||
|
$( "#node-dialog-rename-workspace" ).dialog({
|
||||||
|
modal: true,
|
||||||
|
autoOpen: false,
|
||||||
|
width: 500,
|
||||||
|
title: "Rename workspace",
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: "Ok",
|
||||||
|
click: function() {
|
||||||
|
var workspace = $(this).dialog('option','workspace');
|
||||||
|
var label = $( "#node-input-workspace-name" ).val();
|
||||||
|
if (workspace.label != label) {
|
||||||
|
workspace.label = label;
|
||||||
|
var link = $("#workspace-tabs a[href='#"+workspace.id+"']");
|
||||||
|
link.attr("title",label);
|
||||||
|
link.text(label);
|
||||||
|
RED.view.dirty(true);
|
||||||
|
}
|
||||||
|
$( this ).dialog( "close" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Cancel",
|
||||||
|
click: function() {
|
||||||
|
$( this ).dialog( "close" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
$( "#node-dialog-delete-workspace" ).dialog({
|
||||||
|
modal: true,
|
||||||
|
autoOpen: false,
|
||||||
|
width: 500,
|
||||||
|
title: "Confirm delete",
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: "Ok",
|
||||||
|
click: function() {
|
||||||
|
var workspace = $(this).dialog('option','workspace');
|
||||||
|
workspace_tabs.removeTab(workspace.id);
|
||||||
|
// TODO: make undoable
|
||||||
|
RED.nodes.removeWorkspace(workspace.id);
|
||||||
|
RED.view.dirty(true);
|
||||||
|
$( this ).dialog( "close" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Cancel",
|
||||||
|
click: function() {
|
||||||
|
$( this ).dialog( "close" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
state:function(state) {
|
state:function(state) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user