mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			310-b2
			...
			outliner-c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b65e4d5794 | ||
|  | 7599e865fd | 
| @@ -331,10 +331,12 @@ RED.history = (function() { | ||||
|                             var currentConfigNode = RED.nodes.node(ev.node[i]); | ||||
|                             if (currentConfigNode) { | ||||
|                                 currentConfigNode.users.splice(currentConfigNode.users.indexOf(ev.node),1); | ||||
|                                 RED.events.emit("nodes:change",currentConfigNode); | ||||
|                             } | ||||
|                             var newConfigNode = RED.nodes.node(ev.changes[i]); | ||||
|                             if (newConfigNode) { | ||||
|                                 newConfigNode.users.push(ev.node); | ||||
|                                 RED.events.emit("nodes:change",newConfigNode); | ||||
|                             } | ||||
|                         } | ||||
|                         ev.node[i] = ev.changes[i]; | ||||
|   | ||||
| @@ -360,7 +360,7 @@ | ||||
|                 } | ||||
|                 processChildren(item,newItem); | ||||
|  | ||||
|                 if (!item.deferBuild) { | ||||
|                 if (!item.deferBuild && item.treeList.childList) { | ||||
|                     item.treeList.childList.editableList('insertItemAt',newItem,position) | ||||
|                     if (select) { | ||||
|                         setTimeout(function() { | ||||
|   | ||||
| @@ -1283,10 +1283,12 @@ RED.editor = (function() { | ||||
|                                                 if (configNode) { | ||||
|                                                     var users = configNode.users; | ||||
|                                                     users.splice(users.indexOf(editing_node),1); | ||||
|                                                     RED.events.emit("nodes:change",configNode); | ||||
|                                                 } | ||||
|                                                 configNode = RED.nodes.node(newValue); | ||||
|                                                 if (configNode) { | ||||
|                                                     configNode.users.push(editing_node); | ||||
|                                                     RED.events.emit("nodes:change",configNode); | ||||
|                                                 } | ||||
|                                             } | ||||
|                                             changes[d] = editing_node[d]; | ||||
| @@ -1911,10 +1913,12 @@ RED.editor = (function() { | ||||
|                                     if (configNode) { | ||||
|                                         var users = configNode.users; | ||||
|                                         users.splice(users.indexOf(editing_config_node),1); | ||||
|                                         RED.events.emit("nodes:change",configNode); | ||||
|                                     } | ||||
|                                     configNode = RED.nodes.node(newValue); | ||||
|                                     if (configNode) { | ||||
|                                         configNode.users.push(editing_config_node); | ||||
|                                         RED.events.emit("nodes:change",configNode); | ||||
|                                     } | ||||
|                                 } | ||||
|                                 editing_config_node[d] = newValue; | ||||
| @@ -2503,10 +2507,12 @@ RED.editor = (function() { | ||||
|                                                 if (configNode) { | ||||
|                                                     var users = configNode.users; | ||||
|                                                     users.splice(users.indexOf(editing_node),1); | ||||
|                                                     RED.events.emit("nodes:change",configNode); | ||||
|                                                 } | ||||
|                                                 configNode = RED.nodes.node(newValue); | ||||
|                                                 if (configNode) { | ||||
|                                                     configNode.users.push(editing_node); | ||||
|                                                     RED.events.emit("nodes:change",configNode); | ||||
|                                                 } | ||||
|                                             } | ||||
|                                             changes[d] = editing_node[d]; | ||||
|   | ||||
| @@ -79,6 +79,18 @@ RED.search = (function() { | ||||
|         return val; | ||||
|     } | ||||
|  | ||||
|     function extractValue(val, flagName, flags) { | ||||
|         // flagName:XYZ | ||||
|         var regEx = new RegExp("(?:^| )"+flagName+":([^ ]+)(?: |$)"); | ||||
|         var m | ||||
|         while(m = regEx.exec(val)) { | ||||
|             val = val.replace(regEx," ").trim(); | ||||
|             flags[flagName] = flags[flagName] || []; | ||||
|             flags[flagName].push(m[1]); | ||||
|         } | ||||
|         return val; | ||||
|     } | ||||
|  | ||||
|     function search(val) { | ||||
|         var results = []; | ||||
|         var keys = Object.keys(index); | ||||
| @@ -93,6 +105,8 @@ RED.search = (function() { | ||||
|         val = extractFlag(val,"unused",flags); | ||||
|         val = extractFlag(val,"config",flags); | ||||
|         val = extractFlag(val,"subflow",flags); | ||||
|         // uses:<node-id> | ||||
|         val = extractValue(val,"uses",flags); | ||||
|  | ||||
|         var hasFlags = Object.keys(flags).length > 0; | ||||
|  | ||||
|   | ||||
| @@ -11,6 +11,8 @@ RED.sidebar.info.outliner = (function() { | ||||
|  | ||||
|     var objects = {}; | ||||
|     var missingParents = {}; | ||||
|     var configNodeTypes; | ||||
|  | ||||
|  | ||||
|     function getFlowData() { | ||||
|         var flowData = [ | ||||
| @@ -29,6 +31,7 @@ RED.sidebar.info.outliner = (function() { | ||||
|             { | ||||
|                 id: "__global__", | ||||
|                 label: RED._("sidebar.info.globalConfig"), | ||||
|                 types: {}, | ||||
|                 children: [ | ||||
|                     getEmptyItem("__global__") | ||||
|                 ] | ||||
| @@ -38,6 +41,7 @@ RED.sidebar.info.outliner = (function() { | ||||
|         flowList = flowData[0]; | ||||
|         subflowList = flowData[1]; | ||||
|         globalConfigNodes = flowData[2]; | ||||
|         configNodeTypes = { __global__: globalConfigNodes}; | ||||
|  | ||||
|         return flowData; | ||||
|     } | ||||
| @@ -141,6 +145,16 @@ RED.sidebar.info.outliner = (function() { | ||||
|  | ||||
|     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.category === "config" && n.type !== "group") { | ||||
|             var userCountBadge = $('<button type="button" class="red-ui-info-outline-item-control-users red-ui-button red-ui-button-small"><i class="fa fa-toggle-right"></i></button>').text(n.users.length).appendTo(controls).on("click",function(evt) { | ||||
|                 evt.preventDefault(); | ||||
|                 evt.stopPropagation(); | ||||
|                 RED.search.show("uses:"+n.id); | ||||
|             }) | ||||
|             RED.popover.tooltip(userCountBadge,function() { return RED._('editor.nodesUse',{count:n.users.length})}); | ||||
|         } | ||||
|  | ||||
|         if (n._def.button) { | ||||
|             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) { | ||||
|                 evt.preventDefault(); | ||||
| @@ -395,18 +409,58 @@ RED.sidebar.info.outliner = (function() { | ||||
|             existingObject.element.find(".red-ui-info-outline-item-label").html(" "); | ||||
|         } | ||||
|         if (parent !== existingObject.parent.id) { | ||||
|             var parentItem = existingObject.parent; | ||||
|             existingObject.treeList.remove(true); | ||||
|             if (parent === "__global__") { | ||||
|                 globalConfigNodes.treeList.addChild(existingObject); | ||||
|             } else { | ||||
|                 if (empties[parent]) { | ||||
|                     empties[parent].treeList.remove(); | ||||
|                     delete empties[parent]; | ||||
|             if (parentItem.children.length === 0) { | ||||
|                 if (parentItem.config) { | ||||
|                     // this is a config | ||||
|                     parentItem.treeList.remove(); | ||||
|                     // console.log("Removing",n.type,"from",parentItem.parent.id||parentItem.parent.parent.id) | ||||
|  | ||||
|                     delete configNodeTypes[parentItem.parent.id||parentItem.parent.parent.id].types[n.type]; | ||||
|  | ||||
|  | ||||
|                     if (parentItem.parent.children.length === 0) { | ||||
|                         if (parentItem.parent.id === "__global__") { | ||||
|                             parentItem.parent.treeList.addChild(getEmptyItem(parentItem.parent.id)); | ||||
|                         } else { | ||||
|                             delete configNodeTypes[parentItem.parent.parent.id]; | ||||
|                             parentItem.parent.treeList.remove(); | ||||
|                         } | ||||
|                     } | ||||
|                 } else { | ||||
|                     parentItem.treeList.addChild(getEmptyItem(parentItem.id)); | ||||
|                 } | ||||
|                 objects[parent].treeList.addChild(existingObject) | ||||
|             } | ||||
|             // This must be a config node that has been rescoped | ||||
|             createFlowConfigNode(parent,n.type); | ||||
|             configNodeTypes[parent].types[n.type].treeList.addChild(objects[n.id]); | ||||
|  | ||||
|             // if (parent === "__global__") { | ||||
|             //     // Global always exists here | ||||
|             //     if (!configNodeTypes[parent][n.type]) { | ||||
|             //         configNodeTypes[parent][n.type] = { | ||||
|             //             config: true, | ||||
|             //             label: n.type, | ||||
|             //             children: [] | ||||
|             //         } | ||||
|             //         globalConfigNodes.treeList.addChild(configNodeTypes[parent][n.type]) | ||||
|             //     } | ||||
|             //     configNodeTypes[parent][n.type].treeList.addChild(existingObject); | ||||
|             // } else { | ||||
|             //     if (empties[parent]) { | ||||
|             //         empties[parent].treeList.remove(); | ||||
|             //         delete empties[parent]; | ||||
|             //     } | ||||
|             //     objects[parent].treeList.addChild(existingObject) | ||||
|             // } | ||||
|         } | ||||
|         existingObject.element.toggleClass("red-ui-info-outline-item-disabled", !!n.d) | ||||
|  | ||||
|         if (n._def.category === "config" && n.type !== 'group') { | ||||
|             existingObject.element.find(".red-ui-info-outline-item-control-users").text(n.users.length); | ||||
|         } | ||||
|  | ||||
|         updateSearch(); | ||||
|     } | ||||
|     function onObjectRemove(n) { | ||||
| @@ -418,10 +472,23 @@ RED.sidebar.info.outliner = (function() { | ||||
|         if (empties[n.id]) { | ||||
|             delete empties[n.id]; | ||||
|         } | ||||
|  | ||||
|         var parent = existingObject.parent; | ||||
|         if (parent.children.length === 0) { | ||||
|             parent.treeList.addChild(getEmptyItem(parent.id)); | ||||
|             if (parent.config) { | ||||
|                 // this is a config | ||||
|                 parent.treeList.remove(); | ||||
|                 delete configNodeTypes[parent.parent.id||n.z].types[n.type]; | ||||
|                 if (parent.parent.children.length === 0) { | ||||
|                     if (parent.parent.id === "__global__") { | ||||
|                         parent.parent.treeList.addChild(getEmptyItem(parent.parent.id)); | ||||
|                     } else { | ||||
|                         delete configNodeTypes[n.z]; | ||||
|                         parent.parent.treeList.remove(); | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 parent.treeList.addChild(getEmptyItem(parent.id)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     function getGutter(n) { | ||||
| @@ -434,6 +501,34 @@ RED.sidebar.info.outliner = (function() { | ||||
|         RED.popover.tooltip(revealButton,RED._("sidebar.info.find")); | ||||
|         return span; | ||||
|     } | ||||
|  | ||||
|     function createFlowConfigNode(parent,type) { | ||||
|         // console.log("createFlowConfig",parent,type,configNodeTypes[parent]); | ||||
|         if (empties[parent]) { | ||||
|             empties[parent].treeList.remove(); | ||||
|             delete empties[parent]; | ||||
|         } | ||||
|         if (!configNodeTypes[parent]) { | ||||
|             // There is no 'config nodes' item in the parent flow | ||||
|             configNodeTypes[parent] = { | ||||
|                 config: true, | ||||
|                 types: {}, | ||||
|                 label: RED._("menu.label.displayConfig"), | ||||
|                 children: [] | ||||
|             } | ||||
|             objects[parent].treeList.insertChildAt(configNodeTypes[parent],0); | ||||
|             // console.log("CREATED", parent) | ||||
|         } | ||||
|         if (!configNodeTypes[parent].types[type]) { | ||||
|             configNodeTypes[parent].types[type] = { | ||||
|                 config: true, | ||||
|                 label: type, | ||||
|                 children: [] | ||||
|             } | ||||
|             configNodeTypes[parent].treeList.addChild(configNodeTypes[parent].types[type]); | ||||
|             // console.log("CREATED", parent,type) | ||||
|         } | ||||
|     } | ||||
|     function onNodeAdd(n) { | ||||
|         objects[n.id] = { | ||||
|             id: n.id, | ||||
| @@ -449,7 +544,8 @@ RED.sidebar.info.outliner = (function() { | ||||
|             } | ||||
|         } | ||||
|         var parent = n.g||n.z||"__global__"; | ||||
|         if (parent !== "__global__") { | ||||
|  | ||||
|         if (n._def.category !== "config" || n.type === 'group') { | ||||
|             if (objects[parent]) { | ||||
|                 if (empties[parent]) { | ||||
|                     empties[parent].treeList.remove(); | ||||
| @@ -465,12 +561,8 @@ RED.sidebar.info.outliner = (function() { | ||||
|                 missingParents[parent].push(objects[n.id]) | ||||
|             } | ||||
|         } else { | ||||
|             if (empties[parent]) { | ||||
|                 empties[parent].treeList.remove(); | ||||
|                 delete empties[parent]; | ||||
|             } | ||||
|             // No parent - add to Global flow list | ||||
|             globalConfigNodes.treeList.addChild(objects[n.id]); | ||||
|             createFlowConfigNode(parent,n.type); | ||||
|             configNodeTypes[parent].types[n.type].treeList.addChild(objects[n.id]); | ||||
|         } | ||||
|         objects[n.id].element.toggleClass("red-ui-info-outline-item-disabled", !!n.d) | ||||
|         updateSearch(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user