2020-04-27 12:17:19 +02:00
|
|
|
RED.sidebar.info.outliner = (function() {
|
|
|
|
|
|
|
|
var treeList;
|
2020-04-27 16:23:39 +02:00
|
|
|
var searchInput;
|
2020-06-05 23:19:46 +02:00
|
|
|
var activeSearch;
|
2020-05-01 18:39:54 +02:00
|
|
|
var projectInfo;
|
2020-05-07 22:48:47 +02:00
|
|
|
var projectInfoLabel;
|
2020-04-27 12:17:19 +02:00
|
|
|
var flowList;
|
|
|
|
var subflowList;
|
|
|
|
var globalConfigNodes;
|
|
|
|
|
|
|
|
var objects = {};
|
2020-05-20 13:36:26 +02:00
|
|
|
var missingParents = {};
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
function getFlowData() {
|
2020-04-27 12:17:19 +02:00
|
|
|
var flowData = [
|
|
|
|
{
|
2020-05-06 17:15:12 +02:00
|
|
|
label: RED._("menu.label.flows"),
|
2020-04-27 12:17:19 +02:00
|
|
|
expanded: true,
|
2020-05-01 18:39:54 +02:00
|
|
|
children: []
|
2020-04-27 12:17:19 +02:00
|
|
|
},
|
|
|
|
{
|
2020-05-06 17:15:12 +02:00
|
|
|
label: RED._("menu.label.subflows"),
|
2020-04-27 12:17:19 +02:00
|
|
|
children: []
|
2020-05-01 18:39:54 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
id: "__global__",
|
2020-05-06 17:15:12 +02:00
|
|
|
label: RED._("sidebar.info.globalConfig"),
|
2020-05-01 18:39:54 +02:00
|
|
|
children: []
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
]
|
|
|
|
flowList = flowData[0];
|
|
|
|
subflowList = flowData[1];
|
2020-05-01 18:39:54 +02:00
|
|
|
globalConfigNodes = flowData[2];
|
|
|
|
|
2020-04-27 12:17:19 +02:00
|
|
|
return flowData;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getProjectLabel(p) {
|
|
|
|
var div = $('<div>',{class:"red-ui-info-outline-item red-ui-info-outline-item-flow"});
|
2020-05-01 18:39:54 +02:00
|
|
|
div.css("width", "calc(100% - 40px)");
|
2020-04-27 12:17:19 +02:00
|
|
|
var contentDiv = $('<div>',{class:"red-ui-search-result-description red-ui-info-outline-item-label"}).appendTo(div);
|
|
|
|
contentDiv.text(p.name);
|
|
|
|
var controls = $('<div>',{class:"red-ui-info-outline-item-controls"}).appendTo(div);
|
2020-05-01 18:39:54 +02:00
|
|
|
var editProjectButton = $('<button class="red-ui-button red-ui-button-small" style="position:absolute;right:5px;top: 3px;"><i class="fa fa-ellipsis-h"></i></button>')
|
2020-04-27 12:17:19 +02:00
|
|
|
.appendTo(controls)
|
|
|
|
.on("click", function(evt) {
|
|
|
|
evt.preventDefault();
|
|
|
|
RED.projects.editProject();
|
|
|
|
});
|
|
|
|
RED.popover.tooltip(editProjectButton,RED._('sidebar.project.showProjectSettings'));
|
|
|
|
return div;
|
|
|
|
}
|
|
|
|
|
|
|
|
var empties = {};
|
|
|
|
function getEmptyItem(id) {
|
|
|
|
var item = {
|
|
|
|
empty: true,
|
2020-05-12 13:06:07 +02:00
|
|
|
element: $('<div class="red-ui-info-outline-item red-ui-info-outline-item-empty">').text(RED._("sidebar.info.empty")),
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
empties[id] = item;
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getNodeLabelText(n) {
|
2020-05-14 23:08:25 +02:00
|
|
|
var label = n.name || n.type+": "+n.id;
|
2020-04-27 12:17:19 +02:00
|
|
|
if (n._def.label) {
|
|
|
|
try {
|
|
|
|
label = (typeof n._def.label === "function" ? n._def.label.call(n) : n._def.label)||"";
|
|
|
|
} catch(err) {
|
|
|
|
console.log("Definition error: "+type+".label",err);
|
|
|
|
}
|
|
|
|
}
|
2020-05-19 18:53:20 +02:00
|
|
|
var newlineIndex = label.indexOf("\\n");
|
|
|
|
if (newlineIndex > -1) {
|
|
|
|
label = label.substring(0,newlineIndex)+"...";
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
return label;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getNodeLabel(n) {
|
|
|
|
var div = $('<div>',{class:"red-ui-info-outline-item"});
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.utils.createNodeIcon(n).appendTo(div);
|
2020-04-27 12:17:19 +02:00
|
|
|
var contentDiv = $('<div>',{class:"red-ui-search-result-description"}).appendTo(div);
|
|
|
|
var labelText = getNodeLabelText(n);
|
|
|
|
var label = $('<div>',{class:"red-ui-search-result-node-label red-ui-info-outline-item-label"}).appendTo(contentDiv);
|
|
|
|
if (labelText) {
|
|
|
|
label.text(labelText)
|
|
|
|
} else {
|
|
|
|
label.html(" ")
|
|
|
|
}
|
|
|
|
|
|
|
|
addControls(n, div);
|
|
|
|
|
|
|
|
return div;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getFlowLabel(n) {
|
|
|
|
var div = $('<div>',{class:"red-ui-info-outline-item red-ui-info-outline-item-flow"});
|
|
|
|
var contentDiv = $('<div>',{class:"red-ui-search-result-description red-ui-info-outline-item-label"}).appendTo(div);
|
2020-05-19 18:53:20 +02:00
|
|
|
var label = (typeof n === "string")? n : n.label;
|
|
|
|
var newlineIndex = label.indexOf("\\n");
|
|
|
|
if (newlineIndex > -1) {
|
|
|
|
label = label.substring(0,newlineIndex)+"...";
|
|
|
|
}
|
|
|
|
contentDiv.text(label);
|
2020-04-27 12:17:19 +02:00
|
|
|
addControls(n, div);
|
|
|
|
return div;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getSubflowLabel(n) {
|
|
|
|
|
|
|
|
var div = $('<div>',{class:"red-ui-info-outline-item"});
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.utils.createNodeIcon(n).appendTo(div);
|
2020-04-27 12:17:19 +02:00
|
|
|
var contentDiv = $('<div>',{class:"red-ui-search-result-description"}).appendTo(div);
|
|
|
|
var labelText = getNodeLabelText(n);
|
|
|
|
var label = $('<div>',{class:"red-ui-search-result-node-label red-ui-info-outline-item-label"}).appendTo(contentDiv);
|
|
|
|
if (labelText) {
|
|
|
|
label.text(labelText)
|
|
|
|
} else {
|
|
|
|
label.html(" ")
|
|
|
|
}
|
|
|
|
|
|
|
|
addControls(n, div);
|
|
|
|
|
|
|
|
return div;
|
|
|
|
|
|
|
|
|
|
|
|
// var div = $('<div>',{class:"red-ui-info-outline-item red-ui-info-outline-item-flow"});
|
|
|
|
// var contentDiv = $('<div>',{class:"red-ui-search-result-description red-ui-info-outline-item-label"}).appendTo(div);
|
|
|
|
// contentDiv.text(n.name || n.id);
|
|
|
|
// addControls(n, div);
|
|
|
|
// return div;
|
|
|
|
}
|
|
|
|
|
|
|
|
function addControls(n,div) {
|
|
|
|
var controls = $('<div>',{class:"red-ui-info-outline-item-controls red-ui-info-outline-item-hover-controls"}).appendTo(div);
|
|
|
|
if (n._def.button) {
|
2020-06-05 10:51:45 +02:00
|
|
|
var triggerButton = $('<button type="button" class="red-ui-info-outline-item-control-action red-ui-button red-ui-button-small"><i class="fa fa-toggle-right"></i></button>').appendTo(controls).on("click",function(evt) {
|
2020-04-27 12:17:19 +02:00
|
|
|
evt.preventDefault();
|
|
|
|
evt.stopPropagation();
|
|
|
|
RED.view.clickNodeButton(n);
|
|
|
|
})
|
2020-06-05 10:51:45 +02:00
|
|
|
RED.popover.tooltip(triggerButton,RED._("sidebar.info.triggerAction"));
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
2020-05-14 23:08:25 +02:00
|
|
|
// $('<button type="button" class="red-ui-info-outline-item-control-reveal red-ui-button red-ui-button-small"><i class="fa fa-eye"></i></button>').appendTo(controls).on("click",function(evt) {
|
|
|
|
// evt.preventDefault();
|
|
|
|
// evt.stopPropagation();
|
|
|
|
// RED.view.reveal(n.id);
|
|
|
|
// })
|
2020-04-27 12:17:19 +02:00
|
|
|
if (n.type !== 'group' && n.type !== 'subflow') {
|
2020-06-05 10:51:45 +02:00
|
|
|
var toggleButton = $('<button type="button" class="red-ui-info-outline-item-control-disable red-ui-button red-ui-button-small"><i class="fa fa-circle-thin"></i><i class="fa fa-ban"></i></button>').appendTo(controls).on("click",function(evt) {
|
2020-04-27 12:17:19 +02:00
|
|
|
evt.preventDefault();
|
|
|
|
evt.stopPropagation();
|
|
|
|
if (n.type === 'tab') {
|
|
|
|
if (n.disabled) {
|
|
|
|
RED.workspaces.enable(n.id)
|
|
|
|
} else {
|
|
|
|
RED.workspaces.disable(n.id)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// TODO: this ought to be a utility function in RED.nodes
|
|
|
|
var historyEvent = {
|
|
|
|
t: "edit",
|
|
|
|
node: n,
|
|
|
|
changed: n.changed,
|
|
|
|
changes: {
|
|
|
|
d: n.d
|
|
|
|
},
|
|
|
|
dirty:RED.nodes.dirty()
|
|
|
|
}
|
|
|
|
if (n.d) {
|
|
|
|
delete n.d;
|
|
|
|
} else {
|
|
|
|
n.d = true;
|
|
|
|
}
|
|
|
|
n.dirty = true;
|
|
|
|
n.changed = true;
|
|
|
|
RED.events.emit("nodes:change",n);
|
|
|
|
RED.nodes.dirty(true)
|
|
|
|
RED.view.redraw();
|
|
|
|
}
|
|
|
|
});
|
2020-06-05 10:51:45 +02:00
|
|
|
RED.popover.tooltip(toggleButton,function() {
|
|
|
|
return RED._("common.label."+((n.type==='tab' && n.disabled) || (n.type!=='tab' && n.d))?"enable":"disable")
|
|
|
|
});
|
2020-04-27 12:17:19 +02:00
|
|
|
} else {
|
|
|
|
$('<div class="red-ui-info-outline-item-control-spacer">').appendTo(controls)
|
|
|
|
}
|
|
|
|
controls.find("button").on("dblclick", function(evt) {
|
|
|
|
evt.preventDefault();
|
|
|
|
evt.stopPropagation();
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
function onProjectLoad(activeProject) {
|
2020-05-07 22:48:47 +02:00
|
|
|
objects = {};
|
2020-05-01 18:39:54 +02:00
|
|
|
var newFlowData = getFlowData();
|
2020-05-07 22:48:47 +02:00
|
|
|
projectInfoLabel.empty();
|
|
|
|
getProjectLabel(activeProject).appendTo(projectInfoLabel);
|
|
|
|
projectInfo.show();
|
2020-04-27 12:17:19 +02:00
|
|
|
treeList.treeList('data',newFlowData);
|
|
|
|
}
|
|
|
|
|
|
|
|
function build() {
|
2020-05-01 18:39:54 +02:00
|
|
|
var container = $("<div>", {class:"red-ui-info-outline"}).css({'height': '100%'});
|
2020-05-06 17:15:12 +02:00
|
|
|
var toolbar = $("<div>", {class:"red-ui-sidebar-header red-ui-info-toolbar"}).appendTo(container);
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-06 17:15:12 +02:00
|
|
|
searchInput = $('<input type="text" data-i18n="[placeholder]menu.label.search">').appendTo(toolbar).searchBox({
|
2020-06-01 22:09:58 +02:00
|
|
|
style: "compact",
|
2020-05-01 18:39:54 +02:00
|
|
|
delay: 300,
|
|
|
|
change: function() {
|
|
|
|
var val = $(this).val();
|
|
|
|
var searchResults = RED.search.search(val);
|
|
|
|
if (val) {
|
2020-06-05 23:19:46 +02:00
|
|
|
activeSearch = val;
|
2020-05-01 18:39:54 +02:00
|
|
|
var resultMap = {};
|
|
|
|
for (var i=0,l=searchResults.length;i<l;i++) {
|
|
|
|
resultMap[searchResults[i].node.id] = true;
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
2020-05-01 18:39:54 +02:00
|
|
|
var c = treeList.treeList('filter',function(item) {
|
|
|
|
if (item.depth === 0) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return item.id && objects[item.id] && resultMap[item.id]
|
|
|
|
},true)
|
|
|
|
} else {
|
2020-06-05 23:19:46 +02:00
|
|
|
activeSearch = null;
|
2020-05-01 18:39:54 +02:00
|
|
|
treeList.treeList('filter',null);
|
2020-05-01 18:51:44 +02:00
|
|
|
var selected = treeList.treeList('selected');
|
|
|
|
if (selected.id) {
|
|
|
|
treeList.treeList('show',selected.id);
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
|
|
|
|
}
|
2020-05-01 18:39:54 +02:00
|
|
|
}
|
|
|
|
});
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-07 22:48:47 +02:00
|
|
|
projectInfo = $('<div class="red-ui-treeList-label red-ui-info-outline-project"><span class="red-ui-treeList-icon"><i class="fa fa-archive"></i></span></div>').hide().appendTo(container)
|
|
|
|
projectInfoLabel = $('<span>').appendTo(projectInfo);
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
// <div class="red-ui-info-outline-item red-ui-info-outline-item-flow" style=";"><div class="red-ui-search-result-description red-ui-info-outline-item-label">Space Monkey</div><div class="red-ui-info-outline-item-controls"><button class="red-ui-button red-ui-button-small" style="position:absolute;right:5px;"><i class="fa fa-ellipsis-h"></i></button></div></div></div>').appendTo(container)
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
treeList = $("<div>").css({width: "100%"}).appendTo(container).treeList({
|
|
|
|
data:getFlowData()
|
|
|
|
})
|
2020-05-14 23:08:25 +02:00
|
|
|
treeList.on('treelistselect', function(e,item) {
|
|
|
|
var node = RED.nodes.node(item.id) || RED.nodes.group(item.id);
|
|
|
|
if (node) {
|
|
|
|
if (node.type === 'group' || node._def.category !== "config") {
|
|
|
|
RED.view.select({nodes:[node]})
|
|
|
|
} else {
|
|
|
|
RED.view.select({nodes:[]})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
2020-05-01 18:39:54 +02:00
|
|
|
treeList.on('treelistconfirm', function(e,item) {
|
|
|
|
var node = RED.nodes.node(item.id);
|
|
|
|
if (node) {
|
|
|
|
if (node._def.category === "config") {
|
|
|
|
RED.editor.editConfig("", node.type, node.id);
|
|
|
|
} else {
|
|
|
|
RED.editor.edit(node);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.events.on("projects:load", onProjectLoad)
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.events.on("flows:add", onFlowAdd)
|
|
|
|
RED.events.on("flows:remove", onObjectRemove)
|
|
|
|
RED.events.on("flows:change", onFlowChange)
|
|
|
|
RED.events.on("flows:reorder", onFlowsReorder)
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.events.on("subflows:add", onSubflowAdd)
|
|
|
|
RED.events.on("subflows:remove", onObjectRemove)
|
|
|
|
RED.events.on("subflows:change", onSubflowChange)
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.events.on("nodes:add",onNodeAdd);
|
|
|
|
RED.events.on("nodes:remove",onObjectRemove);
|
|
|
|
RED.events.on("nodes:change",onNodeChange);
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.events.on("groups:add",onNodeAdd);
|
|
|
|
RED.events.on("groups:remove",onObjectRemove);
|
|
|
|
RED.events.on("groups:change",onNodeChange);
|
2020-04-27 12:17:19 +02:00
|
|
|
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.events.on("view:selection-changed", onSelectionChanged);
|
|
|
|
|
2020-05-07 22:48:47 +02:00
|
|
|
RED.events.on("workspace:clear", onWorkspaceClear)
|
2020-05-01 18:39:54 +02:00
|
|
|
|
|
|
|
return container;
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
2020-05-07 22:48:47 +02:00
|
|
|
function onWorkspaceClear() {
|
|
|
|
treeList.treeList('data',getFlowData());
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
function onFlowAdd(ws) {
|
|
|
|
objects[ws.id] = {
|
|
|
|
id: ws.id,
|
|
|
|
element: getFlowLabel(ws),
|
2020-05-20 13:36:26 +02:00
|
|
|
children:[],
|
2020-04-27 12:17:19 +02:00
|
|
|
deferBuild: true,
|
2020-05-14 23:08:25 +02:00
|
|
|
icon: "red-ui-icons red-ui-icons-flow",
|
|
|
|
gutter: getGutter(ws)
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
2020-05-20 13:36:26 +02:00
|
|
|
if (missingParents[ws.id]) {
|
|
|
|
objects[ws.id].children = missingParents[ws.id];
|
|
|
|
delete missingParents[ws.id]
|
|
|
|
} else {
|
|
|
|
objects[ws.id].children.push(getEmptyItem(ws.id));
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
flowList.treeList.addChild(objects[ws.id])
|
|
|
|
objects[ws.id].element.toggleClass("red-ui-info-outline-item-disabled", !!ws.disabled)
|
|
|
|
objects[ws.id].treeList.container.toggleClass("red-ui-info-outline-item-disabled", !!ws.disabled)
|
2020-06-05 23:19:46 +02:00
|
|
|
updateSearch();
|
2020-04-27 12:17:19 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
function onFlowChange(n) {
|
|
|
|
var existingObject = objects[n.id];
|
2020-05-19 18:53:20 +02:00
|
|
|
|
|
|
|
var label = n.label || n.id;
|
|
|
|
var newlineIndex = label.indexOf("\\n");
|
|
|
|
if (newlineIndex > -1) {
|
|
|
|
label = label.substring(0,newlineIndex)+"...";
|
|
|
|
}
|
|
|
|
existingObject.element.find(".red-ui-info-outline-item-label").text(label);
|
2020-04-27 12:17:19 +02:00
|
|
|
existingObject.element.toggleClass("red-ui-info-outline-item-disabled", !!n.disabled)
|
|
|
|
existingObject.treeList.container.toggleClass("red-ui-info-outline-item-disabled", !!n.disabled)
|
2020-06-05 23:19:46 +02:00
|
|
|
updateSearch();
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
function onFlowsReorder(order) {
|
|
|
|
var indexMap = {};
|
|
|
|
order.forEach(function(id,index) {
|
|
|
|
indexMap[id] = index;
|
|
|
|
})
|
|
|
|
|
|
|
|
flowList.treeList.sortChildren(function(A,B) {
|
|
|
|
if (A.id === "__global__") { return -1 }
|
|
|
|
if (B.id === "__global__") { return 1 }
|
|
|
|
return indexMap[A.id] - indexMap[B.id]
|
|
|
|
})
|
|
|
|
}
|
|
|
|
function onSubflowAdd(sf) {
|
|
|
|
objects[sf.id] = {
|
|
|
|
id: sf.id,
|
2020-05-01 18:39:54 +02:00
|
|
|
element: getNodeLabel(sf),
|
2020-05-20 13:36:26 +02:00
|
|
|
children:[],
|
2020-05-14 23:08:25 +02:00
|
|
|
deferBuild: true,
|
|
|
|
gutter: getGutter(sf)
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
2020-05-20 13:36:26 +02:00
|
|
|
if (missingParents[sf.id]) {
|
|
|
|
objects[sf.id].children = missingParents[sf.id];
|
|
|
|
delete missingParents[sf.id]
|
|
|
|
} else {
|
|
|
|
objects[sf.id].children.push(getEmptyItem(sf.id));
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
subflowList.treeList.addChild(objects[sf.id])
|
2020-06-05 23:19:46 +02:00
|
|
|
updateSearch();
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
2020-05-01 18:39:54 +02:00
|
|
|
function onSubflowChange(sf) {
|
|
|
|
var existingObject = objects[sf.id];
|
|
|
|
existingObject.treeList.replaceElement(getNodeLabel(sf));
|
2020-04-27 12:17:19 +02:00
|
|
|
// existingObject.element.find(".red-ui-info-outline-item-label").text(n.name || n.id);
|
2020-05-01 18:39:54 +02:00
|
|
|
RED.nodes.eachNode(function(n) {
|
|
|
|
if (n.type == "subflow:"+sf.id) {
|
|
|
|
var sfInstance = objects[n.id];
|
|
|
|
sfInstance.treeList.replaceElement(getNodeLabel(n));
|
|
|
|
}
|
|
|
|
});
|
2020-06-05 23:19:46 +02:00
|
|
|
updateSearch();
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function onNodeChange(n) {
|
|
|
|
var existingObject = objects[n.id];
|
2020-06-05 10:54:46 +02:00
|
|
|
var parent = n.g||n.z||"__global__";
|
2020-04-27 12:17:19 +02:00
|
|
|
|
|
|
|
var nodeLabelText = getNodeLabelText(n);
|
|
|
|
if (nodeLabelText) {
|
|
|
|
existingObject.element.find(".red-ui-info-outline-item-label").text(nodeLabelText);
|
|
|
|
} else {
|
|
|
|
existingObject.element.find(".red-ui-info-outline-item-label").html(" ");
|
|
|
|
}
|
|
|
|
if (parent !== existingObject.parent.id) {
|
2020-06-05 10:54:46 +02:00
|
|
|
existingObject.treeList.remove(true);
|
|
|
|
if (parent === "__global__") {
|
2020-04-27 12:17:19 +02:00
|
|
|
globalConfigNodes.treeList.addChild(existingObject);
|
|
|
|
} else {
|
2020-05-16 04:25:55 +02:00
|
|
|
if (empties[parent]) {
|
|
|
|
empties[parent].treeList.remove();
|
|
|
|
delete empties[parent];
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
objects[parent].treeList.addChild(existingObject)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
existingObject.element.toggleClass("red-ui-info-outline-item-disabled", !!n.d)
|
2020-06-05 23:19:46 +02:00
|
|
|
updateSearch();
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
function onObjectRemove(n) {
|
|
|
|
var existingObject = objects[n.id];
|
|
|
|
existingObject.treeList.remove();
|
2020-05-23 14:20:23 +02:00
|
|
|
delete objects[n.id]
|
2020-06-03 15:23:26 +02:00
|
|
|
|
|
|
|
// If this is a group being removed, it may have an empty item
|
|
|
|
if (empties[n.id]) {
|
|
|
|
delete empties[n.id];
|
|
|
|
}
|
|
|
|
|
2020-04-27 12:17:19 +02:00
|
|
|
var parent = existingObject.parent;
|
|
|
|
if (parent.children.length === 0) {
|
|
|
|
parent.treeList.addChild(getEmptyItem(parent.id));
|
|
|
|
}
|
|
|
|
}
|
2020-05-14 23:08:25 +02:00
|
|
|
function getGutter(n) {
|
|
|
|
var span = $("<span>",{class:"red-ui-info-outline-gutter"});
|
2020-06-05 10:51:45 +02:00
|
|
|
var revealButton = $('<button type="button" class="red-ui-info-outline-item-control-reveal red-ui-button red-ui-button-small"><i class="fa fa-search"></i></button>').appendTo(span).on("click",function(evt) {
|
2020-05-14 23:08:25 +02:00
|
|
|
evt.preventDefault();
|
|
|
|
evt.stopPropagation();
|
|
|
|
RED.view.reveal(n.id);
|
|
|
|
})
|
2020-06-05 10:51:45 +02:00
|
|
|
RED.popover.tooltip(revealButton,RED._("sidebar.info.find"));
|
2020-05-14 23:08:25 +02:00
|
|
|
return span;
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
function onNodeAdd(n) {
|
|
|
|
objects[n.id] = {
|
|
|
|
id: n.id,
|
2020-05-14 23:08:25 +02:00
|
|
|
element: getNodeLabel(n),
|
|
|
|
gutter: getGutter(n)
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
if (n.type === "group") {
|
|
|
|
objects[n.id].children = [];
|
|
|
|
objects[n.id].deferBuild = true;
|
2020-05-20 13:36:26 +02:00
|
|
|
if (missingParents[n.id]) {
|
|
|
|
objects[n.id].children = missingParents[n.id];
|
|
|
|
delete missingParents[n.id]
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
var parent = n.g||n.z;
|
|
|
|
if (parent) {
|
|
|
|
if (objects[parent]) {
|
|
|
|
if (empties[parent]) {
|
|
|
|
empties[parent].treeList.remove();
|
|
|
|
delete empties[parent];
|
|
|
|
}
|
2020-05-20 13:36:26 +02:00
|
|
|
if (objects[parent].treeList) {
|
|
|
|
objects[parent].treeList.addChild(objects[n.id]);
|
|
|
|
} else {
|
|
|
|
objects[parent].children.push(objects[n.id])
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
} else {
|
2020-05-20 13:36:26 +02:00
|
|
|
missingParents[parent] = missingParents[parent]||[];
|
|
|
|
missingParents[parent].push(objects[n.id])
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// No parent - add to Global flow list
|
|
|
|
globalConfigNodes.treeList.addChild(objects[n.id])
|
|
|
|
}
|
|
|
|
objects[n.id].element.toggleClass("red-ui-info-outline-item-disabled", !!n.d)
|
2020-06-05 23:19:46 +02:00
|
|
|
updateSearch();
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
|
2020-06-05 23:19:46 +02:00
|
|
|
var updateSearchTimer;
|
|
|
|
function updateSearch() {
|
|
|
|
if (updateSearchTimer) {
|
|
|
|
clearTimeout(updateSearchTimer)
|
|
|
|
}
|
|
|
|
if (activeSearch) {
|
|
|
|
updateSearchTimer = setTimeout(function() {
|
|
|
|
searchInput.searchBox("change");
|
|
|
|
},100);
|
|
|
|
}
|
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
function onSelectionChanged(selection) {
|
2020-05-14 23:08:25 +02:00
|
|
|
// treeList.treeList('clearSelection');
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
2020-04-27 16:23:39 +02:00
|
|
|
build: build,
|
|
|
|
search: function(val) {
|
|
|
|
searchInput.searchBox('value',val)
|
2020-05-01 18:39:54 +02:00
|
|
|
},
|
2020-05-14 23:08:25 +02:00
|
|
|
select: function(node) {
|
|
|
|
if (node) {
|
|
|
|
if (Array.isArray(node)) {
|
|
|
|
treeList.treeList('select', node.map(function(n) { return objects[n.id] }), false)
|
|
|
|
} else {
|
|
|
|
treeList.treeList('select', objects[node.id], false)
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
treeList.treeList('clearSelection')
|
|
|
|
}
|
|
|
|
},
|
2020-05-01 18:39:54 +02:00
|
|
|
reveal: function(node) {
|
2020-05-14 23:08:25 +02:00
|
|
|
treeList.treeList('show', objects[node.id])
|
2020-04-27 16:23:39 +02:00
|
|
|
}
|
2020-04-27 12:17:19 +02:00
|
|
|
}
|
|
|
|
})();
|