/** * 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.group = (function() { var _groupEditTemplate = ''; var groupDef = { defaults:{ name:{value:""}, style:{value:{}}, nodes:{value:[]} }, category: "config", oneditprepare: function() { var style = this.style || {}; $("#node-input-style-stroke").val(style.stroke || "#eeeeee") $("#node-input-style-fill").val(style.fill || "none") }, oneditresize: function(size) { }, oneditsave: function() { this.style.stroke = $("#node-input-style-stroke").val(); this.style.fill = $("#node-input-style-fill").val(); }, set:{ module: "node-red" } } function init() { RED.actions.add("core:group-selection", function() { groupSelection() }) RED.actions.add("core:ungroup-selection", function() { ungroupSelection() }) RED.actions.add("core:merge-selection-to-group", function() { mergeSelection() }) RED.actions.add("core:remove-selection-from-group", function() { removeSelection() }) $(_groupEditTemplate).appendTo("#red-ui-editor-node-configs"); } function groupSelection() { var selection = RED.view.selection(); if (selection.nodes) { var group = createGroup(selection.nodes); if (group) { RED.view.select({nodes:[group]}) } } } function ungroupSelection() { var selection = RED.view.selection(); if (selection.nodes) { var newSelection = []; groups = selection.nodes.filter(function(n) { return n.type === "group" }); groups.forEach(function(g) { newSelection = newSelection.concat(ungroup(g)) }) RED.view.select({nodes:newSelection}) } } function ungroup(g) { var nodes = []; var parentGroup = RED.nodes.group(g.g); g.nodes.forEach(function(n) { nodes.push(n); if (parentGroup) { // Move nodes to parent group n.g = parentGroup.id; parentGroup.nodes.push(n); parentGroup.dirty = true; n.dirty = true; } else { delete n.g; } }) RED.nodes.removeGroup(g); return nodes; } function mergeSelection() { // TODO: this currently creates an entirely new group. Need to merge properties // of any existing group var selection = RED.view.selection(); if (selection.nodes) { var nodes = []; var n; var parentGroup; // First pass, check they are all in the same parent // TODO: DRY mergeSelection,removeSelection,... for (var i=0; i -1) { g.nodes.splice(ni,1) } } n.g = group.id; n.dirty = true; group.nodes.push(n); group.x = Math.min(group.x,n.x-n.w/2-25-((n._def.button && n._def.align!=="right")?20:0)); group.y = Math.min(group.y,n.y-n.h/2-25); group.w = Math.max(group.w,n.x+n.w/2+25+((n._def.button && n._def.align=="right")?20:0) - group.x); group.h = Math.max(group.h,n.y+n.h/2+25-group.y); } } function getNodes(group,recursive) { var nodes = []; group.nodes.forEach(function(n) { if (!recursive || n.type !== 'group') { nodes.push(n); } else { nodes = nodes.concat(getNodes(n,recursive)) } }) return nodes; } function groupContains(group,item) { if (item.g === group.id) { return true; } for (var i=0;i