From: Daniel Malachovsky Date: Thu, 7 Jul 2016 14:26:55 +0000 (+0200) Subject: GBP UI - disable odl-ui build X-Git-Tag: release/boron~67 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=51abe6fc592e8834aa6272d2515d4ad4efc2abb4;p=groupbasedpolicy.git GBP UI - disable odl-ui build - removed old-ui and ui-backend Change-Id: Ic94985525c41186b38e8af7691252159c559b845 Signed-off-by: Daniel Malachovsky --- diff --git a/features/pom.xml b/features/pom.xml index 6d518b44f..41364081f 100755 --- a/features/pom.xml +++ b/features/pom.xml @@ -299,18 +299,10 @@ org.opendaylight.groupbasedpolicy neutron-ovsdb - - org.opendaylight.groupbasedpolicy - ui-backend - org.opendaylight.groupbasedpolicy groupbasedpolicy-ui-bundle - - org.opendaylight.groupbasedpolicy - groupbasedpolicy-old-ui-bundle - org.opendaylight.groupbasedpolicy sxp-mapper @@ -393,12 +385,6 @@ xml config - - org.opendaylight.groupbasedpolicy - ui-backend - xml - config - org.opendaylight.groupbasedpolicy sxp-mapper diff --git a/features/src/main/features/features.xml b/features/src/main/features/features.xml index 133ca2ff8..cea8f8dbc 100755 --- a/features/src/main/features/features.xml +++ b/features/src/main/features/features.xml @@ -25,8 +25,6 @@ mvn:org.opendaylight.neutron/features-neutron/{{VERSION}}/xml/features mvn:org.opendaylight.sfc/features-sfc/{{VERSION}}/xml/features - - mvn:org.opendaylight.netconf/features-restconf/{{VERSION}}/xml/features mvn:org.opendaylight.dlux/features-dlux/{{VERSION}}/xml/features @@ -175,25 +173,12 @@ mvn:org.opendaylight.groupbasedpolicy/neutron-vpp-mapper/{{VERSION}}/xml/config - - - odl-groupbasedpolicy-base - odl-restconf - mvn:org.opendaylight.groupbasedpolicy/ui-backend/{{VERSION}} - mvn:org.opendaylight.groupbasedpolicy/ui-backend/{{VERSION}}/xml/config - - odl-dlux-core - odl-dlux-yangvisualizer - odl-groupbasedpolicy-uibackend mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-ui-bundle/{{VERSION}} - mvn:org.opendaylight.groupbasedpolicy/groupbasedpolicy-old-ui-bundle/{{VERSION}} - - unpack-loader-resources - - unpack-dependencies - - generate-resources - - ${project.build.directory}/generated-resources - org.opendaylight.dlux - groupbasedpolicy-old-ui-module - META-INF\/** - true - false - - - - - - org.apache.felix - maven-bundle-plugin - true - - - org.osgi.service.http, - org.osgi.framework;version="1.0.0", - org.opendaylight.dlux.loader, - org.slf4j - - - - - - - - - scm:git:ssh://git.opendaylight.org:29418/dlux.git - scm:git:ssh://git.opendaylight.org:29418/dlux.git - HEAD - https://wiki.opendaylight.org/view/OpenDaylight_dlux:Main - - diff --git a/groupbasedpolicy-old-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/groupbasedpolicy-old-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml deleted file mode 100644 index 7b3d17e70..000000000 --- a/groupbasedpolicy-old-ui/bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - src/app/gbp-old/gbp.css - src/app/gbp-old/js/joint.css - - - - diff --git a/groupbasedpolicy-old-ui/module/pom.xml b/groupbasedpolicy-old-ui/module/pom.xml deleted file mode 100644 index 37da5b7bd..000000000 --- a/groupbasedpolicy-old-ui/module/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - 4.0.0 - - org.opendaylight.groupbasedpolicy - groupbasedpolicy-old-ui - 0.4.0-SNAPSHOT - - - groupbasedpolicy-old-ui-module - ${project.artifactId} - GBP Old UI Module Resources - jar - - diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.controller.js b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.controller.js deleted file mode 100644 index 424f33e67..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.controller.js +++ /dev/null @@ -1,5050 +0,0 @@ -var modules = ['app/gbp-old/gbp.module', - 'app/gbp-old/gbp.services' - ]; - - -define(modules, function(gbpOld) { - - gbpOld.register.controller('gbpCtrl', ['$scope', '$rootScope', 'GBPTenantServices','DesignGbpFactory', 'GBPConstants', - function ($scope, $rootScope, GBPTenantServices, DesignGbpFactory, GBPConstants) { - $rootScope['section_logo'] = 'logo_gbp'; - $scope.view_path = 'src/app/gbp-old/views/'; - - $scope.mainView = { - main: true, - 'policy-renderer': false, - governance: false - }; - - $scope.policyRendererView = { - slider : true, - basic : true, - policy: false, - tenants : false, - l2l3 : false, - epg : false, - contracts : false, - docs : false, - groupMenu: false, - classifiers: false, - actions: false, - registerEndpoint : false, - registerL3PrefixEndpoint : false - }; - - $scope.subMenuView = { - governance : false, - policy : false, - policySub : false, - renderers : false, - endpoints : false - }; - - $scope.breadcrumbs = {'l1' : null, - 'l2' : null, - 'l3' : null}; - - $scope.wizards = { - accessModelWizard: false, - actionReferenceWizard: false - }; - - $scope.setBreadcrumb = function(level, label, visible){ - $scope.breadcrumbs[level] = visible ? label : null; - if(level === 'l1'){ - $scope.breadcrumbs.l2 = null; - $scope.breadcrumbs.l3 = null; - } - if(level === 'l2'){ - $scope.breadcrumbs.l3 = null; - } - }; - - $scope.setViewExpand = function(menu, expand, show){ - $scope[menu][expand] = show ? true : !$scope[menu][expand]; - for ( var property in $scope[menu] ) { - $scope[menu][property] = expand !== property ? false : $scope[menu][expand]; - } - - }; - - $scope.toggleExpandedMM = function(expand, show, broadcast){ - $scope.setViewExpand('mainView',expand, show); - - if ( broadcast ) { - $scope.$broadcast(broadcast); - } - }; - - $scope.sliceLabel = function(label){ - return label.length > GBPConstants.numbers.displayLabelLength ? label.slice(0,GBPConstants.numbers.displayLabelLength)+'...' : label; - }; - - $scope.getDisplayLabel = function(obj, labelArray, dontSlice){ - var ret = ''; - - if((typeof labelArray) === 'string'){ - ret = obj[labelArray]; - } else if (angular.isFunction(labelArray)) { - ret = labelArray(obj); - } else { - labelArray.some(function(labelParam) { - if(angular.isFunction(labelParam)) { - ret = labelParam(obj); - } else if(obj.hasOwnProperty(labelParam)) { - ret = obj[labelParam]; - } - return ret; - }); - } - - return dontSlice ? ret : $scope.sliceLabel(ret); - }; - - // TENANTS - $scope.tenantList = []; - $scope.selectedTenant = null; - $scope.tenantDisplayLabel = ['name' , 'id']; - - $scope.loadTenants = function() { - GBPTenantServices.load( - function(tenants) { - $scope.tenantList = tenants; - console.log('$scope.tenantList', $scope.tenantList); - }, - function(){ - //TODO error - }); - - DesignGbpFactory.setMainClass(); - }; - - $scope.setTenant = function(selectedTenant) { - $scope.selectedTenant = selectedTenant; - $scope.$broadcast('GBP_TENANT_RELOAD', $scope.selectedTenant); - }; - - $scope.loadTenants(); - - $scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){ - $scope.loadTenants(); - }); - - $scope.sendReloadEventFromRoot = function(eventName, val) { - $scope.$broadcast(eventName, val); - }; - - - // TODO: rework, use $scope.setViewContent or something - $scope.showWizard = function(wizardName, broadcast, broadcastedData, path) { - $scope.wizards[wizardName] = true; - - if ( broadcast ) { - $scope.sendReloadEventFromRoot(broadcast, {data: broadcastedData, path: path}); - } - }; - - $scope.closeWizard = function(wizardName) { - $scope.wizards[wizardName] = false; - }; - - $scope.updateList = function(list, object, key) { - var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]); - - if(elementPos < 0) { - list.push(object); - } - else { - list[elementPos] = object; - } - }; - - }]); - - gbpOld.register.controller('governanceCtrl', ['$rootScope','$scope', - function ($rootScope, $scope) { - $scope.menuTpl = 'main-menu'; - $scope.menuBox = null; - $scope.contentTpl = 'main'; - // $scope.selectedTenant = null; - $scope.rendererList = []; - var broadcastObj = {}; - - $scope.rendererList.push({'name' : 'of_overlay', 'id' : 0}); - - $scope.toggleExpanded = function(expand, menu, tplType){ - var type = tplType ? tplType : 'contentTpl'; - $scope.menuBox = null; - - $scope[type] = expand; - - if ( menu && menu === false ) { - $scope.menuTpl = !menu ? null : menu; - } - }; - - - - $scope.setViewContent = function(tplName, data, broadcast, tplType) { - - if ( $scope[tplType] === tplName ) { - $scope.$broadcast(broadcast, data, true); - } else { - - broadcastObj[tplType] = {}; - broadcastObj[tplType].name = broadcast; - broadcastObj[tplType].data = data; - - $scope.toggleExpanded(tplName, null, tplType); - $scope.$apply(); - - } - }; - - $scope.broadcastCalling = function(tplType){ - $scope.$broadcast(broadcastObj[tplType].name, broadcastObj[tplType].data); - }; - - $scope.checkBroadcastCalling = function(tplName){ - var objClickAction = { - 'epg-detail': function(){ - $scope.broadcastCalling('contentTpl'); - }, - 'subject-detail': function(){ - $scope.broadcastCalling('contentTpl'); - } - }; - - if ( angular.isFunction(objClickAction[tplName]) ) { - objClickAction[tplName](); - } - - }; - - - $scope.$on('GOV_INIT', function(){ - $scope.menuTpl = 'main-menu'; - $scope.contentTpl = 'main'; - // $scope.$emit('GBP_GLOBAL_TENANT_RELOAD'); - $scope.menuBox = null; - }); - - $scope.$on('GBP_TENANT_RELOAD', function(e, obj){ - $scope.selectedTenant = obj; - }); - - - }]); - - gbpOld.register.controller('boxStaticCtrl',['$scope', - function($scope){ - - $scope.selectedObj = null; - - $scope.getLabel = function(id, type){ - var objAction = { - providerItems: function(){ - var name = $scope.selectedObj[type][id].attributes.objData['name']; - return name ? name + ' : ' + id : id; - }, - consumerItems: function(){ - var name = $scope.selectedObj[type][id].attributes.objData['name']; - return name ? name + ' : ' + id : id; - } - }; - - if ( angular.isFunction(objAction[type]) ) { - return objAction[type](); - } - }; - - $scope.$on('SET_SEL_STA_OBJ', function(obj, data, apply){ - $scope.selectedObj = data; - - if ( apply ) { - $scope.$apply(); - } - - }); - - }]); - - gbpOld.register.controller('graphCtrl', ['$scope', function($scope){ - var paper = null, - paperScale = 1; - - $scope.init = function(paperInstance){ - paper = paperInstance; - $scope.loadMouseScrollEvent(); - }; - - - $scope.zoom = function(out){ - paperScale = out ? paperScale - 0.1 : paperScale >= 1 ? 1 : paperScale + 0.1; - paper.scale(paperScale, paperScale); - }; - - - - $scope.loadMouseScrollEvent = function(){ - /*mouse wheel event for zooming*/ - var graph = document.getElementById('graph'), - MouseWheelHandler = function(e){ - var mouseEvent = window.event || e; // old IE support - var delta = Math.max(-1, Math.min(1, (mouseEvent.wheelDelta || -mouseEvent.detail))); - $scope.zoom(delta === 1 ? false : true); - }; - - if (graph.addEventListener) { - // IE9, Chrome, Safari, Opera - graph.addEventListener("mousewheel", MouseWheelHandler, false); - // Firefox - graph.addEventListener("DOMMouseScroll", MouseWheelHandler, false); - } - // IE 6/7/8 - else {graph.attachEvent("onmousewheel", MouseWheelHandler);} - /*mouse wheel event for zooming - end*/ - }; - - }]); - - gbpOld.register.controller('expressedPolicyCtrl', ['$scope', 'JointGraphFactory', 'JointGraphOffsetFactory', 'GBPConstants', - function ($scope, JointGraphFactory, JointGraphOffsetFactory, GBPConstants) { - var paper = JointGraphFactory.createGraph(), - epgItems = [], - contractItems = [], - linkItems = []; - - var objClickAction = { - epg: function(data){ - $scope.setViewContent('epg-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox'); - }, - contract: function(data){ - $scope.setViewContent('contract-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox'); - } - }; - - paper.on('cell:pointerdown', function(cell) { - if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) { - objClickAction[cell.model.attributes.objType](cell.model.attributes.objData); - } - }); - - var createEpgLinks = function(epg, epgItem, contracts) { - var providers = epg['provider-named-selector'] && epg['provider-named-selector'].length>0 ? epg['provider-named-selector'] : []; - var consumers = epg['consumer-named-selector'] && epg['consumer-named-selector'].length>0 ? epg['consumer-named-selector'] : []; - var consumerLinkItems = []; - var providerLinkItems = []; - - consumers.forEach(function(c) { - c.contract.forEach(function(con) { - consumerLinkItems.push(JointGraphFactory.createLink(contracts[con].id, epgItem.id, 'green')); - }); - }); - - providers.forEach(function(p) { - p.contract.forEach(function(con) { - providerLinkItems.push(JointGraphFactory.createLink(epgItem.id, contracts[con].id, 'blue')); - }); - }); - - JointGraphFactory.addItemList(paper.model, providerLinkItems); - JointGraphFactory.addItemList(paper.model, consumerLinkItems); - - }; - - var loadData = function() { - if($scope.selectedTenant) { - var offsetObj = { - ow: 100, - oh: 100, - w: 100, - h: 100 - }, - marginObj = { - w: 50, - h: 80 - }, - offsetHobj = { - contract: 0, - epg: 0 - }, - itemsArray = { - contract: [], - epg: [] - }; - - JointGraphFactory.reloadGraph(paper.model); - - if ( $scope.selectedTenant && $scope.selectedTenant.contract ) { - - $scope.selectedTenant.contract.forEach(function(c, i) { - var label = c.description ? $scope.sliceLabel(c.description) : c.id, - width = JointGraphFactory.getLabelLength(label.length); - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.contract, c, 'Click to see contract info', GBPConstants.colors.graph['subject'], 'Contract'); - - itemsArray.contract.push(item); - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - contractItems[c.id] = item; - }); - - offsetHobj.contract = offsetObj.h; - - } - - if ( $scope.selectedTenant && $scope.selectedTenant['endpoint-group'] ) { - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h > 400 ? offsetObj.h : 400); - $scope.selectedTenant['endpoint-group'].forEach(function(e, i) { - var label = e.name || e.id, - width = JointGraphFactory.getLabelLength(label.length); - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.epg, e, 'Click to see epg info', GBPConstants.colors.graph['pns'], 'EP group'); - - itemsArray.epg.push(item); - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - epgItems[e.id] = item; - - createEpgLinks(e, item, contractItems); - }); - - } - - offsetHobj.epg = JointGraphOffsetFactory.getCurrentOffset(itemsArray.contract, 'y'); - JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.epg ,offsetHobj.epg, paper); - } - - }; - - $scope.getPaperObj = function(){ - return paper; - }; - - $scope.$on('GBP_TENANT_RELOAD',function(){ - if ($scope.selectedTenant) { - loadData(); - } - else { - JointGraphFactory.reloadGraph(paper.model); - } - }); - - loadData(); - }]); - - gbpOld.register.controller('deliveredPolicyCtrl', ['$scope', 'GPBServices', 'JointGraphFactory', 'GBPGovernanceServices', 'JointGraphOffsetFactory', 'GBPConstants', - function ($scope, GPBServices, JointGraphFactory, GBPGovernanceServices, JointGraphOffsetFactory, GBPConstants) { - var paper = JointGraphFactory.createGraph(), - providerItems = {}, - consumerItems = {}, - subjectItems = {}; - - var getEpList = function() { - var providerEpKeys = Object.keys(providerItems), - consumerEpKeys = Object.keys(consumerItems), - epList = providerEpKeys.map(function (k) { - return providerItems[k].attributes.objData; - }); - - consumerEpKeys.forEach(function(k) { - if(providerEpKeys.indexOf(k) === -1) { - epList.push(consumerItems[k].attributes.objData); - } - }); - - return epList; - }; - - var getSubjList = function() { - return Object.keys(subjectItems).map(function (k) { - return subjectItems[k].attributes.objData; - }); - }; - - var objClickAction = { - subject: function(data){ - data.providerItems = providerItems; - data.consumerItems = consumerItems; - $scope.setViewContent('subject-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox'); - }, - consumer: function(data) { - $scope.setViewContent('epg-content-static', data, 'SET_SEL_STA_OBJ', 'menuBox'); - }, - provider: function(data) { - $scope.setViewContent('epg-content-static', data, 'SET_SEL_STA_OBJ', 'menuBox'); - } - }; - - var objDblClickAction = { - consumer: function(data){ - $scope.setBreadcrumb('l3', 'Endpoint group detail', true); - $scope.setViewContent('epg-detail', { ep: data, epList: getEpList() }, 'SET_SELECTED_EPG','contentTpl'); - }, - provider: function(data){ - $scope.setBreadcrumb('l3', 'Endpoint group detail', true); - $scope.setViewContent('epg-detail', { ep: data, epList: getEpList() }, 'SET_SELECTED_EPG','contentTpl'); - }, - subject: function(data) { - var obj = { subject: data, - subjList: Object.keys(subjectItems).map(function (k) { - return subjectItems[k].attributes.objData; - }), - providerItems: providerItems, - consumerItems: consumerItems - }; - $scope.setBreadcrumb('l3', 'Subject detail', true); - $scope.setViewContent('subject-detail', obj, 'SET_SELECTED_SUBJECT','contentTpl'); - } - }; - - paper.on('cell:pointerdown', function(cell) { - if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) { - objClickAction[cell.model.attributes.objType](cell.model.attributes.objData); - } - }); - - paper.on('cell:pointerdblclick', function(cell) { - objDblClickAction[cell.model.attributes.objType](cell.model.attributes.objData); - }); - - var createSubjectLinks = function(subject, subjectItem, providerItems, consumerItems) { - var providerLinkItems = subject.providers.map(function(p) { - return JointGraphFactory.createLink(providerItems[p].id, subjectItem.id, 'green'); - }); - consumerLinkItems = subject.consumers.map(function(c) { - return JointGraphFactory.createLink(subjectItem.id, consumerItems[c].id, 'blue'); - }); - - JointGraphFactory.addItemList(paper.model, providerLinkItems); - JointGraphFactory.addItemList(paper.model, consumerLinkItems); - }; - - var loadData = function() { - if($scope.selectedTenant) { - providerItems = {}; - consumerItems = {}; - subjectItems = {}; - - var classifierInstances = $scope.selectedTenant['subject-feature-instances'] && - $scope.selectedTenant['subject-feature-instances']['classifier-instance'] && - $scope.selectedTenant['subject-feature-instances']['classifier-instance'].length > 0 ? $scope.selectedTenant['subject-feature-instances']['classifier-instance'] : []; - - var offsetObj = { - ow: 100, - oh: 100, - w: 100, - h: 100 - }, - marginObj = { - w: 50, - h: 80 - }, - offsetHobj = { - pEpg: 0, - cEpg: 0, - subject: 0 - }, - itemsArray = { - pEpg: [], - cEpg: [], - subject: [] - }; - - JointGraphFactory.reloadGraph(paper.model); - - GBPGovernanceServices.getEPGsAndSubjects($scope.selectedTenant.id, classifierInstances, function(data){ - data.providers.forEach(function(p, i) { - var relatedObj = GPBServices.getPropFromListByProp($scope.selectedTenant['endpoint-group'], 'id', p.id), - label = relatedObj.name || p.id, - width = JointGraphFactory.getLabelLength(label.length); - - relatedObj.rules = p.rules; - var item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.provider, relatedObj, 'Click to see epg info, doubleclick to see Endpoint group detail', GBPConstants.colors.graph['pns'], 'Provider EPG'); - - itemsArray.pEpg.push(item); - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - providerItems[p.id] = item; - }); - - offsetHobj.pEpg = offsetObj.h; - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 500); - data.consumers.forEach(function(c, i) { - var relatedObj = GPBServices.getPropFromListByProp($scope.selectedTenant['endpoint-group'], 'id', c.id), - label = relatedObj.name || c.id, - width = JointGraphFactory.getLabelLength(label.length); - - relatedObj.rules = c.rules; - var item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.consumer, relatedObj, 'Click to see epg info, doubleclick to see Endpoint group detail', GBPConstants.colors.graph['cns'], 'Consumer EPG'); - - itemsArray.cEpg.push(item); - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - consumerItems[c.id] = item; - }); - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetHobj.pEpg > 300 ? offsetHobj.pEpg : 300); - data.subjects.forEach(function(s, i) { - var label = s.name, - width = JointGraphFactory.getLabelLength(label.length), - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.subject, s, 'Click to see subject info, doubleclick to see Subject detail', GBPConstants.colors.graph['subject'], 'Subject'); - - itemsArray.subject.push(item); - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - subjectItems[s.name] = item; - createSubjectLinks(s, item, providerItems, consumerItems); - }); - - offsetHobj.pEpg = JointGraphOffsetFactory.getCurrentOffset(itemsArray.pEpg, 'y'); - JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.subject ,offsetHobj.pEpg, paper); - offsetHobj.subject = JointGraphOffsetFactory.getCurrentOffset(itemsArray.subject, 'y'); - JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.cEpg ,offsetHobj.subject, paper); - - }, function(){}); - - } - - - // paper.scaleContentToFit(); - // paper.fitToContent(); - }; - - $scope.getPaperObj = function(){ - return paper; - }; - - - $scope.$on('GBP_TENANT_RELOAD',function(){ - if ($scope.selectedTenant) { - loadData(); - } - else { - JointGraphFactory.reloadGraph(paper.model); - } - }); - - loadData(); - }]); - - gbpOld.register.controller('subjectDetailCtrl', ['$scope', 'GPBServices', 'JointGraphFactory', 'GBPGovernanceServices', 'JointGraphOffsetFactory', 'GBPConstants', - function ($scope, GPBServices, JointGraphFactory, GBPGovernanceServices, JointGraphOffsetFactory, GBPConstants) { - $scope.selectedSubject = null; - $scope.subjectList = []; - - var paper = JointGraphFactory.createGraph(), - subjectItem = null, - ruleItems = {}, - subjectItems = {}; - - var createSubjectLinks = function(subjectItem, ruleItem) { - var linkItem = JointGraphFactory.createLink(subjectItem.id, ruleItem.id, 'blue'); - JointGraphFactory.addItem(paper.model, linkItem); - }; - - paper.on('cell:pointerdown', function(cell) { - var objClickAction = { - subject: function(data){ - $scope.setViewContent('subject-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox'); - }, - rule: function(data){ - $scope.setViewContent('rule-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox'); - } - }; - - // console.log('cell.model.attributes.objType', cell.model.attributes.objType, cell.model.attributes.objData); - if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) { - objClickAction[cell.model.attributes.objType](cell.model.attributes.objData); - } - }); - - var loadData = function() { - if($scope.selectedSubject) { - subjectItem = null; - ruleItems = {}; - - var offsetObj = { - ow: 100, - oh: 100, - w: 100, - h: 100 - }, - marginObj = { - w: 50, - h: 80 - }; - - JointGraphFactory.reloadGraph(paper.model); - - var label = $scope.selectedSubject.name || $scope.selectedSubject.id, - width = JointGraphFactory.getLabelLength(label.length); - subjectItem = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.subject, $scope.selectedSubject, 'Click to see subject info', GBPConstants.colors.graph['subject'], 'Subject'); - - JointGraphFactory.addItem(paper.model, subjectItem); - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 300); - $scope.selectedSubject.rules.forEach(function(r, i) { - var label = r.name, - width = JointGraphFactory.getLabelLength(label.length); - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.rule, r, 'Click to see rule info', GBPConstants.colors.graph['cns'], 'Rule'); - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper); - JointGraphFactory.addItem(paper.model, item); - ruleItems[r.name] = item; - - createSubjectLinks(subjectItem, item); - }); - } - }; - - $scope.getPaperObj = function(){ - return paper; - }; - - $scope.$on('SET_SELECTED_SUBJECT', function(event, data){ - $scope.selectedSubject = data.subject; - $scope.subjectList = data.subjList; - loadData(); - }); - - $scope.setSubject = function(subject) { - $scope.selectedSubject = subject; - loadData(); - }; - - loadData(); - }]); - - gbpOld.register.controller('epgDetailCtrl', ['$scope', 'JointGraphFactory', 'TopologyDataLoaders', 'GBPEpgServices', 'JointGraphOffsetFactory', 'GBPConstants', - function ($scope, JointGraphFactory, TopologyDataLoaders, GBPEpgServices, JointGraphOffsetFactory, GBPConstants) { - var paper = JointGraphFactory.createGraph(), - epgItem = {}, - epItems = {}; - - $scope.epgDisplayLabel = ['name', 'id']; - $scope.epgList = []; - $scope.selectedEpg = null; - - $scope.$on('SET_SELECTED_EPG', function(event, epg){ - $scope.selectedEpg = epg.ep; - $scope.epgList = epg.epList; - loadData(); - }); - - $scope.setEpg = function(epg){ - selectedEpg = epg; - loadData(); - }; - - paper.on('cell:pointerdown', function(cell) { - var objClickAction = { - ep: function(data){ - $scope.setViewContent('ep-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox'); - }, - epg: function(data){ - $scope.setViewContent('epg-content-static',data, 'SET_SEL_STA_OBJ', 'menuBox'); - }, - }; - - if ( angular.isFunction(objClickAction[cell.model.attributes.objType]) ) { - objClickAction[cell.model.attributes.objType](cell.model.attributes.objData); - } - }); - - var loadData = function() { - if($scope.selectedTenant && $scope.selectedEpg) { - epgItem = {}; - epItems = {}; - links = []; - - JointGraphFactory.reloadGraph(paper.model); - - TopologyDataLoaders.getEndpointsFromEndpointGroup($scope.selectedTenant.id, $scope.selectedEpg.id, function(data){ - var offsetObj = { - ow: 100, - oh: 100, - w: 100, - h: 100 - }, - marginObj = { - w: 50, - h: 80 - }; - - var label = $scope.selectedEpg.name || $scope.selectedEpg.id, - width = JointGraphFactory.getLabelLength(label.length); - epgItem = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, 'epg', $scope.selectedEpg, 'Click to see epg info', GBPConstants.colors.graph['subject'], 'EPG'); - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper); - JointGraphFactory.addItem(paper.model, epgItem); - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, 500); - if(data && data.output && data.output['ui-endpoint'] && data.output['ui-endpoint'].length){ - data.output['ui-endpoint'].forEach(function(ep, i){ - var label = ep['mac-address'] + ':' + ep['l2-context'], - width = JointGraphFactory.getLabelLength(label.length); - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, 'ep', ep, 'Click to see ep info', GBPConstants.colors.graph['pns'], 'Endpoint'); - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width), paper); - JointGraphFactory.addItem(paper.model, item); - epItems[label] = item; - links.push(JointGraphFactory.createLink(item.id, epgItem.id, 'green')); - }); - - JointGraphFactory.addItemList(paper.model, links); - } - }, function(){}); - } - }; - - $scope.getPaperObj = function(){ - return paper; - }; - - // init(); - }]); - - gbpOld.register.controller('policyRendererCtrl', ['$scope', '$http', '$timeout', 'PGNServices', 'TopoServices', 'GBPTenantServices', 'GBPConstants', 'JointGraphFactory','GBPJointGraphBuilder', - function ($scope, $http, $timeout, PGNServices, TopoServices, GBPTenantServices, GBPConstants, JointGraphFactory, GBPJointGraphBuilder) { - - $scope.topologyData = { nodes: [], links: [] }; - $scope.topologyType = null; - $scope.topologyArgs = {}; - $scope.legend = {}; - $scope.showLegend = false; - - var paper = JointGraphFactory.createGraph(); - - var reloadShowLegend = function() { - $scope.showLegend = !$.isEmptyObject($scope.legend); - }; - - $scope.settingsSigma = { - defaultLabelColor: '#fff', - doubleClickEnabled: false, - labelThreshold: 8 - }; - - $scope.settingsAtlas = { - adjustSizes: true, - gravity: 0.2 - }; - - $scope.viewTopo = { - box: false, - button: false - }; - - paper.on('cell:pointerdown', function(cellView, evt) { - if (cellView.model.isLink() && cellView.model.attributes.objData) { - $scope.$broadcast('SET_LINK_DATA', cellView.model.attributes.objData); - } - }); - - $scope.mandatoryProperties = []; - $scope.loadTopology = function(type, args) { - if ($scope.selectedTenant) { - $scope.topologyType = type; - $scope.topologyArgs = args; - GBPJointGraphBuilder.loadTopology(args, paper, type); - } - }; - $scope.toggleExpanded = function(expand, show) { - $scope.setViewExpand('policyRendererView',expand, show, 'l2'); - - if($scope.policyRendererView[expand] && $scope.selectedTenant) { - $scope.topologyArgs.tenantId = $scope.selectedTenant.id; - - if((expand === 'epg' || expand === 'contracts' || expand === 'classifiers' || expand === 'actions' || expand === 'renderers') && ($scope.topologyType !== GBPConstants.strings.config)) { - $scope.loadTopology(GBPConstants.strings.config, $scope.topologyArgs); - } else if((expand === 'l2l3' || expand === 'registerEndpoint' || expand === 'registerL3PrefixEndpoint') && ($scope.topologyType !== GBPConstants.strings.l2l3)) { - $scope.loadTopology(GBPConstants.strings.l2l3, $scope.topologyArgs); - } - } - }; - - $scope.reloadTopo = function() { - if($scope.selectedTenant) { - $scope.topologyArgs.tenantId = $scope.selectedTenant.id; - GBPJointGraphBuilder.loadTopology($scope.topologyArgs, paper, $scope.topologyType); - } - }; - - $scope.getDisplayLabelsFromCtrl = function(eventName, val) { - $scope.$broadcast(eventName, val); - }; - - $scope.validateMandatory = function(newObj, mandatoryProps){ - var ret = true, - notFilledProps = []; - - mandatoryProps.forEach(function(el){ - if(newObj[el] === '' || newObj[el] === null || newObj[el] === undefined){ - notFilledProps.push(el); - ret = false; - } - }); - - return {'status' : ret, 'notFilledProps' : notFilledProps}; - }; - - $scope.validate = function(value, errors){ - errors.int32 = !(parseInt(value) >= -2147483648 && parseInt(value) <= 2147483647); - }; - - - - $scope.validateForm = function(form) { - return form.$valid; - }; - - $scope.$on('GBP_TENANT_RELOAD', function(e, obj){ - $scope.selectedTenant = obj; - }); - - }]); - - gbpOld.register.controller('linkDataCtrl',['$scope', function($scope){ - $scope.showTable = false; - - $scope.show = function(){ - $scope.showTable = true; - }; - - $scope.close = function(){ - $scope.showTable = false; - }; - - $scope.$on('SET_LINK_DATA', function(e, obj){ - $scope.linkData = obj; - $scope.show(); - $scope.$apply(); - }); - }]); - - gbpOld.register.controller('crudCtrl',['$scope', function($scope){ - $scope.selectedObj = null; - $scope.label = ''; - $scope.q = {}; - - $scope.add = function() { - $scope.selectedObj = null; - $scope.showForm(); - }; - - $scope.modify = function() { - $scope.$emit('PGN_EDIT_ELEM'); - }; - - $scope.init = function(label) { - $scope.label = label; - }; - - - $scope.$on('EV_SET_SEL_CLASS', function(event, selObj){ - $scope.selectedObj = selObj; - }); - }]); - - gbpOld.register.controller('contractCtrl', ['$scope','GBPContractServices', '$filter', function($scope, GBPContractServices, $filter){ - $scope.list = []; - $scope.selectedContract = null; - $scope.newContractObj = GBPContractServices.createObj(); - $scope.displayLabel = ['description','id']; - $scope.crudLabel = 'Contract list'; - - $scope.internalView = { - contract: false, - edit: "view" - }; - - var path = null, - mandatoryProperties = [], - clear = function(){ - $scope.list = []; - $scope.internalView = { - contract: false, - edit: "view" - }; - $scope.selectedContract = null; - $scope.newContractObj = GBPContractServices.createObj(); - }; - - $scope.init = function() { - if ( $scope.selectedTenant ) { - $scope.selectedContract = null; - path = GBPContractServices.createPathObj($scope.selectedTenant.id); - - GBPContractServices.load(path, function(data){ - $scope.list = data; - // $scope.$broadcast('GBP_CONTRACT_RELOAD'); - $scope.sendReloadEventFromRoot('GBP_CONTRACT_RELOAD'); - }, function(){ - - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - var resp = $scope.validateMandatory($scope.newContractObj, mandatoryProperties); - if(resp.status){ - path = GBPContractServices.createPathObj($scope.selectedTenant.id, $scope.newContractObj.id); - GBPContractServices.send(path, $scope.newContractObj, function(data){ - $scope.init(); - $scope.internalView.contract = false; - $scope.reloadNewObj(); - $scope.internalView.edit = "view"; - }, function(){ - //TODO: error cbk - }); - }else{ - alert($filter('translate')('GBP_MANDATORY_NOT_FILLED')+': '+resp.notFilledProps.join(', ')); - } - }; - - $scope.delete = function() { - if ( $scope.selectedContract ) { - path = GBPContractServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id); - GBPContractServices.delete(path, function(data){ - $scope.init(); - $scope.selectedContract = null; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reloadNewObj = function() { - $scope.newContractObj = GBPContractServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedContract = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.contract = true; - }else { - $scope.internalView.contract = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.contract) { - angular.copy(selectedObj, $scope.newContractObj); - } - $scope.sendReloadEventFromRoot('GBP_CONTRACT_RELOAD'); - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.contract = true; - $scope.selectedContract = null; - $scope.internalView.edit = "add"; - }; - - $scope.close = function(){ - $scope.internalView.contract = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if(!event.defaultPrevented) { - if ( $scope.selectedContract ) { - $scope.internalView.contract = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedContract, $scope.newContractObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_TENANT_RELOAD',function(event){ - $scope.init(); - }); - - $scope.$on('GBP_CONTRACTS_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - }]); - - gbpOld.register.controller('clauseCtrl', ['$scope','GBPClauseServices', 'GBPSubjectServices', - function($scope, GBPClauseServices, GBPSubjectServices){ - $scope.list = []; - $scope.selectedClause = null; - $scope.newClauseObj = GBPClauseServices.createObj(); - $scope.internalView = { - clause: false, - edit: "view" - }; - $scope.displayLabel = 'name'; - $scope.crudLabel = 'Clause list'; - - $scope.subjects = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects); - - var path = null, - - clear = function(){ - $scope.list = []; - $scope.selectedClause = null; - $scope.newClauseObj = GBPClauseServices.createObj(); - $scope.internalView = { - clause: false, - edit: "view" - }; - }; - - //move to separate ctrl \/ - $scope.addNewElem = function(templateObj) { - if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) { - var objToPush = templateObj || ""; - $scope.newClauseObj['subject-refs'].push(objToPush); - } - }; - - $scope.deleteElemAt = function(index) { - if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) { - $scope.newClauseObj['subject-refs'].splice(index, 1); - } - }; - - $scope.updateAt = function(index, value) { - if($scope.newClauseObj && $scope.newClauseObj['subject-refs'] && $scope.newClauseObj['subject-refs'].length >= index) { - $scope.newClauseObj['subject-refs'][index] = value; - } - }; - //move to separate ctrl /\ - - var loadSubjects = function() { - $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects); - - GBPSubjectServices.load(path, function(data){ - $scope.subjects.options = data; - }, function(){ - //TODO: error cbk - }); - }; - - $scope.init = function() { - if ( $scope.selectedContract ) { - path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id); - - GBPClauseServices.load(path, function(data){ - $scope.list = data; - }, function(){ - //TODO: error cbk - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.clauseForm)){ - path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.newClauseObj.name); - GBPClauseServices.send(path, $scope.newClauseObj, function(data){ - $scope.init(); - $scope.internalView.clause = false; - $scope.reloadNewObj(); - $scope.internalView.clause = "view"; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if ( $scope.selectedClause ) { - path = GBPClauseServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedClause.name); - GBPClauseServices.delete(path, function(data){ - $scope.init(); - $scope.selectedClause = null; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reloadNewObj = function() { - $scope.newClauseObj = GBPClauseServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedClause = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.clause = true; - }else { - $scope.internalView.clause = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.clause) { - angular.copy(selectedObj, $scope.newClauseObj); - } - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.clause = true; - $scope.internalView.edit = "add"; - $scope.selectedClause = null; - }; - - $scope.close = function(){ - $scope.internalView.clause = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedClause ) { - $scope.internalView.clause = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedClause, $scope.newClauseObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_CONTRACT_RELOAD',function(){ - $scope.internalView.clause = false; - $scope.init(); - }); - - $scope.$on('GBP_SUBJECT_RELOAD',function(){ - loadSubjects(); - }); - }]); - - gbpOld.register.controller('subjectCtrl', ['$scope','GBPSubjectServices', '$filter', function($scope, GBPSubjectServices, $filter){ - $scope.list = []; - $scope.selectedSubject = null; - $scope.newSubjectObj = GBPSubjectServices.createObj(); - $scope.displayLabel = 'name'; - $scope.internalView = { - subject : false, - edit : "view" - }; - $scope.crudLabel = 'Subject list'; - $scope.errors = {}; - - var path = null, - mandatoryProperties = ['order'], - - clear = function(){ - $scope.list = []; - $scope.selectedSubject = null; - $scope.newSubjectObj = GBPSubjectServices.createObj(); - $scope.internalView = { - subject : false, - edit : "view" - }; - }; - - $scope.init = function() { - if ( $scope.selectedContract ) { - $scope.selectedSubject = null; - path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id); - - GBPSubjectServices.load(path, function(data){ - $scope.list = data; - $scope.sendReloadEventFromRoot('GBP_SUBJECT_RELOAD'); - }, function(){ - //TODO: error cbk - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.subjectForm)){ - path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.newSubjectObj.name); - GBPSubjectServices.send(path, $scope.newSubjectObj, function(data){ - $scope.init(); - $scope.internalView.subject = false; - $scope.reloadNewObj(); - $scope.internalView.edit = "view"; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if ( $scope.selectedSubject ) { - path = GBPSubjectServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name); - GBPSubjectServices.delete(path, function(data){ - $scope.init(); - $scope.selectedSubject = null; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reloadNewObj = function() { - $scope.newSubjectObj = GBPSubjectServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedSubject = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.subject = true; - }else { - $scope.internalView.subject = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.subject) { - angular.copy(selectedObj, $scope.newSubjectObj); - } - $scope.sendReloadEventFromRoot('GBP_SUBJECT_RELOAD'); - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.subject = true; - $scope.internalView.edit = "add"; - $scope.selectedSubject = null; - }; - - $scope.close = function(){ - $scope.internalView.subject = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedSubject ) { - $scope.internalView.subject = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedSubject, $scope.newSubjectObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_CONTRACT_RELOAD',function(){ - $scope.internalView.subject = false; - $scope.init(); - }); - - $scope.$on('GBP_SUBJECTS_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - }]); - - gbpOld.register.controller('ruleCtrl', ['$scope','GBPRuleServices', '$filter', function($scope, GBPRuleServices, $filter){ - $scope.list = []; - $scope.selectedRule = null; - $scope.newRuleObj = GBPRuleServices.createObj(); - $scope.displayLabel = 'name'; - $scope.internalView = { - rule : false, - edit : "view" - }; - $scope.crudLabel = 'Rule list'; - $scope.errors = {}; - - var path = null, - mandatoryProperties = ['order'], - - clear = function(){ - $scope.list = []; - $scope.selectedRule = null; - $scope.newRuleObj = GBPRuleServices.createObj(); - $scope.internalView = { - rule : false, - edit : "view" - }; - }; - - $scope.init = function() { - if ( $scope.selectedSubject ) { - $scope.selectedRule = null; - path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name); - - GBPRuleServices.load(path, function(data){ - $scope.list = data; - }, function(){ - //TODO: error cbk - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.rulesForm)){ - path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.newRuleObj.name); - GBPRuleServices.send(path, $scope.newRuleObj, function(data){ - $scope.init(); - $scope.internalView.rule = false; - $scope.reloadNewObj(); - $scope.internalView.edit = "view"; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if ( $scope.selectedRule ) { - path = GBPRuleServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name); - GBPRuleServices.delete(path, function(data){ - $scope.init(); - $scope.selectedRule = null; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reloadNewObj = function() { - $scope.newRuleObj = GBPRuleServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedRule = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.rule = true; - }else { - $scope.internalView.rule = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.rule) { - angular.copy(selectedObj, $scope.newRuleObj); - } - $scope.$broadcast('GBP_RULE_RELOAD'); - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.rule = true; - $scope.internalView.edit = "add"; - $scope.selectedRule = null; - }; - - $scope.close = function(){ - $scope.internalView.rule = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedRule ) { - $scope.internalView.rule = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedRule, $scope.newRuleObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_SUBJECT_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('actionRefCtrl', ['$scope','GBPActionRefsServices', 'GBPActionInstanceServices', '$filter', function($scope, GBPActionRefsServices, GBPActionInstanceServices, $filter){ - $scope.list = []; - $scope.selectedActionRef = null; - $scope.newActionRefObj = GBPActionRefsServices.createObj(); - $scope.displayLabel = 'name'; - $scope.internalView = { - actionRef : false, - edit : "view" - }; - $scope.crudLabel = 'Action ref list'; - $scope.errors = {}; - - $scope.actionInstanceNames = {'options' : [], 'labels' : $scope.displayLabel}; - - var path = null, - mandatoryProperties = ['order'], - - actionInstanceNamesLoad = function() { - var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id); - GBPActionInstanceServices.load(actionInstancePath, function(data){ - $scope.actionInstanceNames.options = data; - },function(){ - //TODO: error cbk - }); - }, - - clear = function(){ - $scope.list = []; - $scope.selectedActionRef = null; - $scope.newActionRefObj = GBPActionRefsServices.createObj(); - $scope.internalView = { - actionRef : false, - edit : "view" - }; - }; - - $scope.init = function() { - if ( $scope.selectedRule ) { - $scope.selectedActionRef = null; - path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name); - - GBPActionRefsServices.load(path, function(data){ - $scope.list = data; - }, function(){ - //TODO: error cbk - }); - - actionInstanceNamesLoad(); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.actionRefForm)){ - path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.newActionRefObj.name); - GBPActionRefsServices.send(path, $scope.newActionRefObj, function(data){ - $scope.init(); - $scope.internalView.actionRef = false; - $scope.reloadNewObj(); - $scope.internalView.edit = "view"; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if ( $scope.selectedActionRef ) { - path = GBPActionRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.selectedActionRef.name); - GBPActionRefsServices.delete(path, function(data){ - $scope.init(); - $scope.selectedActionRef = null; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reloadNewObj = function() { - $scope.newActionRefObj = GBPActionRefsServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedActionRef = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.actionRef = true; - }else { - $scope.internalView.actionRef = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.actionRef) { - angular.copy(selectedObj, $scope.newActionRefObj); - } - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.actionRef = true; - $scope.internalView.edit = "add"; - $scope.selectedActionRef = null; - }; - - $scope.close = function(){ - $scope.internalView.actionRef = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedActionRef ) { - $scope.internalView.actionRef = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedActionRef, $scope.newActionRefObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_RULE_RELOAD',function(){ - $scope.internalView.actionRef = false; - $scope.init(); - }); - - $scope.$on('GBP_ACTION_INSTANCE_RELOAD',function(){ - actionInstanceNamesLoad(); - }); - }]); - - gbpOld.register.controller('classifierRefCtrl', ['$scope','GBPClassifierRefsServices', 'GBPClassifierInstanceServices', '$filter', function($scope, GBPClassifierRefsServices, GBPClassifierInstanceServices, $filter){ - $scope.list = []; - $scope.selectedClassifierRef = null; - $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj(); - $scope.displayLabel = 'name'; - $scope.internalView = { - classifierRef : false, - edit : "view" - }; - - $scope.instanceNames = {'options' : [], 'labels' : $scope.displayLabel}; - - $scope.formDirections = ['in', 'out', 'bidirectional']; - $scope.formConnectionTracking = ['normal', 'reflexive']; - - $scope.crudLabel = 'Classifier ref list'; - - var path = null, - - instanceNamesLoad = function() { - var classifierInstancePath = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id); - GBPClassifierInstanceServices.load(classifierInstancePath, function(data){ - $scope.instanceNames.options = data; - },function(){ - //TODO: error cbk - }); - }, - - clear = function(){ - $scope.list = []; - $scope.selectedClassifierRef = null; - $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj(); - $scope.internalView = { - classifierRef : false, - edit : "view" - }; - }; - - $scope.init = function() { - if ( $scope.selectedRule ) { - $scope.selectedClassifierRef = null; - path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name); - - - - GBPClassifierRefsServices.load(path, function(data){ - $scope.list = data; - }, function(){ - //TODO: error cbk - }); - - instanceNamesLoad(); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.classifierRefForm)){ - path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.newClassifierRefObj.name); - GBPClassifierRefsServices.send(path, $scope.newClassifierRefObj, function(data){ - $scope.init(); - $scope.internalView.classifierRef = false; - $scope.reloadNewObj(); - $scope.internalView.edit = "view"; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if ( $scope.selectedClassifierRef ) { - path = GBPClassifierRefsServices.createPathObj($scope.selectedTenant.id, $scope.selectedContract.id, $scope.selectedSubject.name, $scope.selectedRule.name, $scope.selectedClassifierRef.name); - GBPClassifierRefsServices.delete(path, function(data){ - $scope.init(); - $scope.selectedClassifierRef = null; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reloadNewObj = function() { - $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedClassifierRef = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.classifierRef = true; - }else { - $scope.internalView.classifierRef = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.classifierRef) { - angular.copy(selectedObj, $scope.newClassifierRefObj); - } - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.classifierRef = true; - $scope.internalView.edit = "add"; - $scope.selectedClassifierRef = null; - }; - - $scope.close = function(){ - $scope.internalView.classifierRef = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedClassifierRef ) { - $scope.internalView.classifierRef = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedClassifierRef, $scope.newClassifierRefObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_RULE_RELOAD',function(){ - $scope.internalView.classifierRef = false; - $scope.init(); - }); - - $scope.$on('GBP_CLASSIFIER_INSTANCE_RELOAD',function(){ - instanceNamesLoad(); - }); - }]); - - gbpOld.register.controller('tenantCtrl', ['$scope', 'GBPTenantServices', '$filter', function($scope, GBPTenantServices, $filter){ - $scope.list = []; - $scope.selectedTenantObj = null; - $scope.newTenantObj = GBPTenantServices.createObj(); - $scope.displayLabel = ['name' , 'id']; - $scope.crudLabel = 'Tenants list'; - - $scope.view = { - tenant: false, - edit: "view" - }; - - $scope.init = function() { - GBPTenantServices.load( - function(data) { - $scope.list = data; - $scope.newTenantObj = GBPTenantServices.createObj(); - $scope.selectedTenantObj = null; - }, - function(){ - //TODO error - }); - }; - - $scope.save = function(){ - if($scope.validateForm($scope.tenantForm)){ - path = GBPTenantServices.createPathObj($scope.newTenantObj.id); - GBPTenantServices.send(path, $scope.newTenantObj, function(data){ - $scope.init(); - $scope.view.tenant = false; - $scope.view.edit = "view"; - $scope.$emit('GBP_GLOBAL_TENANT_RELOAD'); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenantObj) { - path = GBPTenantServices.createPathObj($scope.selectedTenantObj.id); - - GBPTenantServices.delete(path, function(data){ - $scope.init(); - $scope.view.tenant = false; - $scope.$emit('GBP_GLOBAL_TENANT_RELOAD'); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reload = function(selectedObj) { - $scope.selectedTenantObj = selectedObj; - - $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view"; - if(selectedObj){ - $scope.view.tenant = true; - } - else { - $scope.view.tenant = false; - $scope.view.edit = "view"; - } - - if ($scope.view.tenant) { - angular.copy(selectedObj, $scope.newTenantObj); - } - }; - - $scope.showForm = function() { - $scope.newTenantObj = GBPTenantServices.createObj(); - $scope.selectedTenantObj = null; - $scope.view.tenant = true; - $scope.view.edit = "add"; - }; - - $scope.close = function(){ - $scope.view.tenant = false; - $scope.view.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedTenantObj ) { - $scope.view.tenant = true; - $scope.view.edit = "edit"; - angular.copy($scope.selectedTenantObj, $scope.newTenantObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('epgCtrl',['$scope', 'GBPEpgServices', 'GBPContractServices', '$filter', - function($scope, GBPEpgServices, GBPContractServices, $filter){ - $scope.selectedEpg = null; - $scope.newEpgObj = GBPEpgServices.createObj(); - $scope.displayLabel = ['name', 'id']; - $scope.crudLabel = 'Group list'; - - $scope.igpOpts = ['allow', 'require-contract']; - - $scope.contracts = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contracts); - - $scope.list = []; - - $scope.internalView = { - epg: false, - edit: "view" - }; - - var loadContracts = function() { - GBPContractServices.load(path, function(data){ - $scope.contracts.options = data; - }, function(){ - //TODO: error cbk - }); - }, - - mandatoryProperties = ['name'], - - clear = function(){ - $scope.list = []; - $scope.selectedEpg = null; - $scope.newEpgObj = GBPEpgServices.createObj(); - $scope.internalView = { - epg: false, - edit: "view" - }; - }; - - $scope.init = function() { - if ($scope.selectedTenant) { - path = GBPEpgServices.createPathObj($scope.selectedTenant.id); - - GBPEpgServices.load(path, function(data){ - $scope.list = data; - // $scope.$broadcast('GBP_EPG_RELOAD'); - $scope.sendReloadEventFromRoot('GBP_EPG_RELOAD'); - }, function(){ - //TODO: error cbk - }); - - loadContracts(); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.epgForm)){ - path = GBPEpgServices.createPathObj($scope.selectedTenant.id, $scope.newEpgObj.id); - GBPEpgServices.send(path, $scope.newEpgObj, function(data){ - $scope.init(); - $scope.internalView.epg = false; - $scope.reloadNewObj(); - $scope.internalView.edit = "view"; - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedEpg) { - path = GBPEpgServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id); - GBPEpgServices.delete(path, function(data){ - $scope.init(); - $scope.internalView.epg = false; - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.showForm = function() { - $scope.internalView.epg = true; - $scope.reloadNewObj(); - $scope.selectedEpg = null; - $scope.internalView.edit = "add"; - }; - - $scope.reloadNewObj = function() { - $scope.newEpgObj = GBPEpgServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedEpg = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.epg = true; - }else { - $scope.internalView.epg = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.epg) { - angular.copy(selectedObj, $scope.newEpgObj); - } - $scope.sendReloadEventFromRoot('GBP_EPG_RELOAD'); - }; - - $scope.close = function(){ - $scope.internalView.epg = false; - $scope.internalView.edit = "view"; - }; - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedEpg ) { - $scope.internalView.epg = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedEpg, $scope.newEpgObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_CONTRACT_RELOAD',function(){ - loadContracts(); - }); - - $scope.$on('GBP_EPG_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - }]); - - gbpOld.register.controller('cnsCtrl',['$scope', 'GBPConNamedSelServices', function($scope, GBPConNamedSelServices){ - $scope.list = []; - $scope.selectedCNS = null; - $scope.newCNSObj = GBPConNamedSelServices.createObj(); - $scope.internalView = { - cns: false, - edit: "view" - }; - $scope.displayLabel = 'name'; - $scope.crudLabel = 'Consumer named selectors list'; - - var clear = function(){ - $scope.list = []; - $scope.selectedCNS = null; - $scope.newCNSObj = GBPConNamedSelServices.createObj(); - $scope.internalView = { - cns: false, - edit: "view" - }; - }; - - //move to separate ctrl \/ - $scope.addNewElem = function(templateObj) { - if($scope.newCNSObj && $scope.newCNSObj.contract) { - var objToPush = templateObj || ""; - $scope.newCNSObj.contract.push(objToPush); - } - }; - - $scope.deleteElemAt = function(index) { - if($scope.newCNSObj && $scope.newCNSObj.contract) { - $scope.newCNSObj.contract.splice(index, 1); - } - }; - - $scope.updateAt = function(index, value) { - if($scope.newCNSObj && $scope.newCNSObj.contract && $scope.newCNSObj.contract.length >= index) { - $scope.newCNSObj.contract[index] = value; - } - }; - //move to separate ctrl /\ - - $scope.init = function() { - if ($scope.selectedTenant && $scope.selectedEpg) { - path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id); - - GBPConNamedSelServices.load(path, function(data){ - $scope.list = data; - }, function(){ - //TODO: error cbk - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.cnsForm)){ - path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.newCNSObj.name); - GBPConNamedSelServices.send(path, $scope.newCNSObj, function(data){ - $scope.init(); - $scope.internalView.cns = false; - $scope.internalView.cns = "view"; - $scope.reloadNewObj(); - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedEpg && $scope.selectedCNS) { - path = GBPConNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.selectedCNS.name); - GBPConNamedSelServices.delete(path, function(data){ - $scope.init(); - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.selectedCNS = null; - $scope.internalView.cns = true; - $scope.internalView.edit = "add"; - }; - - $scope.reloadNewObj = function() { - $scope.newCNSObj = GBPConNamedSelServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedCNS = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.cns = true; - }else { - $scope.internalView.cns = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.cns) { - angular.copy(selectedObj, $scope.newCNSObj); - } - }; - - $scope.close = function(){ - $scope.internalView.cns = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedEpg ) { - $scope.internalView.cns = true; - $scope.internalView.edit = "add"; - angular.copy($scope.selectedCNS, $scope.newCNSObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_EPG_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('pnsCtrl',['$scope', 'GBPProNamedSelServices', function($scope, GBPProNamedSelServices){ - $scope.list = []; - $scope.selectedPNS = null; - $scope.newPNSObj = GBPProNamedSelServices.createObj(); - $scope.displayLabel = 'name'; - $scope.crudLabel = 'Provider named selectors list'; - $scope.internalView = { - pns: false, - edit: "view" - }; - - var clear = function(){ - $scope.list = []; - $scope.selectedPNS = null; - $scope.newPNSObj = GBPProNamedSelServices.createObj(); - $scope.internalView = { - pns: false, - edit: "view" - }; - }; - - //move to separate ctrl \/ - $scope.addNewElem = function(templateObj) { - if($scope.newPNSObj && $scope.newPNSObj.contract) { - var objToPush = templateObj || ""; - $scope.newPNSObj.contract.push(objToPush); - } - }; - - $scope.deleteElemAt = function(index) { - if($scope.newPNSObj && $scope.newPNSObj.contract) { - $scope.newPNSObj.contract.splice(index, 1); - } - }; - - $scope.updateAt = function(index, value) { - if($scope.newPNSObj && $scope.newPNSObj.contract && $scope.newPNSObj.contract.length >= index) { - $scope.newPNSObj.contract[index] = value; - } - }; - //move to separate ctrl /\ - - $scope.init = function() { - if ($scope.selectedTenant && $scope.selectedEpg) { - path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id); - - GBPProNamedSelServices.load(path, function(data){ - $scope.list = data; - }, function(){ - //TODO: error cbk - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.pnsForm)){ - path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.newPNSObj.name); - GBPProNamedSelServices.send(path, $scope.newPNSObj, function(data){ - $scope.init(); - $scope.internalView.pns = false; - $scope.reloadNewObj(); - $scope.internalView.cns = "view"; - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedEpg && $scope.selectedPNS) { - path = GBPProNamedSelServices.createPathObj($scope.selectedTenant.id, $scope.selectedEpg.id, $scope.selectedPNS.name); - GBPProNamedSelServices.delete(path, function(data){ - $scope.init(); - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.pns = true; - $scope.internalView.edit = "add"; - $scope.selectedPNS = null; - }; - - $scope.reloadNewObj = function() { - $scope.newPNSObj = GBPProNamedSelServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedPNS = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.pns = true; - }else { - $scope.internalView.pns = false; - $scope.internalView.edit = "view"; - } - - if($scope.internalView.pns) { - angular.copy(selectedObj, $scope.newPNSObj); - } - }; - - $scope.close = function(){ - $scope.internalView.pns = false; - $scope.internalView.edit = "view"; - }; - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedEpg ) { - $scope.internalView.pns = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedPNS, $scope.newPNSObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_EPG_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('l2FloodCtrl', ['$scope', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', '$filter', function($scope, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, $filter){ - $scope.list = []; - $scope.selectedL2Flood = null; - $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj(); - $scope.displayLabel = ['name', 'id']; - $scope.crudLabel = 'L2 Flood Domain list'; - - $scope.l2bridge = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_L2BRIDGE_LABEL', $scope.l2bridge); - - $scope.view = { - l2flood: false, - edit: "view" - }; - - var path = null, - - loadL2BridgeList = function() { - GBPL2BridgeDomainServices.load(GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id), function(data){ - $scope.l2bridge.options = data; - }, function(){ - - }); - }, - - clear = function(){ - $scope.list = []; - $scope.selectedL2Flood = null; - $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj(); - $scope.view = { - l2flood: false, - edit: "view" - }; - }; - - $scope.init = function() { - if ( $scope.selectedTenant ) { - path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id); - - GBPL2FloodDomainServices.load(path, function(data){ - $scope.list = data; - // clear objects - $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj(); - $scope.selectedL2Flood = null; - }, function(){ - - }); - - loadL2BridgeList(); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.l2FloodForm)){ - path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id, $scope.newL2FloodObj.id); - GBPL2FloodDomainServices.send(path, $scope.newL2FloodObj, function(data){ - $scope.init(); - $scope.view.l2flood = false; - $scope.view.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD'); - - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedL2Flood) { - path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id, $scope.selectedL2Flood.id); - GBPL2FloodDomainServices.delete(path, function(data){ - $scope.init(); - $scope.view.l2flood = false; - $scope.view.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD'); - - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reload = function(selectedObj) { - $scope.selectedL2Flood = selectedObj; - - $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view"; - if(selectedObj){ - $scope.view.l2flood = true; - } - else { - $scope.view.l2flood = false; - $scope.view.edit = "view"; - } - - if ($scope.view.l2flood) { - angular.copy(selectedObj, $scope.newL2FloodObj); - } - - $scope.sendReloadEventFromRoot('GBP_L2FLOOD_RELOAD'); - }; - - $scope.showForm = function() { - $scope.newL2FloodObj = GBPL2FloodDomainServices.createObj(); - $scope.selectedL2Flood = null; - $scope.view.l2flood = true; - $scope.view.edit = "add"; - }; - - $scope.close = function(){ - $scope.view.l2flood = false; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedL2Flood ) { - $scope.view.l2flood = true; - $scope.view.edit = "edit"; - angular.copy($scope.selectedL2Flood, $scope.newL2FloodObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_L2BRIDGE_RELOAD',function(){ - loadL2BridgeList(); - }); - - $scope.$on('GBP_L2FLOOD_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - }]); - - gbpOld.register.controller('l2BridgeCtrl', ['$scope', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', '$filter', function($scope, GBPL2BridgeDomainServices, GBPL3ContextServices, $filter){ - $scope.list = []; - $scope.selectedL2Bridge = null; - $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj(); - $scope.displayLabel = ['name', 'id']; - $scope.crudLabel = 'L2 Bridge Domain list'; - - $scope.l3context = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context); - - $scope.view = { - l2bridge: false, - edit: "view" - }; - - var path = null, - - loadL3ContextList = function() { - GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){ - $scope.l3context.options = data; - //$scope.$broadcast('GBP_L2BRIDGE_RELOAD'); - }, function(){ - - }); - }, - - clear = function(){ - $scope.list = []; - $scope.selectedL2Bridge = null; - $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj(); - $scope.view = { - l2bridge: false, - edit: "view" - }; - }; - - $scope.init = function() { - if ( $scope.selectedTenant ) { - path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id); - - GBPL2BridgeDomainServices.load(path, function(data){ - $scope.list = data; - $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj(); - $scope.selectedL2Bridge = null; - // $scope.$broadcast('GBP_L2BRIDGE_RELOAD'); - }, function(){ - - }); - - loadL3ContextList(); - }else{ - clear(); - } - }; - - - - $scope.save = function(){ - if($scope.validateForm($scope.l2BridgeForm)){ - path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id, $scope.newL2BridgeObj.id); - GBPL2BridgeDomainServices.send(path, $scope.newL2BridgeObj, function(data){ - $scope.init(); - $scope.view.l2bridge = false; - $scope.view.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD'); - - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedL2Bridge) { - path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id, $scope.selectedL2Bridge.id); - GBPL2BridgeDomainServices.delete(path, function(data){ - $scope.init(); - $scope.view.l2bridge = false; - $scope.view.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD'); - - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reload = function(selectedObj) { - $scope.selectedL2Bridge = selectedObj; - - $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view"; - if(selectedObj){ - $scope.view.l2bridge = true; - } - else { - $scope.view.l2bridge = false; - $scope.view.edit = "view"; - } - - if ($scope.view.l2bridge) { - angular.copy(selectedObj, $scope.newL2BridgeObj); - } - - $scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD'); - }; - - $scope.showForm = function() { - $scope.newL2BridgeObj = GBPL2BridgeDomainServices.createObj(); - $scope.selectedL2Bridge = null; - $scope.view.l2bridge = true; - $scope.view.edit = "add"; - }; - - $scope.close = function(){ - $scope.view.l2bridge = false; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedL2Bridge ) { - $scope.view.l2bridge = true; - $scope.view.edit = "edit"; - angular.copy($scope.selectedL2Bridge, $scope.newL2BridgeObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_L3CONTEXT_RELOAD',function(){ - loadL3ContextList(); - }); - - $scope.$on('GBP_L2BRIDGE_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - }]); - - gbpOld.register.controller('l3ContextCtrl', ['$scope', 'GBPL3ContextServices', '$filter', function($scope, GBPL3ContextServices, $filter){ //GBPContractServices - $scope.list = []; - $scope.selectedL3Context = null; - $scope.newL3ContextObj = GBPL3ContextServices.createObj(); - $scope.displayLabel = ['name', 'id']; - $scope.crudLabel = 'L3 Context list'; - - $scope.view = { - l3context: false, - edit: "view" - }; - - var path = null, - - clear = function(){ - $scope.list = []; - $scope.view = { - l3context: false, - edit: "view" - }; - $scope.selectedL3Context = null; - $scope.newL3ContextObj = GBPL3ContextServices.createObj(); - }; - - $scope.init = function() { - if ( $scope.selectedTenant ) { - path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id); - - GBPL3ContextServices.load(path, function(data){ - $scope.list = data; - $scope.newL3ContextObj = GBPL3ContextServices.createObj(); - $scope.selectedL3Context = null; - }, function(){ - - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.l3ContextForm)){ - path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id, $scope.newL3ContextObj.id); - GBPL3ContextServices.send(path, $scope.newL3ContextObj, function(data){ - $scope.init(); - $scope.view.l3context = false; - $scope.view.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD'); - - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedL3Context) { - path = GBPL3ContextServices.createPathObj($scope.selectedTenant.id, $scope.selectedL3Context.id); - GBPL3ContextServices.delete(path, function(data){ - $scope.init(); - $scope.view.l3context = false; - $scope.view.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD'); - - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reload = function(selectedObj) { - $scope.selectedL3Context = selectedObj; - - $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view"; - if(selectedObj){ - $scope.view.l3context = true; - } - else { - $scope.view.l3context = false; - $scope.view.edit = "view"; - } - - if($scope.view.l3context) { - angular.copy(selectedObj, $scope.newL3ContextObj); - } - - $scope.sendReloadEventFromRoot('GBP_L3CONTEXT_RELOAD'); - }; - - $scope.showForm = function() { - $scope.newL3ContextObj = GBPL3ContextServices.createObj(); - $scope.selectedL3Context = null; - $scope.view.l3context = true; - $scope.view.edit = "add"; - }; - - $scope.close = function(){ - $scope.view.l3context = false; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedL3Context ) { - $scope.view.l3context = true; - $scope.view.edit = "edit"; - angular.copy($scope.selectedL3Context, $scope.newL3ContextObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_L3CONTEXT_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - }]); - - gbpOld.register.controller('subnetCtrl', ['$scope', 'GBPSubnetServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', '$filter', function($scope, GBPSubnetServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, GBPL3ContextServices, $filter){ - $scope.list = []; - $scope.selectedSubnet = null; - $scope.newSubnetObj = GBPSubnetServices.createObj(); - $scope.displayLabel = ['name', 'id']; - $scope.crudLabel = 'Subnet list'; - - $scope.l2L3List = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2L3List); - - $scope.view = { - subnet: false, - edit: "view" - }; - - - var path = null, - - loadL2L3List = function() { - $scope.l2L3List.options = []; - - GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(l3ContextData){ - $scope.l2L3List.options = $scope.l2L3List.options.concat(l3ContextData); - }, function(){ - - }); - - GBPL2FloodDomainServices.load(GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id), function(l2FloodData){ - $scope.l2L3List.options = $scope.l2L3List.options.concat(l2FloodData); - }, function(){ - - }); - - GBPL2BridgeDomainServices.load(GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id), function(l2BridgeData){ - $scope.l2L3List.options = $scope.l2L3List.options.concat(l2BridgeData); - }, function(){ - - }); - }, - - clear = function(){ - $scope.list = []; - $scope.view = { - subnet: false, - edit: "view" - }; - $scope.selectedSubnet = null; - $scope.newSubnetObj = GBPSubnetServices.createObj(); - }; - - $scope.init = function() { - if ( $scope.selectedTenant ) { - path = GBPSubnetServices.createPathObj($scope.selectedTenant.id); - - GBPSubnetServices.load(path, function(data){ - $scope.list = data; - $scope.newSubnetObj = GBPSubnetServices.createObj(); - $scope.selectedSubnet = null; - - $scope.view.subnet = false; - $scope.view.edit = "view"; - //$scope.sendReloadEventFromRoot('GBP_L2BRIDGE_RELOAD'); - }, function(){ - - }); - - loadL2L3List(); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.subnetForm)){ - path = GBPSubnetServices.createPathObj($scope.selectedTenant.id, $scope.newSubnetObj.id); - GBPSubnetServices.send(path, $scope.newSubnetObj, function(data){ - $scope.init(); - $scope.view.subnet = false; - $scope.view.edit = "view"; - - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedSubnet) { - path = GBPSubnetServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id); - GBPSubnetServices.delete(path, function(data){ - $scope.init(); - $scope.view.subnet = false; - $scope.view.edit = "view"; - - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reload = function(selectedObj) { - $scope.selectedSubnet = selectedObj; - - $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view"; - if(selectedObj){ - $scope.view.subnet = true; - } - else { - $scope.view.subnet = false; - $scope.view.edit = "view"; - } - - if($scope.view.subnet) { - angular.copy(selectedObj, $scope.newSubnetObj); - } - - $scope.sendReloadEventFromRoot('GBP_SUBNET_RELOAD'); - }; - - $scope.showForm = function() { - $scope.newSubnetObj = GBPSubnetServices.createObj(); - $scope.selectedSubnet = null; - $scope.view.subnet = true; - $scope.view.edit = "add"; - }; - - $scope.close = function(){ - $scope.view.subnet = false; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedSubnet ) { - $scope.view.subnet = true; - $scope.view.edit = "edit"; - angular.copy($scope.selectedSubnet, $scope.newSubnetObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_GATEWAY_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_L3CONTEXT_RELOAD',function(){ - loadL2L3List(); - }); - - $scope.$on('GBP_L2BRIDGE_RELOAD',function(){ - loadL2L3List(); - }); - - $scope.$on('GBP_L2FLOOD_RELOAD',function(){ - loadL2L3List(); - }); - - $scope.$on('GBP_PREFIX_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('gatewayCtrl', ['$scope', 'GBPGatewayServices', function($scope, GBPGatewayServices){ - $scope.list = []; - $scope.gatewayView = false; - $scope.selectedGateway = null; - $scope.newGatewayObj = GBPGatewayServices.createObj(); - $scope.displayLabel = 'gateway'; - $scope.crudLabel = 'Gateway list'; - $scope.internalView = { - gateway: false, - edit: "view" - }; - - var path = null, - - clear = function(){ - $scope.list = []; - $scope.gatewayView = false; - $scope.selectedGateway = null; - $scope.newGatewayObj = GBPGatewayServices.createObj(); - }; - - $scope.init = function() { - if ( $scope.selectedTenant && $scope.selectedSubnet ) { - path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id); - - GBPGatewayServices.load(path, function(data){ - $scope.list = data; - $scope.newGatewayObj = GBPGatewayServices.createObj(); - $scope.internalView.gateway = false; - $scope.selectedGateway = null; - }, function(){ - - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.gatewayForm)){ - path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.newGatewayObj.gateway); - GBPGatewayServices.send(path, $scope.newGatewayObj, function(data){ - $scope.init(); - $scope.internalView.gateway = false; - $scope.internalView.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_GATEWAY_RELOAD'); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedSubnet && $scope.selectedGateway) { - path = GBPGatewayServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway); - GBPGatewayServices.delete(path, function(data){ - $scope.init(); - $scope.internalView.gateway = false; - $scope.sendReloadEventFromRoot('GBP_GATEWAY_RELOAD'); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.reload = function(selectedObj) { - $scope.selectedGateway = selectedObj; - angular.copy(selectedObj, $scope.newGatewayObj); - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.gateway = true; - }else { - $scope.internalView.gateway = false; - $scope.internalView.edit = "view"; - } - - $scope.sendReloadEventFromRoot('GBP_GATEWAY_SET'); - }; - - $scope.showForm = function() { - $scope.newGatewayObj = GBPGatewayServices.createObj(); - $scope.internalView.gateway = true; - $scope.internalView.edit = "add"; - $scope.selectedGateway = null; - }; - - $scope.close = function(){ - $scope.internalView.gateway = false; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedGateway ) { - $scope.internalView.gateway = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedGateway, $scope.newGatewayObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_SUBNET_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_PREFIX_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('prefixCtrl', ['$scope', 'GBPPrefixServices', function($scope, GBPPrefixServices){ - $scope.list = []; - $scope.selectedPrefix = null; - $scope.newPrefixObj = GBPPrefixServices.createObj(); - $scope.displayLabel = 'prefix'; - $scope.crudLabel = 'Prefix list'; - $scope.internalView = { - prefix: false, - edit: "view" - }; - - var path = null, - - clear = function(){ - $scope.list = []; - $scope.selectedPrefix = null; - $scope.newPrefixObj = GBPPrefixServices.createObj(); - $scope.internalView = { - prefix: false, - edit: "view" - }; - }; - - $scope.init = function() { - if ( $scope.selectedTenant && $scope.selectedSubnet && $scope.selectedGateway) { - path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway); - - GBPPrefixServices.load(path, function(data){ - $scope.list = data; - $scope.newPrefixObj = GBPPrefixServices.createObj(); - $scope.internalView.prefix = false; - $scope.selectedPrefix = null; - }, function(){ - - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.prefixForm)){ - path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway, $scope.newPrefixObj.prefix); - GBPPrefixServices.send(path, $scope.newPrefixObj, function(data){ - $scope.init(); - $scope.internalView.prefix = false; - $scope.internalView.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_PREFIX_RELOAD'); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - path = GBPPrefixServices.createPathObj($scope.selectedTenant.id, $scope.selectedSubnet.id, $scope.selectedGateway.gateway, $scope.selectedPrefix.prefix); - GBPPrefixServices.delete(path, function(data){ - $scope.init(); - $scope.internalView.prefix = false; - $scope.sendReloadEventFromRoot('GBP_PREFIX_RELOAD'); - }, function(){ - //TODO: error cbk - }); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedPrefix = selectedObj; - $scope.internalView.edit = $scope.internalView.edit == "edit" ? $scope.internalView.edit : "view"; - if(selectedObj){ - $scope.internalView.prefix = true; - }else { - $scope.internalView.prefix = false; - $scope.internalView.edit = "view"; - } - - angular.copy(selectedObj, $scope.newPrefixObj); - }; - - $scope.showForm = function() { - $scope.newPrefixObj = GBPPrefixServices.createObj(); - $scope.internalView.prefix = true; - $scope.internalView.edit = "add"; - $scope.selectedPrefix = null; - }; - - $scope.close = function(){ - $scope.internalView.prefix = false; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedPrefix ) { - $scope.internalView.prefix = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedPrefix, $scope.newPrefixObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_GATEWAY_SET',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('renderersCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){ //GBPContractServices - $scope.classifierDefinitions = {'options' : [], 'labels' : null}; - $scope.actionDefinitions = {'options' : [], 'labels' : null}; - - //reload on event? - - var loadDefinitions = function() { - GPBServices.getDefinitions(function(classifierDefs, actionDefs) { - $scope.classifierDefinitions.options = classifierDefs; - $scope.getDisplayLabelsFromCtrl('GBP_CLASSIFIERS_LABEL', $scope.classifierDefinitions); - - $scope.actionDefinitions.options = actionDefs; - $scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions); - }); - }; - - loadDefinitions(); - }]); - - gbpOld.register.controller('paramCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){ - $scope.value = null; - - $scope.init = function(param, paramValues) { - $scope.parameter = param; - - if(paramValues) { - paramValues.forEach(function(p) { - if($scope.parameter.name === p.name) { - $scope.value = GPBServices.getInstanceParamValue(p); - } - }); - } - }; - - $scope.$on('GBP_SAVE_PARAM', function(event){ - if($scope.value !== '' && $scope.value !== null) { - $scope.addParam($scope.parameter.name, $scope.parameter.type, $scope.value); - } - }); - - $scope.$on('GBP_SET_PARAM_VALUE', function(event, name, intVal, strVal) { - //console.info($scope.parameter, ' got GBP_SET_PARAM_VALUE', name, intVal, strVal, event); - - }); - - $scope.$on('GBP_RESET_PARAM', function(event){ - $scope.value = null; - }); - }]); - - gbpOld.register.controller('classifiersCtrl', ['$scope', 'GBPClassifierInstanceServices', 'GPBServices', '$filter', - function($scope, GBPClassifierInstanceServices, GPBServices, $filter){ - $scope.list = []; - $scope.classifiersView = false; - $scope.displayLabel = 'name'; - $scope.selectedClassifier = null; - $scope.crudLabel = 'Classifiers'; - $scope.newClassifierObj = GBPClassifierInstanceServices.createObj(); - $scope.edit = "view"; - - var mandatoryProperties = ['name'], - - clear = function(){ - $scope.list = []; - $scope.classifiersView = false; - $scope.selectedClassifier = null; - $scope.newClassifierObj = GBPClassifierInstanceServices.createObj(); - $scope.edit = "view"; - }; - - $scope.getDefinitionObjParams = function(id){ - return GPBServices.getDefinitionObjParams($scope.classifierDefinitions.options, id); - }; - - $scope.reloadDefs = function(){ - $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newClassifierObj['classifier-definition-id'])); - }; - - $scope.addParam = function(name, type, value) { - $scope.newClassifierObj['parameter-value'].push(GPBServices.createParamObj(name, type, value)); - }; - - var saveParams = function() { - $scope.newClassifierObj['parameter-value'] = []; - $scope.$broadcast('GBP_SAVE_PARAM'); - }; - - - $scope.init = function() { - if ( $scope.selectedTenant ) { - path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id); - GBPClassifierInstanceServices.load(path, function(data){ - $scope.list = data; - $scope.reloadDefs(); - }, function(){ - //TODO: error cbk - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.classifierForm)){ - path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id, $scope.newClassifierObj.name); - saveParams(); - GBPClassifierInstanceServices.send(path, $scope.newClassifierObj, function(data){ - $scope.init(); - $scope.classifiersView = false; - $scope.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD'); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.showForm = function() { - $scope.newClassifierObj = GBPClassifierInstanceServices.createObj(); - $scope.selectedClassifier = null; - $scope.classifiersView = true; - $scope.edit = "add"; - $scope.reloadDefs(); - }; - - $scope.reload = function(selectedObj){ - $scope.selectedClassifier = selectedObj; - $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD'); - - $scope.edit = $scope.edit == "edit" ? $scope.edit : "view"; - if(selectedObj){ - $scope.classifiersView = true; - } - else { - $scope.classifiersView = false; - $scope.edit = "view"; - } - - if($scope.classifiersView) { - angular.copy(selectedObj, $scope.newClassifierObj); - } - - $scope.reloadDefs(); - }; - - $scope.close = function(){ - $scope.classifiersView = false; - $scope.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedClassifier ) { - $scope.classifiersView = true; - angular.copy($scope.selectedClassifier, $scope.newClassifierObj); - $scope.edit = "edit"; - $scope.reloadDefs(); - } - event.defaultPrevented = true; - } - }); - - $scope.delete = function(){ - path = GBPClassifierInstanceServices.createPathObj($scope.selectedTenant.id, $scope.selectedClassifier.name); - GBPClassifierInstanceServices.delete(path, function(data){ - $scope.init(); - $scope.classifiersView = false; - $scope.sendReloadEventFromRoot('GBP_CLASSIFIER_INSTANCE_RELOAD'); - }, function(){ - //TODO: error cbk - }); - }; - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_CLASSIFIERS_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - }]); - - gbpOld.register.controller('actionsCtrl', ['$scope', 'GBPActionInstanceServices', 'GPBServices', '$filter', - function($scope, GBPActionInstanceServices, GPBServices, $filter){ - $scope.list = []; - $scope.actionsView = false; - $scope.displayLabel = 'name'; - $scope.selectedAction = null; - $scope.crudLabel = 'Actions'; - $scope.newActionObj = GBPActionInstanceServices.createObj(); - $scope.edit = "view"; - - var mandatoryProperties = ['name'], - - clear = function(){ - $scope.list = []; - $scope.actionsView = false; - $scope.selectedAction = null; - $scope.newActionObj = GBPActionInstanceServices.createObj(); - $scope.edit = "view"; - }; - - $scope.getDefinitionObjParams = function(id){ - return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id); - }; - - $scope.reloadDefs = function(){ - $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id'])); - }; - - $scope.addParam = function(name, type, value) { - $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value)); - }; - - var saveParams = function() { - $scope.newActionObj['parameter-value'] = []; - $scope.$broadcast('GBP_SAVE_PARAM'); - }; - - - $scope.init = function() { - if ( $scope.selectedTenant ) { - path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id); - GBPActionInstanceServices.load(path, function(data){ - $scope.list = data; - $scope.reloadDefs(); - }, function(){ - //TODO: error cbk - }); - }else{ - clear(); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.actionsForm)){ - path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id, $scope.newActionObj.name); - saveParams(); - - GBPActionInstanceServices.send(path, $scope.newActionObj, function(data){ - $scope.init(); - $scope.actionsView = false; - $scope.edit = "view"; - $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD'); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.showForm = function() { - $scope.newActionObj = GBPActionInstanceServices.createObj(); - $scope.selectedAction = null; - $scope.actionsView = true; - $scope.edit = "add"; - $scope.reloadDefs(); - }; - - $scope.reload = function(selectedObj){ - $scope.selectedAction = selectedObj; - $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD'); - - $scope.edit = $scope.edit == "edit" ? $scope.edit : "view"; - if(selectedObj){ - $scope.actionsView = true; - } - else { - $scope.actionsView = false; - $scope.edit = "view"; - } - - if($scope.actionsView) { - angular.copy(selectedObj, $scope.newActionObj); - } - - $scope.reloadDefs(); - }; - - $scope.close = function(){ - $scope.actionsView = false; - $scope.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedAction ) { - $scope.actionsView = true; - angular.copy($scope.selectedAction, $scope.newActionObj); - $scope.edit = "edit"; - $scope.reloadDefs(); - } - event.defaultPrevented = true; - } - }); - - $scope.delete = function(){ - path = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id, $scope.selectedAction.name); - GBPActionInstanceServices.delete(path, function(data){ - $scope.init(); - $scope.actionsView = false; - $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD'); - }, function(){ - //TODO: error cbk - }); - }; - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_ACTIONS_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - }]); - - gbpOld.register.controller('endpointCtrl', ['$scope', 'GBPEndpointServices', 'GPBServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', 'GBPL3ContextServices', 'GBPEpgServices', '$filter', 'GBPSubnetServices', - function($scope, GBPEndpointServices, GPBServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, GBPL3ContextServices, GBPEpgServices, $filter, GBPSubnetServices){ - $scope.list = []; - $scope.selectedEndpoint = null; - $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null); - $scope.displayLabel = function(obj) { - return obj['mac-address'] + ':' + obj['l2-context']; - }; - $scope.crudLabel = 'Endpoint list'; - - $scope.l2context = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2context); - - $scope.l3context = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context); - - $scope.subnet = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_SUBNET_LABEL', $scope.subnet); - - $scope.epg = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_EPG_LABEL', $scope.epg); - - $scope.networkContainment = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.networkContainment); - - $scope.view = { - endpoint: false, - edit: "view" - }; - - var path = null, - mandatoryProperties = [], - - loadEpgOptions = function() { - $scope.epg.options = []; - - path = GBPEpgServices.createPathObj($scope.selectedTenant.id); - GBPEpgServices.load(path, function(data){ - $scope.epg.options = data; - }, function(){ - //TODO: error cbk - }); - }, - - loadL2ContextOptions = function() { - removeL2ContextOptions($scope.networkContainment.options, $scope.l2context.options); - $scope.l2context.options = []; - - path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id); - - GBPL2FloodDomainServices.load(path, function(data){ - $scope.l2context.options = $scope.l2context.options.concat(data); - $scope.networkContainment.options = $scope.networkContainment.options.concat(data); - }, function(){ - - }); - - path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id); - GBPL2BridgeDomainServices.load(path, function(data){ - $scope.l2context.options = $scope.l2context.options.concat(data); - $scope.networkContainment.options = $scope.networkContainment.options.concat(data); - }, function(){ - - }); - }, - - loadL3ContextOptions = function(){ - removeL2ContextOptions($scope.networkContainment.options, $scope.l3context.options); - $scope.l3context.options = []; - - GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){ - $scope.l3context.options = data; - $scope.networkContainment.options = $scope.networkContainment.options.concat(data); - }, function(){ - - }); - }, - - loadSubnetOptions = function(){ - $scope.subnet.options = []; - - GBPSubnetServices.load(GBPSubnetServices.createPathObj($scope.selectedTenant.id), function(data){ - $scope.subnet.options = data; - $scope.networkContainment.options = $scope.networkContainment.options.concat(data); - }, function(){ - - }); - }, - - loadNetworkCotnaninemnt = function(){ - $scope.networkContainment.options = []; - - loadL2ContextOptions(); - loadL3ContextOptions(); - loadSubnetOptions(); - }, - - clear = function(){ - $scope.list = []; - $scope.selectedEndpoint = null; - $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null); - $scope.view = { - endpoint: false, - edit: "view" - }; - }, - removeL2ContextOptions = function(arr1, arr2) { - arr1 = arr1.filter( function( el ) { - return arr2.indexOf( el ) < 0; - }); - }; - - $scope.init = function() { - if ($scope.selectedTenant) { - - GBPEndpointServices.load(path, function(data){ - $scope.list = data; - }, function(){ - //TODO: error cbk - }); - - loadEpgOptions(); - /*loadL2ContextOptions(); - loadL3ContextOptions(); - loadSubnetOptions();*/ - loadNetworkCotnaninemnt(); - }else{ - clear(); - } - }; - - $scope.addNewL3address = function() { - if($scope.newEndpointObj) { - if(!$scope.newEndpointObj['l3-address']){ - $scope.newEndpointObj['l3-address'] = []; - } - var objToPush = {'l3-context' : '', 'ip-address' : ''}; - $scope.newEndpointObj['l3-address'].push(objToPush); - } - }; - - $scope.deleteNewL3address = function(index){ - if($scope.newEndpointObj) { - $scope.newEndpointObj['l3-address'].splice(index, 1); - } - }; - - $scope.addNewLeafListEl = function(prop) { - if($scope.newEndpointObj) { - if(!$scope.newEndpointObj[prop]){ - $scope.newEndpointObj[prop] = []; - } - var objToPush = ""; - $scope.newEndpointObj[prop].push(objToPush); - } - }; - - $scope.updateLeafListEl = function(index, value, prop) { - if($scope.newEndpointObj && $scope.newEndpointObj[prop] && $scope.newEndpointObj[prop].length >= index) { - $scope.newEndpointObj[prop][index] = value; - } - }; - - $scope.deleteNewLeafListEl = function(index, prop){ - if($scope.newEndpointObj) { - $scope.newEndpointObj[prop].splice(index, 1); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.endpointForm)){ - GBPEndpointServices.send(path, $scope.newEndpointObj, function(data){ - $scope.init(); - $scope.view.endpoint = false; - $scope.reloadNewObj(); - $scope.view.edit = "view"; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedEndpoint) { - GBPEndpointServices.delete(path, $scope.selectedEndpoint, function(data){ - $scope.init(); - $scope.view.endpoint = false; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.showForm = function() { - $scope.view.endpoint = true; - $scope.reloadNewObj(); - $scope.selectedEndpoint = null; - - $scope.view.edit = "add"; - }; - - $scope.reloadNewObj = function() { - $scope.newEndpointObj = GBPEndpointServices.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedEndpoint = selectedObj; - $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view"; - if(selectedObj){ - $scope.view.endpoint = true; - } - else { - $scope.view.endpoint = false; - $scope.view.edit = "view"; - } - - if($scope.view.endpoint) { - angular.copy(selectedObj, $scope.newEndpointObj); - } - }; - - $scope.close = function(){ - $scope.view.endpoint = false; - $scope.view.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedEndpoint ) { - $scope.view.endpoint = true; - $scope.view.edit = "edit"; - angular.copy($scope.selectedEndpoint, $scope.newEndpointObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_EPG_RELOAD',function(){ - loadEpgOptions(); - }); - - $scope.$on('GBP_L2BRIDGE_RELOAD',function(){ - //loadL2ContextOptions(); - loadNetworkCotnaninemnt(); - }); - - $scope.$on('GBP_L2FLOOD_RELOAD',function(){ - //loadL2ContextOptions(); - loadNetworkCotnaninemnt(); - }); - - $scope.$on('GBP_L3CONTEXT_RELOAD',function(){ - //loadL3ContextOptions(); - loadNetworkCotnaninemnt(); - }); - - $scope.$on('GBP_SUBNET_RELOAD',function(){ - //loadSubnetOptions(); - loadNetworkCotnaninemnt(); - }); - }]); - - gbpOld.register.controller('l3EndpointCtrl', ['$scope', 'GBPEndpointL3Services', 'GPBServices', 'GBPEpgServices', 'GBPL3ContextServices', 'GBPL2FloodDomainServices', 'GBPL2BridgeDomainServices', '$filter', - function($scope, GBPEndpointL3Services, GPBServices, GBPEpgServices, GBPL3ContextServices, GBPL2FloodDomainServices, GBPL2BridgeDomainServices, $filter){ - $scope.list = []; - $scope.selectedEndpoint = null; - $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null); - $scope.displayLabel = function(obj) { - return obj['ip-prefix'] + ':' + obj['l3-context']; - }; - $scope.crudLabel = 'L3 Prefix endpoint list'; - - $scope.l2context = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_L2FLOOD_LABEL', $scope.l2context); - - $scope.l3context = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_L3CONTEXT_LABEL', $scope.l3context); - - $scope.epg = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_EPG_LABEL', $scope.epg); - - $scope.view = { - endpoint: false, - edit: "view" - }; - - var path = null, - mandatoryProperties = [], - - loadEpgOptions = function() { - $scope.epg.options = []; - - path = GBPEpgServices.createPathObj($scope.selectedTenant.id); - GBPEpgServices.load(path, function(data){ - $scope.epg.options = data; - }, function(){ - //TODO: error cbk - }); - }, - - loadL2ContextOptions = function() { - $scope.l2context.options = []; - - path = GBPL2FloodDomainServices.createPathObj($scope.selectedTenant.id); - - GBPL2FloodDomainServices.load(path, function(data){ - $scope.l2context.options = $scope.l2context.options.concat(data); - }, function(){ - - }); - - path = GBPL2BridgeDomainServices.createPathObj($scope.selectedTenant.id); - GBPL2BridgeDomainServices.load(path, function(data){ - $scope.l2context.options = $scope.l2context.options.concat(data); - }, function(){ - - }); - }, - - loadL3ContextOptions = function(){ - $scope.l3context.options = []; - - GBPL3ContextServices.load(GBPL3ContextServices.createPathObj($scope.selectedTenant.id), function(data){ - $scope.l3context.options = data; - }, function(){ - - }); - }, - - clear = function(){ - $scope.list = []; - $scope.selectedEndpoint = null; - $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null); - $scope.view = { - endpoint: false, - edit: "view" - }; - }; - - $scope.init = function() { - if ($scope.selectedTenant) { - - GBPEndpointL3Services.load(path, function(data){ - $scope.list = data; - }, function(){ - //TODO: error cbk - }); - - loadEpgOptions(); - loadL2ContextOptions(); - loadL3ContextOptions(); - }else{ - clear(); - } - }; - - $scope.addNewL2gateways = function() { - if($scope.newEndpointObj) { - if(!$scope.newEndpointObj['endpoint-l2-gateways']){ - $scope.newEndpointObj['endpoint-l2-gateways'] = []; - } - var objToPush = {'l2-context' : '', 'mac-address' : ''}; - $scope.newEndpointObj['endpoint-l2-gateways'].push(objToPush); - } - }; - - $scope.deleteNewL2gateways = function(index){ - if($scope.newEndpointObj) { - $scope.newEndpointObj['endpoint-l2-gateways'].splice(index, 1); - } - }; - - $scope.addNewL3gateways = function() { - if($scope.newEndpointObj) { - if(!$scope.newEndpointObj['endpoint-l3-gateways']){ - $scope.newEndpointObj['endpoint-l3-gateways'] = []; - } - var objToPush = {'l3-context' : '', 'ip-address' : ''}; - $scope.newEndpointObj['endpoint-l3-gateways'].push(objToPush); - } - }; - - $scope.deleteNewL3gateways = function(index){ - if($scope.newEndpointObj) { - $scope.newEndpointObj['endpoint-l3-gateways'].splice(index, 1); - } - }; - - $scope.addNewLeafListEl = function(prop) { - if($scope.newEndpointObj) { - if(!$scope.newEndpointObj[prop]){ - $scope.newEndpointObj[prop] = []; - } - var objToPush = ""; - $scope.newEndpointObj[prop].push(objToPush); - } - }; - - $scope.updateLeafListEl = function(index, value, prop) { - if($scope.newEndpointObj && $scope.newEndpointObj[prop] && $scope.newEndpointObj[prop].length >= index) { - $scope.newEndpointObj[prop][index] = value; - } - }; - - $scope.deleteNewLeafListEl = function(index, prop){ - if($scope.newEndpointObj) { - $scope.newEndpointObj[prop].splice(index, 1); - } - }; - - $scope.save = function(){ - if($scope.validateForm($scope.l3EndpointForm)){ - GBPEndpointL3Services.send(path, $scope.newEndpointObj, function(data){ - $scope.init(); - $scope.view.endpoint = false; - $scope.reloadNewObj(); - $scope.view.edit = "view"; - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.delete = function() { - if($scope.selectedTenant && $scope.selectedEndpoint) { - GBPEndpointL3Services.delete(path, $scope.selectedEndpoint, function(data){ - $scope.init(); - }, function(){ - //TODO: error cbk - }); - } - }; - - $scope.showForm = function() { - $scope.view.endpoint = true; - $scope.reloadNewObj(); - $scope.selectedEndpoint = null; - $scope.view.edit = "add"; - }; - - $scope.reloadNewObj = function() { - $scope.newEndpointObj = GBPEndpointL3Services.createObj($scope.selectedTenant ? $scope.selectedTenant.id : null); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedEndpoint = selectedObj; - angular.copy(selectedObj, $scope.newEndpointObj); - $scope.view.edit = $scope.view.edit == "edit" ? $scope.view.edit : "view"; - if(selectedObj){ - $scope.view.endpoint = true; - } - else { - $scope.view.endpoint = false; - $scope.view.edit = "view"; - } - }; - - $scope.close = function(){ - $scope.view.endpoint = false; - $scope.view.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedEndpoint ) { - $scope.view.endpoint = true; - $scope.view.edit = "edit"; - angular.copy($scope.selectedEndpoint, $scope.newEndpointObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_TENANT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_EPG_RELOAD',function(){ - loadEpgOptions(); - }); - - $scope.$on('GBP_L2BRIDGE_RELOAD',function(){ - loadL2ContextOptions(); - }); - - $scope.$on('GBP_L2FLOOD_RELOAD',function(){ - loadL2ContextOptions(); - }); - - $scope.$on('GBP_L3CONTEXT_RELOAD',function(){ - loadL3ContextOptions(); - }); - }]); - - gbpOld.register.controller('accessModelWizardCtrl', ['$scope', '$filter', 'GBPTenantServices', 'GBPEpgServices', 'GBPContractServices', 'GPBServices', function($scope, $filter, GBPTenantServices, GBPEpgServices, GBPContractServices, GPBServices){ - $scope.wizardPage = null; - - $scope.selectedTenant = null; - $scope.tenant = null; - //$scope.epgList = []; - $scope.newContractObj = null; - - $scope.init = function() { - $scope.setPage('tenants'); - }; - - $scope.setPage = function(pageName, object) { - $scope.wizardPage = pageName; - - switch(pageName) { - case 'contracts': - if(object) { - $scope.tenant = object; - } - - break; - - case 'summary': - $scope.tenant['endpoint-group'] = $scope.tenant['endpoint-group'] ? $scope.tenant['endpoint-group'] : []; - - if(object) { - object.forEach(function(o) { - $scope.tenant['endpoint-group'].push(GPBServices.stripNullValues(o)); - }); - } - - break; - - case 'epgs': - $scope.tenant['contract'] = $scope.tenant['contract'] ? $scope.tenant['contract'] : []; - - if(object) { - object.forEach(function(o) { - $scope.tenant['contract'].push(GPBServices.stripNullValues(o)); - }); - } - - break; - } - }; - - $scope.submit = function(object) { - $scope.tenant['endpoint-group'] = $scope.tenant['endpoint-group'] ? $scope.tenant['endpoint-group'] : []; - - if(object) { - object.forEach(function(o) { - $scope.tenant['endpoint-group'].push(GPBServices.stripNullValues(o)); - }); - } - - - path = GBPTenantServices.createPathObj($scope.tenant.id); - GBPTenantServices.send(path, $scope.tenant, function(data){ - $scope.wizards.accessModelWizard = false; - $scope.sendReloadEventFromRoot('GBP_GLOBAL_TENANT_RELOAD'); - $scope.reloadTopo(); - }, function(){ - //TODO: error cbk - }); - }; - - // $scope.updateList = function(list, object, key) { - // var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]); - - // if(elementPos < 0) { - // list.push(object); - // } - // else { - // list[elementPos] = object; - // } - // }; - }]); - - gbpOld.register.controller('wizardTenantCtrl', ['$scope', '$filter', 'GBPTenantServices', function($scope, $filter, GBPTenantServices){ - // $scope.tenantList = []; - $scope.newTenantObj = GBPTenantServices.createObj(); - $scope.displayLabel = ['name' , 'id']; - - $scope.view = { - tenantEdit: false - }; - - // $scope.init = function() { - // $scope.getTenants(); - // }; - - // $scope.getTenants = function() { - // GBPTenantServices.load( - // function(data) { - // $scope.tenantList = data; - // $scope.newTenantObj = GBPTenantServices.createObj(); - // }, - // function(){ - // //TODO error - // } - // ); - // }; - - $scope.reloadTenants = function(selectedObject) { - if(!selectedObject) { - selectedObject = GBPTenantServices.createObj(); - $scope.view.tenantEdit = false; - } - else { - $scope.view.tenantEdit = true; - } - - $scope.selectedTenant = selectedObject; - $scope.newTenantObj = selectedObject; - }; - - $scope.getNewTenantObject = function() { - return GBPTenantServices.createObj(); - }; - }]); - - gbpOld.register.controller('wizardEpgCtrl', ['$scope', '$filter', 'GBPEpgServices', function($scope, $filter, GBPEpgServices){ - $scope.list = []; - $scope.newEpgObj = GBPEpgServices.createObj(); - $scope.selectedEpg = null; - $scope.epgFormView = true; - - $scope.displayLabel = ['name', 'id']; - $scope.crudLabel = 'Group list'; - - $scope.igpOpts = ['allow', 'require-contract']; - - $scope.init = function() { - - }; - - $scope.showForm = function() { - $scope.epgFormView = true; - $scope.newEpgObj = GBPEpgServices.createObj(); - }; - - $scope.save = function() { - $scope.updateList($scope.list, $scope.newEpgObj, "id"); - $scope.reload($scope.newEpgObj); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newEpgObj); - }; - - $scope.delete = function() { - if($scope.selectedEpg) { - var index = $scope.list.indexOf($scope.selectedEpg); - $scope.list.splice(index, 1); - $scope.epgFormView = false; - } - //$scope.newEpgObj = GBPEpgServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedEpg = selectedObj; - $scope.newEpgObj = selectedObj; - $scope.epgFormView = true; - $scope.$broadcast('WIZARD_EPG_RELOAD'); - }; - - $scope.close = function() { - $scope.epgFormView = false; - $scope.newEpgObj = GBPEpgServices.createObj(); - $scope.selectedEpg = null; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedEpg ) { - $scope.epgFormView = true; - angular.copy($scope.selectedEpg, $scope.newEpgObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on("WIZARD_CNS_RELOAD", function(event, args){ - //$scope.selectedEpg['consumer-named-selector'] = args; - $scope.newEpgObj['consumer-named-selector'] = args; - $scope.updateList($scope.list, $scope.newEpgObj, "id"); - }); - - $scope.$on("WIZARD_PNS_RELOAD", function(event, args){ - //$scope.selectedEpg['provider-named-selector'] = args; - $scope.newEpgObj['provider-named-selector'] = args; - $scope.updateList($scope.list, $scope.newEpgObj, "id"); - }); - }]); - - gbpOld.register.controller('wizardContractCtrl', ['$scope', '$filter', 'GBPContractServices', function($scope, $filter, GBPContractServices){ - $scope.list = []; - $scope.newContractObj = GBPContractServices.createObj(); - $scope.selectedContract = null; - - $scope.displayLabel = ['description', 'id']; - $scope.crudLabel = 'Contract list'; - - $scope.contractFormView = true; - - $scope.init = function() { - - }; - - $scope.showForm = function() { - $scope.contractFormView = true; - $scope.newContractObj = GBPContractServices.createObj(); - }; - - $scope.save = function() { - $scope.updateList($scope.list, $scope.newContractObj, "id"); - $scope.reload($scope.newContractObj); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newContractObj); - }; - - $scope.delete = function() { - if($scope.selectedContract) { - var index = $scope.list.indexOf($scope.selectedContract); - $scope.list.splice(index, 1); - $scope.contractFormView = false; - $scope.newContractObj = GBPContractServices.createObj(); - $scope.selectedContract = null; - } - }; - - $scope.reload = function(selectedObj) { - $scope.selectedContract = selectedObj; - $scope.newContractObj = selectedObj; - $scope.contractFormView = true; - }; - - $scope.close = function() { - $scope.contractFormView = false; - //$scope.newContractObj = GBPContractServices.createObj(); - //$scope.selectedContract = null; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedContract ) { - $scope.contractFormView = true; - angular.copy($scope.selectedContract, $scope.newContractObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on("WIZARD_SUBJECT_RELOAD", function(event, args){ - //$scope.selectedEpg['consumer-named-selector'] = args; - $scope.newContractObj['subject'] = args; - $scope.updateList($scope.list, $scope.newContractObj, "id"); - }); - - $scope.$on("WIZARD_CLAUSE_RELOAD", function(event, args){ - //$scope.selectedEpg['consumer-named-selector'] = args; - $scope.newContractObj['clause'] = args; - $scope.updateList($scope.list, $scope.newContractObj, "id"); - }); - }]); - - gbpOld.register.controller('wizardCnsCtrl',['$scope', 'GBPConNamedSelServices', function($scope, GBPConNamedSelServices){ - $scope.list = []; - $scope.selectedCNS = null; - $scope.newCNSObj = GBPConNamedSelServices.createObj(); - $scope.internalView = { - cns: false, - edit: "view" - }; - $scope.displayLabel = 'name'; - $scope.crudLabel = 'Consumer named selectors list'; - - $scope.contractList = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contractList); - - var clear = function(){ - $scope.list = []; - $scope.selectedCNS = null; - $scope.newCNSObj = GBPConNamedSelServices.createObj(); - $scope.internalView = { - cns: false, - edit: "add" - }; - }; - - //move to separate ctrl \/ - $scope.addNewElem = function(templateObj) { - if($scope.newCNSObj && $scope.newCNSObj.contract) { - var objToPush = templateObj || ""; - $scope.newCNSObj.contract.push(objToPush); - } - }; - - $scope.deleteElemAt = function(index) { - if($scope.newCNSObj && $scope.newCNSObj.contract) { - $scope.newCNSObj.contract.splice(index, 1); - } - }; - - $scope.updateAt = function(index, value) { - if($scope.newCNSObj && $scope.newCNSObj.contract && $scope.newCNSObj.contract.length >= index) { - $scope.newCNSObj.contract[index] = value; - } - }; - //move to separate ctrl /\ - - $scope.init = function() { - clear(); - - if($scope.tenant && $scope.tenant['contract'].length>0) { - $scope.contractList.options = $scope.tenant['contract']; - } - - if($scope.selectedEpg && $scope.selectedEpg['consumer-named-selector']) { - $scope.list = $scope.selectedEpg['consumer-named-selector']; - } - }; - - $scope.save = function(){ - $scope.updateList($scope.list, $scope.newCNSObj, "name"); - $scope.reload($scope.newCNSObj); - $scope.$emit('WIZARD_CNS_RELOAD', $scope.list); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newCNSObj); - }; - - $scope.delete = function() { - if($scope.selectedCNS) { - var index = $scope.list.indexOf($scope.selectedCNS); - $scope.list.splice(index, 1); - $scope.internalView = { - cns: false, - edit: "add" - }; - $scope.$emit('WIZARD_CNS_RELOAD', $scope.list); - } - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.selectedCNS = null; - $scope.internalView.cns = true; - $scope.internalView.edit = "add"; - }; - - $scope.reloadNewObj = function() { - $scope.newCNSObj = GBPConNamedSelServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedCNS = selectedObj; - $scope.newCNSObj = selectedObj; - $scope.internalView.cns = true; - }; - - $scope.close = function(){ - $scope.internalView.cns = false; - //$scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedEpg ) { - $scope.internalView.cns = true; - $scope.internalView.edit = "add"; - angular.copy($scope.selectedCNS, $scope.newCNSObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('WIZARD_EPG_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('wizardPnsCtrl',['$scope', 'GBPProNamedSelServices', function($scope, GBPProNamedSelServices){ - $scope.list = []; - $scope.selectedPNS = null; - $scope.newPNSObj = GBPProNamedSelServices.createObj(); - $scope.displayLabel = 'name'; - $scope.crudLabel = 'Provider named selectors list'; - $scope.internalView = { - pns: false, - edit: "view" - }; - - $scope.contractList = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_CONTRACTS_LABEL', $scope.contractList); - - var clear = function(){ - $scope.list = []; - $scope.selectedPNS = null; - $scope.newPNSObj = GBPProNamedSelServices.createObj(); - $scope.internalView = { - pns: false, - edit: "view" - }; - }; - - //move to separate ctrl \/ - $scope.addNewElem = function(templateObj) { - if($scope.newPNSObj && $scope.newPNSObj.contract) { - var objToPush = templateObj || ""; - $scope.newPNSObj.contract.push(objToPush); - } - }; - - $scope.deleteElemAt = function(index) { - if($scope.newPNSObj && $scope.newPNSObj.contract) { - $scope.newPNSObj.contract.splice(index, 1); - } - }; - - $scope.updateAt = function(index, value) { - if($scope.newPNSObj && $scope.newPNSObj.contract && $scope.newPNSObj.contract.length >= index) { - $scope.newPNSObj.contract[index] = value; - } - }; - //move to separate ctrl /\ - - $scope.init = function() { - clear(); - - if($scope.tenant && $scope.tenant['contract'].length>0) { - $scope.contractList.options = $scope.tenant['contract']; - } - - if($scope.selectedEpg && $scope.selectedEpg['provider-named-selector']) { - $scope.list = $scope.selectedEpg['provider-named-selector']; - } - }; - - $scope.save = function(){ - $scope.updateList($scope.list, $scope.newPNSObj, "name"); - $scope.reload($scope.newPNSObj); - $scope.$emit('WIZARD_PNS_RELOAD', $scope.list); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newPNSObj); - }; - - $scope.delete = function() { - if($scope.selectedPNS) { - var index = $scope.list.indexOf($scope.selectedPNS); - $scope.list.splice(index, 1); - $scope.internalView = { - pns: false, - edit: "add" - }; - $scope.$emit('WIZARD_PNS_RELOAD', $scope.list); - } - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.selectedPNS = null; - $scope.internalView.pns = true; - $scope.internalView.edit = "add"; - }; - - $scope.reloadNewObj = function() { - $scope.newPNSObj = GBPProNamedSelServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedPNS = selectedObj; - $scope.newPNSObj = selectedObj; - $scope.internalView.pns = true; - }; - - $scope.close = function(){ - $scope.internalView.pns = false; - $scope.internalView.edit = "view"; - }; - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedEpg ) { - $scope.internalView.pns = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedPNS, $scope.newPNSObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('WIZARD_EPG_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('wizardSubjectCtrl', ['$scope','GBPSubjectServices', '$filter', function($scope, GBPSubjectServices, $filter){ - $scope.list = []; - $scope.selectedSubject = null; - $scope.newSubjectObj = GBPSubjectServices.createObj(); - $scope.displayLabel = 'name'; - $scope.internalView = { - subject : false, - edit : "view" - }; - $scope.crudLabel = 'Subject list'; - $scope.errors = {}; - - - var path = null, - mandatoryProperties = ['order'], - - clear = function(){ - $scope.list = []; - $scope.selectedSubject = null; - $scope.newSubjectObj = GBPSubjectServices.createObj(); - $scope.internalView = { - subject : false, - edit : "view" - }; - }; - - $scope.init = function() { - - }; - - $scope.save = function(){ - $scope.updateList($scope.list, $scope.newSubjectObj, "name"); - $scope.reload($scope.newSubjectObj); - $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newSubjectObj); - }; - - $scope.delete = function() { - if($scope.selectedSubject) { - var index = $scope.list.indexOf($scope.selectedSubject); - $scope.list.splice(index, 1); - $scope.internalView = { - subject: false, - edit: "add" - }; - $scope.reloadNewObj(); - $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list); - } - }; - - $scope.reloadNewObj = function() { - $scope.newSubjectObj = GBPSubjectServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedSubject = selectedObj; - $scope.newSubjectObj = selectedObj; - $scope.internalView.subject = true; - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.subject = true; - $scope.internalView.edit = "add"; - $scope.selectedSubject = null; - }; - - $scope.close = function(){ - $scope.internalView.subject = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedSubject ) { - $scope.internalView.subject = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedSubject, $scope.newSubjectObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_CONTRACT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on('GBP_SUBJECTS_LABEL', function(event, obj){ - obj.labels = $scope.displayLabel; - }); - - $scope.$on("WIZARD_RULE_RELOAD", function(event, args){ - //$scope.selectedEpg['consumer-named-selector'] = args; - $scope.newSubjectObj['rule'] = args; - $scope.updateList($scope.list, $scope.newSubjectObj, "id"); - $scope.$emit('WIZARD_SUBJECT_RELOAD', $scope.list); - }); - }]); - - gbpOld.register.controller('wizardRuleCtrl', ['$scope','GBPRuleServices', '$filter', function($scope, GBPRuleServices, $filter){ - $scope.list = []; - $scope.selectedRule = null; - $scope.newRuleObj = GBPRuleServices.createObj(); - $scope.displayLabel = 'name'; - $scope.internalView = { - rule : false, - edit : "view" - }; - $scope.crudLabel = 'Rule list'; - $scope.errors = {}; - - var path = null, - mandatoryProperties = ['order'], - - clear = function(){ - $scope.list = []; - $scope.selectedRule = null; - $scope.newRuleObj = GBPRuleServices.createObj(); - $scope.internalView = { - rule : false, - edit : "view" - }; - }; - - $scope.init = function() { - - }; - - $scope.save = function(){ - $scope.updateList($scope.list, $scope.newRuleObj, "name"); - $scope.reload($scope.newRuleObj); - $scope.$emit('WIZARD_RULE_RELOAD', $scope.list); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newRuleObj); - }; - - $scope.delete = function() { - if($scope.selectedRule) { - var index = $scope.list.indexOf($scope.selectedRule); - $scope.list.splice(index, 1); - $scope.internalView = { - rule: false, - edit: "add" - }; - $scope.reloadNewObj(); - $scope.$emit('WIZARD_RULE_RELOAD', $scope.list); - } - }; - - $scope.reloadNewObj = function() { - $scope.newRuleObj = GBPRuleServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedRule = selectedObj; - $scope.newRuleObj = selectedObj; - $scope.internalView.rule = true; - $scope.$broadcast('WIZARD_RULE_RELOAD'); - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.rule = true; - $scope.internalView.edit = "add"; - $scope.selectedRule = null; - }; - - $scope.close = function(){ - $scope.internalView.rule = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedRule ) { - $scope.internalView.rule = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedRule, $scope.newRuleObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('GBP_SUBJECT_RELOAD',function(){ - $scope.init(); - }); - - $scope.$on("WIZARD_CLASREF_RELOAD", function(event, args){ - $scope.newRuleObj['classifier-ref'] = args; - $scope.updateList($scope.list, $scope.newRuleObj, "name"); - $scope.$emit('WIZARD_RULE_RELOAD', $scope.list); - }); - - $scope.$on("WIZARD_ACTIONREF_RELOAD", function(event, args){ - $scope.newRuleObj['action-ref'] = args; - $scope.updateList($scope.list, $scope.newRuleObj, "name"); - $scope.$emit('WIZARD_RULE_RELOAD', $scope.list); - }); - }]); - - gbpOld.register.controller('wizardClauseCtrl', ['$scope','GBPClauseServices', 'GBPSubjectServices', - function($scope, GBPClauseServices, GBPSubjectServices){ - $scope.list = []; - $scope.selectedClause = null; - $scope.newClauseObj = GBPClauseServices.createObj(); - $scope.internalView = { - clause: false, - edit: "view" - }; - $scope.displayLabel = 'name'; - $scope.crudLabel = 'Clause list'; - - $scope.subjects = {'options' : [], 'labels' : null}; - $scope.getDisplayLabelsFromCtrl('GBP_SUBJECTS_LABEL', $scope.subjects); - - var path = null, - - clear = function(){ - $scope.list = []; - $scope.selectedClause = null; - $scope.newClauseObj = GBPClauseServices.createObj(); - $scope.internalView = { - clause: false, - edit: "view" - }; - }; - - //move to separate ctrl \/ - $scope.addNewElem = function(templateObj) { - if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) { - $scope.init(); - var objToPush = templateObj || ""; - $scope.newClauseObj['subject-refs'].push(objToPush); - } - }; - - $scope.deleteElemAt = function(index) { - if($scope.newClauseObj && $scope.newClauseObj['subject-refs']) { - $scope.newClauseObj['subject-refs'].splice(index, 1); - } - }; - - $scope.updateAt = function(index, value) { - if($scope.newClauseObj && $scope.newClauseObj['subject-refs'] && $scope.newClauseObj['subject-refs'].length >= index) { - $scope.newClauseObj['subject-refs'][index] = value; - } - }; - //move to separate ctrl /\ - - $scope.init = function() { - if($scope.selectedContract && $scope.selectedContract['subject'].length>0) { - $scope.subjects.options = $scope.selectedContract['subject']; - } - }; - - $scope.save = function(){ - $scope.updateList($scope.list, $scope.newClauseObj, "name"); - $scope.reload($scope.newClauseObj); - $scope.$emit('WIZARD_CLAUSE_RELOAD', $scope.list); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newClauseObj); - }; - - $scope.delete = function() { - if($scope.selectedClause) { - var index = $scope.list.indexOf($scope.selectedClause); - $scope.list.splice(index, 1); - $scope.internalView = { - clause: false, - edit: "add" - }; - $scope.$emit('WIZARD_CLAUSE_RELOAD', $scope.list); - } - }; - - $scope.reloadNewObj = function() { - $scope.newClauseObj = GBPClauseServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedClause = selectedObj; - $scope.newClauseObj = selectedObj; - $scope.internalView.clause = true; - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.clause = true; - $scope.internalView.edit = "add"; - $scope.selectedClause = null; - }; - - $scope.close = function(){ - $scope.internalView.clause = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedClause ) { - $scope.internalView.clause = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedClause, $scope.newClauseObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('WIZARD_SUBJECT_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('wizardActionRefCtrl', ['$scope','GBPActionRefsServices', 'GBPActionInstanceServices', '$filter', function($scope, GBPActionRefsServices, GBPActionInstanceServices, $filter){ - $scope.list = []; - $scope.selectedActionRef = null; - $scope.newActionRefObj = GBPActionRefsServices.createObj(); - $scope.displayLabel = 'name'; - $scope.internalView = { - actionRef : false, - edit : "view" - }; - $scope.crudLabel = 'Action ref list'; - - $scope.actionInstanceNames = {'options' : [], 'labels' : $scope.displayLabel}; - - var path = null, - mandatoryProperties = ['order'], - - actionInstanceNamesLoad = function() { - if($scope.tenant) { - var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.tenant.id); - GBPActionInstanceServices.load(actionInstancePath, function(data){ - $scope.actionInstanceNames.options = data; - },function(){ - //TODO: error cbk - }); - } - }, - - clear = function(){ - $scope.list = []; - $scope.selectedActionRef = null; - $scope.newActionRefObj = GBPActionRefsServices.createObj(); - $scope.internalView = { - actionRef : false, - edit : "view" - }; - }; - - $scope.init = function() { - actionInstanceNamesLoad(); - }; - - $scope.save = function(){ - $scope.updateList($scope.list, $scope.newActionRefObj, "name"); - $scope.reload($scope.newActionRefObj); - $scope.$emit('WIZARD_ACTIONREF_RELOAD', $scope.list); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newActionRefObj); - }; - - $scope.delete = function() { - if($scope.selectedActionRef) { - var index = $scope.list.indexOf($scope.selectedActionRef); - $scope.list.splice(index, 1); - $scope.internalView = { - actionRef: false, - edit: "add" - }; - $scope.$emit('WIZARD_ACTIONREF_RELOAD', $scope.list); - } - }; - - $scope.reloadNewObj = function() { - $scope.newActionRefObj = GBPActionRefsServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedActionRef = selectedObj; - $scope.newActionRefObj = selectedObj; - $scope.internalView.actionRef = true; - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.actionRef = true; - $scope.internalView.edit = "add"; - $scope.selectedActionRef = null; - }; - - $scope.close = function(){ - $scope.internalView.actionRef = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedActionRef ) { - $scope.internalView.actionRef = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedActionRef, $scope.newActionRefObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('WIZARD_RULE_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('wizardClassifierRefCtrl', ['$scope','GBPClassifierRefsServices', 'GBPClassifierInstanceServices', '$filter', function($scope, GBPClassifierRefsServices, GBPClassifierInstanceServices, $filter){ - $scope.list = []; - $scope.selectedClassifierRef = null; - $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj(); - $scope.displayLabel = 'name'; - $scope.internalView = { - classifierRef : false, - edit : "view" - }; - - $scope.instanceNames = {'options' : [], 'labels' : $scope.displayLabel}; - - $scope.formDirections = ['in', 'out', 'bidirectional']; - $scope.formConnectionTracking = ['normal', 'reflexive']; - - $scope.crudLabel = 'Classifier ref list'; - - var path = null, - - instanceNamesLoad = function() { - if($scope.tenant) { - var classifierInstancePath = GBPClassifierInstanceServices.createPathObj($scope.tenant.id); - GBPClassifierInstanceServices.load(classifierInstancePath, function(data){ - $scope.instanceNames.options = data; - },function(){ - //TODO: error cbk - }); - } - }, - - clear = function(){ - $scope.list = []; - $scope.selectedClassifierRef = null; - $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj(); - $scope.internalView = { - classifierRef : false, - edit : "view" - }; - }; - - $scope.init = function() { - instanceNamesLoad(); - }; - - $scope.save = function(){ - $scope.updateList($scope.list, $scope.newClassifierRefObj, "name"); - $scope.reload($scope.newClassifierRefObj); - $scope.$emit('WIZARD_CLASREF_RELOAD', $scope.list); - $scope.$broadcast('EV_SET_SEL_CLASS', $scope.newClassifierRefObj); - }; - - $scope.delete = function() { - if($scope.selectedClassifierRef) { - var index = $scope.list.indexOf($scope.selectedClassifierRef); - $scope.list.splice(index, 1); - $scope.internalView = { - classifierRef: false, - edit: "add" - }; - $scope.$emit('WIZARD_CLASREF_RELOAD', $scope.list); - } - }; - - $scope.reloadNewObj = function() { - $scope.newClassifierRefObj = GBPClassifierRefsServices.createObj(); - }; - - $scope.reload = function(selectedObj) { - $scope.selectedClassifierRef = selectedObj; - $scope.newClassifierRefObj = selectedObj; - $scope.internalView.classifierRef = true; - }; - - $scope.showForm = function() { - $scope.reloadNewObj(); - $scope.internalView.classifierRef = true; - $scope.internalView.edit = "add"; - $scope.selectedClassifierRef = null; - }; - - $scope.close = function(){ - $scope.internalView.classifierRef = false; - $scope.internalView.edit = "view"; - }; - - $scope.$on('PGN_EDIT_ELEM', function(event){ - if (!event.defaultPrevented) { - if ( $scope.selectedClassifierRef ) { - $scope.internalView.classifierRef = true; - $scope.internalView.edit = "edit"; - angular.copy($scope.selectedClassifierRef, $scope.newClassifierRefObj); - } - event.defaultPrevented = true; - } - }); - - $scope.$on('WIZARD_RULE_RELOAD',function(){ - $scope.init(); - }); - }]); - - gbpOld.register.controller('rendererStateCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){ - $scope.data = {'subject-feature-definitions' : {}}; - $scope.view_path = 'src/app/gbp-old/views/governance'; - - var init = function(){ - GPBServices.getDefinitions(function(classifiersDefs, actionsDefs){ - $scope.data['subject-feature-definitions']['classifier-definition'] = classifiersDefs; - $scope.data['subject-feature-definitions']['action-definition'] = actionsDefs; - }, function(){ - //error - }); - }; - - init(); - }]); - - gbpOld.register.controller('layerCtrl', ['$scope', function($scope){ - - var moveOffset = 1; - $scope.currentDisplayIndex = 1; - $scope.displayOffsets = [-1, 0, 1]; - $scope.expanded = true; - - $scope.init = function(key, value){ - $scope.data = value; - if($scope.checkData(value, 'Array')){ - $scope.setActData($scope.data[$scope.data.length - 1]); - } - }; - - $scope.toggleExpanded = function(){ - $scope.expanded = !$scope.expanded; - }; - - $scope.shiftDisplayNext = function() { - $scope.currentDisplayIndex = Math.min($scope.currentDisplayIndex + moveOffset, $scope.data.length - 2); - }; - - $scope.shiftDisplayPrev = function() { - $scope.currentDisplayIndex = Math.max($scope.currentDisplayIndex - moveOffset, 1); - }; - - $scope.showPrevButton = function() { - return $scope.currentDisplayIndex > 1; - }; - - $scope.showNextButton = function() { - return $scope.data && $scope.currentDisplayIndex < $scope.data.length - 2; - }; - - $scope.setActData = function(data) { - $scope.actSelected = data; - }; - - $scope.checkData = function(data, type){ - var result = {'Array' : data instanceof Array, - 'Object' : data instanceof Object}; - - return result[type]; - }; - }]); - - gbpOld.register.controller('actionReferenceWizardCtrl', ['$scope', '$filter', 'GBPRuleServices', 'GBPActionInstanceServices', function($scope, $filter, GBPRuleServices, GBPActionInstanceServices){ - $scope.wizardPage = null; - $scope.path = {}; - $scope.rule = {}; - - $scope.actionInstanceNames = {'options' : [], 'labels' : "name"}; - - var actionInstanceNamesLoad = function() { - var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id); - GBPActionInstanceServices.load(actionInstancePath, function(data){ - $scope.actionInstanceNames.options = data; - },function(){ - //TODO: error cbk - }); - }; - - $scope.init = function() { - $scope.setPage('reference'); - }; - - $scope.setPage = function(pageName, object) { - $scope.wizardPage = pageName; - }; - - $scope.submit = function() { - //if($scope.validateForm($scope.actionsForm)){ - $scope.actionInstanceNames.options.forEach(function(i) { - path = GBPActionInstanceServices.createPathObj($scope.path.tenantId, i.name); - //saveParams(); - - GBPActionInstanceServices.send(path, i, function(data){ - $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD'); - }, function(){ - //TODO: error cbk - }); - }); - - //} - - //if($scope.validateForm($scope.rulesForm)){ - path = GBPRuleServices.createPathObj($scope.path.tenantId, $scope.path.contractId, $scope.path.subjectId, $scope.path.ruleId); - GBPRuleServices.send(path, $scope.rule, function(data){ - - $scope.wizards.actionReferenceWizard = false; - - //$scope.sendReloadEventFromRoot('GBP_TENANT_RELOAD'); - }, function(){ - //TODO: error cbk - }); - //} - //$scope. - }; - - $scope.$on('ACTION_RULE_WIZARD_LOAD', function(event, data){ - $scope.rule = angular.copy(data.data); - $scope.path = data.path; - }); - - $scope.$on('WIZARD_ACTIONREF_ADD', function(event, data){ - if(!$scope.rule['action-ref']) { - $scope.rule['action-ref'] = []; - } - $scope.updateList($scope.rule['action-ref'], data, "name"); - }); - - $scope.$on('WIZARD_ACTIONREF_DELETE', function(event, data){ - $scope.rule['action-ref'].splice(data, 1); - }); - - $scope.$on('WIZARD_ACTIONINSTANCE_ADD', function(event, data){ - $scope.updateList($scope.actionInstanceNames.options, data, "name"); - - $scope.setPage('reference'); - }); - - $scope.$on('GBP_TENANT_RELOAD',function(){ - actionInstanceNamesLoad(); - }); - - }]); - - gbpOld.register.controller('actionsRefListCtrl', ['$scope', '$filter', function($scope, $filter){ - - $scope.actionReferenceForm = false; - - $scope.showForm = function(object) { - $scope.actionReferenceForm = true; - $scope.newActionRefObj = object || null; - }; - - $scope.closeForm = function() { - $scope.actionReferenceForm = false; - }; - - $scope.save = function(){ - $scope.$emit('WIZARD_ACTIONREF_ADD', $scope.newActionRefObj); - $scope.resetObject(); - }; - - $scope.deleteElemAt = function(index) { - $scope.$emit('WIZARD_ACTIONREF_DELETE', index); - $scope.resetObject(); - }; - - $scope.resetObject = function() { - $scope.newActionRefObj = null; - }; - - - - }]); - - gbpOld.register.controller('actionInstanceWizardCtrl', ['$scope', '$filter', 'GPBServices', 'GBPActionInstanceServices', function($scope, $filter, GPBServices, GBPActionInstanceServices){ - $scope.actionDefinitions = {'options' : [], 'labels' : "name"}; - $scope.newActionObj = GBPActionInstanceServices.createObj(); - - var loadDefinitions = function() { - GPBServices.getDefinitions(function(classifierDefs, actionDefs) { - $scope.actionDefinitions.options = actionDefs; - //$scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions); - }); - }; - - $scope.reloadDefs = function(){ - $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id'])); - - //TODO: rework - if($scope.defs.length && $scope.defs[0].name === 'sfc-chain-name') { - GPBServices.getServiceFunctionChains(function(data) { - $scope.serviceFunctionChains = data; - }); - } - }; - - $scope.getDefinitionObjParams = function(id){ - return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id); - }; - - $scope.save = function(){ - $scope.newActionObj['parameter-value'] = []; - $scope.$broadcast('GBP_SAVE_PARAM'); - $scope.$emit('WIZARD_ACTIONINSTANCE_ADD', $scope.newActionObj); - $scope.resetObject(); - }; - - $scope.resetObject = function() { - $scope.newActionObj = GBPActionInstanceServices.createObj(); - }; - - $scope.saveParam = function() { - - }; - - $scope.addParam = function(name, type, value) { - $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value)); - }; - - loadDefinitions(); - - }]); - -}); - - diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.css b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.css deleted file mode 100644 index ecd0d7507..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.css +++ /dev/null @@ -1,740 +0,0 @@ -.pl0 { - padding-left: 0 !important; -} -.pr0 { - padding-right: 0 !important; -} -.mt10 { - margin-top: 10px; -} -.mt20 { - margin-top: 20px; -} -.mt30 { - margin-top: 30px; -} -.mt40 { - margin-top: 40px; -} -.mb50 { - margin-bottom: 50px; -} -.mb0 { - margin-bottom: 0px !important; -} -.ml10 { - margin-left: 10px !important; -} -.ml20 { - margin-left: 20px !important; -} -.ml30 { - margin-left: 30px !important; -} -.maxHeight500 { - max-height: 500px; - overflow-y: scroll; -} -.gbpGlobalWrapper { - background: #f5f5f5; - margin-bottom: 0!important; - min-height: 100%; - padding-bottom: 60px; -} -.gbpGlobalWrapper span, -.gbpGlobalWrapper label { - color: #393939; -} -.gbpGlobalWrapper h2 { - color: #666; -} -.gbpGlobalWrapper .form-control, -.gbpGlobalWrapper .main input[type="text"] { - background: #fff; - color: #858585; -} -.gbpGlobalWrapper .form-control[disabled], -.gbpGlobalWrapper .main input[type="text"][disabled] { - background: #eeeeee; -} -.gbpGlobalWrapper .form-control.narrow-input-left { - width: 45%; - float: left; -} -.gbpGlobalWrapper .form-control.narrow-input-right { - width: 45%; - float: right; -} -.gbpGlobalWrapper .row-param { - margin-bottom: 15px; - float: left; -} -.gbpGlobalWrapper .param-label { - width: 100%; - float: left; -} -.gbpGlobalWrapper .ep-filter { - margin-bottom: 20px; -} -.gbpGlobalWrapper .ep-filter DIV { - width: 48%; -} -.gbpGlobalWrapper .float-left { - float: left; -} -.gbpGlobalWrapper .float-right { - float: right; -} -.gbpGlobalWrapper .full-width { - width: 100%; -} -.gbpGlobalWrapper .full-width .btn { - width: 50px; -} -.gbpGlobalWrapper .full-width label { - margin-top: 10px; -} -.gbpWrapper .btn-primary { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; - font-weight: normal; -} -.gbpWrapper .btn-primary:hover { - background-color: #1BAAFD; - border-color: #1BAAFD; -} -.gbpWrapper .btn-primary.bottom-buttons { - bottom: 0; - position: absolute; - margin-bottom: 0 !important; - background-color: #FF7300; - border-color: #FF7300; - width: 45%; -} -.gbpWrapper .btn-primary.bottom-buttons.back { - right: 0; - margin-right: 15px; -} -.gbpWrapper .btn-primary.bottom-buttons.home { - left: 0; - margin-left: 15px; -} -.gbpWrapper .btn-primary.bottom-buttons:hover { - background-color: #FF8f33; - border-color: #FF8f33; -} -.gbpWrapper .btn-primary.bottom-buttons.full-width { - width: calc(100% - 30px); - left: 0; - margin-left: 15px; -} -.gbpWrapper .btn-primary.bottom-buttons.wizard-button { - bottom: 40px; -} -.gbpWrapper .btn-primary.btn-big { - padding: 20px; - font-size: 1.5em; - white-space: normal; -} -.gbpWrapper .noPadding { - padding: 0!important; -} -.gbpWrapper .basicLabel { - padding: 0; - font-weight: normal; -} -.gbpWrapper .rowWrapper { - margin-bottom: 5px; -} -.gbpWrapper .inline-block { - display: inline-block; -} -.gbpWrapper #graph { - overflow: auto; - width: 100%; - height: 100%; -} -.gbpWrapper .graphWrapper { - position: relative; -} -.gbpWrapper .graphWrapper .controlPanelButtons { - position: absolute; - top: 50px; - right: 0px; -} -.gbpWrapper .graphWrapper .controlPanelButtons .line { - margin: 5px 0; -} -.gbpWrapper .graphWrapper .btn { - min-width: 22px; - line-height: 22px; - text-align: center; - padding: 0!important; -} -.gbpWrapper .simpleBox { - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - -ms-border-radius: 5px; - -o-border-radius: 5px; - border-radius: 5px; - border: 1px solid #e5e5e5; - background: #fff; - padding: 20px; -} -.gbpWrapper .simpleBox h2 { - margin-top: 0; -} -.gbpWrapper .sectionTitle { - padding: 20px; -} -.gbpWrapper .sectionTitle label { - font-size: 25px; -} -.gbpWrapper .legendBox { - position: absolute; - top: 50px; - right: 50px; - z-index: 10; -} -.gbpWrapper .legendBox ul { - padding: 0; - list-style: none; -} -.gbpWrapper .legendBox ul .item { - padding-top: 5px; - margin-bottom: 10px; -} -.gbpWrapper .legendBox ul .line { - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; - margin: 9px 5px 0 0; - width: 50px; -} -.gbpWrapper .legendBox ul .line.blue { - border-top: 2px solid blue; -} -.gbpWrapper .legendBox ul .line.green { - border-top: 2px solid green; -} -.gbpWrapper .mainNavigationWrapper { - padding-bottom: 50px; - overflow-x: scroll; -} -.gbpWrapper .mainNavigation { - padding-top: 5%; - min-width: 1450px; -} -.gbpWrapper .mainNavigation .topButtonsWrapper, -.gbpWrapper .mainNavigation .bottomButtonsWrapper { - text-align: center; - width: 400px; - margin: 0 auto 15px; - padding: 0 0 20px; - border-bottom: 5px solid #393939; -} -.gbpWrapper .mainNavigation .bottomButtonsWrapper { - border-bottom: 0; - border-top: 5px solid #393939; - padding: 20px 0 0; - margin: 15px auto 0; -} -.gbpWrapper .mainNavigation .middleButtonsWrapper { - text-align: center; -} -.gbpWrapper .mainNavigation .middleButtonsWrapper .buttonWrapper { - margin-top: 25px; -} -.gbpWrapper .mainNavigation .middleButtonsWrapper .iconWrapper { - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; - padding-top: 10px; -} -.gbpWrapper .mainNavigation .middleBox { - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; - width: 500px; - height: 150px; - border-left: 5px solid #393939; - border-right: 5px solid #393939; -} -.gbpWrapper .mainNavigation .middleBox .infinityIcon { - background: transparent url('../../src/app/gbp/images/infinity-loop.tpl.html') no-repeat center center; - width: 128px; - height: 128px; - margin: 11px auto 0; - cursor: pointer; -} -.gbpWrapper .mainNavigation .buttonWrapper { - text-align: center; - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; -} -.gbpWrapper .mainNavigation .buttonWrapper .btn-primary { - font-size: 2em; - padding: 25px 0; - width: 350px; - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; -} -.gbpWrapper .mainNavigation .buttonWrapper .icon-large:before { - font-size: 5em; -} -.gbpWrapper aside.col-md-3 { - min-height: 800px; -} -.gbpWrapper aside.col-md-3 .inWrapper { - height: 100%; -} -.gbpWrapper .panelWrapper { - padding: 20px 0 50px; - height: calc(100% - 109px); -} -.gbpWrapper .panelWrapper.no-padd-top { - padding-top: 0px; -} -.gbpWrapper .panelWrapper button.btn { - margin-bottom: 5px; -} -.gbpWrapper .panelWrapper button.btn-list { - margin-top: 25px; -} -.gbpWrapper .panelWrapper button.btn-default:hover { - background-color: #e6e6e6 !important; -} -.gbpWrapper .panelWrapper button.btn-default:focus { - background-color: #fff; -} -.gbpWrapper .panelWrapper button.activated, -.gbpWrapper .panelWrapper button.activated:focus { - background-color: #e6e6e6 !important; -} -.gbpWrapper .breadcrumbs { - padding: 10px 0px; - font-weight: bold; - border: 0; - line-height: initial; -} -.gbpWrapper section.sigmaWrapper div.legend { - margin-bottom: 25px; -} -.gbpWrapper section.sigmaWrapper div.legend span, -.gbpWrapper section.sigmaWrapper div.legend .text { - color: #fff; -} -.gbpWrapper section.sigmaWrapper div.legend ul { - padding: 0; - margin: 0; - list-style: none; -} -.gbpWrapper section.sigmaWrapper div.legend li { - margin-bottom: 5px; -} -.gbpWrapper section.sigmaWrapper div.legend li .textHidden { - display: none; -} -.gbpWrapper section.sigmaWrapper div.legend li .text { - margin-left: 10px; - line-height: 18px; -} -.gbpWrapper section.sigmaWrapper div.legend li .showChckbx { - position: relative; - top: 2px; - left: 5px; -} -.gbpWrapper section.sigmaWrapper div.legend li .itemWrapper:hover .text { - display: block !important; -} -.gbpWrapper section.sigmaWrapper div.legend div.color { - /*margin-right: 15px;*/ - width: 18px; - height: 18px; - -webkit-border-radius: 9px; - border-radius: 9px; - cursor: pointer; -} -.gbpWrapper #graph-container { - padding: 0; - height: 800px; -} -.gbpWrapper .selectWrapper { - padding-left: 0; -} -.gbpWrapper .selectWrapper.col-md-12 { - padding: 0; - margin-bottom: 5px; -} -.gbpWrapper .inputWrapper.leftInput { - padding-left: 0; -} -.gbpWrapper .inputWrapper.rightInput { - padding-right: 0; -} -.gbpWrapper .separator { - padding-bottom: 10px; - margin-top: 15px; - height: 1px; - padding-left: 0px; - padding-right: 15px; -} -.gbpWrapper .inner-separator { - border-bottom: 1px solid #858585; - width: 100%; - float: left; -} -.gbpWrapper .btn-group { - padding: 0; -} -.gbpWrapper .formWrapper { - margin: 20px 0; -} -.gbpWrapper .icon-remove.align-right { - float: right; -} -.gbpWrapper .icon-remove.align-right.padding { - margin: 5px 5px 0 0; -} -.gbpWrapper .icon-exclamation-sign.red { - color: red; -} -.gbpWrapper .sigmaWrapper { - position: relative; -} -.gbpWrapper .sigmaWrapper .sigmaModalWrapper { - position: absolute; - top: 30px; - left: 45px; - z-index: 1; -} -.gbpWrapper .sigmaWrapper .sigmaModalWrapper .icon-remove { - position: absolute; - top: 5px; - right: 5px; -} -.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper { - position: relative; - background: #f5f5f5; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - -ms-border-radius: 5px; - -o-border-radius: 5px; - border-radius: 5px; - min-width: 400px; - min-height: 100px; - margin-top: 20px; - padding: 20px; -} -.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper .dataWrapper { - overflow-y: scroll; - max-height: 350px; -} -.gbpWrapper .sigmaWrapper .sigmaModalWrapper .tableWrapper .rowWrapper { - padding: 10px; - margin-bottom: 10px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - -ms-border-radius: 5px; - -o-border-radius: 5px; - border-radius: 5px; - border: 1px solid #d5d5d5; -} -.modal-dialog { - z-index: 100; - height: 700px; - width: 700px; - background-color: white; - position: fixed; - opacity: 1; - top: 50%; - left: 50%; - margin: -350px 0 0 -400px; -} -.modal-dialog .modal-header { - height: 70px; - padding: 10px 15px; -} -.modal-dialog .modal-navigation { - float: left; - width: 150px; - height: 630px; - border-right: 1px solid #e5e5e5; - background-color: #eeeeee; -} -.modal-dialog .modal-navigation ul { - -webkit-padding-start: 0; - list-style-type: none; -} -.modal-dialog .modal-navigation ul li.navigation-item { - height: 54px; - width: 100%; - background-color: #eeeeee; - color: #666; - font-weight: bold; - padding: 20px; -} -.modal-dialog .modal-navigation ul li.navigation-item.selected { - background-color: #428bca; - border-color: #357ebd; - color: #ffffff; -} -.modal-dialog .modal-content-container { - float: right; - width: 550px; - height: 630px; -} -.modal-dialog .modal-content-container .content { - overflow-y: scroll; - padding: 0 50px 0 20px; - height: 580px; -} -.modal-dialog .modal-content-container .bottom-navigation { - height: 50px; - bottom: 0; - float: right; - margin: 8px 30px; -} -.modal-canvas { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 10; - background-color: #000; - opacity: .15; -} -.link-tools .tool-remove { - display: none; -} -.link-tools .tool-options { - display: none; -} -.connection-wrap, -.marker-arrowheads { - display: none; -}/*-------------------YangUI import START-------------------*/ -.gbpWrapper .customContainer { - border-left: 1px solid #7a7a7a; - margin: 35px 5px 5px 15px; - padding: 5px; - /*z-index: 10;*/ - width: auto; - position: relative; -} -.gbpWrapper .customContainer.withoutBorder { - border-left: 0; - padding-bottom: 0; -} -.gbpWrapper .customContainer.withoutBorder .treeBullet.containerBullet { - left: -25px; - top: -25px; -} -.gbpWrapper .topContainerPart { - margin-left: -19px; - margin-top: -28px; - margin-bottom: 10px; -} -.gbpWrapper .treeBullet { - font-size: 25px; - color: #7a7a7a; - position: absolute; - left: -15px; - top: 0; -} -.gbpWrapper .treeBullet.containerBullet { - top: -25px; - left: -25px; -} -.gbpWrapper .btn-name { - -webkit-border-radius: 5px; - border-radius: 5px; - background: transparent; - font-weight: bold; - color: #393939; - border: 2px solid #393939; - cursor: auto; -} -.gbpWrapper button.yangButton, -.gbpWrapper div.yangButton { - cursor: pointer; - position: relative; - width: 24px; - height: 24px; - border: 0; - margin: 2px; - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; -} -.gbpWrapper button.yangButton.iconArrowDown, -.gbpWrapper div.yangButton.iconArrowDown { - background: transparent url('images/yang-ui-icons/icon-arrow-down.tpl.html') no-repeat center top; -} -.gbpWrapper button.yangButton.iconArrowRight, -.gbpWrapper div.yangButton.iconArrowRight { - background: transparent url('images/yang-ui-icons/icon-arrow-right.tpl.html') no-repeat center top; -} -.gbpWrapper button.yangButton.iconNext, -.gbpWrapper div.yangButton.iconNext { - background: transparent url('images/yang-ui-icons/icon-next.tpl.html') no-repeat center top; -} -.gbpWrapper button.yangButton.iconPrev, -.gbpWrapper div.yangButton.iconPrev { - background: transparent url('images/yang-ui-icons/icon-prev.tpl.html') no-repeat center top; -} -.gbpWrapper button.yangButton:hover, -.gbpWrapper div.yangButton:hover { - background-position: center -24px; -} -.gbpWrapper button.yangButton.disabled, -.gbpWrapper div.yangButton.disabled { - -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity= 40 )' !important; - filter: alpha(opacity= 40 ) !important; - -moz-opacity: 0.4 !important; - -khtml-opacity: 0.4 !important; - opacity: 0.4 !important; -} -.gbpWrapper button.yangButton.disabled:hover, -.gbpWrapper div.yangButton.disabled:hover { - background-position: center top; -} -.gbpWrapper .btn-slim { - padding-top: 2px; - padding-bottom: 2px; -} -.gbpWrapper .inlineBlock { - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; -} -.gbpWrapper .leaf { - margin: 5px; - padding-left: 5px; - position: relative; -} -.gbpWrapper .leaf-label { - margin-right: 10px; - font-weight: bold; - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; - /*width: 170px;*/ - padding-top: 6px; -} -.gbpWrapper .leaf-label button.iconQuestion { - margin-top: -2px; -} -.gbpWrapper .leaf-label i.icon-key { - font-size: 1.3em; - padding-left: 5px; -} -.gbpWrapper .clear { - clear: both; -} -.gbpWrapper .borderArrow { - color: #393939; - position: absolute; - bottom: -6px; - left: -6px; - font-size: 1.3em; -} -.gbpWrapper .tooltip-inner { - color: #fff; - white-space: pre-wrap; - /* CSS3 */ - white-space: -moz-pre-wrap; - /* Firefox */ - white-space: -pre-wrap; - /* Opera <7 */ - white-space: -o-pre-wrap; - /* Opera 7 */ - word-wrap: break-word; - /* IE */ -} -/*-------------------YangUI import END-------------------*/ -/* --------------------JointJS Graph START------------------- -.html-element { - position: absolute; - background: #3498DB; - pointer-events: none; - -webkit-user-select: none; - border-radius: 4px; - border: 2px solid #2980B9; - box-shadow: inset 0 0 5px black, 2px 2px 1px gray; - padding: 5px; - box-sizing: border-box; - z-index: 2; - pointer-events: auto; - bottom: 0; - left: 0; - right: 0; - color: #333; - height: 16px; - margin-top: 107px; - margin-left: 16px; - width: 50px !important; - height: 20px !important; -} --------------------JointJS Graph END------------------- -*/ -/*GBP END*/ - -.gbpWrapper .btn-like-tab { - text-decoration: none; - color: #464646; - border: 0; - line-height: 32px; - padding: 0 15px; - background: transparent !important; - border-bottom: 3px solid transparent; - margin: 0 10px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - -ms-border-radius: 0; - -o-border-radius: 0; - border-radius: 0; - -webkit-transition: 150ms; - transition: 150ms; - -webkit-transition: all 150ms linear; - -moz-transition: all 150ms linear; - -ms-transition: all 150ms linear; - -o-transition: all 150ms linear; - transition: all 150ms linear; -} -.gbpWrapper .btn-like-tab.btn-selected, -.gbpWrapper .btn-like-tab:hover { - border-bottom: 3px solid #1baafd; - background: transparent !important; -} - -.gbpWrapper h1, .gbpWrapper h2, .gbpWrapper h3 { - color: #393939; -} - -#page_logo { - display:none; -} - - diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.less b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.less deleted file mode 100644 index 597e5f9e1..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.less +++ /dev/null @@ -1,759 +0,0 @@ -/*GBP*/ -.pl0{padding-left: 0!important}; -.pr0{padding-right: 0!important}; - -.mt10{margin-top: 10px}; -.mt20{margin-top: 20px}; -.mt30{margin-top: 30px}; -.mt40{margin-top: 40px}; - -.mb50{margin-bottom: 50px}; -.mb0{margin-bottom: 0px!important}; - -.ml10{margin-left: 10px!important}; -.ml20{margin-left: 20px!important}; -.ml30{margin-left: 30px!important}; - -.maxHeight500{ - max-height: 500px; - overflow-y: scroll; -} - -.gbpGlobalWrapper{ - background: #f5f5f5; - margin-bottom: 0!important; - min-height: 100%; - padding-bottom: 60px; - - span, label { - color: #393939; - } - - h2{ - color: #666; - } - - .form-control, .main input[type="text"]{ - background: #fff; - color: #858585; - - &[disabled]{ - background: #eeeeee; - } - } - - - .form-control{ - &.narrow-input-left{ - width: 45%; - float: left; - } - &.narrow-input-right{ - width: 45%; - float: right; - } - } - - .row-param{ - margin-bottom: 15px; - float: left; - } - - .param-label{ - width:100%; - float: left; - } - - .ep-filter{ - margin-bottom: 20px; - DIV{ - width: 48%; - } - } - - .float-left{ - float: left; - } - - .float-right{ - float: right; - } - - .full-width{ - width: 100%; - - .btn{ - width: 50px; - } - - label{ - margin-top: 10px; - } - } -} - -.gbpWrapper{ - - .btn-primary{ - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; - font-weight: normal; - - &:hover { - background-color: #1BAAFD; - border-color: #1BAAFD; - } - - &.bottom-buttons { - bottom: 0; - position: absolute; - margin-bottom: 0 !important; - background-color: #FF7300; - border-color: #FF7300; - width: 45%; - - &.back { - right:0; - margin-right: 15px; - } - - &.home { - left:0; - margin-left: 15px; - } - - &:hover { - background-color: #FF8f33; - border-color: #FF8f33; - } - - &.full-width{ - width: calc(~'100% - 30px'); - left: 0; - margin-left: 15px; - } - - &.wizard-button{ - bottom: 40px; - } - } - - &.btn-big{ - padding: 20px; - font-size: 1.5em; - white-space: normal; - } - } - - .noPadding{ - padding: 0!important; - } - - .basicLabel{ - padding: 0; - font-weight: normal; - } - - .rowWrapper{ - margin-bottom: 5px; - } - - .inline-block{ - display: inline-block; - } - - #graph{ - overflow: auto; - width: 100%; - height: 100%; - } - - .graphWrapper{ - position: relative; - - .controlPanelButtons{ - position: absolute; - top: 50px; - right: 0px; - - .line{ - margin: 5px 0; - } - } - - .btn{ - min-width: 22px; - line-height: 22px; - text-align: center; - padding: 0!important; - } - } - - //SIMPLE BOX - .simpleBox{ - .roundedCorners(5px); - border: 1px solid #e5e5e5; - background: #fff; - padding: 20px; - - h2{ - margin-top: 0; - } - } - - .sectionTitle{ - padding: 20px; - label{ - font-size: 25px; - } - } - - //LEGEND BOX - .legendBox{ - position: absolute; - top: 50px; - right: 50px; - z-index: 10; - ul{ - padding: 0; - list-style: none; - - .item{ - padding-top: 5px; - margin-bottom: 10px; - } - - .line{ - .inlineBlock; - margin: 9px 5px 0 0; - width: 50px; - - &.blue{ - border-top: 2px solid blue; - } - - &.green{ - border-top: 2px solid green; - } - } - } - } - - //MAIN NAVIGATION - .mainNavigationWrapper{ - padding-bottom: 50px; - overflow-x: scroll; - } - .mainNavigation{ - padding-top: 5%; - min-width: 1450px; - .topButtonsWrapper, .bottomButtonsWrapper{ - text-align: center; - width: 400px; - margin: 0 auto 15px; - padding: 0 0 20px; - border-bottom: 5px solid #393939; - } - - .bottomButtonsWrapper{ - border-bottom: 0; - border-top: 5px solid #393939; - padding: 20px 0 0; - margin: 15px auto 0; - } - - .middleButtonsWrapper{ - text-align: center; - - .buttonWrapper{ - margin-top: 25px; - - } - - .iconWrapper{ - .inlineBlock; - padding-top: 10px; - } - } - - .middleBox{ - .inlineBlock; - width: 500px; - height: 150px; - border-left: 5px solid #393939; - border-right: 5px solid #393939; - - .infinityIcon{ - background: transparent url('../../src/app/gbp/images/infinity-loop.tpl.html') no-repeat center center; - width: 128px; - height: 128px; - margin: 11px auto 0; - cursor: pointer; - } - } - - .buttonWrapper{ - text-align: center; - // width: 300px; - // margin: 0 auto; - .inlineBlock; - - .btn-primary{ - font-size: 2em; - padding: 25px 0; - width: 350px; - .inlineBlock; - } - - .icon-large{ - &:before{ - font-size: 5em; - } - } - } - } - - //RIGHT PANEL - aside{ - &.col-md-3{ - min-height: 800px; - - .inWrapper{ - height: 100%; - } - } - } - - .panelWrapper{ - padding: 20px 0 50px; - height: calc(~'100% - 109px'); - &.no-padd-top{ - padding-top: 0px; - } - button{ - &.btn{ - margin-bottom: 5px; - } - &.btn-list{ - margin-top: 25px; - } - &.btn-default:hover { - background-color: #e6e6e6 !important; - } - &.btn-default:focus { - background-color: #fff; - } - &.activated, &.activated:focus { - background-color: #e6e6e6 !important; - } - } - } - - .breadcrumbs{ - padding: 10px 0px; - font-weight: bold; - border: 0; - line-height: initial; - } - - section.sigmaWrapper { - div.legend{ - margin-bottom: 25px; - - span, .text{ - color: #fff; - } - - ul{ - padding: 0; - margin: 0; - list-style: none; - } - li{ - margin-bottom: 5px; - .textHidden{ - display: none; - } - .text{ - margin-left: 10px; - line-height: 18px; - } - .showChckbx{ - position: relative; - top: 2px; - left: 5px; - } - .itemWrapper{ - &:hover{ - .text{ - display: block !important; - } - } - } - - } - div.color{ - /*margin-right: 15px;*/ - width: 18px; - height: 18px; - -webkit-border-radius: 9px; - border-radius: 9px; - cursor: pointer; - } - } - } - - #graph-container{ - // background: transparent; - padding: 0; - height: 800px; - } - - .selectWrapper{ - padding-left: 0; - &.col-md-12{ - padding: 0; - margin-bottom: 5px; - } - } - - .inputWrapper{ - &.leftInput{ - padding-left: 0; - } - - &.rightInput{ - padding-right: 0; - } - } - - .separator{ - padding-bottom: 10px; - margin-top: 15px; - height: 1px; - padding-left: 0px; - padding-right: 15px; - } - - .inner-separator{ - border-bottom: 1px solid #858585; - width: 100%; - float: left; - } - - .btn-group{ - padding: 0; - } - - .formWrapper{ - margin: 20px 0; - } - - .icon-remove { - &.align-right { - float: right; - - &.padding { - margin: 5px 5px 0 0; - } - } - } - - .icon-exclamation-sign{ - &.red { - color: red; - } - } - - .sigmaWrapper{ - position: relative; - - .sigmaModalWrapper{ - position: absolute; - top: 30px; - left: 45px; - z-index: 1; - - .icon-remove{ - position: absolute; - top: 5px; - right: 5px; - } - - .tableWrapper{ - position: relative; - background: #f5f5f5; - .roundedCorners(5px); - min-width: 400px; - min-height: 100px; - margin-top: 20px; - padding: 20px; - - .dataWrapper{ - overflow-y: scroll; - max-height: 350px; - } - - .rowWrapper{ - padding: 10px; - margin-bottom: 10px; - .roundedCorners(5px); - border: 1px solid #d5d5d5; - } - } - } - } -} - -.modal-dialog { - z-index: 100; - height: 700px; - width: 700px; - background-color: white; - position: fixed; - opacity: 1; - top:50%; - left:50%; - margin:-350px 0 0 -400px; - - .modal-header { - height: 70px; - padding: 10px 15px; - } - - .modal-navigation { - float:left; - width: 150px; - height: 630px; - border-right: 1px solid #e5e5e5; - background-color: #eeeeee; - - ul { - -webkit-padding-start: 0; - list-style-type: none; - - li.navigation-item { - height: 54px; - width: 100%; - background-color: #eeeeee; - color: #666; - font-weight: bold; - padding: 20px; - - &.selected { - background-color: #428bca; - border-color: #357ebd; - color: #ffffff; - } - } - } - } - - .modal-content-container { - float: right; - width: 550px; - height: 630px; - - .content { - overflow-y: scroll; - padding: 0 50px 0 20px; - height: 580px; - } - - .bottom-navigation { - height: 50px; - bottom: 0; - float: right; - margin: 8px 30px - } - } - - - - -} - -.modal-canvas { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 10; - background-color: #000; - opacity: .15; -} - -.link-tools .tool-remove { display: none } -.link-tools .tool-options { display: none } -.connection-wrap, .marker-arrowheads { display: none } - -/*-------------------YangUI import START-------------------*/ - -@iconsRootPath : 'images/yang-ui-icons/'; -.gbpWrapper{ - .customContainer{ - border-left: 1px solid #7a7a7a; - margin: 35px 5px 5px 15px; - padding: 5px; - /*z-index: 10;*/ - width:auto; - position: relative; - &.withoutBorder{ - border-left: 0; - padding-bottom: 0; - .treeBullet.containerBullet{ - left: -25px; - top: -25px; - } - } - } - - .topContainerPart{ - margin-left: -19px; - margin-top: -28px; - margin-bottom: 10px; - } - - .treeBullet{ - font-size: 25px; - color: #7a7a7a; - position: absolute; - left: -15px; - top: 0; - &.containerBullet{ - top: -25px; - left: -25px; - } - } - - .btn-name{ - -webkit-border-radius: 5px; - border-radius: 5px; - background: transparent; - font-weight: bold; - color: @text-color; - border: 2px solid @text-color; - cursor: auto; - } - - button, div{ - &.yangButton{ - cursor: pointer; - position: relative; - width: 24px; - height: 24px; - border: 0; - margin: 2px; - .inlineBlock; - &.iconArrowDown{ - background: transparent url('@{iconsRootPath}icon-arrow-down.png') no-repeat center top; - } - &.iconArrowRight{ - background: transparent url('@{iconsRootPath}icon-arrow-right.png') no-repeat center top; - } - &.iconNext{ - background: transparent url('@{iconsRootPath}icon-next.png') no-repeat center top; - } - &.iconPrev{ - background: transparent url('@{iconsRootPath}icon-prev.png') no-repeat center top; - } - &:hover{ - background-position: center -24px; - } - &.disabled{ - .opacityDeph(0.4)!important; - &:hover{ - background-position: center top; - } - } - } - } - - .btn-slim { - padding-top: 2px; - padding-bottom: 2px; - } - - .inlineBlock { - display: -moz-inline-stack; - display: inline-block; - vertical-align: top; - zoom: 1; - *display: inline; - } - - .leaf { - margin: 5px; - padding-left: 5px; - position: relative; - } - - .leaf-label { - margin-right: 10px; - font-weight: bold; - .inlineBlock; - /*width: 170px;*/ - padding-top: 6px; - button.iconQuestion{ - margin-top: -2px; - } - - i.icon-key { - font-size: 1.3em; - padding-left: 5px; - } - } - - .clear{ - clear: both; - } - - .borderArrow{ - color: @text-color; - position: absolute; - bottom: -6px; - left: -6px; - font-size: 1.3em; - } - - .tooltip-inner{ - color: #fff; - white-space: pre-wrap; /* CSS3 */ - white-space: -moz-pre-wrap; /* Firefox */ - white-space: -pre-wrap; /* Opera <7 */ - white-space: -o-pre-wrap; /* Opera 7 */ - word-wrap: break-word; /* IE */ - } -} -/*-------------------YangUI import END-------------------*/ - -/* --------------------JointJS Graph START------------------- -.html-element { - position: absolute; - background: #3498DB; - pointer-events: none; - -webkit-user-select: none; - border-radius: 4px; - border: 2px solid #2980B9; - box-shadow: inset 0 0 5px black, 2px 2px 1px gray; - padding: 5px; - box-sizing: border-box; - z-index: 2; - pointer-events: auto; - bottom: 0; - left: 0; - right: 0; - color: #333; - height: 16px; - margin-top: 107px; - margin-left: 16px; - width: 50px !important; - height: 20px !important; -} --------------------JointJS Graph END------------------- -*/ - -/*GBP END*/ \ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.module.js b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.module.js deleted file mode 100644 index e92550cc0..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.module.js +++ /dev/null @@ -1,56 +0,0 @@ -define(['angularAMD', 'app/routingConfig', 'ui-bootstrap', 'Restangular', 'angular-translate-loader-partial'], function() { - - var gbpOld = angular.module('app.gbpOld', ['ui.router.state','app.core', 'ui.bootstrap', 'restangular', 'pascalprecht.translate']); - - gbpOld.register = gbpOld; - - gbpOld.config(function ($stateProvider, $compileProvider, $controllerProvider, $provide, $translateProvider, - $translatePartialLoaderProvider, NavHelperProvider, $filterProvider) { - - //$translatePartialLoaderProvider.addPart('app/gbp/assets/data/locale'); - - gbpOld.register = { - directive : $compileProvider.directive, - controller : $controllerProvider.register, - filter: $filterProvider.register, - factory : $provide.factory, - service : $provide.service - }; - - NavHelperProvider.addControllerUrl('app/gbp-old/gbp.controller'); - NavHelperProvider.addToMenu('gbpOld', { - "link": "#/gbpOld/index", - "active": "main.gbpOld", - "title": "GBP old", - "icon": "icon-level-down", - "page": { - "title": "GBP old", - "description": "GBP old ui" - } - }); - - var access = routingConfig.accessLevels; - $stateProvider.state('main.gbpOld', { - url: 'gbpOld', - abstract: true, - views : { - 'content' : { - templateUrl: 'src/app/gbp-old/views/root.tpl.html' - } - } - }); - - $stateProvider.state('main.gbpOld.index', { - url: '/index', - access: access.admin, - views: { - '': { - controller: 'gbpCtrl', - templateUrl: 'src/app/gbp-old/views/index.tpl.html' - } - } - }); - }); - - return gbpOld; -}); diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.services.js b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.services.js deleted file mode 100644 index e21faabca..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/gbp.services.js +++ /dev/null @@ -1,2870 +0,0 @@ -define(['app/gbp-old/gbp.module', 'app/gbp-old/js/joint.clean.build'], function(gbpOld, joint) { - - gbpOld.register.factory('GBPRestangular', function(Restangular, ENV) { - return Restangular.withConfig(function(RestangularConfig) { - RestangularConfig.setBaseUrl(ENV.getBaseURL("MD_SAL")); - }); - }); - - gbpOld.register.factory('GBPConstants', function() { - var c = { colors: {'graph' : {}}, strings: {}, jointElements: {}, objType: {}, numbers: {}}; - - c.strings.flood = 'flood'; - c.strings.bridge = 'bridge'; - c.strings.l3ctx = 'l3ctx'; - c.strings.subnet = 'subnet'; - c.strings.linklabel = 'linklabel'; - c.strings.in = 'in'; - c.strings.out = 'out'; - c.strings.bi = 'bidirectional'; - - c.strings.config = 'CONFIG'; - c.strings.oper = 'OPERATIONAL'; - c.strings.l2l3 = 'L2L3'; - c.strings.mock = 'MOCK'; - c.strings.sigmaTopoDefaultText = 'SIGMATOPODEFAULTTEXT'; - c.strings.sigmaTopoDefault = 'SIGMATOPODEFAULTTEXT'; - - c.colors[c.strings.flood] = '#DF0101'; - c.colors[c.strings.bridge] = '#0080FF'; - c.colors[c.strings.l3ctx] = '#3ADF00'; - c.colors[c.strings.subnet] = '#FF9933'; - c.colors[c.strings.sigmaTopoDefaultText] = '#fff'; - c.colors[c.strings.epg] = '#8fde70'; - c.colors[c.strings.linklabel] = '#3366CC'; - - c.colors[c.strings.flood+'-'+c.strings.bridge] = '#6666FF'; - c.colors[c.strings.bridge+'-'+c.strings.l3ctx] = '#6666FF'; - - c.colors[c.strings.subnet+'-'] = '#6666FF'; - - c.colors['graph']['subject'] = '#FFFFD4'; - c.colors['graph']['cns'] = '#8EEDFF'; - c.colors['graph']['pns'] = '#FF9C9C'; - - c.jointElements.minWidth = 100; - c.jointElements.maxWidth = 300; - c.jointElements.minHeight = 50; - c.jointElements.maxHeight = 300; - - c.objType.contract = 'contract'; - c.objType.epg = 'epg'; - c.objType.consumer = 'consumer'; - c.objType.provider = 'provider'; - c.objType.subject = 'subject'; - c.objType.rule = 'rule'; - - c.numbers.displayLabelLength = 40; - - return c; - }); - - gbpOld.register.factory('MockServices', function() { - - var ms = {}; - - ms.mockTopoData = function() { - var lid = 0, - nodeRaw = [0, 1, 2, 3], - linkRaw = [[0, 1], [2, 3], [3, 0], [0, 3]], - nodes = nodeRaw.map(function(data) { - return { - 'id': 'n' + data, - 'label': 'LABEL'+data, - 'size': 3, - 'x': Math.random(), - 'y': Math.random(), - 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault] - }; - }), - links = linkRaw.map(function(data) { - var obj = { - id: 'e' + lid, - source: 'n' + data[0], - target: 'n' + data[1], - color: GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault] - }; - lid = lid + 1; - return obj; - }); - - return {nodes: nodes, links: links}; - }; - - return ms; - }); - - gbpOld.register.factory('TopologyDataLoaders', function(GBPRestangular, GBPConstants) { - var tdl = {}; - - tdl.getSubjectsBetweenEndpointGroups = function(storage, tenantId, successCbk, errorCbk) { - var restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'ui-backend:get-subjects-between-endpoint-groups', - reqData = { "input": { "tenant-id": tenantId }}; - - if(storage) { - reqData.input['from-oper-data'] = {}; - } - - restObj.post(rpcRes, reqData).then(function(data) { - // console.info('got data', data.output); - successCbk(data); - }, function(res) { - errorCbk(res); - }); - }; - - //Policies are representing links in PGN topology - tdl.getGroupRulesBetweenEndpointGroups = function(successCbk, errorCbk) { - var restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'pgn-application:get-group-rules-between-endpoint-groups', - reqData = { "input": { "endpoint-group-pair":[] }}; - - restObj.post(rpcRes, reqData).then(function(data) { - successCbk(data); //set topology links - }, function(res) { - errorCbk(res); - }); - }; - - //Groups are representing nodes in PGN topology - tdl.getEndpointGroups = function(successCbk, errorCbk) { - var tenantId = getId(idTypes.tenant), - restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'pgn-application:get-endpoint-groups', - reqData = { - "input": { - "endpoint-group-id":[ - { - "pgn-application:tenant-id": tenantId - } - ] - } - }; - - restObj.post(rpcRes, reqData).then(function(data) { - successCbk(data); //set topology nodes - }, function(res) { - errorCbk(res); - }); - - }; - - tdl.getEndpointsFromEndpointGroup = function(tenantId, epgId, successCbk, errorCbk) { - var restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'ui-backend:get-endpoints-from-endpoint-group', - reqData = { - "input": { - "tenant-id": tenantId, - "endpoint-group-id":epgId - } - }; - - restObj.post(rpcRes, reqData).then(function(data) { - successCbk(data); //set topology nodes - }, function(res) { - errorCbk(res); - }); - - }; - - tdl.getEpgTopo = function(data){ - var epgData = data.output['endpoint-group-pair-with-subject'], - nodes = [], - edges = [], - setNode = function(obj){ - var nodeObj = { - 'id': 'n' + nodes.length, - 'label': obj.name || obj.id, - 'name': obj.name, - 'size': 1, - 'x': Math.random(), - 'y': Math.random(), - 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault], - 'type': obj.type - }; - - nodes.push(nodeObj); - return nodeObj.id; - }, - setEdge = function(sourceId, destId, data, direction) { - var obj = { - 'id': 'e' + edges.length, - 'source': sourceId, - 'target': destId, - 'color': GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault], - 'data': data, - 'direction' : direction - // 'type': 'curve', - // 'size' : 100 - }; - - edges.push(obj); - }, - getObjByProp = function(val, prop, list) { - return list.filter(function(i){ - return i[prop] === val; - }); - }, - getDirection = function(subjects){ - var directions = []; - if ( subjects ) { - subjects.forEach(function(s){ - if ( s['ui-rule'] ) { - s['ui-rule'].forEach(function(rule){ - if ( rule['classifier-ref'] ) { - rule['classifier-ref'].forEach(function(classifier){ - if ( classifier.direction && directions.indexOf(classifier.direction) === -1 ){ - directions.push(classifier.direction); - } - }); - } - }); - } - }); - } - return directions.length === 1 ? directions[0] : directions.length > 1 ? 'bidirectional' : null; - - }; - - if(epgData) { - epgData.forEach(function(e){ - var cepgnId = null, - pepgnId = null; - - if ( !getObjByProp(e['consumer-endpoint-group-id'],'name', nodes).length ) { - var objCepg = { - type: 'epg', - name: e['consumer-endpoint-group-id'] - }; - cepgnId = setNode(objCepg); - } else { - cepgnId = getObjByProp(e['consumer-endpoint-group-id'],'name', nodes)[0].id; - } - if ( !getObjByProp(e['provider-endpoint-group-id'],'name', nodes).length ) { - var objPepg = { - type: 'epg', - name: e['provider-endpoint-group-id'] - }; - pepgnId = setNode(objPepg); - } else { - pepgnId = getObjByProp(e['provider-endpoint-group-id'],'name', nodes)[0].id; - } - - var direction = getDirection(e['ui-subject']); - - if ( cepgnId && pepgnId ) { - setEdge(cepgnId, pepgnId, e['ui-subject'], direction); - } - }); - } - - return { - nodes: nodes, - links: edges - }; - }; - - - tdl.getL2L3 = function(storage, tenantId, successCbk, errorCbk) { - //l2-bridge-domain - var lid = 0, - nid = 0, - getL2L3Label = function(node) { - return node.name || node.id; - }, - getSubnetLabel = function(node) { - return node['ip-prefix'] || node.id; - }, - getNodeColor = function(src) { - return GBPConstants.colors[src] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]; - }, - getLinkColor = function(from, to) { - return GBPConstants.colors[from+'-'+to] || GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault]; - }, - getNodes = function(data, srcDesc, getLabelCbk) { - var nodes = data.map(function(elem) { - var obj = { - 'id': 'n' + nid, - 'label': getLabelCbk(elem), - 'uuid': elem.id, - 'size': 3, - 'x': Math.random(), - 'y': Math.random(), - 'color': getNodeColor(srcDesc), - 'elemType': srcDesc - }; - - nid += 1; - return obj; - }); - - return nodes; - }, - getLinks = function(data, srcNodes, targetNodes, fromDesc, toDesc) { - var findByUUID = function(array, uuid) { - return array.filter(function(elem) { - return elem.uuid === uuid; - })[0]; - }; - - var links = data.map(function(elem) { - var obj = null, - src = findByUUID(srcNodes, elem.id), - trg = findByUUID(targetNodes, elem.parent); - - if(src && trg) { - obj = { - 'id': 'e' + lid, - 'source': src.id, - 'target': trg.id, - 'color': getLinkColor(fromDesc, toDesc) - }; - lid += 1; - } - - return obj; - }).filter(function(elem) { - return elem !== null; - }); - - return links; - }; - - restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId); - - restObj.get().then(function(data) { - var l2FloodNodes = getNodes(data.tenant[0]['l2-flood-domain'] || [], GBPConstants.strings.flood, getL2L3Label), - l2BridgeNodes = getNodes(data.tenant[0]['l2-bridge-domain'] || [], GBPConstants.strings.bridge, getL2L3Label), - l3ContextNodes = getNodes(data.tenant[0]['l3-context'] || [], GBPConstants.strings.l3ctx, getL2L3Label), - subnetNodes = getNodes(data.tenant[0]['subnet'] || [], GBPConstants.strings.subnet, getSubnetLabel), - l2FloodLinks = getLinks(data.tenant[0]['l2-flood-domain'] || [], l2FloodNodes, l2BridgeNodes, GBPConstants.strings.flood, GBPConstants.strings.bridge), - l2BridgeLinks = getLinks(data.tenant[0]['l2-bridge-domain'] || [], l2BridgeNodes, l3ContextNodes, GBPConstants.strings.bridge, GBPConstants.strings.l3ctx), - subnetLinks = getLinks(data.tenant[0]['subnet'] || [], subnetNodes, l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes), GBPConstants.strings.subnet, ''), - allNodes = l2BridgeNodes.concat(l2FloodNodes).concat(l3ContextNodes).concat(subnetNodes), - allLinks = l2BridgeLinks.concat(l2FloodLinks).concat(subnetLinks); - - successCbk(allNodes, allLinks); - }, function(res) { - errorCbk(res.data, res.status); - }); - }; - - tdl.getClassifierInstances = function() { - - }; - - return tdl; - }); - - gbpOld.register.factory('TopoServices', function(TopologyDataLoaders, MockServices, GBPConstants) { - - var ts = {}; - - var loaders = {}; - - var legends = {}; - - var transformPGNTopoNodes = function(data) { - return data.output['endpoint-group'].map(function(d) { - return { - id: d.id, - group: d.name, - sgt: d['security-group-tag'] - }; - }); - }; - - var transformPGNTopoLinks = function(data) { - return data.output['endpoint-group-pair-with-rules'].map(function(d) { - return { - source: d['provider-group-id'], - target: d['consumer-group-id'], - policy: d['group-rule'][0]['action-ref'].map(function(r) { - return r.name; - }) - }; - }); - }; - - var gbpLegend = { - 'epg' : GBPConstants.colors[GBPConstants.strings.sigmaTopoDefault] - }; - - legends[GBPConstants.strings.empty] = {}; - legends[GBPConstants.strings.config] = gbpLegend; - legends[GBPConstants.strings.oper] = gbpLegend; - legends[GBPConstants.strings.mock] = gbpLegend; - legends[GBPConstants.strings.l2l3] = { - 'l2-flood': GBPConstants.colors[GBPConstants.strings.flood], - 'l2-bridge': GBPConstants.colors[GBPConstants.strings.bridge], - 'l3-context': GBPConstants.colors[GBPConstants.strings.l3ctx], - 'subnet': GBPConstants.colors[GBPConstants.strings.subnet], - 'link': GBPConstants.colors[GBPConstants.strings.subnet+'-'] - }; - - loaders[GBPConstants.strings.empty] = function(successCbk, errorCbk) { - successCbk([], []); - }; - - loaders[GBPConstants.strings.config] = function(successCbk, errorCbk, args) { - var storage = args.storage || 'config', - tenantId = args.tenantId; - - - TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){ - var topo = TopologyDataLoaders.getEpgTopo(data); - successCbk(topo.nodes, topo.links); - //successCbk - }, errorCbk); - }; - - loaders[GBPConstants.strings.oper] = function(successCbk, errorCbk, args) { - var storage = args.storage || 'config', - tenantId = args.tenantId; - - TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, tenantId, function(data){ - var topo = TopologyDataLoaders.getEpgTopo(data); - successCbk(topo.nodes, topo.links); - //successCbk - }, errorCbk); - }; - - loaders[GBPConstants.strings.l2l3] = function(successCbk, errorCbk, args) { - var storage = args.storage || 'config', - tenantId = args.tenantId; - - if(storage && tenantId) { - TopologyDataLoaders.getL2L3(storage, tenantId, successCbk, errorCbk); - } else { - //different kind of error - errorCbk(); - } - }; - - loaders[GBPConstants.strings.mock] = function(successCbk, errorCbk) { - var data = MockServices.mockTopoData(); - successCbk(data.nodes, data.links); - }; - - ts.getConsProvLabel = function(edge, topo){ - var provName = '', - conName = ''; - - topo.nodes.forEach(function(n){ - - if ( edge.source === n.id ) { - provName = n.name; - } - - if ( edge.target === n.id ) { - conName = n.name; - } - }); - - return provName + ':' + conName; - }; - - ts.getLegend = function(type) { - if(type === null || legends.hasOwnProperty(type) === false) { - type = GBPConstants.strings.empty; - } - - return legends[type]; - }; - - ts.loadTopology = function(type, successCbk, errorCbk, args) { - if(type === null || loaders.hasOwnProperty(type) === false) { - type = GBPConstants.strings.empty; - } - - loaders[type](successCbk, errorCbk, args); - }; - - return ts; - }); - - gbpOld.register.factory('GPBServices', function(GBPRestangular) { - - var s = {}; - - s.getDefinitions = function(successCbk, errorCbk) { - var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions'); - - restObj.get().then(function(data) { - if(data['subject-feature-definitions']) { - var classifiersDefs = data['subject-feature-definitions']['classifier-definition'] || [], - actionsDefs = data['subject-feature-definitions']['action-definition'] || []; - successCbk(classifiersDefs, actionsDefs); - } else { - //TODO log error - } - }, function(res) { - // errorCbk(res); - }); - }; - - s.getServiceFunctionChains = function(successCbk, errorCbk) { - var restObj = GBPRestangular.one('restconf').one('config').one('service-function-chain:service-function-chains'); - - restObj.get().then(function(data) { - if(data['service-function-chains']) { - successCbk(data['service-function-chains']['service-function-chain']); - } else { - //TODO log error - } - }, function(res) { - // errorCbk(res); - }); - }; - - s.getUUIDnumber = function() { - var d = new Date().getTime(); - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (d + Math.random()*16)%16 | 0; - d = Math.floor(d/16); - return (c=='x' ? r : (r&0x3|0x8)).toString(16); - }); - }; - - s.createRestObj = function(storage) { - storage = storage || 'config'; - restObj = GBPRestangular.one('restconf').one(storage); - - return restObj; - }; - - s.send = function(restObj, reqData, successCbk, errorCbk) { - restObj.customPUT(reqData).then(function(data) { - successCbk(data); - }, function(res) { - errorCbk(res.data, res.status); - }); - }; - - s.post = function(restObj, reqData, successCbk, errorCbk) { - restObj.customPOST(reqData).then(function(data) { - successCbk(data); - }, function(res) { - errorCbk(res.data, res.status); - }); - }; - - s.delete = function(restObj, successCbk, errorCbk) { - restObj.remove().then(function(data) { - successCbk(data); - }, function(res) { - errorCbk(res.data, res.status); - }); - }; - - s.load = function(restObj, transformCallback, successCbk, errorCbk) { - restObj.get().then(function(data) { - var objs = transformCallback(data) || []; - successCbk(objs); - }, function(res) { - errorCbk(res.data, res.status); - }); - }; - - s.stripNullValues = function(obj) { - Object.keys(obj).forEach(function(k) { - if(obj[k] === null) { - delete obj[k]; - } - }); - - return obj; - }; - - s.removeEmptyElementsFromList = function(list) { - return list.filter(function(e) { - return e !== ""; - }); - }; - - s.createParamObj = function(name, type, value) { - var obj = { name: name }; - - obj[type+'-value'] = value; - - return obj; - }; - - s.getInstanceParamValue = function(param) { - return param['int-value'] || param['string-value'] || param['range-value']; - }; - - s.getDefinitionObjParams = function(defObj, id) { - var obj = defObj.filter(function(def) { - return def.id === id; - })[0], - params = (obj && obj.parameter) ? obj.parameter : []; - - return params; - - }; - - s.getPropFromListByProp = function(list, propSrc, targetValue, propDst) { - var output = null, - selectedObj = list.filter(function(e) { - return e[propSrc] === targetValue; - })[0]; - - if(selectedObj) { - if(propDst) { - output = selectedObj[propDst]; - } else { - output = selectedObj; - } - } - - return output; - }; - - return s; - - }); - - gbpOld.register.factory('GBPGovernanceServices', function(TopologyDataLoaders) { - var s = {}; - - var subjectInList = function(subjectName, subjectList) { - return subjectList.some(function(s) { - return s.name === subjectName; - }); - }; - - var EPG = function(epgId, tenantId) { - this.id = epgId; - this.tenantId = tenantId; - }; - - var Subject = function(name) { - this.name = name; - this.rules = []; - this.providers = []; - this.consumers = []; - - this.addProvider = function(providingEpg) { - if(this.providers.indexOf(providingEpg) === -1) { - this.providers.push(providingEpg); - } - }; - - this.addConsumer = function(consumingEpg) { - if(this.consumers.indexOf(consumingEpg) === -1) { - this.consumers.push(consumingEpg); - } - }; - - this.addRule = function(rule, classifierInstances) { - if(rule['classifier-ref'] && rule['classifier-ref'].length > 0) { - - rule['classifier-ref'].forEach(function(cr) { - //cr['parameters'] = []; - classifierInstances.forEach(function(ci) { - if(ci['name'] === cr['instance-name']) { - cr['parameters'] = ci['parameter-value']; - } - }); - }); - } - - this.rules.push(rule); - }; - }; - - var addEpg = function(epgList, epgId, tenantId) { - var addedEpg = null; - - if(epgList.some(function(epg) { - return epg.id === epgId && epg.tenantId === tenantId; - }) === false) { - addedEpg = new EPG(epgId, tenantId); - } - - if(addedEpg !== null) { - epgList.push(addedEpg); - } - - return addedEpg; - }, - addSubject = function(subject, subjects, providerEpg, consumerEpg, classifierInstances) { - //console.log('classifierInstances:', classifierInstances); - var existingSubject = subjects.filter(function(s) { - return s.name === subject.name; - })[0], - newSubject = (existingSubject === undefined); - - if(newSubject) { - existingSubject = new Subject(subject.name); - } - - existingSubject.addProvider(providerEpg); - existingSubject.addConsumer(consumerEpg); - - if(subject['ui-rule'] && subject['ui-rule'].length > 0) { - subject['ui-rule'].forEach(function(r) { - existingSubject.addRule(r, classifierInstances); - }); - } - - if(newSubject) { - subjects.push(existingSubject); - } - }, - processPairData = function(providers, consumers, subjects, pairData, classifierInstances) { - addEpg(providers, pairData['provider-endpoint-group-id'], pairData['provider-tenant-id']); - addEpg(consumers, pairData['consumer-endpoint-group-id'], pairData['consumer-tenant-id']); - - pairData['ui-subject'].forEach(function(s) { - addSubject(s, subjects, pairData['provider-endpoint-group-id'], pairData['consumer-endpoint-group-id'], classifierInstances); - }); - }; - - s.getEPGsAndSubjects = function(tenantId, classifierInstances, successCbk, errorCbk) { - TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, - function(data) { - var epgPairs = data.output['endpoint-group-pair-with-subject'], - consumers = [], - providers = [], - subjects = []; - - if(epgPairs) { - epgPairs.forEach(function(p) { - processPairData(providers, consumers, subjects, p, classifierInstances); - }); - } - - successCbk({providers: providers, consumers: consumers, subjects: subjects}); - }, - function() { - //TODO log error - }); - }; - - return s; - }); - - gbpOld.register.factory('GBPTenantServices', function(GPBServices) { - - var s = {}; - - var Tenant = function(id, name, description) { - this.id = id || GPBServices.getUUIDnumber(); - this.name = name || null; - this.description = description || null; - }; - - var createBaseRestObj = function() { - return GPBServices - .createRestObj().one('policy:tenants'); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj().one('tenant').one(pathObj.tenantId); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new Tenant(rawObj.id, rawObj.name, rawObj.description); - // }); - return rawData.tenants.tenant; - }; - - var createData = function(obj) { - return { tenant : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId) { - return { - tenantId: tenantId - }; - }; - - s.createObj = function() { - return new Tenant(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.modify = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(successCbk, errorCbk) { - var restObj = createBaseRestObj(); - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPContractServices', function(GPBServices) { - - var s = {}; - - var Contract = function(id, description, parent) { - this.id = id || GPBServices.getUUIDnumber(); - this.description = description || null; - this.parent = parent || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj().one('policy:tenants').one('tenant').one(pathObj.tenantId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('contract').one(pathObj.contractId); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new Contract(rawObj.id, rawObj.description); - // }); - return rawData.tenant[0].contract; - }; - - var createData = function(obj) { - return { contract : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, contractId) { - return { - tenantId: tenantId, - contractId: contractId - }; - }; - - s.createObj = function() { - return new Contract(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPClauseServices', function(GPBServices) { - - var s = {}; - - var Clause = function(name, subjectRefs) { - this.name = name || null; - this['subject-refs'] = subjectRefs || []; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId) - .one('contract').one(pathObj.contractId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('clause').one(pathObj.clauseId); - }; - - var transformCallback = function(rawData) { - var data = null, - clauseData = rawData.contract[0].clause; - - if(clauseData) { - data = clauseData.map(function(elem) { - if(elem.hasOwnProperty('subject-refs') === false) { - elem['subject-refs'] = []; - } - return elem; - }); - } - - return data; - }; - - var createData = function(obj) { - var o = GPBServices.stripNullValues(obj); - - if(o['subject-refs']) { - o['subject-refs'] = GPBServices.removeEmptyElementsFromList(o['subject-refs']); - } - - return { clause : [ o ] }; - }; - - s.createPathObj = function(tenantId, contractId, clauseId) { - return { - tenantId: tenantId, - contractId: contractId, - clauseId: clauseId - }; - }; - - s.createObj = function() { - return new Clause(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPSubjectServices', function(GPBServices) { - - var s = {}; - - var Subject = function(name, order) { - this.name = name || null; - this.order = order || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId) - .one('contract').one(pathObj.contractId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('subject').one(pathObj.subjectId); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new Subject(rawObj.name, rawObj.order); - // }); - return rawData.contract[0].subject; - }; - - var createData = function(obj) { - return { subject : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, contractId, subjectId) { - return { - tenantId: tenantId, - contractId: contractId, - subjectId: subjectId - }; - }; - - s.createObj = function() { - return new Subject(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPRuleServices', function(GPBServices) { - - var s = {}; - - var Rule = function(name, order) { - this.name = name || null; - this.order = order || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant') - .one(pathObj.tenantId).one('contract').one(pathObj.contractId) - .one('subject').one(pathObj.subjectId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('rule').one(pathObj.ruleId); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new Rule(rawObj.name, rawObj.order); - // }); - return rawData.subject[0].rule; - }; - - var createData = function(obj) { - return { rule : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, contractId, subjectId, ruleId) { - return { - tenantId: tenantId, - contractId: contractId, - subjectId: subjectId, - ruleId: ruleId - }; - }; - - s.createObj = function() { - return new Rule(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPClassifierRefsServices', function(GPBServices) { - - var s = {}; - - var ClassifierRef = function(name, direction, instanceName, connectionTracking) { - this.name = name || null; - this.direction = direction || null; - this['instance-name'] = instanceName || null; - this['connection-tracking'] = connectionTracking || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant') - .one(pathObj.tenantId).one('contract').one(pathObj.contractId) - .one('subject').one(pathObj.subjectId) - .one('rule').one(pathObj.ruleId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('classifier-ref').one(pathObj.classifierRefId); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new ClassifierRef(rawObj.name, rawObj.direction, rawObj['instance-name']); - // }); - return rawData.rule[0]['classifier-ref']; - }; - - var createData = function(obj) { - return { 'classifier-ref' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, contractId, subjectId, ruleId, classifierRefId) { - return { - tenantId: tenantId, - contractId: contractId, - subjectId: subjectId, - ruleId: ruleId, - classifierRefId: classifierRefId - }; - }; - - s.createObj = function() { - return new ClassifierRef(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPActionRefsServices', function(GPBServices) { - - var s = {}; - - var ActionRef = function(name, order, instanceName) { - this.name = name || null; - this.order = order || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant') - .one(pathObj.tenantId).one('contract').one(pathObj.contractId) - .one('subject').one(pathObj.subjectId) - .one('rule').one(pathObj.ruleId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('action-ref').one(pathObj.actionRefId); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new ActionRef(rawObj.name, rawObj.order); - // }); - return rawData.rule[0]['action-ref']; - }; - - var createData = function(obj) { - return { 'action-ref' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, contractId, subjectId, ruleId, actionRefId) { - return { - tenantId: tenantId, - contractId: contractId, - subjectId: subjectId, - ruleId: ruleId, - actionRefId: actionRefId - }; - }; - - s.createObj = function() { - return new ActionRef(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPL2FloodDomainServices', function(GPBServices) { - - var s = {}; - - var L2FloodDomain = function(id, name, description, parent) { - this.id = id || GPBServices.getUUIDnumber(); - this.name = name || null; - this.description = description || null; - this.parent = parent || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('l2-flood-domain').one(pathObj.l2FloodDomain); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new L2FloodDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent); - // }); - return rawData.tenant[0]['l2-flood-domain']; - }; - - var createData = function(obj) { - return { 'l2-flood-domain' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, l2FloodDomain) { - return { - tenantId: tenantId, - l2FloodDomain: l2FloodDomain - }; - }; - - s.createObj = function() { - return new L2FloodDomain(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPL2BridgeDomainServices', function(GPBServices) { - - var s = {}; - - var L2BridgeDomain = function(id, name, description, parent) { - this.id = id || GPBServices.getUUIDnumber(); - this.name = name || null; - this.description = description || null; - this.parent = parent || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant') - .one(pathObj.tenantId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('l2-bridge-domain').one(pathObj.l2BridgeDomain); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new L2BridgeDomain(rawObj.id, rawObj.name, rawObj.description, rawObj.parent); - // }); - return rawData.tenant[0]['l2-bridge-domain']; - }; - - var createData = function(obj) { - return { 'l2-bridge-domain' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, l2BridgeDomain) { - return { - tenantId: tenantId, - l2BridgeDomain: l2BridgeDomain - }; - }; - - s.createObj = function() { - return new L2BridgeDomain(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPL3ContextServices', function(GPBServices) { - - var s = {}; - - var L3Context = function(id, name, description) { - this.id = id || GPBServices.getUUIDnumber(); - this.name = name || null; - this.description = description || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('l3-context').one(pathObj.l3Context); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new L3Context(rawObj.id, rawObj.name, rawObj.description); - // }); - return rawData.tenant[0]['l3-context']; - }; - - var createData = function(obj) { - return { 'l3-context' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, l3Context) { - return { - tenantId: tenantId, - l3Context: l3Context - }; - }; - - s.createObj = function() { - return new L3Context(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPSubnetServices', function(GPBServices) { - - var s = {}; - - var Subnet = function(id, name, description, parent, ipPrefix, virtualRouterIp) { - this.id = id || GPBServices.getUUIDnumber(); - this.name = name || null; - this.description = description || null; - this.parent = parent || null; - this['ip-prefix'] = ipPrefix || null; - this['virtual-router-ip'] = virtualRouterIp || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('subnet').one(pathObj.subnet); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new L3Context(rawObj.id, rawObj.name, rawObj.description); - // }); - return rawData.tenant[0]['subnet']; - }; - - var createData = function(obj) { - return { 'subnet' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, subnet) { - return { - tenantId: tenantId, - subnet: subnet - }; - }; - - s.createObj = function() { - return new Subnet(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPGatewayServices', function(GPBServices) { - - var s = {}; - - var Gateway = function(gateway) { - this.gateway = gateway || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('gateways').one(pathObj.gateway); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new L3Context(rawObj.id, rawObj.name, rawObj.description); - // }); - return rawData.subnet[0]['gateways']; - }; - - var createData = function(obj) { - return { 'gateways' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, subnetId, gateway) { - return { - tenantId: tenantId, - subnetId: subnetId, - gateway: gateway - }; - }; - - s.createObj = function() { - return new Gateway(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPPrefixServices', function(GPBServices) { - - var s = {}; - - var Prefix = function(prefix) { - this.prefix = prefix || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subnet').one(pathObj.subnetId).one('gateways').one(pathObj.gatewayId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('prefixes').one(pathObj.prefixId); - }; - - var transformCallback = function(rawData) { - // return rawData.map(function(rawObj){ - // return new L3Context(rawObj.id, rawObj.name, rawObj.description); - // }); - return rawData.gateways[0].prefixes; - }; - - var createData = function(obj) { - return { 'prefixes' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, subnetId, gatewayId, prefixId) { - return { - tenantId: tenantId, - subnetId: subnetId, - gatewayId: gatewayId, - prefixId: prefixId ? prefixId.replace("/", "%2F") : prefixId - }; - }; - - s.createObj = function() { - return new Prefix(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPClassifierInstanceServices', function(GPBServices) { - - var s = {}; - - var ClassifierService = function(name, classifierDefId) { - this.name = name || null; - this['classifier-definition-id'] = classifierDefId || null; - this['parameter-value'] = []; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances'); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('classifier-instance').one(pathObj.classfierInstanceId); - }; - - var transformCallback = function(rawData) { - return rawData['subject-feature-instances']['classifier-instance']; - }; - - var createData = function(obj) { - return { 'classifier-instance' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, classfierInstanceId) { - return { - tenantId: tenantId, - classfierInstanceId: classfierInstanceId - }; - }; - - s.createObj = function() { - return new ClassifierService(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPActionInstanceServices', function(GPBServices) { - - var s = {}; - - var ActionService = function(name, actionDefId) { - this.name = name || null; - this['action-definition-id'] = actionDefId || null; - this['parameter-value'] = []; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('subject-feature-instances'); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('action-instance').one(pathObj.actionInstanceId); - }; - - var transformCallback = function(rawData) { - return rawData['subject-feature-instances']['action-instance']; - }; - - var createData = function(obj) { - return { 'action-instance' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, actionInstanceId) { - return { - tenantId: tenantId, - actionInstanceId: actionInstanceId - }; - }; - - s.createObj = function() { - return new ActionService(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - s.getDefinitions = function(successCbk, errorCbk) { - var restObj = GBPRestangular.one('restconf').one('operational').one('policy:subject-feature-definitions'); - - restObj.get().then(function(data) { - successCbk(data['subject-feature-definitions']['action-definition']); - }, function(res) { - // errorCbk(res); - }); - }; - - return s; - - }); - - gbpOld.register.factory('GBPEpgServices', function(GPBServices) { - - var s = {}; - - var EPG = function(name, description, intraGroupPolicy, networkDomain, id, parent) { - this.id = id || GPBServices.getUUIDnumber(); - this.name = name || null; - this.description = description || null; - this['intra-group-policy'] = intraGroupPolicy || null; - this['network-domain'] = networkDomain || null; - this.parent = parent || null; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('endpoint-group').one(pathObj.epgId); - }; - - var transformCallback = function(rawData) { - return rawData.tenant[0]['endpoint-group']; - }; - - var createData = function(obj) { - return { 'endpoint-group' : [ GPBServices.stripNullValues(obj) ] }; - }; - - s.createPathObj = function(tenantId, epgId) { - return { - tenantId: tenantId, - epgId: epgId - }; - }; - - s.createObj = function() { - return new EPG(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPConNamedSelServices', function(GPBServices) { - - var s = {}; - - var ConsumerNamedSelector = function(name, contract) { - this.name = name || null; - this.contract = contract || []; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('consumer-named-selector').one(pathObj.cnsId); - }; - - var transformCallback = function(rawData) { - var data = null, - consumerData = rawData['endpoint-group'][0]['consumer-named-selector']; - - if(consumerData) { - data = consumerData.map(function(elem) { - if(elem.hasOwnProperty('contract') === false) { - elem.contract = []; - } - return elem; - }); - } - - return data; - }; - - var createData = function(obj) { - var o = GPBServices.stripNullValues(obj); - - if(o.contract) { - o.contract = GPBServices.removeEmptyElementsFromList(o.contract); - } - - return { 'consumer-named-selector' : [ o ] }; - }; - - s.createPathObj = function(tenantId, epgId, cnsId) { - return { - tenantId: tenantId, - epgId: epgId, - cnsId: cnsId - }; - }; - - s.createObj = function() { - return new ConsumerNamedSelector(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - - gbpOld.register.factory('GBPProNamedSelServices', function(GPBServices) { - - var s = {}; - - var ProviderNamedSelector = function(name, contract) { - this.name = name || null; - this.contract = contract || []; - }; - - var createBaseRestObj = function(pathObj) { - return GPBServices.createRestObj() - .one('policy:tenants').one('tenant').one(pathObj.tenantId).one('endpoint-group').one(pathObj.epgId); - }; - - var createRestObj = function(pathObj) { - return createBaseRestObj(pathObj).one('provider-named-selector').one(pathObj.cnsId); - }; - - var transformCallback = function(rawData) { - var data = null, - provderData = rawData['endpoint-group'][0]['provider-named-selector']; - - if(provderData) { - data = provderData.map(function(elem) { - if(elem.hasOwnProperty('contract') === false) { - elem.contract = []; - } - return elem; - }); - } - - return data; - }; - - var createData = function(obj) { - var o = GPBServices.stripNullValues(obj); - - if(o.contract) { - o.contract = GPBServices.removeEmptyElementsFromList(o.contract); - } - - return { 'provider-named-selector' : [ o ] }; - }; - - s.createPathObj = function(tenantId, epgId, cnsId) { - return { - tenantId: tenantId, - epgId: epgId, - cnsId: cnsId - }; - }; - - s.createObj = function() { - return new ProviderNamedSelector(); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path), - reqData = createData(obj); - - GPBServices.send(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, successCbk, errorCbk) { - var restObj = createRestObj(path); - - GPBServices.delete(restObj, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = createBaseRestObj(path); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPEndpointServices', function(GPBServices) { - - var s = {}; - - var Endpoint = function(tenantId) { - this.tenant = tenantId || null; - this['network-containment'] = null; - this['endpoint-group'] = null; - this['endpoint-groups'] = []; - this.condition = []; - this['l2-context'] = null; - this['mac-address'] = null; - this['l3-address'] = []; - }; - - var createRestObj = function() { - return GPBServices.createRestObj('operations'); - }; - - var transformCallback = function(rawData) { - return rawData.endpoints.endpoint; - }; - - var createBaseData = function(obj) { - var o = GPBServices.stripNullValues(obj); - - if(o.condition) { - o.condition = GPBServices.removeEmptyElementsFromList(o.condition); - } - - if(o['endpoint-groups']) { - o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']); - } - - if(o['l3-address']) { - o['l3-address'] = GPBServices.removeEmptyElementsFromList(o['l3-address']); - } - - return o; - }; - - var createSendData = function(obj) { - var o = createBaseData(obj); - return { 'input': o }; - }; - - var createDeleteData = function(obj) { - var o = { - 'input': { - 'l3': obj['l3-address'], - 'l2': [ - { - 'l2-context': obj['l2-context'], - 'mac-address': obj['mac-address'] - } - ] - } - }; - - return o; - }; - - s.createObj = function(tenantId) { - return new Endpoint(tenantId); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj().one('endpoint:register-endpoint'), - reqData = createSendData(obj); - - GPBServices.post(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path).one('endpoint:unregister-endpoint'), - reqData = createDeleteData(obj); - GPBServices.post(restObj, reqData, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints'); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('GBPEndpointL3Services', function(GPBServices) { - - var s = {}; - - var EndpointL3 = function(tenantId) { - this.tenant = tenantId || null; - this['endpoint-group'] = null; - this['endpoint-groups'] = []; - this.condition = []; - this['l3-context'] = null; - this['ip-prefix'] = null; - this['endpoint-l2-gateways'] = []; - this['endpoint-l3-gateways'] = []; - }; - - var createRestObj = function() { - return GPBServices.createRestObj('operations'); - }; - - var transformCallback = function(rawData) { - return rawData.endpoints['endpoint-l3-prefix']; - }; - - var createBaseData = function(obj) { - var o = GPBServices.stripNullValues(obj); - - if(o.condition) { - o.condition = GPBServices.removeEmptyElementsFromList(o.condition); - } - - if(o['endpoint-groups']) { - o['endpoint-groups'] = GPBServices.removeEmptyElementsFromList(o['endpoint-groups']); - } - - if(o['endpoint-l2-gateways']) { - o['endpoint-l2-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l2-gateways']); - } - - if(o['endpoint-l3-gateways']) { - o['endpoint-l3-gateways'] = GPBServices.removeEmptyElementsFromList(o['endpoint-l3-gateways']); - } - - return o; - }; - - var createSendData = function(obj) { - var o = createBaseData(obj); - return { 'input': o }; - }; - - var createDeleteData = function(obj) { - var o = { - 'input': { - 'l3-prefix': [ - { - 'l3-context': obj['l3-context'], - 'ip-prefix': obj['ip-prefix'] - } - ], - 'l2': obj['endpoint-l2-gateways'], - 'l3': obj['endpoint-l3-gateways'] - } - }; - - return o; - }; - - s.createObj = function(tenantId) { - return new EndpointL3(tenantId); - }; - - s.send = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj().one('endpoint:register-l3-prefix-endpoint'), - reqData = createSendData(obj); - - GPBServices.post(restObj, reqData, successCbk, errorCbk); - }; - - s.delete = function(path, obj, successCbk, errorCbk) { - var restObj = createRestObj(path).one('endpoint:unregister-endpoint'), - reqData = createDeleteData(obj); - - GPBServices.post(restObj, reqData, successCbk, errorCbk); - }; - - s.load = function(path, successCbk, errorCbk) { - var restObj = GPBServices.createRestObj('operational').one('endpoint:endpoints'); - - GPBServices.load(restObj, transformCallback, successCbk, errorCbk); - }; - - return s; - - }); - - gbpOld.register.factory('PGNServices', function(GBPRestangular) { - - var s = {}; - - var idGetter = {}; - - var idTypes = { - tenant: 'TENANT', - uuid: 'UUID', - l3ctx: 'L3CTX', - pathAction: 'PATHACTION', - accessAction: 'ACCESSACTION' - }; - - idGetter[idTypes.tenant] = function() { - return 1; - }; - - idGetter[idTypes.uuid] = function() { - return 2; - }; - - idGetter[idTypes.l3ctx] = function() { - return 3; - }; - - idGetter[idTypes.pathAction] = function() { - return 4; - }; - - idGetter[idTypes.accessAction] = function() { - return 5; - }; - - var getId = function(type) { - if(idGetter.hasOwnProperty(type)) { - return id = idGetter[type](); - } else { - throw "Cannot get idGetter for type " + type; - } - }; - - s.addReplaceEndpointGroup = function(successCbk, errorCbk, groupName, sgt, description) { - var tenantId = getId(idTypes.tenant), - uuid = getId(idTypes.uuid), - restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'pgn-application:create-or-replace-endpoint-groups', - reqData = { - "input": - { - "endpoint-group":[ - { - "pgn-application:tenant-id": tenantID, - "pgn-application:id":uuid, - "pgn-application:security-group-tag":sgt, - "pgn-application:name":groupName, - "pgn-application:description":description - } - ] - } - }; - - restObj.post(rpcRes, reqData).then(function(data) { - successCbk(data); - }, function(res) { - errorCbk(res); - }); - }; - - s.deleteEndpointGroup = function(successCbk, errorCbk, uuid) { - var tenantId = getId(idTypes.tenant), - restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'pgn-application:delete-endpoint-groups', - reqData = { - "input": { - "endpoint-group":[ - { - "pgn-application:tenant-id": tenantId, - "pgn-application:id":uuid - } - ] - } - }; - - restObj.post(rpcRes, reqData).then(function(data) { - successCbk(data); - }, function(res) { - errorCbk(res); - }); - }; - - s.getActions = function(successCbk, errorCbk) { - var tenantId = getId(idTypes.tenant), - pathActionId = getId(idTypes.pathAction), - accessActionId = getId(idTypes.accessAction), - restObj = GBPRestangular.one('restconf').one('config').one('policy:tenants', tenantId).one('subject-feature-instances'); - - restObj.get().then(function(data) { - successCbk(data); //TODO fill actions - }, function(res) { - errorCbk(res); - }); - }; - - s.applyPolicy = function(successCbk, errorCbk, providerId, consumerId, pathSelRule, accessCtrlRule) { - var restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'pgn-application:wire-endpoint-groups', - actionRefName = (pathSelRule ? pathSelRule : '') + (accessCtrlRule ? accessCtrlRule : ''), - reqData = { - "input": { - "endpoint-group-pair-with-rules": { - "pgn-application:provider-tenant-id": tenantID, - "pgn-application:consumer-tenant-id": tenantID, - "pgn-application:provider-group-id":providerId, - "pgn-application:consumer-group-id":consumerId, - "pgn-application:group-rule": [ - { - "action-ref": [pathSelRule, accessCtrlRule].map(function(r) { - return { "name":r }; - }), - "name":actionRefName - } - ] - } - } - }; - - restObj.post(rpcRes, reqData).then(function(data) { - successCbk(data); //TODO reload policies - }, function(res) { - errorCbk(res); - }); - }; - - s.deletePolicy = function(successCbk, errorCbk, providerId, consumerId) { - var tenantId = getId(idTypes.tenant), - restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'pgn-application:unwire-endpoint-groups', - reqData = { - "input": - { - "endpoint-group-pair":[ - { - "pgn-application:provider-tenant-id": tenantId, - "pgn-application:consumer-tenant-id": tenantId, - "pgn-application:provider-group-id":providerId, - "pgn-application:consumer-group-id":consumerId - } - ] - } - }; - - restObj.post(rpcRes, reqData).then(function(data) { - successCbk(data); //TODO reload policies - }, function(res) { - errorCbk(res); - }); - }; - - s.addEndPoint = function(successCbk, errorCbk, ipAddress, groupId) { - var l3ctxId = getId(idTypes.l3ctx), - tenantId = getId(idTypes.tenant), - restObj = GBPRestangular.one('restconf').one('operations'), - rpcRes = 'endpoint:register-endpoint', - reqData = { - "input": { - "endpoint-group": groupId, - "l3-address": [ - { - "ip-address": ipAddress, - "l3-context": l3ctxId - } - ], - "tenant": tenantId - } - }; - - restObj.post(rpcRes, reqData).then(function(data) { - successCbk(data); - }, function(res) { - errorCbk(res); - }); - }; - - s.getUUIDnumber = function() { - var d = new Date().getTime(); - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (d + Math.random()*16)%16 | 0; - d = Math.floor(d/16); - return (c=='x' ? r : (r&0x3|0x8)).toString(16); - }); - }; - - return s; - }); - - gbpOld.register.factory('DesignGbpFactory', function(){ - - var dvf = {}; - - dvf.setMainClass = function(){ - if ( $('.gbpWrapper').length ) { - $('.gbpWrapper').closest('.col-xs-12').addClass('gbpGlobalWrapper'); - } - }; - - return dvf; - - }); - - gbpOld.register.factory('JointGraphOffsetFactory', function(GBPConstants){ - var jgof = {}; - - jgof.createWHObj = function(w, h) { - return {w: w || 0, h: h || 0}; - }; - - jgof.updateOffsets = function(delta, offset, margin, maximums, paper) { - offset.w = offset.w + delta.w + margin.w; - - if(offset.w >= maximums.w) { - paper.setDimensions(offset.w + 30, paper.options.height); - offset.w = offset.ow; - offset.h = offset.h + margin.h; - } - - }; - - jgof.resetOffsets = function(offset, w, h) { - offset.w = w; - offset.h = h; - }; - - jgof.getCurrentOffset = function(array, type) { - var max = 0; - array.forEach(function(item){ - max = item.attributes.position[type] > max ? item.attributes.position[type] : max; - }); - - return max; - }; - - jgof.checkObjsHoffsets = function(array, size, paper) { - var lastPosY = 0, - addOffset = false, - cellBottomOffset = 80, - setItemPosition = function(item, type) { - while (item.attributes.position[type] < size + cellBottomOffset) { - item.translate(null, cellBottomOffset); - } - }; - - array.forEach(function(item){ - addOffset = (size + cellBottomOffset) >= item.attributes.position.y; - - if ( addOffset ) { - setItemPosition(item, 'y'); - } - - if ( item.attributes.position.y + cellBottomOffset > paper.options.height ) { - paper.setDimensions(paper.options.width, paper.options.height + cellBottomOffset); - } - }); - }; - - return jgof; - }); - - gbpOld.register.factory('JointGraphFactory', function(GBPConstants){ - var defaulColor = 'blue'; - - var jgf = {}; - - jgf.getLabelLength = function(length) { - return length * 10 > 200 ? 200 : length * 10; - }; - - jgf.createGraph = function() { - var graph = new joint.dia.Graph(); - - var paper = new joint.dia.Paper({ - el: $('#graph'), - width: 1300, - height: 650, - model: graph, - gridSize: 1, - interactive: { vertexAdd: false } - }); - - return paper; - }; - - jgf.resetGraphDimension = function(paper, element, paddingT, paddingL){ - paddingT = paddingT ? paddingT : 0; - paddingL = paddingL ? paddingL : paddingT; - - var paperWidth = element.width() - paddingL, - paperHeight = element.height() - paddingT - 5; - - paper.setDimensions(paperWidth, paperHeight); - }; - - jgf.reloadGraph = function(graph) { - graph.clear(); - }; - - jgf.createElement = function(elementName, posx, posy, width, height, objectType, object, tooltip, bgcolor, titleName) { - var setWidth = function(width) { - return width < GBPConstants.jointElements.minWidth ? GBPConstants.jointElements.minWidth : - width > GBPConstants.jointElements.maxWidth ? GBPConstants.jointElements.maxWidth : width; - }; - - var setHeight = function(height) { - return height < GBPConstants.jointElements.minHeight ? GBPConstants.jointElements.minHeight : - height > GBPConstants.jointElements.maxHeight ? GBPConstants.jointElements.maxHeight : height; - }; - - // joint.shapes.basic.Rect = joint.shapes.basic.Generic.extend({ - joint.shapes.html = {}; - joint.shapes.html.Element = joint.shapes.basic.Generic.extend({ - - markup: '</g><text class="text1"></text><text class="text2"></text><title /></g>', - - defaults: joint.util.deepSupplement({ - type: 'html.Element', - attrs: { - 'rect': { fill: bgcolor, stroke: 'black', 'follow-scale': true, width: 80, height: 40, cursor: 'pointer' }, - '.text1': { ref: 'rect', 'ref-x': 0.5, 'ref-y': 0.3, 'y-alignment': 'middle', 'x-alignment': 'middle', cursor: 'pointer', 'font-weight' : 'bold'}, - '.text2': { ref: 'rect', 'ref-x': 0.5, 'ref-y': 0.7, 'y-alignment': 'middle', 'x-alignment': 'middle', cursor: 'pointer'}, - 'title': {text: tooltip}, - } - - }, joint.shapes.basic.Generic.prototype.defaults) - }); - - // joint.shapes.html.ElementView = joint.dia.ElementView.extend({ - - // template: [ - // '<input class="html-element" type="text" value="'+elementName+'"/>', - // '' - // ].join(''), - - // initialize: function() { - // _.bindAll(this, 'updateBox'); - // joint.dia.ElementView.prototype.initialize.apply(this, arguments); - - // this.$box = $(_.template(this.template)()); - // // Prevent paper from handling pointerdown. - // this.$box.find('input,select').on('mousedown click', function(evt) { evt.stopPropagation(); }); - // // This is an example of reacting on the input change and storing the input data in the cell model. - // this.$box.find('input').on('change', _.bind(function(evt) { - // this.model.set('input', $(evt.target).val()); - // }, this)); - // this.$box.find('button').on('click', _.bind(function(evt) { - // this.model.set('button', $('.divc').css('display','block')); - // }, this)); - // // Update the box position whenever the underlying model changes. - // this.model.on('change', this.updateBox, this); - - // this.updateBox(); - // }, - // render: function() { - // joint.dia.ElementView.prototype.render.apply(this, arguments); - // this.paper.$el.prepend(this.$box); - // this.updateBox(); - // return this; - // }, - // updateBox: function() { - // // Set the position and dimension of the box so that it covers the JointJS element. - // var bbox = this.model.getBBox(); - // // Example of updating the HTML with a data stored in the cell model. - // this.$box.css({ width: bbox.width, height: bbox.height, left: bbox.x, top: bbox.y, transform: 'rotate(' + (this.model.get('angle') || 0) + 'deg)' }); - // }, - // removeBox: function(evt) { - // this.$box.remove(); - // } - // }); - - elementName = elementName.length > 20 ? elementName.slice(0,20) + '...' : elementName; - // width = width > 200 ? 200 : width; - - // return new joint.shapes.basic.Rect({ - return new joint.shapes.html.Element({ - position: { x: posx || 0, y: posy || 0 }, - size: { width: width || GBPConstants.jointElements.minWidth, height: height || GBPConstants.jointElements.minHeight }, - attrs: { rect: { fill: bgcolor }, '.text1': { fill: 'black', text: titleName}, '.text2': { fill: 'black', text: elementName }}, - objType: objectType, - objData: object - }); - }; - - jgf.transformElement = function(element, transformX, transformY) { - return element.translate(transformX, transformY); - }; - - jgf.addItem = function(graph, item) { - graph.addCells([item]); - }; - - jgf.addItemList = function(graph, listItem) { - graph.addCells(listItem); - }; - - jgf.createLink = function(srcId, targetId, colorIn, colorOut, direction, objData) { - colorIn = colorIn || defaulColor; - colorOut = colorOut || defaulColor; - - var labelTextColor = GBPConstants.colors[GBPConstants.strings.sigmaTopoDefaultText], - labelBckColor = GBPConstants.colors[GBPConstants.strings.linklabel]; - - var linkObj = { - source: { id: srcId }, - target: { id: targetId }, - attrs: { - '.connection': { stroke: colorIn, 'stroke-width': 2, name: 'normal' }, - '.connection-wrap': { 'stroke-width': 10 } - }, - objData: objData - }; - - if(direction === 'in' || direction == 'bidirectional' || direction === undefined || direction === null) { - linkObj.attrs['.marker-target'] = { fill: colorIn, d: 'M 10 0 L 0 5 L 10 10 z' }; - } - - if(direction === 'out' || direction == 'bidirectional') { - linkObj.attrs['.marker-source'] = { fill: colorOut, d: 'M 10 0 L 0 5 L 10 10 z' }; - } - - var link = new joint.dia.Link(linkObj); - - // if(labelText) { - // link.label(0, { position: 0.3, attrs: { text: { text: labelText, fill: labelTextColor }, rect: { stroke: labelBckColor, 'stroke-width': 20 }}}); - // } - - - return link; - }; - - return jgf; - }); - - gbpOld.register.factory('GBPJointGraphBuilder', function(GBPRestangular, GBPConstants, JointGraphFactory, JointGraphOffsetFactory, TopologyDataLoaders){ - var jgb = {}; - - var builders = {}; - - var buildJointData = function(paper, nodes, links) { - - }; - - var setOperConfigTopoData = function(paper, data){ - var topo = TopologyDataLoaders.getEpgTopo(data); - - var offsetObj = { - ow: 100, - oh: 100, - w: 100, - h: 100 - }, - marginObj = { - w: 50, - h: 80 - }, - offsetHobj = { - pEpg: 0, - cEpg: 0, - subject: 0 - }, - itemsArray = { - epg: [] - }, - linksArray = []; - - JointGraphFactory.resetGraphDimension(paper, $('.policyGraphWrapper')); - JointGraphFactory.reloadGraph(paper.model); - - var deg2rad = function(deg){ - return deg * Math.PI / 180; - }; - - var getXYInCircle = function(elementIndex, elementsCount, paperCenterX, paperCenterY, elementWidth, elementHeight){ - var result = {x:0, y:0}; - circleMargin = 100; - r = (paperCenterX < paperCenterY ? paperCenterX : paperCenterY ) - circleMargin; - degs = 360 / elementsCount * (elementIndex+1) + 180; - rads = deg2rad(degs); - - elementWidth = elementWidth ? elementWidth : GBPConstants.jointElements.minWidth; - elementHeight = elementHeight ? elementHeight : GBPConstants.jointElements.minHeight; - - if(elementWidth < GBPConstants.jointElements.minWidth){elementWidth = GBPConstants.jointElements.minWidth;} - if(elementWidth > GBPConstants.jointElements.maxWidth){elementWidth = GBPConstants.jointElements.maxWidth;} - if(elementHeight < GBPConstants.jointElements.minHeight){elementHeight = GBPConstants.jointElements.minHeight;} - if(elementHeight > GBPConstants.jointElements.maxHeight){elementHeight = GBPConstants.jointElements.maxHeight;} - - result.x = paperCenterX + r * Math.cos(rads); - result.y = paperCenterY + r * Math.sin(rads); - - degs = degs % 360; - if(degs > 90 && degs < 270){ - result.x = result.x - elementWidth; - } - if(degs == 90 || degs == 270){ - result.x = result.x - elementWidth / 2; - } - if(degs > 180 && degs < 360){ - result.y = result.y - elementHeight; - } - if(degs === 0 || degs == 180){ - result.y = result.y - elementHeight / 2; - } - return result; - }; - - var paperCenterX = (paper.options.width) / 2; - var paperCenterY = (paper.options.height) / 2; - topo.nodes.forEach(function(i, index){ - var label = i.label, - header = 'Epg', - width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length)), - color = GBPConstants.colors[GBPConstants.strings.epg]; - - var itemPos = getXYInCircle(index, topo.nodes.length, paperCenterX, paperCenterY, width, null); - var item = JointGraphFactory.createElement(label, itemPos.x, itemPos.y, width, null, GBPConstants.strings.epg , i, label, color, header); - - itemsArray.epg.push(item); - - // JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - }); - - var getItemById = function(id, array){ - var item = array.filter(function(i){ - return i.attributes.objData.id === id; - }); - - return item.length ? item[0] : null; - }; - - topo.links.forEach(function(l){ - var sourceItem = getItemById(l.source, itemsArray.epg), - targetItem = getItemById(l.target, itemsArray.epg); - - if (sourceItem && targetItem) { - var link = JointGraphFactory.createLink(sourceItem.id, targetItem.id, 'blue', 'green', l.direction, l.data); - linksArray.push(link); - } - }); - - JointGraphFactory.addItemList(paper.model, linksArray); - }; - - jgb.loadTopology = function(args, paper, type) { - if(type === null || builders.hasOwnProperty(type) === false) { - type = GBPConstants.strings.empty; - } - - builders[type](args, paper); - }; - - builders[GBPConstants.strings.empty] = function(args, paper) { - JointGraphFactory.reloadGraph(paper.model); - }; - - builders[GBPConstants.strings.config] = function(args, paper) { - var storage = args.storage || 'config', - tenantId = args.tenantId; - - - TopologyDataLoaders.getSubjectsBetweenEndpointGroups(false, tenantId, function(data){ - setOperConfigTopoData(paper, data); - }, function(){}); - }; - - builders[GBPConstants.strings.oper] = function(args, paper) { - var storage = args.storage || 'config', - tenantId = args.tenantId; - - TopologyDataLoaders.getSubjectsBetweenEndpointGroups(true, tenantId, function(data){ - setOperConfigTopoData(paper, data); - }, function(){}); - }; - - builders[GBPConstants.strings.l2l3] = function(args, paper) { - var storage = args.storage || 'config', - tenantId = args.tenantId; - - if(storage && tenantId) { - restObj = GBPRestangular.one('restconf').one(storage).one('policy:tenants').one('tenant').one(tenantId); - - restObj.get().then(function(data) { - var createLinks = function(srcList, srcItems, dstItems) { - var linkItems = srcList.map(function(srcObj) { - var linkItem = null; - if(srcObj.parent && dstItems[srcObj.parent]) { - linkItem = JointGraphFactory.createLink(srcItems[srcObj.id].id, dstItems[srcObj.parent].id, 'blue'); - } - return linkItem; - }).filter(function(linkObj) { - return linkObj !== null; - }); - - return linkItems; - }; - - var offsetObj = { - ow: 100, - oh: 100, - w: 100, - h: 100 - }, - marginObj = { - w: 50, - h: 80 - }, - itemsArray = { - l3: {}, - l2bridge: {}, - l2flood: {}, - subnets: {} - }; - - JointGraphFactory.reloadGraph(paper.model); - - data.tenant[0]['l3-context'].forEach(function(c, i) { - var label = c.name || c.id, - header = 'L3 context', - color = GBPConstants.colors[GBPConstants.strings.l3ctx], - width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length)); - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.l3ctx , c, null, color, header); - - itemsArray.l3[c.id] = item; - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - }); - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100); - - data.tenant[0]['l2-bridge-domain'].forEach(function(c, i) { - var label = c.name || c.id, - header = 'L2 bridge domain', - color = GBPConstants.colors[GBPConstants.strings.bridge], - width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length)); - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.bridge , c, null, color, header); - - itemsArray.l2bridge[c.id] = item; - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - }); - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100); - - data.tenant[0]['l2-flood-domain'].forEach(function(c, i) { - var label = c.name || c.id, - header = 'L2 flood domain', - color = GBPConstants.colors[GBPConstants.strings.flood], - width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length)); - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.flood , c, null, color, header); - - itemsArray.l2flood[c.id] = item; - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - }); - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h + 100); - - data.tenant[0]['subnet'].forEach(function(c, i) { - var label = c.name || c.id, - header = 'Subnet', - color = GBPConstants.colors[GBPConstants.strings.subnet], - width = Math.max(JointGraphFactory.getLabelLength(label.length), JointGraphFactory.getLabelLength(header.length)); - item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.strings.subnet , c, null, color, header); - - itemsArray.subnets[c.id] = item; - - JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper); - JointGraphFactory.addItem(paper.model, item); - }); - - JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.oh); - - var l2bridgeL3 = createLinks(data.tenant[0]['l2-bridge-domain'], itemsArray.l2bridge, itemsArray.l3); - JointGraphFactory.addItemList(paper.model, l2bridgeL3); - - var l2floodL2bridge = createLinks(data.tenant[0]['l2-flood-domain'], itemsArray.l2flood, itemsArray.l2bridge); - JointGraphFactory.addItemList(paper.model, l2floodL2bridge); - - var l2floodSubnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l2flood); - JointGraphFactory.addItemList(paper.model, l2floodSubnet); - - var l2bridgeSubnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l2bridge); - JointGraphFactory.addItemList(paper.model, l2bridgeSubnet); - - var l3Subnet = createLinks(data.tenant[0]['subnet'], itemsArray.subnets, itemsArray.l3); - JointGraphFactory.addItemList(paper.model, l3Subnet); - - }, function() { - - }); - } - }; - - - return jgb; - }); -}); diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/infinity-loop.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/infinity-loop.tpl.html deleted file mode 100644 index ce5dae81e..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/infinity-loop.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-down.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-down.tpl.html deleted file mode 100644 index 5b5c39240..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-down.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-right.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-right.tpl.html deleted file mode 100644 index 6bf8f5fbe..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-right.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-up.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-up.tpl.html deleted file mode 100644 index 644ed414a..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-arrow-up.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-close.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-close.tpl.html deleted file mode 100644 index 3ee169155..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-close.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-collapse-bits.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-collapse-bits.tpl.html deleted file mode 100644 index 5a8da8acd..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-collapse-bits.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-danger.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-danger.tpl.html deleted file mode 100644 index 9b78515aa..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-danger.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-expand-bits.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-expand-bits.tpl.html deleted file mode 100644 index 72e2e2905..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-expand-bits.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-fill-data.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-fill-data.tpl.html deleted file mode 100644 index 538696f79..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-fill-data.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-empty.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-empty.tpl.html deleted file mode 100644 index 42f68b432..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-empty.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-full-bck.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-full-bck.tpl.html deleted file mode 100644 index 64f626467..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-full-bck.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-full.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-full.tpl.html deleted file mode 100644 index 9a0b1ab52..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-filter-full.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-list-bck.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-list-bck.tpl.html deleted file mode 100644 index b75b1337b..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-list-bck.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-list.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-list.tpl.html deleted file mode 100644 index 81f60c5f0..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-list.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-next.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-next.tpl.html deleted file mode 100644 index ae692823b..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-next.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-plus.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-plus.tpl.html deleted file mode 100644 index 736e3a3e4..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-plus.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-prev.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-prev.tpl.html deleted file mode 100644 index 7cde9d888..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-prev.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-question.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-question.tpl.html deleted file mode 100644 index d0028e816..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-question.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-view.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-view.tpl.html deleted file mode 100644 index c1423a9de..000000000 Binary files a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/images/yang-ui-icons/icon-view.tpl.html and /dev/null differ diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/backbone-min.js b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/backbone-min.js deleted file mode 100644 index d2e95b434..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/backbone-min.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(t){var e=typeof self=="object"&&self.self==self&&self||typeof global=="object"&&global.global==global&&global;if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){e.Backbone=t(e,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore"),r;try{r=require("jquery")}catch(s){}t(e,exports,i,r)}else{e.Backbone=t(e,{},e._,e.jQuery||e.Zepto||e.ender||e.$)}})(function(t,e,i,r){var s=t.Backbone;var n=[];var a=n.slice;e.VERSION="1.2.0";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var o=e.Events={};var h=/\s+/;var u=function(t,e,r,s,n){var a=0,o;if(r&&typeof r==="object"){for(o=i.keys(r);a<o.length;a++){e=t(e,o[a],r[o[a]],n)}}else if(r&&h.test(r)){for(o=r.split(h);a<o.length;a++){e=t(e,o[a],s,n)}}else{e=t(e,r,s,n)}return e};o.on=function(t,e,i){return l(this,t,e,i)};var l=function(t,e,i,r,s){t._events=u(c,t._events||{},e,i,{context:r,ctx:t,listening:s});if(s){var n=t._listeners||(t._listeners={});n[s.id]=s}return t};o.listenTo=function(t,e,r){if(!t)return this;var s=t._listenId||(t._listenId=i.uniqueId("l"));var n=this._listeningTo||(this._listeningTo={});var a=n[s];if(!a){var o=this._listenId||(this._listenId=i.uniqueId("l"));a=n[s]={obj:t,objId:s,id:o,listeningTo:n,count:0}}l(t,e,r,this,a);return this};var c=function(t,e,i,r){if(i){var s=t[e]||(t[e]=[]);var n=r.context,a=r.ctx,o=r.listening;if(o)o.count++;s.push({callback:i,context:n,ctx:n||a,listening:o})}return t};o.off=function(t,e,i){if(!this._events)return this;this._events=u(f,this._events,t,e,{context:i,listeners:this._listeners});return this};o.stopListening=function(t,e,r){var s=this._listeningTo;if(!s)return this;var n=t?[t._listenId]:i.keys(s);for(var a=0;a<n.length;a++){var o=s[n[a]];if(!o)break;o.obj.off(e,r,this)}if(i.isEmpty(s))this._listeningTo=void 0;return this};var f=function(t,e,r,s){if(!t)return;var n=0,a,o;var h=s.context,u=s.listeners;if(!e&&!r&&!h){var l=i.keys(u);for(;n<l.length;n++){o=u[l[n]];delete u[o.id];delete o.listeningTo[o.objId]}return}var c=e?[e]:i.keys(t);for(;n<c.length;n++){e=c[n];var f=t[e];if(!f)break;var d=[];for(var v=0;v<f.length;v++){var g=f[v];if(r&&r!==g.callback&&r!==g.callback._callback||h&&h!==g.context){d.push(g)}else{o=g.listening;if(o&&--o.count===0){delete u[o.id];delete o.listeningTo[o.objId]}}}if(d.length){t[e]=d}else{delete t[e]}}if(i.size(t))return t};o.once=function(t,e,r){var s=u(d,{},t,e,i.bind(this.off,this));return this.on(s,void 0,r)};o.listenToOnce=function(t,e,r){var s=u(d,{},e,r,i.bind(this.stopListening,this,t));return this.listenTo(t,s)};var d=function(t,e,r,s){if(r){var n=t[e]=i.once(function(){s(e,n);r.apply(this,arguments)});n._callback=r}return t};o.trigger=function(t){if(!this._events)return this;var e=Math.max(0,arguments.length-1);var i=Array(e);for(var r=0;r<e;r++)i[r]=arguments[r+1];u(v,this._events,t,void 0,i);return this};var v=function(t,e,i,r){if(t){var s=t[e];var n=t.all;if(s&&n)n=n.slice();if(s)g(s,r);if(n)g(n,[e].concat(r))}return t};var g=function(t,e){var i,r=-1,s=t.length,n=e[0],a=e[1],o=e[2];switch(e.length){case 0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case 2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case 3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,o);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e);return}};var p=function(t,e,r){switch(t){case 1:return function(){return i[e](this[r])};case 2:return function(t){return i[e](this[r],t)};case 3:return function(t,s){return i[e](this[r],t,s)};case 4:return function(t,s,n){return i[e](this[r],t,s,n)};default:return function(){var t=a.call(arguments);t.unshift(this[r]);return i[e].apply(i,t)}}};var m=function(t,e,r){i.each(e,function(e,s){if(i[s])t.prototype[s]=p(e,s,r)})};o.bind=o.on;o.unbind=o.off;i.extend(e,o);var _=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId(this.cidPrefix);this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};r=i.defaults({},r,i.result(this,"defaults"));this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(_.prototype,o,{changed:null,validationError:null,idAttribute:"id",cidPrefix:"c",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},matches:function(t){return!!i.iteratee(t,this)(this.attributes)},set:function(t,e,r){var s,n,a,o,h,u,l,c;if(t==null)return this;if(typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r||(r={});if(!this._validate(n,r))return false;a=r.unset;h=r.silent;o=[];u=this._changing;this._changing=true;if(!u){this._previousAttributes=i.clone(this.attributes);this.changed={}}c=this.attributes,l=this._previousAttributes;if(this.idAttribute in n)this.id=n[this.idAttribute];for(s in n){e=n[s];if(!i.isEqual(c[s],e))o.push(s);if(!i.isEqual(l[s],e)){this.changed[s]=e}else{delete this.changed[s]}a?delete c[s]:c[s]=e}if(!h){if(o.length)this._pending=r;for(var f=0;f<o.length;f++){this.trigger("change:"+o[f],this,c[o[f]],r)}}if(u)return this;if(!h){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.changed);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e,r=false;var s=this._changing?this._previousAttributes:this.attributes;for(var n in t){if(i.isEqual(s[n],e=t[n]))continue;(r||(r={}))[n]=e}return r},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=this;var r=t.success;t.success=function(i){if(!e.set(e.parse(i,t),t))return false;if(r)r.call(t.context,e,i,t);e.trigger("sync",e,i,t)};F(this,t);return this.sync("read",this,t)},save:function(t,e,r){var s,n,a,o=this.attributes,h;if(t==null||typeof t==="object"){s=t;r=e}else{(s={})[t]=e}r=i.extend({validate:true},r);h=r.wait;if(s&&!h){if(!this.set(s,r))return false}else{if(!this._validate(s,r))return false}if(s&&h){this.attributes=i.extend({},o,s)}if(r.parse===void 0)r.parse=true;var u=this;var l=r.success;r.success=function(t){u.attributes=o;var e=r.parse?u.parse(t,r):t;if(h)e=i.extend(s||{},e);if(i.isObject(e)&&!u.set(e,r)){return false}if(l)l.call(r.context,u,t,r);u.trigger("sync",u,t,r)};F(this,r);n=this.isNew()?"create":r.patch?"patch":"update";if(n==="patch"&&!r.attrs)r.attrs=s;a=this.sync(n,this,r);if(s&&h)this.attributes=o;return a},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var s=t.wait;var n=function(){e.stopListening();e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(s)n();if(r)r.call(t.context,e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};var a=false;if(this.isNew()){i.defer(t.success)}else{F(this,t);a=this.sync("delete",this,t)}if(!s)n();return a},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||q();if(this.isNew())return t;var e=this.id||this.attributes[this.idAttribute];return t.replace(/([^\/])$/,"$1/")+encodeURIComponent(e)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.extend(t||{},{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var y={keys:1,values:1,pairs:1,invert:1,pick:0,omit:0,chain:1,isEmpty:1};m(_,y,"attributes");var b=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var x={add:true,remove:true,merge:true};var w={add:true,remove:false};i.extend(b.prototype,o,{model:_,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,w))},remove:function(t,e){var r=!i.isArray(t),s;t=r?[t]:i.clone(t);e||(e={});s=this._removeModels(t,e);if(!e.silent&&s)this.trigger("update",this,e);return r?t[0]:t},set:function(t,e){e=i.defaults({},e,x);if(e.parse)t=this.parse(t,e);var r=!i.isArray(t);t=r?t?[t]:[]:t.slice();var s,n,a,o,h;var u=e.at;if(u!=null)u=+u;if(u<0)u+=this.length+1;var l=this.comparator&&u==null&&e.sort!==false;var c=i.isString(this.comparator)?this.comparator:null;var f=[],d=[],v={};var g=e.add,p=e.merge,m=e.remove;var _=!l&&g&&m?[]:false;var y=false;for(var b=0;b<t.length;b++){a=t[b];if(o=this.get(a)){if(m)v[o.cid]=true;if(p&&a!==o){a=this._isModel(a)?a.attributes:a;if(e.parse)a=o.parse(a,e);o.set(a,e);if(l&&!h&&o.hasChanged(c))h=true}t[b]=o}else if(g){n=t[b]=this._prepareModel(a,e);if(!n)continue;f.push(n);this._addReference(n,e)}n=o||n;if(!n)continue;s=this.modelId(n.attributes);if(_&&(n.isNew()||!v[s])){_.push(n);y=y||!this.models[b]||n.cid!==this.models[b].cid}v[s]=true}if(m){for(var b=0;b<this.length;b++){if(!v[(n=this.models[b]).cid])d.push(n)}if(d.length)this._removeModels(d,e)}if(f.length||y){if(l)h=true;this.length+=f.length;if(u!=null){for(var b=0;b<f.length;b++){this.models.splice(u+b,0,f[b])}}else{if(_)this.models.length=0;var w=_||f;for(var b=0;b<w.length;b++){this.models.push(w[b])}}}if(h)this.sort({silent:true});if(!e.silent){var E=u!=null?i.clone(e):e;for(var b=0;b<f.length;b++){if(u!=null)E.index=u+b;(n=f[b]).trigger("add",n,this,E)}if(h||y)this.trigger("sort",this,e);if(f.length||d.length)this.trigger("update",this,e)}return r?t[0]:t},reset:function(t,e){e=e?i.clone(e):{};for(var r=0;r<this.models.length;r++){this._removeReference(this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);this.remove(e,t);return e},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);this.remove(e,t);return e},slice:function(){return a.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;var e=this.modelId(this._isModel(t)?t.attributes:t);return this._byId[t]||this._byId[e]||this._byId[t.cid]},at:function(t){if(t<0)t+=this.length;return this.models[t]},where:function(t,e){var r=i.matches(t);return this[e?"find":"filter"](function(t){return r(t.attributes)})},findWhere:function(t){return this.where(t,true)},sort:function(t){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");t||(t={});if(i.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(i.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return i.invoke(this.models,"get",t)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=t.success;var r=this;t.success=function(i){var s=t.reset?"reset":"set";r[s](i,t);if(e)e.call(t.context,r,i,t);r.trigger("sync",r,i,t)};F(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};var r=e.wait;if(!(t=this._prepareModel(t,e)))return false;if(!r)this.add(t,e);var s=this;var n=e.success;e.success=function(t,e,i){if(r)s.add(t,i);if(n)n.call(i.context,t,e,i)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models,{model:this.model,comparator:this.comparator})},modelId:function(t){return t[this.model.prototype.idAttribute||"id"]},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(this._isModel(t)){if(!t.collection)t.collection=this;return t}e=e?i.clone(e):{};e.collection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_removeModels:function(t,e){var i,r,s,n,a=false;for(var i=0,o=0;i<t.length;i++){var n=t[i]=this.get(t[i]);if(!n)continue;var h=this.modelId(n.attributes);if(h!=null)delete this._byId[h];delete this._byId[n.cid];var s=this.indexOf(n);this.models.splice(s,1);this.length--;if(!e.silent){e.index=s;n.trigger("remove",n,this,e)}t[o++]=n;this._removeReference(n,e);a=true}if(t.length!==o)t=t.slice(0,o);return a},_isModel:function(t){return t instanceof _},_addReference:function(t,e){this._byId[t.cid]=t;var i=this.modelId(t.attributes);if(i!=null)this._byId[i]=t;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(t==="change"){var s=this.modelId(e.previousAttributes());var n=this.modelId(e.attributes);if(s!==n){if(s!=null)delete this._byId[s];if(n!=null)this._byId[n]=e}}this.trigger.apply(this,arguments)}});var E={forEach:3,each:3,map:3,collect:3,reduce:4,foldl:4,inject:4,reduceRight:4,foldr:4,find:3,detect:3,filter:3,select:3,reject:3,every:3,all:3,some:3,any:3,include:2,contains:2,invoke:2,max:3,min:3,toArray:1,size:1,first:3,head:3,take:3,initial:3,rest:3,tail:3,drop:3,last:3,without:0,difference:0,indexOf:3,shuffle:1,lastIndexOf:3,isEmpty:1,chain:1,sample:3,partition:3};m(b,E,"models");var k=["groupBy","countBy","sortBy","indexBy"];i.each(k,function(t){if(!i[t])return;b.prototype[t]=function(e,r){var s=i.isFunction(e)?e:function(t){return t.get(e)};return i[t](this.models,s,r)}});var S=e.View=function(t){this.cid=i.uniqueId("view");t||(t={});i.extend(this,i.pick(t,T));this._ensureElement();this.initialize.apply(this,arguments)};var I=/^(\S+)\s*(.*)$/;var T=["model","collection","el","id","attributes","className","tagName","events"];i.extend(S.prototype,o,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this._removeElement();this.stopListening();return this},_removeElement:function(){this.$el.remove()},setElement:function(t){this.undelegateEvents();this._setElement(t);this.delegateEvents();return this},_setElement:function(t){this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0]},delegateEvents:function(t){if(!(t||(t=i.result(this,"events"))))return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[t[e]];if(!r)continue;var s=e.match(I);this.delegate(s[1],s[2],i.bind(r,this))}return this},delegate:function(t,e,i){this.$el.on(t+".delegateEvents"+this.cid,e,i)},undelegateEvents:function(){if(this.$el)this.$el.off(".delegateEvents"+this.cid);return this},undelegate:function(t,e,i){this.$el.off(t+".delegateEvents"+this.cid,e,i)},_createElement:function(t){return document.createElement(t)},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attributes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");this.setElement(this._createElement(i.result(this,"tagName")));this._setAttributes(t)}else{this.setElement(i.result(this,"el"))}},_setAttributes:function(t){this.$el.attr(t)}});e.sync=function(t,r,s){var n=P[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||q()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}var h=s.error;s.error=function(t,e,i){s.textStatus=e;s.errorThrown=i;if(h)h.call(s.context,t,e,i)};var u=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,u,s);return u};var P={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var H=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var $=/\((.*?)\)/g;var A=/(\(\?)?:\w+/g;var C=/\*\w+/g;var N=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend(H.prototype,o,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);if(n.execute(s,a,r)!==false){n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)}});return this},execute:function(t,e,i){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(N,"\\$&").replace($,"(?:$1)?").replace(A,function(t,e){return e?t:"([^/?]+)"}).replace(C,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var R=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var j=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var U=/#.*$/;R.started=false;i.extend(R.prototype,o,{interval:50,atRoot:function(){var t=this.location.pathname.replace(/[^\/]$/,"$&/");return t===this.root&&!this.getSearch()},matchRoot:function(){var t=this.decodeFragment(this.location.pathname);var e=t.slice(0,this.root.length-1)+"/";return e===this.root},decodeFragment:function(t){return decodeURI(t.replace(/%25/g,"%2525"))},getSearch:function(){var t=this.location.href.replace(/#.*/,"").match(/\?.+/);return t?t[0]:""},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getPath:function(){var t=this.decodeFragment(this.location.pathname+this.getSearch()).slice(this.root.length-1);return t.charAt(0)==="/"?t.slice(1):t},getFragment:function(t){if(t==null){if(this._usePushState||!this._wantsHashChange){t=this.getPath()}else{t=this.getHash()}}return t.replace(j,"")},start:function(t){if(R.started)throw new Error("Backbone.history has already been started");R.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._hasHashChange="onhashchange"in window;this._useHashChange=this._wantsHashChange&&this._hasHashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.history&&this.history.pushState);this._usePushState=this._wantsPushState&&this._hasPushState;this.fragment=this.getFragment();this.root=("/"+this.root+"/").replace(O,"/");if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){var e=this.root.slice(0,-1)||"/";this.location.replace(e+"#"+this.getPath());return true}else if(this._hasPushState&&this.atRoot()){this.navigate(this.getHash(),{replace:true})}}if(!this._hasHashChange&&this._wantsHashChange&&!this._usePushState){var r=document.createElement("iframe");r.src="javascript:0";r.style.display="none";r.tabIndex=-1;var s=document.body;this.iframe=s.insertBefore(r,s.firstChild).contentWindow;this.iframe.document.open().close();this.iframe.location.hash="#"+this.fragment}var n=window.addEventListener||function(t,e){return attachEvent("on"+t,e)};if(this._usePushState){n("popstate",this.checkUrl,false)}else if(this._useHashChange&&!this.iframe){n("hashchange",this.checkUrl,false)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}if(!this.options.silent)return this.loadUrl()},stop:function(){var t=window.removeEventListener||function(t,e){return detachEvent("on"+t,e)};if(this._usePushState){t("popstate",this.checkUrl,false)}else if(this._useHashChange&&!this.iframe){t("hashchange",this.checkUrl,false)}if(this.iframe){document.body.removeChild(this.iframe.frameElement);this.iframe=null}if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);R.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getHash(this.iframe)}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){if(!this.matchRoot())return false;t=this.fragment=this.getFragment(t);return i.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!R.started)return false;if(!e||e===true)e={trigger:!!e};t=this.getFragment(t||"");var i=this.root;if(t===""||t.charAt(0)==="?"){i=i.slice(0,-1)||"/"}var r=i+t;t=this.decodeFragment(t.replace(U,""));if(this.fragment===t)return;this.fragment=t;if(this._usePushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,r)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getHash(this.iframe)){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(r)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new R;var M=function(t,e){var r=this;var s;if(t&&i.has(t,"constructor")){s=t.constructor}else{s=function(){return r.apply(this,arguments)}}i.extend(s,r,e);var n=function(){this.constructor=s};n.prototype=r.prototype;s.prototype=new n;if(t)i.extend(s.prototype,t);s.__super__=r.prototype;return s};_.extend=b.extend=H.extend=S.extend=R.extend=M;var q=function(){throw new Error('A "url" property or function must be specified')};var F=function(t,e){var i=e.error;e.error=function(r){if(i)i.call(e.context,t,r,e);t.trigger("error",t,r,e)}};return e}); -//# sourceMappingURL=backbone-min.map \ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/geometry.js b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/geometry.js deleted file mode 100644 index a41411ca4..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/geometry.js +++ /dev/null @@ -1,770 +0,0 @@ -/*! JointJS v0.9.3 - JavaScript diagramming library 2015-05-22 - - -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -// Geometry library. -// (c) 2011-2013 client IO - -(function(root, factory) { - - if (typeof define === 'function' && define.amd) { - - // AMD. Register as an anonymous module. - define([], factory); - - } else if (typeof exports === 'object') { - - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - - } else { - - // Browser globals. - root.g = factory(); - - } - -}(this, function() { - - // Declare shorthands to the most used math functions. - var math = Math; - var abs = math.abs; - var cos = math.cos; - var sin = math.sin; - var sqrt = math.sqrt; - var mmin = math.min; - var mmax = math.max; - var atan = math.atan; - var atan2 = math.atan2; - var acos = math.acos; - var round = math.round; - var floor = math.floor; - var PI = math.PI; - var random = math.random; - var toDeg = function(rad) { return (180 * rad / PI) % 360; }; - var toRad = function(deg, over360) { - over360 = over360 || false; - deg = over360 ? deg : (deg % 360); - return deg * PI / 180; - }; - var snapToGrid = function(val, gridSize) { return gridSize * Math.round(val / gridSize); }; - var normalizeAngle = function(angle) { return (angle % 360) + (angle < 0 ? 360 : 0); }; - - // Point - // ----- - - // Point is the most basic object consisting of x/y coordinate,. - - // Possible instantiations are: - - // * `point(10, 20)` - // * `new point(10, 20)` - // * `point('10 20')` - // * `point(point(10, 20))` - function point(x, y) { - if (!(this instanceof point)) - return new point(x, y); - var xy; - if (y === undefined && Object(x) !== x) { - xy = x.split(x.indexOf('@') === -1 ? ' ' : '@'); - this.x = parseInt(xy[0], 10); - this.y = parseInt(xy[1], 10); - } else if (Object(x) === x) { - this.x = x.x; - this.y = x.y; - } else { - this.x = x; - this.y = y; - } - } - - point.prototype = { - toString: function() { - return this.x + '@' + this.y; - }, - // If point lies outside rectangle `r`, return the nearest point on the boundary of rect `r`, - // otherwise return point itself. - // (see Squeak Smalltalk, Point>>adhereTo:) - adhereToRect: function(r) { - if (r.containsPoint(this)) { - return this; - } - this.x = mmin(mmax(this.x, r.x), r.x + r.width); - this.y = mmin(mmax(this.y, r.y), r.y + r.height); - return this; - }, - // Compute the angle between me and `p` and the x axis. - // (cartesian-to-polar coordinates conversion) - // Return theta angle in degrees. - theta: function(p) { - p = point(p); - // Invert the y-axis. - var y = -(p.y - this.y); - var x = p.x - this.x; - // Makes sure that the comparison with zero takes rounding errors into account. - var PRECISION = 10; - // Note that `atan2` is not defined for `x`, `y` both equal zero. - var rad = (y.toFixed(PRECISION) == 0 && x.toFixed(PRECISION) == 0) ? 0 : atan2(y, x); - - // Correction for III. and IV. quadrant. - if (rad < 0) { - rad = 2 * PI + rad; - } - return 180 * rad / PI; - }, - // Returns distance between me and point `p`. - distance: function(p) { - return line(this, p).length(); - }, - // Returns a manhattan (taxi-cab) distance between me and point `p`. - manhattanDistance: function(p) { - return abs(p.x - this.x) + abs(p.y - this.y); - }, - // Offset me by the specified amount. - offset: function(dx, dy) { - this.x += dx || 0; - this.y += dy || 0; - return this; - }, - magnitude: function() { - return sqrt((this.x * this.x) + (this.y * this.y)) || 0.01; - }, - update: function(x, y) { - this.x = x || 0; - this.y = y || 0; - return this; - }, - round: function(decimals) { - this.x = decimals ? this.x.toFixed(decimals) : round(this.x); - this.y = decimals ? this.y.toFixed(decimals) : round(this.y); - return this; - }, - // Scale the line segment between (0,0) and me to have a length of len. - normalize: function(len) { - var s = (len || 1) / this.magnitude(); - this.x = s * this.x; - this.y = s * this.y; - return this; - }, - difference: function(p) { - return point(this.x - p.x, this.y - p.y); - }, - // Return the bearing between me and point `p`. - bearing: function(p) { - return line(this, p).bearing(); - }, - // Converts rectangular to polar coordinates. - // An origin can be specified, otherwise it's 0@0. - toPolar: function(o) { - o = (o && point(o)) || point(0, 0); - var x = this.x; - var y = this.y; - this.x = sqrt((x - o.x) * (x - o.x) + (y - o.y) * (y - o.y)); // r - this.y = toRad(o.theta(point(x, y))); - return this; - }, - // Rotate point by angle around origin o. - rotate: function(o, angle) { - angle = (angle + 360) % 360; - this.toPolar(o); - this.y += toRad(angle); - var p = point.fromPolar(this.x, this.y, o); - this.x = p.x; - this.y = p.y; - return this; - }, - // Move point on line starting from ref ending at me by - // distance distance. - move: function(ref, distance) { - var theta = toRad(point(ref).theta(this)); - return this.offset(cos(theta) * distance, -sin(theta) * distance); - }, - // Returns change in angle from my previous position (-dx, -dy) to my new position - // relative to ref point. - changeInAngle: function(dx, dy, ref) { - // Revert the translation and measure the change in angle around x-axis. - return point(this).offset(-dx, -dy).theta(ref) - this.theta(ref); - }, - equals: function(p) { - return this.x === p.x && this.y === p.y; - }, - snapToGrid: function(gx, gy) { - this.x = snapToGrid(this.x, gx); - this.y = snapToGrid(this.y, gy || gx); - return this; - }, - // Returns a point that is the reflection of me with - // the center of inversion in ref point. - reflection: function(ref) { - return point(ref).move(this, this.distance(ref)); - } - }; - // Alternative constructor, from polar coordinates. - // @param {number} r Distance. - // @param {number} angle Angle in radians. - // @param {point} [optional] o Origin. - point.fromPolar = function(r, angle, o) { - o = (o && point(o)) || point(0, 0); - var x = abs(r * cos(angle)); - var y = abs(r * sin(angle)); - var deg = normalizeAngle(toDeg(angle)); - - if (deg < 90) { - y = -y; - } else if (deg < 180) { - x = -x; - y = -y; - } else if (deg < 270) { - x = -x; - } - - return point(o.x + x, o.y + y); - }; - - // Create a point with random coordinates that fall into the range `[x1, x2]` and `[y1, y2]`. - point.random = function(x1, x2, y1, y2) { - return point(floor(random() * (x2 - x1 + 1) + x1), floor(random() * (y2 - y1 + 1) + y1)); - }; - - // Line. - // ----- - function line(p1, p2) { - if (!(this instanceof line)) - return new line(p1, p2); - this.start = point(p1); - this.end = point(p2); - } - - line.prototype = { - toString: function() { - return this.start.toString() + ' ' + this.end.toString(); - }, - // @return {double} length of the line - length: function() { - return sqrt(this.squaredLength()); - }, - // @return {integer} length without sqrt - // @note for applications where the exact length is not necessary (e.g. compare only) - squaredLength: function() { - var x0 = this.start.x; - var y0 = this.start.y; - var x1 = this.end.x; - var y1 = this.end.y; - return (x0 -= x1) * x0 + (y0 -= y1) * y0; - }, - // @return {point} my midpoint - midpoint: function() { - return point((this.start.x + this.end.x) / 2, - (this.start.y + this.end.y) / 2); - }, - // @return {point} Point where I'm intersecting l. - // @see Squeak Smalltalk, LineSegment>>intersectionWith: - intersection: function(l) { - var pt1Dir = point(this.end.x - this.start.x, this.end.y - this.start.y); - var pt2Dir = point(l.end.x - l.start.x, l.end.y - l.start.y); - var det = (pt1Dir.x * pt2Dir.y) - (pt1Dir.y * pt2Dir.x); - var deltaPt = point(l.start.x - this.start.x, l.start.y - this.start.y); - var alpha = (deltaPt.x * pt2Dir.y) - (deltaPt.y * pt2Dir.x); - var beta = (deltaPt.x * pt1Dir.y) - (deltaPt.y * pt1Dir.x); - - if (det === 0 || - alpha * det < 0 || - beta * det < 0) { - // No intersection found. - return null; - } - if (det > 0) { - if (alpha > det || beta > det) { - return null; - } - } else { - if (alpha < det || beta < det) { - return null; - } - } - return point(this.start.x + (alpha * pt1Dir.x / det), - this.start.y + (alpha * pt1Dir.y / det)); - }, - - // @return the bearing (cardinal direction) of the line. For example N, W, or SE. - // @returns {String} One of the following bearings : NE, E, SE, S, SW, W, NW, N. - bearing: function() { - - var lat1 = toRad(this.start.y); - var lat2 = toRad(this.end.y); - var lon1 = this.start.x; - var lon2 = this.end.x; - var dLon = toRad(lon2 - lon1); - var y = sin(dLon) * cos(lat2); - var x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon); - var brng = toDeg(atan2(y, x)); - - var bearings = ['NE', 'E', 'SE', 'S', 'SW', 'W', 'NW', 'N']; - - var index = brng - 22.5; - if (index < 0) - index += 360; - index = parseInt(index / 45); - - return bearings[index]; - }, - - // @return {point} my point at 't' <0,1> - pointAt: function(t) { - var x = (1 - t) * this.start.x + t * this.end.x; - var y = (1 - t) * this.start.y + t * this.end.y; - return point(x, y); - }, - - // @return {number} the offset of the point `p` from the line. + if the point `p` is on the right side of the line, - if on the left and 0 if on the line. - pointOffset: function(p) { - // Find the sign of the determinant of vectors (start,end), where p is the query point. - return ((this.end.x - this.start.x) * (p.y - this.start.y) - (this.end.y - this.start.y) * (p.x - this.start.x)) / 2; - } - }; - - // Rectangle. - // ---------- - function rect(x, y, w, h) { - if (!(this instanceof rect)) - return new rect(x, y, w, h); - if (y === undefined) { - y = x.y; - w = x.width; - h = x.height; - x = x.x; - } - this.x = x; - this.y = y; - this.width = w; - this.height = h; - } - - rect.prototype = { - toString: function() { - return this.origin().toString() + ' ' + this.corner().toString(); - }, - origin: function() { - return point(this.x, this.y); - }, - corner: function() { - return point(this.x + this.width, this.y + this.height); - }, - topRight: function() { - return point(this.x + this.width, this.y); - }, - bottomLeft: function() { - return point(this.x, this.y + this.height); - }, - center: function() { - return point(this.x + this.width / 2, this.y + this.height / 2); - }, - // @return {boolean} true if rectangles intersect - intersect: function(r) { - var myOrigin = this.origin(); - var myCorner = this.corner(); - var rOrigin = r.origin(); - var rCorner = r.corner(); - - if (rCorner.x <= myOrigin.x || - rCorner.y <= myOrigin.y || - rOrigin.x >= myCorner.x || - rOrigin.y >= myCorner.y) return false; - return true; - }, - // @return {string} (left|right|top|bottom) side which is nearest to point - // @see Squeak Smalltalk, Rectangle>>sideNearestTo: - sideNearestToPoint: function(p) { - p = point(p); - var distToLeft = p.x - this.x; - var distToRight = (this.x + this.width) - p.x; - var distToTop = p.y - this.y; - var distToBottom = (this.y + this.height) - p.y; - var closest = distToLeft; - var side = 'left'; - - if (distToRight < closest) { - closest = distToRight; - side = 'right'; - } - if (distToTop < closest) { - closest = distToTop; - side = 'top'; - } - if (distToBottom < closest) { - closest = distToBottom; - side = 'bottom'; - } - return side; - }, - // @return {bool} true if point p is insight me - containsPoint: function(p) { - p = point(p); - if (p.x >= this.x && p.x <= this.x + this.width && - p.y >= this.y && p.y <= this.y + this.height) { - return true; - } - return false; - }, - // Algorithm ported from java.awt.Rectangle from OpenJDK. - // @return {bool} true if rectangle `r` is inside me. - containsRect: function(r) { - var nr = rect(r).normalize(); - var W = nr.width; - var H = nr.height; - var X = nr.x; - var Y = nr.y; - var w = this.width; - var h = this.height; - if ((w | h | W | H) < 0) { - // At least one of the dimensions is negative... - return false; - } - // Note: if any dimension is zero, tests below must return false... - var x = this.x; - var y = this.y; - if (X < x || Y < y) { - return false; - } - w += x; - W += X; - if (W <= X) { - // X+W overflowed or W was zero, return false if... - // either original w or W was zero or - // x+w did not overflow or - // the overflowed x+w is smaller than the overflowed X+W - if (w >= x || W > w) return false; - } else { - // X+W did not overflow and W was not zero, return false if... - // original w was zero or - // x+w did not overflow and x+w is smaller than X+W - if (w >= x && W > w) return false; - } - h += y; - H += Y; - if (H <= Y) { - if (h >= y || H > h) return false; - } else { - if (h >= y && H > h) return false; - } - return true; - }, - // @return {point} a point on my boundary nearest to p - // @see Squeak Smalltalk, Rectangle>>pointNearestTo: - pointNearestToPoint: function(p) { - p = point(p); - if (this.containsPoint(p)) { - var side = this.sideNearestToPoint(p); - switch (side){ - case 'right': return point(this.x + this.width, p.y); - case 'left': return point(this.x, p.y); - case 'bottom': return point(p.x, this.y + this.height); - case 'top': return point(p.x, this.y); - } - } - return p.adhereToRect(this); - }, - // Find point on my boundary where line starting - // from my center ending in point p intersects me. - // @param {number} angle If angle is specified, intersection with rotated rectangle is computed. - intersectionWithLineFromCenterToPoint: function(p, angle) { - p = point(p); - var center = point(this.x + this.width / 2, this.y + this.height / 2); - var result; - if (angle) p.rotate(center, angle); - - // (clockwise, starting from the top side) - var sides = [ - line(this.origin(), this.topRight()), - line(this.topRight(), this.corner()), - line(this.corner(), this.bottomLeft()), - line(this.bottomLeft(), this.origin()) - ]; - var connector = line(center, p); - - for (var i = sides.length - 1; i >= 0; --i) { - var intersection = sides[i].intersection(connector); - if (intersection !== null) { - result = intersection; - break; - } - } - if (result && angle) result.rotate(center, -angle); - return result; - }, - // Move and expand me. - // @param r {rectangle} representing deltas - moveAndExpand: function(r) { - this.x += r.x || 0; - this.y += r.y || 0; - this.width += r.width || 0; - this.height += r.height || 0; - return this; - }, - round: function(decimals) { - this.x = decimals ? this.x.toFixed(decimals) : round(this.x); - this.y = decimals ? this.y.toFixed(decimals) : round(this.y); - this.width = decimals ? this.width.toFixed(decimals) : round(this.width); - this.height = decimals ? this.height.toFixed(decimals) : round(this.height); - return this; - }, - // Normalize the rectangle; i.e., make it so that it has a non-negative width and height. - // If width < 0 the function swaps the left and right corners, - // and it swaps the top and bottom corners if height < 0 - // like in http://qt-project.org/doc/qt-4.8/qrectf.html#normalized - normalize: function() { - var newx = this.x; - var newy = this.y; - var newwidth = this.width; - var newheight = this.height; - if (this.width < 0) { - newx = this.x + this.width; - newwidth = -this.width; - } - if (this.height < 0) { - newy = this.y + this.height; - newheight = -this.height; - } - this.x = newx; - this.y = newy; - this.width = newwidth; - this.height = newheight; - return this; - }, - // Find my bounding box when I'm rotated with the center of rotation in the center of me. - // @return r {rectangle} representing a bounding box - bbox: function(angle) { - var theta = toRad(angle || 0); - var st = abs(sin(theta)); - var ct = abs(cos(theta)); - var w = this.width * ct + this.height * st; - var h = this.width * st + this.height * ct; - return rect(this.x + (this.width - w) / 2, this.y + (this.height - h) / 2, w, h); - } - }; - - // Ellipse. - // -------- - function ellipse(c, a, b) { - if (!(this instanceof ellipse)) - return new ellipse(c, a, b); - c = point(c); - this.x = c.x; - this.y = c.y; - this.a = a; - this.b = b; - } - - ellipse.prototype = { - toString: function() { - return point(this.x, this.y).toString() + ' ' + this.a + ' ' + this.b; - }, - bbox: function() { - return rect(this.x - this.a, this.y - this.b, 2 * this.a, 2 * this.b); - }, - // Find point on me where line from my center to - // point p intersects my boundary. - // @param {number} angle If angle is specified, intersection with rotated ellipse is computed. - intersectionWithLineFromCenterToPoint: function(p, angle) { - p = point(p); - if (angle) p.rotate(point(this.x, this.y), angle); - var dx = p.x - this.x; - var dy = p.y - this.y; - var result; - if (dx === 0) { - result = this.bbox().pointNearestToPoint(p); - if (angle) return result.rotate(point(this.x, this.y), -angle); - return result; - } - var m = dy / dx; - var mSquared = m * m; - var aSquared = this.a * this.a; - var bSquared = this.b * this.b; - var x = sqrt(1 / ((1 / aSquared) + (mSquared / bSquared))); - - x = dx < 0 ? -x : x; - var y = m * x; - result = point(this.x + x, this.y + y); - if (angle) return result.rotate(point(this.x, this.y), -angle); - return result; - } - }; - - // Bezier curve. - // ------------- - var bezier = { - // Cubic Bezier curve path through points. - // Ported from C# implementation by Oleg V. Polikarpotchkin and Peter Lee (http://www.codeproject.com/KB/graphics/BezierSpline.aspx). - // @param {array} points Array of points through which the smooth line will go. - // @return {array} SVG Path commands as an array - curveThroughPoints: function(points) { - var controlPoints = this.getCurveControlPoints(points); - var path = ['M', points[0].x, points[0].y]; - - for (var i = 0; i < controlPoints[0].length; i++) { - path.push('C', controlPoints[0][i].x, controlPoints[0][i].y, controlPoints[1][i].x, controlPoints[1][i].y, points[i + 1].x, points[i + 1].y); - } - return path; - }, - - // Get open-ended Bezier Spline Control Points. - // @param knots Input Knot Bezier spline points (At least two points!). - // @param firstControlPoints Output First Control points. Array of knots.length - 1 length. - // @param secondControlPoints Output Second Control points. Array of knots.length - 1 length. - getCurveControlPoints: function(knots) { - var firstControlPoints = []; - var secondControlPoints = []; - var n = knots.length - 1; - var i; - - // Special case: Bezier curve should be a straight line. - if (n == 1) { - // 3P1 = 2P0 + P3 - firstControlPoints[0] = point((2 * knots[0].x + knots[1].x) / 3, - (2 * knots[0].y + knots[1].y) / 3); - // P2 = 2P1 – P0 - secondControlPoints[0] = point(2 * firstControlPoints[0].x - knots[0].x, - 2 * firstControlPoints[0].y - knots[0].y); - return [firstControlPoints, secondControlPoints]; - } - - // Calculate first Bezier control points. - // Right hand side vector. - var rhs = []; - - // Set right hand side X values. - for (i = 1; i < n - 1; i++) { - rhs[i] = 4 * knots[i].x + 2 * knots[i + 1].x; - } - rhs[0] = knots[0].x + 2 * knots[1].x; - rhs[n - 1] = (8 * knots[n - 1].x + knots[n].x) / 2.0; - // Get first control points X-values. - var x = this.getFirstControlPoints(rhs); - - // Set right hand side Y values. - for (i = 1; i < n - 1; ++i) { - rhs[i] = 4 * knots[i].y + 2 * knots[i + 1].y; - } - rhs[0] = knots[0].y + 2 * knots[1].y; - rhs[n - 1] = (8 * knots[n - 1].y + knots[n].y) / 2.0; - // Get first control points Y-values. - var y = this.getFirstControlPoints(rhs); - - // Fill output arrays. - for (i = 0; i < n; i++) { - // First control point. - firstControlPoints.push(point(x[i], y[i])); - // Second control point. - if (i < n - 1) { - secondControlPoints.push(point(2 * knots [i + 1].x - x[i + 1], - 2 * knots[i + 1].y - y[i + 1])); - } else { - secondControlPoints.push(point((knots[n].x + x[n - 1]) / 2, - (knots[n].y + y[n - 1]) / 2)); - } - } - return [firstControlPoints, secondControlPoints]; - }, - - // Solves a tridiagonal system for one of coordinates (x or y) of first Bezier control points. - // @param rhs Right hand side vector. - // @return Solution vector. - getFirstControlPoints: function(rhs) { - var n = rhs.length; - // `x` is a solution vector. - var x = []; - var tmp = []; - var b = 2.0; - - x[0] = rhs[0] / b; - // Decomposition and forward substitution. - for (var i = 1; i < n; i++) { - tmp[i] = 1 / b; - b = (i < n - 1 ? 4.0 : 3.5) - tmp[i]; - x[i] = (rhs[i] - x[i - 1]) / b; - } - for (i = 1; i < n; i++) { - // Backsubstitution. - x[n - i - 1] -= tmp[n - i] * x[n - i]; - } - return x; - }, - - // Solves an inversion problem -- Given the (x, y) coordinates of a point which lies on - // a parametric curve x = x(t)/w(t), y = y(t)/w(t), find the parameter value t - // which corresponds to that point. - // @param control points (start, control start, control end, end) - // @return a function accepts a point and returns t. - getInversionSolver: function(p0, p1, p2, p3) { - var pts = arguments; - function l(i, j) { - // calculates a determinant 3x3 - // [p.x p.y 1] - // [pi.x pi.y 1] - // [pj.x pj.y 1] - var pi = pts[i]; - var pj = pts[j]; - return function(p) { - var w = (i % 3 ? 3 : 1) * (j % 3 ? 3 : 1); - var lij = p.x * (pi.y - pj.y) + p.y * (pj.x - pi.x) + pi.x * pj.y - pi.y * pj.x; - return w * lij; - }; - } - return function solveInversion(p) { - var ct = 3 * l(2, 3)(p1); - var c1 = l(1, 3)(p0) / ct; - var c2 = -l(2, 3)(p0) / ct; - var la = c1 * l(3, 1)(p) + c2 * (l(3, 0)(p) + l(2, 1)(p)) + l(2, 0)(p); - var lb = c1 * l(3, 0)(p) + c2 * l(2, 0)(p) + l(1, 0)(p); - return lb / (lb - la); - }; - }, - - // Divide a Bezier curve into two at point defined by value 't' <0,1>. - // Using deCasteljau algorithm. http://math.stackexchange.com/a/317867 - // @param control points (start, control start, control end, end) - // @return a function accepts t and returns 2 curves each defined by 4 control points. - getCurveDivider: function(p0, p1, p2, p3) { - return function divideCurve(t) { - var l = line(p0, p1).pointAt(t); - var m = line(p1, p2).pointAt(t); - var n = line(p2, p3).pointAt(t); - var p = line(l, m).pointAt(t); - var q = line(m, n).pointAt(t); - var r = line(p, q).pointAt(t); - return [{ p0: p0, p1: l, p2: p, p3: r }, { p0: r, p1: q, p2: n, p3: p3 }]; - }; - } - }; - - // Scale. - var scale = { - - // Return the `value` from the `domain` interval scaled to the `range` interval. - linear: function(domain, range, value) { - - var domainSpan = domain[1] - domain[0]; - var rangeSpan = range[1] - range[0]; - return (((value - domain[0]) / domainSpan) * rangeSpan + range[0]) || 0; - } - }; - - return { - toDeg: toDeg, - toRad: toRad, - snapToGrid: snapToGrid, - normalizeAngle: normalizeAngle, - point: point, - line: line, - rect: rect, - ellipse: ellipse, - bezier: bezier, - scale: scale - }; - -})); \ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/joint.clean.build.js b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/joint.clean.build.js deleted file mode 100644 index 5d0baa5ff..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/joint.clean.build.js +++ /dev/null @@ -1,6962 +0,0 @@ -/*! JointJS v0.9.3 - JavaScript diagramming library 2015-05-22 - - -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -(function(root, factory) { - - if (typeof define === 'function' && define.amd) { - - // For AMD. - - define(['app/gbp-old/js/geometry', 'app/gbp-old/js/vectorizer', 'jquery', 'app/gbp-old/js/lodash.min', 'app/gbp-old/js/backbone-min'], function(g, V, $, _, Backbone) { - - Backbone.$ = $; - - return factory(root, Backbone, _, $, g, V); - }); - - } else if (typeof exports !== 'undefined') { - - // For Node.js or CommonJS. - - var Backbone = require('backbone'); - var _ = require('lodash'); - var $ = Backbone.$ = require('jquery'); - var g = require('./geometry'); - var V = require('./vectorizer'); - - module.exports = factory(root, Backbone, _, $, g, V); - - } else { - - // As a browser global. - - var Backbone = root.Backbone; - var _ = root._; - var $ = Backbone.$ = root.jQuery || root.$; - var g = root.g; - var V = root.V; - - root.joint = factory(root, Backbone, _, $, g, V); - - } - -}(this, function(root, Backbone, _, $, g, V) { - -/*! JointJS v0.9.3 - JavaScript diagramming library 2015-05-22 - - -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -// JointJS library. -// (c) 2011-2013 client IO - -// Global namespace. - -var joint = { - - version: '0.9.3', - - // `joint.dia` namespace. - dia: {}, - - // `joint.ui` namespace. - ui: {}, - - // `joint.layout` namespace. - layout: {}, - - // `joint.shapes` namespace. - shapes: {}, - - // `joint.format` namespace. - format: {}, - - // `joint.connectors` namespace. - connectors: {}, - - // `joint.routers` namespace. - routers: {}, - - util: { - - // Return a simple hash code from a string. See http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/. - hashCode: function(str) { - - var hash = 0; - if (str.length == 0) return hash; - for (var i = 0; i < str.length; i++) { - var c = str.charCodeAt(i); - hash = ((hash << 5) - hash) + c; - hash = hash & hash; // Convert to 32bit integer - } - return hash; - }, - - getByPath: function(obj, path, delim) { - - delim = delim || '.'; - var keys = path.split(delim); - var key; - - while (keys.length) { - key = keys.shift(); - if (Object(obj) === obj && key in obj) { - obj = obj[key]; - } else { - return undefined; - } - } - return obj; - }, - - setByPath: function(obj, path, value, delim) { - - delim = delim || '.'; - - var keys = path.split(delim); - var diver = obj; - var i = 0; - - if (path.indexOf(delim) > -1) { - - for (var len = keys.length; i < len - 1; i++) { - // diver creates an empty object if there is no nested object under such a key. - // This means that one can populate an empty nested object with setByPath(). - diver = diver[keys[i]] || (diver[keys[i]] = {}); - } - diver[keys[len - 1]] = value; - } else { - obj[path] = value; - } - return obj; - }, - - unsetByPath: function(obj, path, delim) { - - delim = delim || '.'; - - // index of the last delimiter - var i = path.lastIndexOf(delim); - - if (i > -1) { - - // unsetting a nested attribute - var parent = joint.util.getByPath(obj, path.substr(0, i), delim); - - if (parent) { - delete parent[path.slice(i + 1)]; - } - - } else { - - // unsetting a primitive attribute - delete obj[path]; - } - - return obj; - }, - - flattenObject: function(obj, delim, stop) { - - delim = delim || '.'; - var ret = {}; - - for (var key in obj) { - - if (!obj.hasOwnProperty(key)) continue; - - var shouldGoDeeper = typeof obj[key] === 'object'; - if (shouldGoDeeper && stop && stop(obj[key])) { - shouldGoDeeper = false; - } - - if (shouldGoDeeper) { - - var flatObject = this.flattenObject(obj[key], delim, stop); - - for (var flatKey in flatObject) { - if (!flatObject.hasOwnProperty(flatKey)) continue; - ret[key + delim + flatKey] = flatObject[flatKey]; - } - - } else { - - ret[key] = obj[key]; - } - } - - return ret; - }, - - uuid: function() { - - // credit: http://stackoverflow.com/posts/2117523/revisions - - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random() * 16|0; - var v = c == 'x' ? r : (r&0x3|0x8); - return v.toString(16); - }); - }, - - // Generate global unique id for obj and store it as a property of the object. - guid: function(obj) { - - this.guid.id = this.guid.id || 1; - obj.id = (obj.id === undefined ? 'j_' + this.guid.id++ : obj.id); - return obj.id; - }, - - // Copy all the properties to the first argument from the following arguments. - // All the properties will be overwritten by the properties from the following - // arguments. Inherited properties are ignored. - mixin: function() { - - var target = arguments[0]; - - for (var i = 1, l = arguments.length; i < l; i++) { - - var extension = arguments[i]; - - // Only functions and objects can be mixined. - - if ((Object(extension) !== extension) && - !_.isFunction(extension) && - (extension === null || extension === undefined)) { - - continue; - } - - _.each(extension, function(copy, key) { - - if (this.mixin.deep && (Object(copy) === copy)) { - - if (!target[key]) { - - target[key] = _.isArray(copy) ? [] : {}; - } - - this.mixin(target[key], copy); - return; - } - - if (target[key] !== copy) { - - if (!this.mixin.supplement || !target.hasOwnProperty(key)) { - - target[key] = copy; - } - - } - - }, this); - } - - return target; - }, - - // Copy all properties to the first argument from the following - // arguments only in case if they don't exists in the first argument. - // All the function propererties in the first argument will get - // additional property base pointing to the extenders same named - // property function's call method. - supplement: function() { - - this.mixin.supplement = true; - var ret = this.mixin.apply(this, arguments); - this.mixin.supplement = false; - return ret; - }, - - // Same as `mixin()` but deep version. - deepMixin: function() { - - this.mixin.deep = true; - var ret = this.mixin.apply(this, arguments); - this.mixin.deep = false; - return ret; - }, - - // Same as `supplement()` but deep version. - deepSupplement: function() { - - this.mixin.deep = this.mixin.supplement = true; - var ret = this.mixin.apply(this, arguments); - this.mixin.deep = this.mixin.supplement = false; - return ret; - }, - - normalizeEvent: function(evt) { - - return (evt.originalEvent && evt.originalEvent.changedTouches && evt.originalEvent.changedTouches.length) ? evt.originalEvent.changedTouches[0] : evt; - }, - - nextFrame:(function() { - - var raf; - var client = typeof window != 'undefined'; - - if (client) { - - raf = window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame; - } - - if (!raf) { - - var lastTime = 0; - - raf = function(callback) { - - var currTime = new Date().getTime(); - var timeToCall = Math.max(0, 16 - (currTime - lastTime)); - var id = setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); - - lastTime = currTime + timeToCall; - - return id; - }; - } - - return client ? _.bind(raf, window) : raf; - - })(), - - cancelFrame: (function() { - - var caf; - var client = typeof window != 'undefined'; - - if (client) { - - caf = window.cancelAnimationFrame || - window.webkitCancelAnimationFrame || - window.webkitCancelRequestAnimationFrame || - window.msCancelAnimationFrame || - window.msCancelRequestAnimationFrame || - window.oCancelAnimationFrame || - window.oCancelRequestAnimationFrame || - window.mozCancelAnimationFrame || - window.mozCancelRequestAnimationFrame; - } - - caf = caf || clearTimeout; - - return client ? _.bind(caf, window) : caf; - - })(), - - shapePerimeterConnectionPoint: function(linkView, view, magnet, reference) { - - var bbox; - var spot; - - if (!magnet) { - - // There is no magnet, try to make the best guess what is the - // wrapping SVG element. This is because we want this "smart" - // connection points to work out of the box without the - // programmer to put magnet marks to any of the subelements. - // For example, we want the functoin to work on basic.Path elements - // without any special treatment of such elements. - // The code below guesses the wrapping element based on - // one simple assumption. The wrapping elemnet is the - // first child of the scalable group if such a group exists - // or the first child of the rotatable group if not. - // This makese sense because usually the wrapping element - // is below any other sub element in the shapes. - var scalable = view.$('.scalable')[0]; - var rotatable = view.$('.rotatable')[0]; - - if (scalable && scalable.firstChild) { - - magnet = scalable.firstChild; - - } else if (rotatable && rotatable.firstChild) { - - magnet = rotatable.firstChild; - } - } - - if (magnet) { - - spot = V(magnet).findIntersection(reference, linkView.paper.viewport); - if (!spot) { - bbox = g.rect(V(magnet).bbox(false, linkView.paper.viewport)); - } - - } else { - - bbox = view.model.getBBox(); - spot = bbox.intersectionWithLineFromCenterToPoint(reference); - } - return spot || bbox.center(); - }, - - breakText: function(text, size, styles, opt) { - - opt = opt || {}; - - var width = size.width; - var height = size.height; - - var svgDocument = opt.svgDocument || V('svg').node; - var textElement = V('<text><tspan></tspan></text>').attr(styles || {}).node; - var textSpan = textElement.firstChild; - var textNode = document.createTextNode(''); - - textSpan.appendChild(textNode); - - svgDocument.appendChild(textElement); - - if (!opt.svgDocument) { - - document.body.appendChild(svgDocument); - } - - var words = text.split(' '); - var full = []; - var lines = []; - var p; - - for (var i = 0, l = 0, len = words.length; i < len; i++) { - - var word = words[i]; - - textNode.data = lines[l] ? lines[l] + ' ' + word : word; - - if (textSpan.getComputedTextLength() <= width) { - - // the current line fits - lines[l] = textNode.data; - - if (p) { - // We were partitioning. Put rest of the word onto next line - full[l++] = true; - - // cancel partitioning - p = 0; - } - - } else { - - if (!lines[l] || p) { - - var partition = !!p; - - p = word.length - 1; - - if (partition || !p) { - - // word has only one character. - if (!p) { - - if (!lines[l]) { - - // we won't fit this text within our rect - lines = []; - - break; - } - - // partitioning didn't help on the non-empty line - // try again, but this time start with a new line - - // cancel partitions created - words.splice(i, 2, word + words[i + 1]); - - // adjust word length - len--; - - full[l++] = true; - i--; - - continue; - } - - // move last letter to the beginning of the next word - words[i] = word.substring(0, p); - words[i + 1] = word.substring(p) + words[i + 1]; - - } else { - - // We initiate partitioning - // split the long word into two words - words.splice(i, 1, word.substring(0, p), word.substring(p)); - - // adjust words length - len++; - - if (l && !full[l - 1]) { - // if the previous line is not full, try to fit max part of - // the current word there - l--; - } - } - - i--; - - continue; - } - - l++; - i--; - } - - // if size.height is defined we have to check whether the height of the entire - // text exceeds the rect height - if (typeof height !== 'undefined') { - - // get line height as text height / 0.8 (as text height is approx. 0.8em - // and line height is 1em. See vectorizer.text()) - var lh = lh || textElement.getBBox().height * 1.25; - - if (lh * lines.length > height) { - - // remove overflowing lines - lines.splice(Math.floor(height / lh)); - - break; - } - } - } - - if (opt.svgDocument) { - - // svg document was provided, remove the text element only - svgDocument.removeChild(textElement); - - } else { - - // clean svg document - document.body.removeChild(svgDocument); - } - - return lines.join('\n'); - }, - - imageToDataUri: function(url, callback) { - - if (!url || url.substr(0, 'data:'.length) === 'data:') { - // No need to convert to data uri if it is already in data uri. - - // This not only convenient but desired. For example, - // IE throws a security error if data:image/svg+xml is used to render - // an image to the canvas and an attempt is made to read out data uri. - // Now if our image is already in data uri, there is no need to render it to the canvas - // and so we can bypass this error. - - // Keep the async nature of the function. - return setTimeout(function() { callback(null, url); }, 0); - } - - var canvas = document.createElement('canvas'); - var img = document.createElement('img'); - - img.onload = function() { - - var ctx = canvas.getContext('2d'); - - canvas.width = img.width; - canvas.height = img.height; - - ctx.drawImage(img, 0, 0); - - try { - - // Guess the type of the image from the url suffix. - var suffix = (url.split('.').pop()) || 'png'; - // A little correction for JPEGs. There is no image/jpg mime type but image/jpeg. - var type = 'image/' + (suffix === 'jpg') ? 'jpeg' : suffix; - var dataUri = canvas.toDataURL(type); - - } catch (e) { - - if (/\.svg$/.test(url)) { - // IE throws a security error if we try to render an SVG into the canvas. - // Luckily for us, we don't need canvas at all to convert - // SVG to data uri. We can just use AJAX to load the SVG string - // and construct the data uri ourselves. - var xhr = window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject('Microsoft.XMLHTTP'); - xhr.open('GET', url, false); - xhr.send(null); - var svg = xhr.responseText; - - return callback(null, 'data:image/svg+xml,' + encodeURIComponent(svg)); - } - - console.error(img.src, 'fails to convert', e); - } - - callback(null, dataUri); - }; - - img.ononerror = function() { - - callback(new Error('Failed to load image.')); - }; - - img.src = url; - }, - - timing: { - - linear: function(t) { - return t; - }, - - quad: function(t) { - return t * t; - }, - - cubic: function(t) { - return t * t * t; - }, - - inout: function(t) { - if (t <= 0) return 0; - if (t >= 1) return 1; - var t2 = t * t; - var t3 = t2 * t; - return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75); - }, - - exponential: function(t) { - return Math.pow(2, 10 * (t - 1)); - }, - - bounce: function(t) { - for (var a = 0, b = 1; 1; a += b, b /= 2) { - if (t >= (7 - 4 * a) / 11) { - var q = (11 - 6 * a - 11 * t) / 4; - return -q * q + b * b; - } - } - }, - - reverse: function(f) { - return function(t) { - return 1 - f(1 - t); - }; - }, - - reflect: function(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; - }, - - clamp: function(f, n, x) { - n = n || 0; - x = x || 1; - return function(t) { - var r = f(t); - return r < n ? n : r > x ? x : r; - }; - }, - - back: function(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; - }, - - elastic: function(x) { - if (!x) x = 1.5; - return function(t) { - return Math.pow(2, 10 * (t - 1)) * Math.cos(20 * Math.PI * x / 3 * t); - }; - } - }, - - interpolate: { - - number: function(a, b) { - var d = b - a; - return function(t) { return a + d * t; }; - }, - - object: function(a, b) { - var s = _.keys(a); - return function(t) { - var i, p; - var r = {}; - for (i = s.length - 1; i != -1; i--) { - p = s[i]; - r[p] = a[p] + (b[p] - a[p]) * t; - } - return r; - }; - }, - - hexColor: function(a, b) { - - var ca = parseInt(a.slice(1), 16); - var cb = parseInt(b.slice(1), 16); - var ra = ca & 0x0000ff; - var rd = (cb & 0x0000ff) - ra; - var ga = ca & 0x00ff00; - var gd = (cb & 0x00ff00) - ga; - var ba = ca & 0xff0000; - var bd = (cb & 0xff0000) - ba; - - return function(t) { - - var r = (ra + rd * t) & 0x000000ff; - var g = (ga + gd * t) & 0x0000ff00; - var b = (ba + bd * t) & 0x00ff0000; - - return '#' + (1 << 24 | r | g | b ).toString(16).slice(1); - }; - }, - - unit: function(a, b) { - - var r = /(-?[0-9]*.[0-9]*)(px|em|cm|mm|in|pt|pc|%)/; - var ma = r.exec(a); - var mb = r.exec(b); - var p = mb[1].indexOf('.'); - var f = p > 0 ? mb[1].length - p - 1 : 0; - a = +ma[1]; - var d = +mb[1] - a; - var u = ma[2]; - - return function(t) { - return (a + d * t).toFixed(f) + u; - }; - } - }, - - // SVG filters. - filter: { - - // `x` ... horizontal blur - // `y` ... vertical blur (optional) - blur: function(args) { - - var x = _.isFinite(args.x) ? args.x : 2; - - return _.template('<filter><feGaussianBlur stdDeviation="${stdDeviation}"/></filter>', { - stdDeviation: _.isFinite(args.y) ? [x, args.y] : x - }); - }, - - // `dx` ... horizontal shift - // `dy` ... vertical shift - // `blur` ... blur - // `color` ... color - // `opacity` ... opacity - dropShadow: function(args) { - - var tpl = 'SVGFEDropShadowElement' in window - ? '<filter><feDropShadow stdDeviation="${blur}" dx="${dx}" dy="${dy}" flood-color="${color}" flood-opacity="${opacity}"/></filter>' - : '<filter><feGaussianBlur in="SourceAlpha" stdDeviation="${blur}"/><feOffset dx="${dx}" dy="${dy}" result="offsetblur"/><feFlood flood-color="${color}"/><feComposite in2="offsetblur" operator="in"/><feComponentTransfer><feFuncA type="linear" slope="${opacity}"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in="SourceGraphic"/></feMerge></filter>'; - - return _.template(tpl, { - dx: args.dx || 0, - dy: args.dy || 0, - opacity: _.isFinite(args.opacity) ? args.opacity : 1, - color: args.color || 'black', - blur: _.isFinite(args.blur) ? args.blur : 4 - }); - }, - - // `amount` ... the proportion of the conversion. A value of 1 is completely grayscale. A value of 0 leaves the input unchanged. - grayscale: function(args) { - - var amount = _.isFinite(args.amount) ? args.amount : 1; - - return _.template('<filter><feColorMatrix type="matrix" values="${a} ${b} ${c} 0 0 ${d} ${e} ${f} 0 0 ${g} ${b} ${h} 0 0 0 0 0 1 0"/></filter>', { - a: 0.2126 + 0.7874 * (1 - amount), - b: 0.7152 - 0.7152 * (1 - amount), - c: 0.0722 - 0.0722 * (1 - amount), - d: 0.2126 - 0.2126 * (1 - amount), - e: 0.7152 + 0.2848 * (1 - amount), - f: 0.0722 - 0.0722 * (1 - amount), - g: 0.2126 - 0.2126 * (1 - amount), - h: 0.0722 + 0.9278 * (1 - amount) - }); - }, - - // `amount` ... the proportion of the conversion. A value of 1 is completely sepia. A value of 0 leaves the input unchanged. - sepia: function(args) { - - var amount = _.isFinite(args.amount) ? args.amount : 1; - - return _.template('<filter><feColorMatrix type="matrix" values="${a} ${b} ${c} 0 0 ${d} ${e} ${f} 0 0 ${g} ${h} ${i} 0 0 0 0 0 1 0"/></filter>', { - a: 0.393 + 0.607 * (1 - amount), - b: 0.769 - 0.769 * (1 - amount), - c: 0.189 - 0.189 * (1 - amount), - d: 0.349 - 0.349 * (1 - amount), - e: 0.686 + 0.314 * (1 - amount), - f: 0.168 - 0.168 * (1 - amount), - g: 0.272 - 0.272 * (1 - amount), - h: 0.534 - 0.534 * (1 - amount), - i: 0.131 + 0.869 * (1 - amount) - }); - }, - - // `amount` ... the proportion of the conversion. A value of 0 is completely un-saturated. A value of 1 leaves the input unchanged. - saturate: function(args) { - - var amount = _.isFinite(args.amount) ? args.amount : 1; - - return _.template('<filter><feColorMatrix type="saturate" values="${amount}"/></filter>', { - amount: 1 - amount - }); - }, - - // `angle` ... the number of degrees around the color circle the input samples will be adjusted. - hueRotate: function(args) { - - return _.template('<filter><feColorMatrix type="hueRotate" values="${angle}"/></filter>', { - angle: args.angle || 0 - }); - }, - - // `amount` ... the proportion of the conversion. A value of 1 is completely inverted. A value of 0 leaves the input unchanged. - invert: function(args) { - - var amount = _.isFinite(args.amount) ? args.amount : 1; - - return _.template('<filter><feComponentTransfer><feFuncR type="table" tableValues="${amount} ${amount2}"/><feFuncG type="table" tableValues="${amount} ${amount2}"/><feFuncB type="table" tableValues="${amount} ${amount2}"/></feComponentTransfer></filter>', { - amount: amount, - amount2: 1 - amount - }); - }, - - // `amount` ... proportion of the conversion. A value of 0 will create an image that is completely black. A value of 1 leaves the input unchanged. - brightness: function(args) { - - return _.template('<filter><feComponentTransfer><feFuncR type="linear" slope="${amount}"/><feFuncG type="linear" slope="${amount}"/><feFuncB type="linear" slope="${amount}"/></feComponentTransfer></filter>', { - amount: _.isFinite(args.amount) ? args.amount : 1 - }); - }, - - // `amount` ... proportion of the conversion. A value of 0 will create an image that is completely black. A value of 1 leaves the input unchanged. - contrast: function(args) { - - var amount = _.isFinite(args.amount) ? args.amount : 1; - - return _.template('<filter><feComponentTransfer><feFuncR type="linear" slope="${amount}" intercept="${amount2}"/><feFuncG type="linear" slope="${amount}" intercept="${amount2}"/><feFuncB type="linear" slope="${amount}" intercept="${amount2}"/></feComponentTransfer></filter>', { - amount: amount, - amount2: .5 - amount / 2 - }); - } - }, - - format: { - - // Formatting numbers via the Python Format Specification Mini-language. - // See http://docs.python.org/release/3.1.3/library/string.html#format-specification-mini-language. - // Heavilly inspired by the D3.js library implementation. - number: function(specifier, value, locale) { - - locale = locale || { - - currency: ['$', ''], - decimal: '.', - thousands: ',', - grouping: [3] - }; - - // See Python format specification mini-language: http://docs.python.org/release/3.1.3/library/string.html#format-specification-mini-language. - // [[fill]align][sign][symbol][0][width][,][.precision][type] - var re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i; - - var match = re.exec(specifier); - var fill = match[1] || ' '; - var align = match[2] || '>'; - var sign = match[3] || ''; - var symbol = match[4] || ''; - var zfill = match[5]; - var width = +match[6]; - var comma = match[7]; - var precision = match[8]; - var type = match[9]; - var scale = 1; - var prefix = ''; - var suffix = ''; - var integer = false; - - if (precision) precision = +precision.substring(1); - - if (zfill || fill === '0' && align === '=') { - zfill = fill = '0'; - align = '='; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case 'n': comma = true; type = 'g'; break; - case '%': scale = 100; suffix = '%'; type = 'f'; break; - case 'p': scale = 100; suffix = '%'; type = 'r'; break; - case 'b': - case 'o': - case 'x': - case 'X': if (symbol === '#') prefix = '0' + type.toLowerCase(); - case 'c': - case 'd': integer = true; precision = 0; break; - case 's': scale = -1; type = 'r'; break; - } - - if (symbol === '$') { - prefix = locale.currency[0]; - suffix = locale.currency[1]; - } - - // If no precision is specified for `'r'`, fallback to general notation. - if (type == 'r' && !precision) type = 'g'; - - // Ensure that the requested precision is in the supported range. - if (precision != null) { - if (type == 'g') precision = Math.max(1, Math.min(21, precision)); - else if (type == 'e' || type == 'f') precision = Math.max(0, Math.min(20, precision)); - } - - var zcomma = zfill && comma; - - // Return the empty string for floats formatted as ints. - if (integer && (value % 1)) return ''; - - // Convert negative to positive, and record the sign prefix. - var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, '-') : sign; - - var fullSuffix = suffix; - - // Apply the scale, computing it from the value's exponent for si format. - // Preserve the existing suffix, if any, such as the currency symbol. - if (scale < 0) { - var unit = this.prefix(value, precision); - value = unit.scale(value); - fullSuffix = unit.symbol + suffix; - } else { - value *= scale; - } - - // Convert to the desired precision. - value = this.convert(type, value, precision); - - // Break the value into the integer part (before) and decimal part (after). - var i = value.lastIndexOf('.'); - var before = i < 0 ? value : value.substring(0, i); - var after = i < 0 ? '' : locale.decimal + value.substring(i + 1); - - function formatGroup(value) { - - var i = value.length; - var t = []; - var j = 0; - var g = locale.grouping[0]; - while (i > 0 && g > 0) { - t.push(value.substring(i -= g, i + g)); - g = locale.grouping[j = (j + 1) % locale.grouping.length]; - } - return t.reverse().join(locale.thousands); - } - - // If the fill character is not `'0'`, grouping is applied before padding. - if (!zfill && comma && locale.grouping) { - - before = formatGroup(before); - } - - var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length); - var padding = length < width ? new Array(length = width - length + 1).join(fill) : ''; - - // If the fill character is `'0'`, grouping is applied after padding. - if (zcomma) before = formatGroup(padding + before); - - // Apply prefix. - negative += prefix; - - // Rejoin integer and decimal parts. - value = before + after; - - return (align === '<' ? negative + value + padding - : align === '>' ? padding + negative + value - : align === '^' ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) - : negative + (zcomma ? value : padding + value)) + fullSuffix; - }, - - // Formatting string via the Python Format string. - // See https://docs.python.org/2/library/string.html#format-string-syntax) - string: function(formatString, value) { - - var fieldDelimiterIndex; - var fieldDelimiter = '{'; - var endPlaceholder = false; - var formattedStringArray = []; - - while ((fieldDelimiterIndex = formatString.indexOf(fieldDelimiter)) !== -1) { - - var pieceFormatedString, formatSpec, fieldName; - - pieceFormatedString = formatString.slice(0, fieldDelimiterIndex); - - if (endPlaceholder) { - formatSpec = pieceFormatedString.split(':'); - fieldName = formatSpec.shift().split('.'); - pieceFormatedString = value; - - for (var i = 0; i < fieldName.length; i++) - pieceFormatedString = pieceFormatedString[fieldName[i]]; - - if (formatSpec.length) - pieceFormatedString = this.number(formatSpec, pieceFormatedString); - } - - formattedStringArray.push(pieceFormatedString); - - formatString = formatString.slice(fieldDelimiterIndex + 1); - fieldDelimiter = (endPlaceholder = !endPlaceholder) ? '}' : '{'; - } - formattedStringArray.push(formatString); - - return formattedStringArray.join(''); - }, - - convert: function(type, value, precision) { - - switch (type) { - case 'b': return value.toString(2); - case 'c': return String.fromCharCode(value); - case 'o': return value.toString(8); - case 'x': return value.toString(16); - case 'X': return value.toString(16).toUpperCase(); - case 'g': return value.toPrecision(precision); - case 'e': return value.toExponential(precision); - case 'f': return value.toFixed(precision); - case 'r': return (value = this.round(value, this.precision(value, precision))).toFixed(Math.max(0, Math.min(20, this.precision(value * (1 + 1e-15), precision)))); - default: return value + ''; - } - }, - - round: function(value, precision) { - - return precision - ? Math.round(value * (precision = Math.pow(10, precision))) / precision - : Math.round(value); - }, - - precision: function(value, precision) { - - return precision - (value ? Math.ceil(Math.log(value) / Math.LN10) : 1); - }, - - prefix: function(value, precision) { - - var prefixes = _.map(['y', 'z', 'a', 'f', 'p', 'n', 'µ', 'm', '', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'], function(d, i) { - var k = Math.pow(10, abs(8 - i) * 3); - return { - scale: i > 8 ? function(d) { return d / k; } : function(d) { return d * k; }, - symbol: d - }; - }); - - var i = 0; - if (value) { - if (value < 0) value *= -1; - if (precision) value = this.round(value, this.precision(value, precision)); - i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); - i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3)); - } - return prefixes[8 + i / 3]; - } - } - } -}; - -// JointJS, the JavaScript diagramming library. -// (c) 2011-2013 client IO - -joint.dia.GraphCells = Backbone.Collection.extend({ - - initialize: function() { - - // Backbone automatically doesn't trigger re-sort if models attributes are changed later when - // they're already in the collection. Therefore, we're triggering sort manually here. - this.on('change:z', this.sort, this); - }, - - model: function(attrs, options) { - - if (attrs.type === 'link') { - - return new joint.dia.Link(attrs, options); - } - - var module = attrs.type.split('.')[0]; - var entity = attrs.type.split('.')[1]; - - if (joint.shapes[module] && joint.shapes[module][entity]) { - - return new joint.shapes[module][entity](attrs, options); - } - - return new joint.dia.Element(attrs, options); - }, - - // `comparator` makes it easy to sort cells based on their `z` index. - comparator: function(model) { - - return model.get('z') || 0; - }, - - // Get all inbound and outbound links connected to the cell `model`. - getConnectedLinks: function(model, opt) { - - opt = opt || {}; - - if (_.isUndefined(opt.inbound) && _.isUndefined(opt.outbound)) { - opt.inbound = opt.outbound = true; - } - - var links = this.filter(function(cell) { - - var source = cell.get('source'); - var target = cell.get('target'); - - return (source && source.id === model.id && opt.outbound) || - (target && target.id === model.id && opt.inbound); - }); - - // option 'deep' returns all links that are connected to any of the descendent cell - // and are not descendents itself - if (opt.deep) { - - var embeddedCells = model.getEmbeddedCells({ deep: true }); - - _.each(this.difference(links, embeddedCells), function(cell) { - - if (opt.outbound) { - - var source = cell.get('source'); - - if (source && source.id && _.find(embeddedCells, { id: source.id })) { - links.push(cell); - return; // prevent a loop link to be pushed twice - } - } - - if (opt.inbound) { - - var target = cell.get('target'); - - if (target && target.id && _.find(embeddedCells, { id: target.id })) { - links.push(cell); - } - } - }); - } - - return links; - }, - - getCommonAncestor: function(/* cells */) { - - var cellsAncestors = _.map(arguments, function(cell) { - - var ancestors = [cell.id]; - var parentId = cell.get('parent'); - - while (parentId) { - - ancestors.push(parentId); - parentId = this.get(parentId).get('parent'); - } - - return ancestors; - - }, this); - - cellsAncestors = _.sortBy(cellsAncestors, 'length'); - - var commonAncestor = _.find(cellsAncestors.shift(), function(ancestor) { - - return _.every(cellsAncestors, function(cellAncestors) { - return _.contains(cellAncestors, ancestor); - }); - }); - - return this.get(commonAncestor); - }, - - // Return the bounding box of all cells in array provided. If no array - // provided returns bounding box of all cells. Links are being ignored. - getBBox: function(cells) { - - cells = cells || this.models; - - var origin = { x: Infinity, y: Infinity }; - var corner = { x: -Infinity, y: -Infinity }; - - _.each(cells, function(cell) { - - // Links has no bounding box defined on the model. - if (cell.isLink()) return; - - var bbox = cell.getBBox(); - origin.x = Math.min(origin.x, bbox.x); - origin.y = Math.min(origin.y, bbox.y); - corner.x = Math.max(corner.x, bbox.x + bbox.width); - corner.y = Math.max(corner.y, bbox.y + bbox.height); - }); - - return g.rect(origin.x, origin.y, corner.x - origin.x, corner.y - origin.y); - } -}); - - -joint.dia.Graph = Backbone.Model.extend({ - - initialize: function(attrs, opt) { - - // Passing `cellModel` function in the options object to graph allows for - // setting models based on attribute objects. This is especially handy - // when processing JSON graphs that are in a different than JointJS format. - this.set('cells', new joint.dia.GraphCells([], { model: opt && opt.cellModel })); - - // Make all the events fired in the `cells` collection available. - // to the outside world. - this.get('cells').on('all', this.trigger, this); - - this.get('cells').on('remove', this.removeCell, this); - }, - - toJSON: function() { - - // Backbone does not recursively call `toJSON()` on attributes that are themselves models/collections. - // It just clones the attributes. Therefore, we must call `toJSON()` on the cells collection explicitely. - var json = Backbone.Model.prototype.toJSON.apply(this, arguments); - json.cells = this.get('cells').toJSON(); - return json; - }, - - fromJSON: function(json, opt) { - - if (!json.cells) { - - throw new Error('Graph JSON must contain cells array.'); - } - - this.set(_.omit(json, 'cells'), opt); - this.resetCells(json.cells, opt); - }, - - clear: function(opt) { - - this.trigger('batch:start'); - this.get('cells').remove(this.get('cells').models, opt); - this.trigger('batch:stop'); - }, - - _prepareCell: function(cell) { - - if (cell instanceof Backbone.Model && _.isUndefined(cell.get('z'))) { - - cell.set('z', this.maxZIndex() + 1, { silent: true }); - - } else if (_.isUndefined(cell.z)) { - - cell.z = this.maxZIndex() + 1; - } - - return cell; - }, - - maxZIndex: function() { - - var lastCell = this.get('cells').last(); - return lastCell ? (lastCell.get('z') || 0) : 0; - }, - - addCell: function(cell, options) { - - if (_.isArray(cell)) { - - return this.addCells(cell, options); - } - - this.get('cells').add(this._prepareCell(cell), options || {}); - - return this; - }, - - addCells: function(cells, options) { - - options = options || {}; - options.position = cells.length; - - _.each(cells, function(cell) { - options.position--; - this.addCell(cell, options); - }, this); - - return this; - }, - - // When adding a lot of cells, it is much more efficient to - // reset the entire cells collection in one go. - // Useful for bulk operations and optimizations. - resetCells: function(cells, opt) { - - this.get('cells').reset(_.map(cells, this._prepareCell, this), opt); - - return this; - }, - - removeCell: function(cell, collection, options) { - - // Applications might provide a `disconnectLinks` option set to `true` in order to - // disconnect links when a cell is removed rather then removing them. The default - // is to remove all the associated links. - if (options && options.disconnectLinks) { - - this.disconnectLinks(cell, options); - - } else { - - this.removeLinks(cell, options); - } - - // Silently remove the cell from the cells collection. Silently, because - // `joint.dia.Cell.prototype.remove` already triggers the `remove` event which is - // then propagated to the graph model. If we didn't remove the cell silently, two `remove` events - // would be triggered on the graph model. - this.get('cells').remove(cell, { silent: true }); - }, - - // Get a cell by `id`. - getCell: function(id) { - - return this.get('cells').get(id); - }, - - getElements: function() { - - return this.get('cells').filter(function(cell) { - - return cell instanceof joint.dia.Element; - }); - }, - - getLinks: function() { - - return this.get('cells').filter(function(cell) { - - return cell instanceof joint.dia.Link; - }); - }, - - // Get all inbound and outbound links connected to the cell `model`. - getConnectedLinks: function(model, opt) { - - return this.get('cells').getConnectedLinks(model, opt); - }, - - getNeighbors: function(el) { - - var links = this.getConnectedLinks(el); - var neighbors = []; - var cells = this.get('cells'); - - _.each(links, function(link) { - - var source = link.get('source'); - var target = link.get('target'); - - // Discard if it is a point. - if (!source.x) { - var sourceElement = cells.get(source.id); - if (sourceElement !== el) { - - neighbors.push(sourceElement); - } - } - if (!target.x) { - var targetElement = cells.get(target.id); - if (targetElement !== el) { - - neighbors.push(targetElement); - } - } - }); - - return neighbors; - }, - - // Disconnect links connected to the cell `model`. - disconnectLinks: function(model, options) { - - _.each(this.getConnectedLinks(model), function(link) { - - link.set(link.get('source').id === model.id ? 'source' : 'target', g.point(0, 0), options); - }); - }, - - // Remove links connected to the cell `model` completely. - removeLinks: function(model, options) { - - _.invoke(this.getConnectedLinks(model), 'remove', options); - }, - - // Find all views at given point - findModelsFromPoint: function(p) { - - return _.filter(this.getElements(), function(el) { - return el.getBBox().containsPoint(p); - }); - }, - - // Find all views in given area - findModelsInArea: function(r) { - - return _.filter(this.getElements(), function(el) { - return el.getBBox().intersect(r); - }); - }, - - // Return the bounding box of all `elements`. - getBBox: function(/* elements */) { - - var collection = this.get('cells'); - return collection.getBBox.apply(collection, arguments); - }, - - getCommonAncestor: function(/* cells */) { - - var collection = this.get('cells'); - return collection.getCommonAncestor.apply(collection, arguments); - } -}); - -// JointJS. -// (c) 2011-2013 client IO - -// joint.dia.Cell base model. -// -------------------------- - -joint.dia.Cell = Backbone.Model.extend({ - - // This is the same as Backbone.Model with the only difference that is uses _.merge - // instead of just _.extend. The reason is that we want to mixin attributes set in upper classes. - constructor: function(attributes, options) { - - var defaults; - var attrs = attributes || {}; - this.cid = _.uniqueId('c'); - this.attributes = {}; - if (options && options.collection) this.collection = options.collection; - if (options && options.parse) attrs = this.parse(attrs, options) || {}; - if (defaults = _.result(this, 'defaults')) { - //<custom code> - // Replaced the call to _.defaults with _.merge. - attrs = _.merge({}, defaults, attrs); - //</custom code> - } - this.set(attrs, options); - this.changed = {}; - this.initialize.apply(this, arguments); - }, - - toJSON: function() { - - var defaultAttrs = this.constructor.prototype.defaults.attrs || {}; - var attrs = this.attributes.attrs; - var finalAttrs = {}; - - // Loop through all the attributes and - // omit the default attributes as they are implicitly reconstructable by the cell 'type'. - _.each(attrs, function(attr, selector) { - - var defaultAttr = defaultAttrs[selector]; - - _.each(attr, function(value, name) { - - // attr is mainly flat though it might have one more level (consider the `style` attribute). - // Check if the `value` is object and if yes, go one level deep. - if (_.isObject(value) && !_.isArray(value)) { - - _.each(value, function(value2, name2) { - - if (!defaultAttr || !defaultAttr[name] || !_.isEqual(defaultAttr[name][name2], value2)) { - - finalAttrs[selector] = finalAttrs[selector] || {}; - (finalAttrs[selector][name] || (finalAttrs[selector][name] = {}))[name2] = value2; - } - }); - - } else if (!defaultAttr || !_.isEqual(defaultAttr[name], value)) { - // `value` is not an object, default attribute for such a selector does not exist - // or it is different than the attribute value set on the model. - - finalAttrs[selector] = finalAttrs[selector] || {}; - finalAttrs[selector][name] = value; - } - }); - }); - - var attributes = _.cloneDeep(_.omit(this.attributes, 'attrs')); - //var attributes = JSON.parse(JSON.stringify(_.omit(this.attributes, 'attrs'))); - attributes.attrs = finalAttrs; - - return attributes; - }, - - initialize: function(options) { - - if (!options || !options.id) { - - this.set('id', joint.util.uuid(), { silent: true }); - } - - this._transitionIds = {}; - - // Collect ports defined in `attrs` and keep collecting whenever `attrs` object changes. - this.processPorts(); - this.on('change:attrs', this.processPorts, this); - }, - - processPorts: function() { - - // Whenever `attrs` changes, we extract ports from the `attrs` object and store it - // in a more accessible way. Also, if any port got removed and there were links that had `target`/`source` - // set to that port, we remove those links as well (to follow the same behaviour as - // with a removed element). - - var previousPorts = this.ports; - - // Collect ports from the `attrs` object. - var ports = {}; - _.each(this.get('attrs'), function(attrs, selector) { - - if (attrs && attrs.port) { - - // `port` can either be directly an `id` or an object containing an `id` (and potentially other data). - if (!_.isUndefined(attrs.port.id)) { - ports[attrs.port.id] = attrs.port; - } else { - ports[attrs.port] = { id: attrs.port }; - } - } - }); - - // Collect ports that have been removed (compared to the previous ports) - if any. - // Use hash table for quick lookup. - var removedPorts = {}; - _.each(previousPorts, function(port, id) { - - if (!ports[id]) removedPorts[id] = true; - }); - - // Remove all the incoming/outgoing links that have source/target port set to any of the removed ports. - if (this.collection && !_.isEmpty(removedPorts)) { - - var inboundLinks = this.collection.getConnectedLinks(this, { inbound: true }); - _.each(inboundLinks, function(link) { - - if (removedPorts[link.get('target').port]) link.remove(); - }); - - var outboundLinks = this.collection.getConnectedLinks(this, { outbound: true }); - _.each(outboundLinks, function(link) { - - if (removedPorts[link.get('source').port]) link.remove(); - }); - } - - // Update the `ports` object. - this.ports = ports; - }, - - remove: function(opt) { - - opt = opt || {}; - - var collection = this.collection; - - if (collection) { - collection.trigger('batch:start', { batchName: 'remove' }); - } - - // First, unembed this cell from its parent cell if there is one. - var parentCellId = this.get('parent'); - if (parentCellId) { - - var parentCell = this.collection && this.collection.get(parentCellId); - parentCell.unembed(this); - } - - _.invoke(this.getEmbeddedCells(), 'remove', opt); - - this.trigger('remove', this, this.collection, opt); - - if (collection) { - collection.trigger('batch:stop', { batchName: 'remove' }); - } - - return this; - }, - - toFront: function(opt) { - - if (this.collection) { - - opt = opt || {}; - - var z = (this.collection.last().get('z') || 0) + 1; - - this.trigger('batch:start', { batchName: 'to-front' }).set('z', z, opt); - - if (opt.deep) { - - var cells = this.getEmbeddedCells({ deep: true, breadthFirst: true }); - _.each(cells, function(cell) { cell.set('z', ++z, opt); }); - - } - - this.trigger('batch:stop', { batchName: 'to-front' }); - } - - return this; - }, - - toBack: function(opt) { - - if (this.collection) { - - opt = opt || {}; - - var z = (this.collection.first().get('z') || 0) - 1; - - this.trigger('batch:start', { batchName: 'to-back' }); - - if (opt.deep) { - - var cells = this.getEmbeddedCells({ deep: true, breadthFirst: true }); - _.eachRight(cells, function(cell) { cell.set('z', z--, opt); }); - } - - this.set('z', z, opt).trigger('batch:stop', { batchName: 'to-back' }); - } - - return this; - }, - - embed: function(cell, opt) { - - if (this == cell || this.isEmbeddedIn(cell)) { - - throw new Error('Recursive embedding not allowed.'); - - } else { - - this.trigger('batch:start', { batchName: 'embed' }); - - var embeds = _.clone(this.get('embeds') || []); - - // We keep all element ids after links ids. - embeds[cell.isLink() ? 'unshift' : 'push'](cell.id); - - cell.set('parent', this.id, opt); - this.set('embeds', _.uniq(embeds), opt); - - this.trigger('batch:stop', { batchName: 'embed' }); - } - - return this; - }, - - unembed: function(cell, opt) { - - this.trigger('batch:start', { batchName: 'unembed' }); - - cell.unset('parent', opt); - this.set('embeds', _.without(this.get('embeds'), cell.id), opt); - - this.trigger('batch:stop', { batchName: 'unembed' }); - - return this; - }, - - // Return an array of ancestor cells. - // The array is ordered from the parent of the cell - // to the most distant ancestor. - getAncestors: function() { - - var ancestors = []; - var parentId = this.get('parent'); - - if (this.collection === undefined) - return ancestors; - - while (parentId !== undefined) { - var parent = this.collection.get(parentId); - if (parent !== undefined) { - ancestors.push(parent); - parentId = parent.get('parent'); - } else { - break; - } - } - - return ancestors; - }, - - getEmbeddedCells: function(opt) { - - opt = opt || {}; - - // Cell models can only be retrieved when this element is part of a collection. - // There is no way this element knows about other cells otherwise. - // This also means that calling e.g. `translate()` on an element with embeds before - // adding it to a graph does not translate its embeds. - if (this.collection) { - - var cells; - - if (opt.deep) { - - if (opt.breadthFirst) { - - // breadthFirst algorithm - cells = []; - var queue = this.getEmbeddedCells(); - - while (queue.length > 0) { - - var parent = queue.shift(); - cells.push(parent); - queue.push.apply(queue, parent.getEmbeddedCells()); - } - - } else { - - // depthFirst algorithm - cells = this.getEmbeddedCells(); - _.each(cells, function(cell) { - cells.push.apply(cells, cell.getEmbeddedCells(opt)); - }); - } - - } else { - - cells = _.map(this.get('embeds'), this.collection.get, this.collection); - } - - return cells; - } - return []; - }, - - isEmbeddedIn: function(cell, opt) { - - var cellId = _.isString(cell) ? cell : cell.id; - var parentId = this.get('parent'); - - opt = _.defaults({ deep: true }, opt); - - // See getEmbeddedCells(). - if (this.collection && opt.deep) { - - while (parentId) { - if (parentId == cellId) { - return true; - } - parentId = this.collection.get(parentId).get('parent'); - } - - return false; - - } else { - - // When this cell is not part of a collection check - // at least whether it's a direct child of given cell. - return parentId == cellId; - } - }, - - clone: function(opt) { - - opt = opt || {}; - - var clone = Backbone.Model.prototype.clone.apply(this, arguments); - - // We don't want the clone to have the same ID as the original. - clone.set('id', joint.util.uuid(), { silent: true }); - clone.set('embeds', ''); - - if (!opt.deep) return clone; - - // The rest of the `clone()` method deals with embeds. If `deep` option is set to `true`, - // the return value is an array of all the embedded clones created. - - var embeds = _.sortBy(this.getEmbeddedCells(), function(cell) { - // Sort embeds that links come before elements. - return cell instanceof joint.dia.Element; - }); - - var clones = [clone]; - - // This mapping stores cloned links under the `id`s of they originals. - // This prevents cloning a link more then once. Consider a link 'self loop' for example. - var linkCloneMapping = {}; - - _.each(embeds, function(embed) { - - var embedClones = embed.clone({ deep: true }); - - // Embed the first clone returned from `clone({ deep: true })` above. The first - // cell is always the clone of the cell that called the `clone()` method, i.e. clone of `embed` in this case. - clone.embed(embedClones[0]); - - _.each(embedClones, function(embedClone) { - - if (embedClone instanceof joint.dia.Link) { - - if (embedClone.get('source').id == this.id) { - - embedClone.prop('source', { id: clone.id }); - } - - if (embedClone.get('target').id == this.id) { - - embedClone.prop('target', { id: clone.id }); - } - - linkCloneMapping[embed.id] = embedClone; - - // Skip links. Inbound/outbound links are not relevant for them. - return; - } - - clones.push(embedClone); - - // Collect all inbound links, clone them (if not done already) and set their target to the `embedClone.id`. - var inboundLinks = this.collection.getConnectedLinks(embed, { inbound: true }); - - _.each(inboundLinks, function(link) { - - var linkClone = linkCloneMapping[link.id] || link.clone(); - - // Make sure we don't clone a link more then once. - linkCloneMapping[link.id] = linkClone; - - linkClone.prop('target', { id: embedClone.id }); - }); - - // Collect all inbound links, clone them (if not done already) and set their source to the `embedClone.id`. - var outboundLinks = this.collection.getConnectedLinks(embed, { outbound: true }); - - _.each(outboundLinks, function(link) { - - var linkClone = linkCloneMapping[link.id] || link.clone(); - - // Make sure we don't clone a link more then once. - linkCloneMapping[link.id] = linkClone; - - linkClone.prop('source', { id: embedClone.id }); - }); - - }, this); - - }, this); - - // Add link clones to the array of all the new clones. - clones = clones.concat(_.values(linkCloneMapping)); - - return clones; - }, - - // A convenient way to set nested properties. - // This method merges the properties you'd like to set with the ones - // stored in the cell and makes sure change events are properly triggered. - // You can either set a nested property with one object - // or use a property path. - // The most simple use case is: - // `cell.prop('name/first', 'John')` or - // `cell.prop({ name: { first: 'John' } })`. - // Nested arrays are supported too: - // `cell.prop('series/0/data/0/degree', 50)` or - // `cell.prop({ series: [ { data: [ { degree: 50 } ] } ] })`. - prop: function(props, value, opt) { - - var delim = '/'; - - if (_.isString(props)) { - // Get/set an attribute by a special path syntax that delimits - // nested objects by the colon character. - - if (arguments.length > 1) { - - var path = props; - var pathArray = path.split('/'); - var property = pathArray[0]; - - opt = opt || {}; - opt.propertyPath = path; - opt.propertyValue = value; - - if (pathArray.length == 1) { - // Property is not nested. We can simply use `set()`. - return this.set(property, value, opt); - } - - var update = {}; - // Initialize the nested object. Subobjects are either arrays or objects. - // An empty array is created if the sub-key is an integer. Otherwise, an empty object is created. - // Note that this imposes a limitation on object keys one can use with Inspector. - // Pure integer keys will cause issues and are therefore not allowed. - var initializer = update; - var prevProperty = property; - _.each(_.rest(pathArray), function(key) { - initializer = initializer[prevProperty] = (_.isFinite(Number(key)) ? [] : {}); - prevProperty = key; - }); - // Fill update with the `value` on `path`. - update = joint.util.setByPath(update, path, value, '/'); - - var baseAttributes = _.merge({}, this.attributes); - // if rewrite mode enabled, we replace value referenced by path with - // the new one (we don't merge). - opt.rewrite && joint.util.unsetByPath(baseAttributes, path, '/'); - - // Merge update with the model attributes. - var attributes = _.merge(baseAttributes, update); - // Finally, set the property to the updated attributes. - return this.set(property, attributes[property], opt); - - } else { - - return joint.util.getByPath(this.attributes, props, delim); - } - } - - return this.set(_.merge({}, this.attributes, props), value); - }, - - // A convient way to unset nested properties - removeProp: function(path, opt) { - - // Once a property is removed from the `attrs` attribute - // the cellView will recognize a `dirty` flag and rerender itself - // in order to remove the attribute from SVG element. - opt = opt || {}; - opt.dirty = true; - - var pathArray = path.split('/'); - - if (pathArray.length === 1) { - // A top level property - return this.unset(path, opt); - } - - // A nested property - var property = pathArray[0]; - var nestedPath = pathArray.slice(1).join('/'); - var propertyValue = _.merge({}, this.get(property)); - - joint.util.unsetByPath(propertyValue, nestedPath, '/'); - - return this.set(property, propertyValue, opt); - }, - - // A convenient way to set nested attributes. - attr: function(attrs, value, opt) { - - var args = Array.prototype.slice.call(arguments); - - if (_.isString(attrs)) { - // Get/set an attribute by a special path syntax that delimits - // nested objects by the colon character. - args[0] = 'attrs/' + attrs; - - } else { - - args[0] = { 'attrs' : attrs }; - } - - return this.prop.apply(this, args); - }, - - // A convenient way to unset nested attributes - removeAttr: function(path, opt) { - - if (_.isArray(path)) { - _.each(path, function(p) { this.removeAttr(p, opt); }, this); - return this; - } - - return this.removeProp('attrs/' + path, opt); - }, - - transition: function(path, value, opt, delim) { - - delim = delim || '/'; - - var defaults = { - duration: 100, - delay: 10, - timingFunction: joint.util.timing.linear, - valueFunction: joint.util.interpolate.number - }; - - opt = _.extend(defaults, opt); - - var firstFrameTime = 0; - var interpolatingFunction; - - var setter = _.bind(function(runtime) { - - var id, progress, propertyValue, status; - - firstFrameTime = firstFrameTime || runtime; - runtime -= firstFrameTime; - progress = runtime / opt.duration; - - if (progress < 1) { - this._transitionIds[path] = id = joint.util.nextFrame(setter); - } else { - progress = 1; - delete this._transitionIds[path]; - } - - propertyValue = interpolatingFunction(opt.timingFunction(progress)); - - opt.transitionId = id; - - this.prop(path, propertyValue, opt); - - if (!id) this.trigger('transition:end', this, path); - - }, this); - - var initiator = _.bind(function(callback) { - - this.stopTransitions(path); - - interpolatingFunction = opt.valueFunction(joint.util.getByPath(this.attributes, path, delim), value); - - this._transitionIds[path] = joint.util.nextFrame(callback); - - this.trigger('transition:start', this, path); - - }, this); - - return _.delay(initiator, opt.delay, setter); - }, - - getTransitions: function() { - return _.keys(this._transitionIds); - }, - - stopTransitions: function(path, delim) { - - delim = delim || '/'; - - var pathArray = path && path.split(delim); - - _(this._transitionIds).keys().filter(pathArray && function(key) { - - return _.isEqual(pathArray, key.split(delim).slice(0, pathArray.length)); - - }).each(function(key) { - - joint.util.cancelFrame(this._transitionIds[key]); - - delete this._transitionIds[key]; - - this.trigger('transition:end', this, key); - - }, this); - - return this; - }, - - // A shorcut making it easy to create constructs like the following: - // `var el = (new joint.shapes.basic.Rect).addTo(graph)`. - addTo: function(graph, opt) { - - graph.addCell(this, opt); - return this; - }, - - // A shortcut for an equivalent call: `paper.findViewByModel(cell)` - // making it easy to create constructs like the following: - // `cell.findView(paper).highlight()` - findView: function(paper) { - - return paper.findViewByModel(this); - }, - - isLink: function() { - - return false; - } -}); - -// joint.dia.CellView base view and controller. -// -------------------------------------------- - -// This is the base view and controller for `joint.dia.ElementView` and `joint.dia.LinkView`. - -joint.dia.CellView = Backbone.View.extend({ - - tagName: 'g', - - attributes: function() { - - return { 'model-id': this.model.id }; - }, - - constructor: function(options) { - - this._configure(options); - Backbone.View.apply(this, arguments); - }, - - _configure: function(options) { - - if (this.options) options = _.extend({}, _.result(this, 'options'), options); - this.options = options; - // Make sure a global unique id is assigned to this view. Store this id also to the properties object. - // The global unique id makes sure that the same view can be rendered on e.g. different machines and - // still be associated to the same object among all those clients. This is necessary for real-time - // collaboration mechanism. - this.options.id = this.options.id || joint.util.guid(this); - }, - - initialize: function() { - - _.bindAll(this, 'remove', 'update'); - - // Store reference to this to the <g> DOM element so that the view is accessible through the DOM tree. - this.$el.data('view', this); - - this.listenTo(this.model, 'remove', this.remove); - this.listenTo(this.model, 'change:attrs', this.onChangeAttrs); - }, - - onChangeAttrs: function(cell, attrs, opt) { - - if (opt.dirty) { - - // dirty flag could be set when a model attribute was removed and it needs to be cleared - // also from the DOM element. See cell.removeAttr(). - return this.render(); - } - - return this.update(); - }, - - // Override the Backbone `_ensureElement()` method in order to create a `<g>` node that wraps - // all the nodes of the Cell view. - _ensureElement: function() { - - var el; - - if (!this.el) { - - var attrs = _.extend({ id: this.id }, _.result(this, 'attributes')); - if (this.className) attrs['class'] = _.result(this, 'className'); - el = V(_.result(this, 'tagName'), attrs).node; - - } else { - - el = _.result(this, 'el'); - } - - this.setElement(el, false); - }, - - findBySelector: function(selector) { - - // These are either descendants of `this.$el` of `this.$el` itself. - // `.` is a special selector used to select the wrapping `<g>` element. - var $selected = selector === '.' ? this.$el : this.$el.find(selector); - return $selected; - }, - - notify: function(evt) { - - if (this.paper) { - - var args = Array.prototype.slice.call(arguments, 1); - - // Trigger the event on both the element itself and also on the paper. - this.trigger.apply(this, [evt].concat(args)); - - // Paper event handlers receive the view object as the first argument. - this.paper.trigger.apply(this.paper, [evt, this].concat(args)); - } - }, - - getStrokeBBox: function(el) { - // Return a bounding box rectangle that takes into account stroke. - // Note that this is a naive and ad-hoc implementation that does not - // works only in certain cases and should be replaced as soon as browsers will - // start supporting the getStrokeBBox() SVG method. - // @TODO any better solution is very welcome! - - var isMagnet = !!el; - - el = el || this.el; - var bbox = V(el).bbox(false, this.paper.viewport); - - var strokeWidth; - if (isMagnet) { - - strokeWidth = V(el).attr('stroke-width'); - - } else { - - strokeWidth = this.model.attr('rect/stroke-width') || this.model.attr('circle/stroke-width') || this.model.attr('ellipse/stroke-width') || this.model.attr('path/stroke-width'); - } - - strokeWidth = parseFloat(strokeWidth) || 0; - - return g.rect(bbox).moveAndExpand({ x: -strokeWidth / 2, y: -strokeWidth / 2, width: strokeWidth, height: strokeWidth }); - }, - - getBBox: function() { - - return V(this.el).bbox(); - }, - - highlight: function(el, opt) { - - el = !el ? this.el : this.$(el)[0] || this.el; - - // set partial flag if the highlighted element is not the entire view. - opt = opt || {}; - opt.partial = el != this.el; - - this.notify('cell:highlight', el, opt); - return this; - }, - - unhighlight: function(el, opt) { - - el = !el ? this.el : this.$(el)[0] || this.el; - - opt = opt || {}; - opt.partial = el != this.el; - - this.notify('cell:unhighlight', el, opt); - return this; - }, - - // Find the closest element that has the `magnet` attribute set to `true`. If there was not such - // an element found, return the root element of the cell view. - findMagnet: function(el) { - - var $el = this.$(el); - - if ($el.length === 0 || $el[0] === this.el) { - - // If the overall cell has set `magnet === false`, then return `undefined` to - // announce there is no magnet found for this cell. - // This is especially useful to set on cells that have 'ports'. In this case, - // only the ports have set `magnet === true` and the overall element has `magnet === false`. - var attrs = this.model.get('attrs') || {}; - if (attrs['.'] && attrs['.']['magnet'] === false) { - return undefined; - } - - return this.el; - } - - if ($el.attr('magnet')) { - - return $el[0]; - } - - return this.findMagnet($el.parent()); - }, - - // `selector` is a CSS selector or `'.'`. `filter` must be in the special JointJS filter format: - // `{ name: <name of the filter>, args: { <arguments>, ... }`. - // An example is: `{ filter: { name: 'blur', args: { radius: 5 } } }`. - applyFilter: function(selector, filter) { - - var $selected = this.findBySelector(selector); - - // Generate a hash code from the stringified filter definition. This gives us - // a unique filter ID for different definitions. - var filterId = filter.name + this.paper.svg.id + joint.util.hashCode(JSON.stringify(filter)); - - // If the filter already exists in the document, - // we're done and we can just use it (reference it using `url()`). - // If not, create one. - if (!this.paper.svg.getElementById(filterId)) { - - var filterSVGString = joint.util.filter[filter.name] && joint.util.filter[filter.name](filter.args || {}); - if (!filterSVGString) { - throw new Error('Non-existing filter ' + filter.name); - } - var filterElement = V(filterSVGString); - // Set the filter area to be 3x the bounding box of the cell - // and center the filter around the cell. - filterElement.attr({ - filterUnits: 'objectBoundingBox', - x: -1, y: -1, width: 3, height: 3 - }); - if (filter.attrs) filterElement.attr(filter.attrs); - filterElement.node.id = filterId; - V(this.paper.svg).defs().append(filterElement); - } - - $selected.each(function() { - - V(this).attr('filter', 'url(#' + filterId + ')'); - }); - }, - - // `selector` is a CSS selector or `'.'`. `attr` is either a `'fill'` or `'stroke'`. - // `gradient` must be in the special JointJS gradient format: - // `{ type: <linearGradient|radialGradient>, stops: [ { offset: <offset>, color: <color> }, ... ]`. - // An example is: `{ fill: { type: 'linearGradient', stops: [ { offset: '10%', color: 'green' }, { offset: '50%', color: 'blue' } ] } }`. - applyGradient: function(selector, attr, gradient) { - - var $selected = this.findBySelector(selector); - - // Generate a hash code from the stringified filter definition. This gives us - // a unique filter ID for different definitions. - var gradientId = gradient.type + this.paper.svg.id + joint.util.hashCode(JSON.stringify(gradient)); - - // If the gradient already exists in the document, - // we're done and we can just use it (reference it using `url()`). - // If not, create one. - if (!this.paper.svg.getElementById(gradientId)) { - - var gradientSVGString = [ - '<' + gradient.type + '>', - _.map(gradient.stops, function(stop) { - return '<stop offset="' + stop.offset + '" stop-color="' + stop.color + '" stop-opacity="' + (_.isFinite(stop.opacity) ? stop.opacity : 1) + '" />'; - }).join(''), - '</' + gradient.type + '>' - ].join(''); - - var gradientElement = V(gradientSVGString); - if (gradient.attrs) { gradientElement.attr(gradient.attrs); } - gradientElement.node.id = gradientId; - V(this.paper.svg).defs().append(gradientElement); - } - - $selected.each(function() { - - V(this).attr(attr, 'url(#' + gradientId + ')'); - }); - }, - - // Construct a unique selector for the `el` element within this view. - // `prevSelector` is being collected through the recursive call. - // No value for `prevSelector` is expected when using this method. - getSelector: function(el, prevSelector) { - - if (el === this.el) { - return prevSelector; - } - - var nthChild = V(el).index() + 1; - var selector = el.tagName + ':nth-child(' + nthChild + ')'; - - if (prevSelector) { - selector += ' > ' + prevSelector; - } - - return this.getSelector(el.parentNode, selector); - }, - - // Interaction. The controller part. - // --------------------------------- - - // Interaction is handled by the paper and delegated to the view in interest. - // `x` & `y` parameters passed to these functions represent the coordinates already snapped to the paper grid. - // If necessary, real coordinates can be obtained from the `evt` event object. - - // These functions are supposed to be overriden by the views that inherit from `joint.dia.Cell`, - // i.e. `joint.dia.Element` and `joint.dia.Link`. - - pointerdblclick: function(evt, x, y) { - - this.notify('cell:pointerdblclick', evt, x, y); - }, - - pointerclick: function(evt, x, y) { - - this.notify('cell:pointerclick', evt, x, y); - }, - - pointerdown: function(evt, x, y) { - - if (this.model.collection) { - this.model.trigger('batch:start', { batchName: 'pointer' }); - this._collection = this.model.collection; - } - - this.notify('cell:pointerdown', evt, x, y); - }, - - pointermove: function(evt, x, y) { - - this.notify('cell:pointermove', evt, x, y); - }, - - pointerup: function(evt, x, y) { - - this.notify('cell:pointerup', evt, x, y); - - if (this._collection) { - // we don't want to trigger event on model as model doesn't - // need to be member of collection anymore (remove) - this._collection.trigger('batch:stop', { batchName: 'pointer' }); - delete this._collection; - } - }, - - mouseover: function(evt) { - - this.notify('cell:mouseover', evt); - }, - - mouseout: function(evt) { - - this.notify('cell:mouseout', evt); - } -}); - -// JointJS library. -// (c) 2011-2013 client IO - -// joint.dia.Element base model. -// ----------------------------- - -joint.dia.Element = joint.dia.Cell.extend({ - - defaults: { - position: { x: 0, y: 0 }, - size: { width: 1, height: 1 }, - angle: 0 - }, - - position: function(x, y, opt) { - - var isSetter = _.isNumber(y); - - opt = (isSetter ? opt : x) || {}; - - // option `parentRelative` for setting the position relative to the element's parent. - if (opt.parentRelative) { - - // Getting the parent's position requires the collection. - // Cell.get('parent') helds cell id only. - if (!this.collection) throw new Error('Element must be part of a collection.'); - - var parent = this.collection.get(this.get('parent')); - var parentPosition = parent && !parent.isLink() - ? parent.get('position') - : { x: 0, y: 0 }; - } - - if (isSetter) { - - if (opt.parentRelative) { - x += parentPosition.x; - y += parentPosition.y; - } - - return this.set('position', { x: x, y: y }, opt); - - } else { // Getter returns a geometry point. - - var elementPosition = g.point(this.get('position')); - - return opt.parentRelative - ? elementPosition.difference(parentPosition) - : elementPosition; - } - }, - - translate: function(tx, ty, opt) { - - ty = ty || 0; - - if (tx === 0 && ty === 0) { - // Like nothing has happened. - return this; - } - - opt = opt || {}; - // Pass the initiator of the translation. - opt.translateBy = opt.translateBy || this.id; - // To find out by how much an element was translated in event 'change:position' handlers. - opt.tx = tx; - opt.ty = ty; - - var position = this.get('position') || { x: 0, y: 0 }; - var translatedPosition = { x: position.x + tx || 0, y: position.y + ty || 0 }; - - if (opt.transition) { - - if (!_.isObject(opt.transition)) opt.transition = {}; - - this.transition('position', translatedPosition, _.extend({}, opt.transition, { - valueFunction: joint.util.interpolate.object - })); - - } else { - - this.set('position', translatedPosition, opt); - - // Recursively call `translate()` on all the embeds cells. - _.invoke(this.getEmbeddedCells(), 'translate', tx, ty, opt); - } - - return this; - }, - - resize: function(width, height, opt) { - - this.trigger('batch:start', { batchName: 'resize' }); - this.set('size', { width: width, height: height }, opt); - this.trigger('batch:stop', { batchName: 'resize' }); - - return this; - }, - - fitEmbeds: function(opt) { - - opt = opt || 0; - - var collection = this.collection; - - // Getting the children's size and position requires the collection. - // Cell.get('embdes') helds an array of cell ids only. - if (!collection) throw new Error('Element must be part of a collection.'); - - var embeddedCells = this.getEmbeddedCells(); - - if (embeddedCells.length > 0) { - - this.trigger('batch:start', { batchName: 'fit-embeds' }); - - if (opt.deep) { - // Recursively apply fitEmbeds on all embeds first. - _.invoke(embeddedCells, 'fitEmbeds', opt); - } - - // Compute cell's size and position based on the children bbox - // and given padding. - var bbox = collection.getBBox(embeddedCells); - var padding = opt.padding || 0; - - if (_.isNumber(padding)) { - padding = { - left: padding, - right: padding, - top: padding, - bottom: padding - }; - } else { - padding = { - left: padding.left || 0, - right: padding.right || 0, - top: padding.top || 0, - bottom: padding.bottom || 0 - }; - } - - // Apply padding computed above to the bbox. - bbox.moveAndExpand({ - x: - padding.left, - y: - padding.top, - width: padding.right + padding.left, - height: padding.bottom + padding.top - }); - - // Set new element dimensions finally. - this.set({ - position: { x: bbox.x, y: bbox.y }, - size: { width: bbox.width, height: bbox.height } - }, opt); - - this.trigger('batch:stop', { batchName: 'fit-embeds' }); - } - - return this; - }, - - // Rotate element by `angle` degrees, optionally around `origin` point. - // If `origin` is not provided, it is considered to be the center of the element. - // If `absolute` is `true`, the `angle` is considered is abslute, i.e. it is not - // the difference from the previous angle. - rotate: function(angle, absolute, origin) { - - if (origin) { - - var center = this.getBBox().center(); - var size = this.get('size'); - var position = this.get('position'); - center.rotate(origin, this.get('angle') - angle); - var dx = center.x - size.width / 2 - position.x; - var dy = center.y - size.height / 2 - position.y; - this.trigger('batch:start', { batchName: 'rotate' }); - this.translate(dx, dy); - this.rotate(angle, absolute); - this.trigger('batch:stop', { batchName: 'rotate' }); - - } else { - - this.set('angle', absolute ? angle : (this.get('angle') + angle) % 360); - } - - return this; - }, - - getBBox: function() { - - var position = this.get('position'); - var size = this.get('size'); - - return g.rect(position.x, position.y, size.width, size.height); - } -}); - -// joint.dia.Element base view and controller. -// ------------------------------------------- - -joint.dia.ElementView = joint.dia.CellView.extend({ - - className: function() { - return 'element ' + this.model.get('type').split('.').join(' '); - }, - - initialize: function() { - - _.bindAll(this, 'translate', 'resize', 'rotate'); - - joint.dia.CellView.prototype.initialize.apply(this, arguments); - - this.listenTo(this.model, 'change:position', this.translate); - this.listenTo(this.model, 'change:size', this.resize); - this.listenTo(this.model, 'change:angle', this.rotate); - }, - - // Default is to process the `attrs` object and set attributes on subelements based on the selectors. - update: function(cell, renderingOnlyAttrs) { - - var allAttrs = this.model.get('attrs'); - - var rotatable = V(this.$('.rotatable')[0]); - if (rotatable) { - - var rotation = rotatable.attr('transform'); - rotatable.attr('transform', ''); - } - - var relativelyPositioned = []; - - _.each(renderingOnlyAttrs || allAttrs, function(attrs, selector) { - - // Elements that should be updated. - var $selected = this.findBySelector(selector); - - // No element matched by the `selector` was found. We're done then. - if ($selected.length === 0) return; - - // Special attributes are treated by JointJS, not by SVG. - var specialAttributes = ['style', 'text', 'html', 'ref-x', 'ref-y', 'ref-dx', 'ref-dy', 'ref-width', 'ref-height', 'ref', 'x-alignment', 'y-alignment', 'port']; - - // If the `filter` attribute is an object, it is in the special JointJS filter format and so - // it becomes a special attribute and is treated separately. - if (_.isObject(attrs.filter)) { - - specialAttributes.push('filter'); - this.applyFilter(selector, attrs.filter); - } - - // If the `fill` or `stroke` attribute is an object, it is in the special JointJS gradient format and so - // it becomes a special attribute and is treated separately. - if (_.isObject(attrs.fill)) { - - specialAttributes.push('fill'); - this.applyGradient(selector, 'fill', attrs.fill); - } - if (_.isObject(attrs.stroke)) { - - specialAttributes.push('stroke'); - this.applyGradient(selector, 'stroke', attrs.stroke); - } - - // Make special case for `text` attribute. So that we can set text content of the `<text>` element - // via the `attrs` object as well. - // Note that it's important to set text before applying the rest of the final attributes. - // Vectorizer `text()` method sets on the element its own attributes and it has to be possible - // to rewrite them, if needed. (i.e display: 'none') - if (!_.isUndefined(attrs.text)) { - - $selected.each(function() { - - V(this).text(attrs.text + '', { lineHeight: attrs.lineHeight, textPath: attrs.textPath }); - }); - specialAttributes.push('lineHeight', 'textPath'); - } - - // Set regular attributes on the `$selected` subelement. Note that we cannot use the jQuery attr() - // method as some of the attributes might be namespaced (e.g. xlink:href) which fails with jQuery attr(). - var finalAttributes = _.omit(attrs, specialAttributes); - - $selected.each(function() { - - V(this).attr(finalAttributes); - }); - - // `port` attribute contains the `id` of the port that the underlying magnet represents. - if (attrs.port) { - - $selected.attr('port', _.isUndefined(attrs.port.id) ? attrs.port : attrs.port.id); - } - - // `style` attribute is special in the sense that it sets the CSS style of the subelement. - if (attrs.style) { - - $selected.css(attrs.style); - } - - if (!_.isUndefined(attrs.html)) { - - $selected.each(function() { - - $(this).html(attrs.html + ''); - }); - } - - // Special `ref-x` and `ref-y` attributes make it possible to set both absolute or - // relative positioning of subelements. - if (!_.isUndefined(attrs['ref-x']) || - !_.isUndefined(attrs['ref-y']) || - !_.isUndefined(attrs['ref-dx']) || - !_.isUndefined(attrs['ref-dy']) || - !_.isUndefined(attrs['x-alignment']) || - !_.isUndefined(attrs['y-alignment']) || - !_.isUndefined(attrs['ref-width']) || - !_.isUndefined(attrs['ref-height']) - ) { - - _.each($selected, function(el, index, list) { - var $el = $(el); - // copy original list selector to the element - $el.selector = list.selector; - relativelyPositioned.push($el); - }); - } - - }, this); - - // We don't want the sub elements to affect the bounding box of the root element when - // positioning the sub elements relatively to the bounding box. - //_.invoke(relativelyPositioned, 'hide'); - //_.invoke(relativelyPositioned, 'show'); - - // Note that we're using the bounding box without transformation because we are already inside - // a transformed coordinate system. - var bbox = this.el.getBBox(); - - renderingOnlyAttrs = renderingOnlyAttrs || {}; - - _.each(relativelyPositioned, function($el) { - - // if there was a special attribute affecting the position amongst renderingOnlyAttributes - // we have to merge it with rest of the element's attributes as they are necessary - // to update the position relatively (i.e `ref`) - var renderingOnlyElAttrs = renderingOnlyAttrs[$el.selector]; - var elAttrs = renderingOnlyElAttrs - ? _.merge({}, allAttrs[$el.selector], renderingOnlyElAttrs) - : allAttrs[$el.selector]; - - this.positionRelative($el, bbox, elAttrs); - - }, this); - - if (rotatable) { - - rotatable.attr('transform', rotation || ''); - } - }, - - positionRelative: function($el, bbox, elAttrs) { - - var ref = elAttrs['ref']; - var refX = parseFloat(elAttrs['ref-x']); - var refY = parseFloat(elAttrs['ref-y']); - var refDx = parseFloat(elAttrs['ref-dx']); - var refDy = parseFloat(elAttrs['ref-dy']); - var yAlignment = elAttrs['y-alignment']; - var xAlignment = elAttrs['x-alignment']; - var refWidth = parseFloat(elAttrs['ref-width']); - var refHeight = parseFloat(elAttrs['ref-height']); - - // `ref` is the selector of the reference element. If no `ref` is passed, reference - // element is the root element. - - var isScalable = _.contains(_.pluck(_.pluck($el.parents('g'), 'className'), 'baseVal'), 'scalable'); - - if (ref) { - - // Get the bounding box of the reference element relative to the root `<g>` element. - bbox = V(this.findBySelector(ref)[0]).bbox(false, this.el); - } - - var vel = V($el[0]); - - // Remove the previous translate() from the transform attribute and translate the element - // relative to the root bounding box following the `ref-x` and `ref-y` attributes. - if (vel.attr('transform')) { - - vel.attr('transform', vel.attr('transform').replace(/translate\([^)]*\)/g, '').trim() || ''); - } - - function isDefined(x) { - return _.isNumber(x) && !_.isNaN(x); - } - - // The final translation of the subelement. - var tx = 0; - var ty = 0; - - // 'ref-width'/'ref-height' defines the width/height of the subelement relatively to - // the reference element size - // val in 0..1 ref-width = 0.75 sets the width to 75% of the ref. el. width - // val < 0 || val > 1 ref-height = -20 sets the height to the the ref. el. height shorter by 20 - - if (isDefined(refWidth)) { - - if (refWidth >= 0 && refWidth <= 1) { - - vel.attr('width', refWidth * bbox.width); - - } else { - - vel.attr('width', Math.max(refWidth + bbox.width, 0)); - } - } - - if (isDefined(refHeight)) { - - if (refHeight >= 0 && refHeight <= 1) { - - vel.attr('height', refHeight * bbox.height); - - } else { - - vel.attr('height', Math.max(refHeight + bbox.height, 0)); - } - } - - // `ref-dx` and `ref-dy` define the offset of the subelement relative to the right and/or bottom - // coordinate of the reference element. - if (isDefined(refDx)) { - - if (isScalable) { - - // Compensate for the scale grid in case the elemnt is in the scalable group. - var scale = V(this.$('.scalable')[0]).scale(); - tx = bbox.x + bbox.width + refDx / scale.sx; - - } else { - - tx = bbox.x + bbox.width + refDx; - } - } - if (isDefined(refDy)) { - - if (isScalable) { - - // Compensate for the scale grid in case the elemnt is in the scalable group. - var scale = V(this.$('.scalable')[0]).scale(); - ty = bbox.y + bbox.height + refDy / scale.sy; - } else { - - ty = bbox.y + bbox.height + refDy; - } - } - - // if `refX` is in [0, 1] then `refX` is a fraction of bounding box width - // if `refX` is < 0 then `refX`'s absolute values is the right coordinate of the bounding box - // otherwise, `refX` is the left coordinate of the bounding box - // Analogical rules apply for `refY`. - if (isDefined(refX)) { - - if (refX > 0 && refX < 1) { - - tx = bbox.x + bbox.width * refX; - - } else if (isScalable) { - - // Compensate for the scale grid in case the elemnt is in the scalable group. - var scale = V(this.$('.scalable')[0]).scale(); - tx = bbox.x + refX / scale.sx; - - } else { - - tx = bbox.x + refX; - } - } - if (isDefined(refY)) { - - if (refY > 0 && refY < 1) { - - ty = bbox.y + bbox.height * refY; - - } else if (isScalable) { - - // Compensate for the scale grid in case the elemnt is in the scalable group. - var scale = V(this.$('.scalable')[0]).scale(); - ty = bbox.y + refY / scale.sy; - - } else { - - ty = bbox.y + refY; - } - } - - var velbbox = vel.bbox(false, this.paper.viewport); - // `y-alignment` when set to `middle` causes centering of the subelement around its new y coordinate. - if (yAlignment === 'middle') { - - ty -= velbbox.height / 2; - - } else if (isDefined(yAlignment)) { - - ty += (yAlignment > -1 && yAlignment < 1) ? velbbox.height * yAlignment : yAlignment; - } - - // `x-alignment` when set to `middle` causes centering of the subelement around its new x coordinate. - if (xAlignment === 'middle') { - - tx -= velbbox.width / 2; - - } else if (isDefined(xAlignment)) { - - tx += (xAlignment > -1 && xAlignment < 1) ? velbbox.width * xAlignment : xAlignment; - } - - vel.translate(tx, ty); - }, - - // `prototype.markup` is rendered by default. Set the `markup` attribute on the model if the - // default markup is not desirable. - renderMarkup: function() { - - var markup = this.model.markup || this.model.get('markup'); - - if (markup) { - - var nodes = V(markup); - V(this.el).append(nodes); - - } else { - - throw new Error('properties.markup is missing while the default render() implementation is used.'); - } - }, - - render: function() { - - this.$el.empty(); - - this.renderMarkup(); - - this.update(); - - this.resize(); - this.rotate(); - this.translate(); - - return this; - }, - - // Scale the whole `<g>` group. Note the difference between `scale()` and `resize()` here. - // `resize()` doesn't scale the whole `<g>` group but rather adjusts the `box.sx`/`box.sy` only. - // `update()` is then responsible for scaling only those elements that have the `follow-scale` - // attribute set to `true`. This is desirable in elements that have e.g. a `<text>` subelement - // that is not supposed to be scaled together with a surrounding `<rect>` element that IS supposed - // be be scaled. - scale: function(sx, sy) { - - // TODO: take into account the origin coordinates `ox` and `oy`. - V(this.el).scale(sx, sy); - }, - - resize: function() { - - var size = this.model.get('size') || { width: 1, height: 1 }; - var angle = this.model.get('angle') || 0; - - var scalable = V(this.$('.scalable')[0]); - if (!scalable) { - // If there is no scalable elements, than there is nothing to resize. - return; - } - var scalableBbox = scalable.bbox(true); - // Make sure `scalableBbox.width` and `scalableBbox.height` are not zero which can happen if the element does not have any content. By making - // the width/height 1, we prevent HTML errors of the type `scale(Infinity, Infinity)`. - scalable.attr('transform', 'scale(' + (size.width / (scalableBbox.width || 1)) + ',' + (size.height / (scalableBbox.height || 1)) + ')'); - - // Now the interesting part. The goal is to be able to store the object geometry via just `x`, `y`, `angle`, `width` and `height` - // Order of transformations is significant but we want to reconstruct the object always in the order: - // resize(), rotate(), translate() no matter of how the object was transformed. For that to work, - // we must adjust the `x` and `y` coordinates of the object whenever we resize it (because the origin of the - // rotation changes). The new `x` and `y` coordinates are computed by canceling the previous rotation - // around the center of the resized object (which is a different origin then the origin of the previous rotation) - // and getting the top-left corner of the resulting object. Then we clean up the rotation back to what it originally was. - - // Cancel the rotation but now around a different origin, which is the center of the scaled object. - var rotatable = V(this.$('.rotatable')[0]); - var rotation = rotatable && rotatable.attr('transform'); - if (rotation && rotation !== 'null') { - - rotatable.attr('transform', rotation + ' rotate(' + (-angle) + ',' + (size.width / 2) + ',' + (size.height / 2) + ')'); - var rotatableBbox = scalable.bbox(false, this.paper.viewport); - - // Store new x, y and perform rotate() again against the new rotation origin. - this.model.set('position', { x: rotatableBbox.x, y: rotatableBbox.y }); - this.rotate(); - } - - // Update must always be called on non-rotated element. Otherwise, relative positioning - // would work with wrong (rotated) bounding boxes. - this.update(); - }, - - translate: function(model, changes, opt) { - - var position = this.model.get('position') || { x: 0, y: 0 }; - - V(this.el).attr('transform', 'translate(' + position.x + ',' + position.y + ')'); - }, - - rotate: function() { - - var rotatable = V(this.$('.rotatable')[0]); - if (!rotatable) { - // If there is no rotatable elements, then there is nothing to rotate. - return; - } - - var angle = this.model.get('angle') || 0; - var size = this.model.get('size') || { width: 1, height: 1 }; - - var ox = size.width / 2; - var oy = size.height / 2; - - - rotatable.attr('transform', 'rotate(' + angle + ',' + ox + ',' + oy + ')'); - }, - - getBBox: function(opt) { - - if (opt && opt.useModelGeometry) { - var noTransformationBBox = this.model.getBBox().bbox(this.model.get('angle')); - var transformationMatrix = this.paper.viewport.getCTM(); - return V.transformRect(noTransformationBBox, transformationMatrix); - } - - return joint.dia.CellView.prototype.getBBox.apply(this, arguments); - }, - - // Embedding mode methods - // ---------------------- - - findParentsByKey: function(key) { - - var bbox = this.model.getBBox(); - - return key == 'bbox' - ? this.paper.model.findModelsInArea(bbox) - : this.paper.model.findModelsFromPoint(bbox[key]()); - }, - - prepareEmbedding: function() { - - // Bring the model to the front with all his embeds. - this.model.toFront({ deep: true, ui: true }); - - // Move to front also all the inbound and outbound links that are connected - // to any of the element descendant. If we bring to front only embedded elements, - // links connected to them would stay in the background. - _.invoke(this.paper.model.getConnectedLinks(this.model, { deep: true }), 'toFront', { ui: true }); - - // Before we start looking for suitable parent we remove the current one. - var parentId = this.model.get('parent'); - parentId && this.paper.model.getCell(parentId).unembed(this.model, { ui: true }); - }, - - processEmbedding: function(opt) { - - opt = opt || this.paper.options; - - var candidates = this.findParentsByKey(opt.findParentBy); - - // don't account element itself or any of its descendents - candidates = _.reject(candidates, function(el) { - return this.model.id == el.id || el.isEmbeddedIn(this.model); - }, this); - - if (opt.frontParentOnly) { - // pick the element with the highest `z` index - candidates = candidates.slice(-1); - } - - var newCandidateView = null; - var prevCandidateView = this._candidateEmbedView; - - // iterate over all candidates starting from the last one (has the highest z-index). - for (var i = candidates.length - 1; i >= 0; i--) { - - var candidate = candidates[i]; - - if (prevCandidateView && prevCandidateView.model.id == candidate.id) { - - // candidate remains the same - newCandidateView = prevCandidateView; - break; - - } else { - - var view = candidate.findView(this.paper); - if (opt.validateEmbedding.call(this.paper, this, view)) { - - // flip to the new candidate - newCandidateView = view; - break; - } - } - } - - if (newCandidateView && newCandidateView != prevCandidateView) { - // A new candidate view found. Highlight the new one. - prevCandidateView && prevCandidateView.unhighlight(null, { embedding: true }); - this._candidateEmbedView = newCandidateView.highlight(null, { embedding: true }); - } - - if (!newCandidateView && prevCandidateView) { - // No candidate view found. Unhighlight the previous candidate. - prevCandidateView.unhighlight(null, { embedding: true }); - delete this._candidateEmbedView; - } - }, - - finalizeEmbedding: function() { - - var candidateView = this._candidateEmbedView; - - if (candidateView) { - - // We finished embedding. Candidate view is chosen to become the parent of the model. - candidateView.model.embed(this.model, { ui: true }); - candidateView.unhighlight(null, { embedding: true }); - - delete this._candidateEmbedView; - } - - _.invoke(this.paper.model.getConnectedLinks(this.model, { deep: true }), 'reparent', { ui: true }); - }, - - // Interaction. The controller part. - // --------------------------------- - - pointerdown: function(evt, x, y) { - - // target is a valid magnet start linking - if (evt.target.getAttribute('magnet') && this.paper.options.validateMagnet.call(this.paper, this, evt.target)) { - - this.model.trigger('batch:start', { batchName: 'add-link' }); - - var link = this.paper.getDefaultLink(this, evt.target); - link.set({ - source: { - id: this.model.id, - selector: this.getSelector(evt.target), - port: $(evt.target).attr('port') - }, - target: { x: x, y: y } - }); - - this.paper.model.addCell(link); - - this._linkView = this.paper.findViewByModel(link); - this._linkView.pointerdown(evt, x, y); - this._linkView.startArrowheadMove('target'); - - } else { - this._dx = x; - this._dy = y; - - joint.dia.CellView.prototype.pointerdown.apply(this, arguments); - this.notify('element:pointerdown', evt, x, y); - } - }, - - pointermove: function(evt, x, y) { - - if (this._linkView) { - - // let the linkview deal with this event - this._linkView.pointermove(evt, x, y); - - } else { - - var grid = this.paper.options.gridSize; - var interactive = _.isFunction(this.options.interactive) - ? this.options.interactive(this, 'pointermove') - : this.options.interactive; - - if (interactive !== false) { - - var position = this.model.get('position'); - - // Make sure the new element's position always snaps to the current grid after - // translate as the previous one could be calculated with a different grid size. - this.model.translate( - g.snapToGrid(position.x, grid) - position.x + g.snapToGrid(x - this._dx, grid), - g.snapToGrid(position.y, grid) - position.y + g.snapToGrid(y - this._dy, grid) - ); - - if (this.paper.options.embeddingMode) { - - if (!this._inProcessOfEmbedding) { - // Prepare the element for embedding only if the pointer moves. - // We don't want to do unnecessary action with the element - // if an user only clicks/dblclicks on it. - this.prepareEmbedding(); - this._inProcessOfEmbedding = true; - } - - this.processEmbedding(); - } - } - - this._dx = g.snapToGrid(x, grid); - this._dy = g.snapToGrid(y, grid); - - - joint.dia.CellView.prototype.pointermove.apply(this, arguments); - this.notify('element:pointermove', evt, x, y); - } - }, - - pointerup: function(evt, x, y) { - - if (this._linkView) { - - // let the linkview deal with this event - this._linkView.pointerup(evt, x, y); - delete this._linkView; - - this.model.trigger('batch:stop', { batchName: 'add-link' }); - - } else { - - if (this._inProcessOfEmbedding) { - this.finalizeEmbedding(); - this._inProcessOfEmbedding = false; - } - - this.notify('element:pointerup', evt, x, y); - joint.dia.CellView.prototype.pointerup.apply(this, arguments); - - } - } - -}); - -// JointJS diagramming library. -// (c) 2011-2013 client IO - -// joint.dia.Link base model. -// -------------------------- -joint.dia.Link = joint.dia.Cell.extend({ - - // The default markup for links. - markup: [ - '<path class="connection" stroke="black"/>', - '<path class="marker-source" fill="black" stroke="black" />', - '<path class="marker-target" fill="black" stroke="black" />', - '<path class="connection-wrap"/>', - '<g class="labels"/>', - '<g class="marker-vertices"/>', - '<g class="marker-arrowheads"/>', - '<g class="link-tools"/>' - ].join(''), - - labelMarkup: [ - '<g class="label">', - '<rect />', - '<text />', - '</g>' - ].join(''), - - toolMarkup: [ - '<g class="link-tool">', - '<g class="tool-remove" event="remove">', - '<circle r="11" />', - '<path transform="scale(.8) translate(-16, -16)" d="M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248z"/>', - '<title>Remove link.', - '', - '', - '', - '', - 'Link options.', - '', - '' - ].join(''), - - // The default markup for showing/removing vertices. These elements are the children of the .marker-vertices element (see `this.markup`). - // Only .marker-vertex and .marker-vertex-remove element have special meaning. The former is used for - // dragging vertices (changin their position). The latter is used for removing vertices. - vertexMarkup: [ - '', - '', - '', - '', - 'Remove vertex.', - '', - '' - ].join(''), - - arrowheadMarkup: [ - '', - '', - '' - ].join(''), - - defaults: { - - type: 'link', - source: {}, - target: {} - }, - - disconnect: function() { - - return this.set({ source: g.point(0, 0), target: g.point(0, 0) }); - }, - - // A convenient way to set labels. Currently set values will be mixined with `value` if used as a setter. - label: function(idx, value) { - - idx = idx || 0; - - var labels = this.get('labels') || []; - - // Is it a getter? - if (arguments.length === 0 || arguments.length === 1) { - - return labels[idx]; - } - - var newValue = _.merge({}, labels[idx], value); - - var newLabels = labels.slice(); - newLabels[idx] = newValue; - - return this.set({ labels: newLabels }); - }, - - translate: function(tx, ty, opt) { - - var attrs = {}; - var source = this.get('source'); - var target = this.get('target'); - var vertices = this.get('vertices'); - - if (!source.id) { - attrs.source = { x: source.x + tx, y: source.y + ty }; - } - - if (!target.id) { - attrs.target = { x: target.x + tx, y: target.y + ty }; - } - - if (vertices && vertices.length) { - attrs.vertices = _.map(vertices, function(vertex) { - return { x: vertex.x + tx, y: vertex.y + ty }; - }); - } - - return this.set(attrs, opt); - }, - - reparent: function(opt) { - - var newParent; - - if (this.collection) { - - var source = this.collection.get(this.get('source').id); - var target = this.collection.get(this.get('target').id); - var prevParent = this.collection.get(this.get('parent')); - - if (source && target) { - newParent = this.collection.getCommonAncestor(source, target); - } - - if (prevParent && (!newParent || newParent.id != prevParent.id)) { - // Unembed the link if source and target has no common ancestor - // or common ancestor changed - prevParent.unembed(this, opt); - } - - if (newParent) { - newParent.embed(this, opt); - } - } - - return newParent; - }, - - isLink: function() { - - return true; - }, - - hasLoop: function() { - - var sourceId = this.get('source').id; - var targetId = this.get('target').id; - - return sourceId && targetId && sourceId == targetId; - } -}); - - -// joint.dia.Link base view and controller. -// ---------------------------------------- - -joint.dia.LinkView = joint.dia.CellView.extend({ - - className: function() { - return _.unique(this.model.get('type').split('.').concat('link')).join(' '); - }, - - options: { - - shortLinkLength: 100, - doubleLinkTools: false, - longLinkLength: 160, - linkToolsOffset: 40, - doubleLinkToolsOffset: 60, - sampleInterval: 50 - }, - - initialize: function(options) { - - joint.dia.CellView.prototype.initialize.apply(this, arguments); - - // create methods in prototype, so they can be accessed from any instance and - // don't need to be create over and over - if (typeof this.constructor.prototype.watchSource !== 'function') { - this.constructor.prototype.watchSource = this.createWatcher('source'); - this.constructor.prototype.watchTarget = this.createWatcher('target'); - } - - // `_.labelCache` is a mapping of indexes of labels in the `this.get('labels')` array to - // `` nodes wrapped by Vectorizer. This allows for quick access to the - // nodes in `updateLabelPosition()` in order to update the label positions. - this._labelCache = {}; - - // keeps markers bboxes and positions again for quicker access - this._markerCache = {}; - - // bind events - this.startListening(); - }, - - startListening: function() { - - this.listenTo(this.model, 'change:markup', this.render); - this.listenTo(this.model, 'change:smooth change:manhattan change:router change:connector', this.update); - this.listenTo(this.model, 'change:toolMarkup', function() { - this.renderTools().updateToolsPosition(); - }); - this.listenTo(this.model, 'change:labels change:labelMarkup', function() { - this.renderLabels().updateLabelPositions(); - }); - this.listenTo(this.model, 'change:vertices change:vertexMarkup', function(cell, changed, opt) { - this.renderVertexMarkers(); - // If the vertices have been changed by a translation we do update only if the link was - // only one translated. If the link was translated via another element which the link - // is embedded in, this element will be translated as well and that triggers an update. - // Note that all embeds in a model are sorted - first comes links, then elements. - if (!opt.translateBy || (opt.translateBy == this.model.id || this.model.hasLoop())) { - this.update(); - } - }); - this.listenTo(this.model, 'change:source', function(cell, source) { - this.watchSource(cell, source).update(); - }); - this.listenTo(this.model, 'change:target', function(cell, target) { - this.watchTarget(cell, target).update(); - }); - }, - - // Rendering - //---------- - - render: function() { - - this.$el.empty(); - - // A special markup can be given in the `properties.markup` property. This might be handy - // if e.g. arrowhead markers should be `` elements or any other element than ``s. - // `.connection`, `.connection-wrap`, `.marker-source` and `.marker-target` selectors - // of elements with special meaning though. Therefore, those classes should be preserved in any - // special markup passed in `properties.markup`. - var children = V(this.model.get('markup') || this.model.markup); - - // custom markup may contain only one children - if (!_.isArray(children)) children = [children]; - - // Cache all children elements for quicker access. - this._V = {}; // vectorized markup; - _.each(children, function(child) { - var c = child.attr('class'); - c && (this._V[$.camelCase(c)] = child); - }, this); - - // Only the connection path is mandatory - if (!this._V.connection) throw new Error('link: no connection path in the markup'); - - // partial rendering - this.renderTools(); - this.renderVertexMarkers(); - this.renderArrowheadMarkers(); - - V(this.el).append(children); - - // rendering labels has to be run after the link is appended to DOM tree. (otherwise bbox - // returns zero values) - this.renderLabels(); - - // start watching the ends of the link for changes - this.watchSource(this.model, this.model.get('source')) - .watchTarget(this.model, this.model.get('target')) - .update(); - - return this; - }, - - renderLabels: function() { - - if (!this._V.labels) return this; - - this._labelCache = {}; - var $labels = $(this._V.labels.node).empty(); - - var labels = this.model.get('labels') || []; - if (!labels.length) return this; - - var labelTemplate = _.template(this.model.get('labelMarkup') || this.model.labelMarkup); - // This is a prepared instance of a vectorized SVGDOM node for the label element resulting from - // compilation of the labelTemplate. The purpose is that all labels will just `clone()` this - // node to create a duplicate. - var labelNodeInstance = V(labelTemplate()); - - var canLabelMove = this.can('labelMove'); - - _.each(labels, function(label, idx) { - - var labelNode = labelNodeInstance.clone().node; - V(labelNode).attr('label-idx', idx); - if (canLabelMove) { - V(labelNode).attr('cursor', 'move'); - } - - // Cache label nodes so that the `updateLabels()` can just update the label node positions. - this._labelCache[idx] = V(labelNode); - - var $text = $(labelNode).find('text'); - var $rect = $(labelNode).find('rect'); - - // Text attributes with the default `text-anchor` and font-size set. - var textAttributes = _.extend({ 'text-anchor': 'middle', 'font-size': 14 }, joint.util.getByPath(label, 'attrs/text', '/')); - - $text.attr(_.omit(textAttributes, 'text')); - - if (!_.isUndefined(textAttributes.text)) { - - V($text[0]).text(textAttributes.text + ''); - } - - // Note that we first need to append the `` element to the DOM in order to - // get its bounding box. - $labels.append(labelNode); - - // `y-alignment` - center the text element around its y coordinate. - var textBbox = V($text[0]).bbox(true, $labels[0]); - V($text[0]).translate(0, -textBbox.height / 2); - - // Add default values. - var rectAttributes = _.extend({ - - fill: 'white', - rx: 3, - ry: 3 - - }, joint.util.getByPath(label, 'attrs/rect', '/')); - - $rect.attr(_.extend(rectAttributes, { - x: textBbox.x, - y: textBbox.y - textBbox.height / 2, // Take into account the y-alignment translation. - width: textBbox.width, - height: textBbox.height - })); - - }, this); - - return this; - }, - - renderTools: function() { - - if (!this._V.linkTools) return this; - - // Tools are a group of clickable elements that manipulate the whole link. - // A good example of this is the remove tool that removes the whole link. - // Tools appear after hovering the link close to the `source` element/point of the link - // but are offset a bit so that they don't cover the `marker-arrowhead`. - - var $tools = $(this._V.linkTools.node).empty(); - var toolTemplate = _.template(this.model.get('toolMarkup') || this.model.toolMarkup); - var tool = V(toolTemplate()); - - $tools.append(tool.node); - - // Cache the tool node so that the `updateToolsPosition()` can update the tool position quickly. - this._toolCache = tool; - - // If `doubleLinkTools` is enabled, we render copy of the tools on the other side of the - // link as well but only if the link is longer than `longLinkLength`. - if (this.options.doubleLinkTools) { - - var tool2 = tool.clone(); - $tools.append(tool2.node); - this._tool2Cache = tool2; - } - - return this; - }, - - renderVertexMarkers: function() { - - if (!this._V.markerVertices) return this; - - var $markerVertices = $(this._V.markerVertices.node).empty(); - - // A special markup can be given in the `properties.vertexMarkup` property. This might be handy - // if default styling (elements) are not desired. This makes it possible to use any - // SVG elements for .marker-vertex and .marker-vertex-remove tools. - var markupTemplate = _.template(this.model.get('vertexMarkup') || this.model.vertexMarkup); - - _.each(this.model.get('vertices'), function(vertex, idx) { - - $markerVertices.append(V(markupTemplate(_.extend({ idx: idx }, vertex))).node); - }); - - return this; - }, - - renderArrowheadMarkers: function() { - - // Custom markups might not have arrowhead markers. Therefore, jump of this function immediately if that's the case. - if (!this._V.markerArrowheads) return this; - - var $markerArrowheads = $(this._V.markerArrowheads.node); - - $markerArrowheads.empty(); - - // A special markup can be given in the `properties.vertexMarkup` property. This might be handy - // if default styling (elements) are not desired. This makes it possible to use any - // SVG elements for .marker-vertex and .marker-vertex-remove tools. - var markupTemplate = _.template(this.model.get('arrowheadMarkup') || this.model.arrowheadMarkup); - - this._V.sourceArrowhead = V(markupTemplate({ end: 'source' })); - this._V.targetArrowhead = V(markupTemplate({ end: 'target' })); - - $markerArrowheads.append(this._V.sourceArrowhead.node, this._V.targetArrowhead.node); - - return this; - }, - - // Updating - //--------- - - // Default is to process the `attrs` object and set attributes on subelements based on the selectors. - update: function() { - - // Update attributes. - _.each(this.model.get('attrs'), function(attrs, selector) { - - var processedAttributes = []; - - // If the `fill` or `stroke` attribute is an object, it is in the special JointJS gradient format and so - // it becomes a special attribute and is treated separately. - if (_.isObject(attrs.fill)) { - - this.applyGradient(selector, 'fill', attrs.fill); - processedAttributes.push('fill'); - } - - if (_.isObject(attrs.stroke)) { - - this.applyGradient(selector, 'stroke', attrs.stroke); - processedAttributes.push('stroke'); - } - - // If the `filter` attribute is an object, it is in the special JointJS filter format and so - // it becomes a special attribute and is treated separately. - if (_.isObject(attrs.filter)) { - - this.applyFilter(selector, attrs.filter); - processedAttributes.push('filter'); - } - - // remove processed special attributes from attrs - if (processedAttributes.length > 0) { - - processedAttributes.unshift(attrs); - attrs = _.omit.apply(_, processedAttributes); - } - - this.findBySelector(selector).attr(attrs); - - }, this); - - // Path finding - var vertices = this.route = this.findRoute(this.model.get('vertices') || []); - - // finds all the connection points taking new vertices into account - this._findConnectionPoints(vertices); - - var pathData = this.getPathData(vertices); - - // The markup needs to contain a `.connection` - this._V.connection.attr('d', pathData); - this._V.connectionWrap && this._V.connectionWrap.attr('d', pathData); - - this._translateAndAutoOrientArrows(this._V.markerSource, this._V.markerTarget); - - //partials updates - this.updateLabelPositions(); - this.updateToolsPosition(); - this.updateArrowheadMarkers(); - - delete this.options.perpendicular; - // Mark that postponed update has been already executed. - this.updatePostponed = false; - - return this; - }, - - _findConnectionPoints: function(vertices) { - - // cache source and target points - var sourcePoint, targetPoint, sourceMarkerPoint, targetMarkerPoint; - - var firstVertex = _.first(vertices); - - sourcePoint = this.getConnectionPoint( - 'source', this.model.get('source'), firstVertex || this.model.get('target') - ).round(); - - var lastVertex = _.last(vertices); - - targetPoint = this.getConnectionPoint( - 'target', this.model.get('target'), lastVertex || sourcePoint - ).round(); - - // Move the source point by the width of the marker taking into account - // its scale around x-axis. Note that scale is the only transform that - // makes sense to be set in `.marker-source` attributes object - // as all other transforms (translate/rotate) will be replaced - // by the `translateAndAutoOrient()` function. - var cache = this._markerCache; - - if (this._V.markerSource) { - - cache.sourceBBox = cache.sourceBBox || this._V.markerSource.bbox(true); - - sourceMarkerPoint = g.point(sourcePoint).move( - firstVertex || targetPoint, - cache.sourceBBox.width * this._V.markerSource.scale().sx * -1 - ).round(); - } - - if (this._V.markerTarget) { - - cache.targetBBox = cache.targetBBox || this._V.markerTarget.bbox(true); - - targetMarkerPoint = g.point(targetPoint).move( - lastVertex || sourcePoint, - cache.targetBBox.width * this._V.markerTarget.scale().sx * -1 - ).round(); - } - - // if there was no markup for the marker, use the connection point. - cache.sourcePoint = sourceMarkerPoint || sourcePoint; - cache.targetPoint = targetMarkerPoint || targetPoint; - - // make connection points public - this.sourcePoint = sourcePoint; - this.targetPoint = targetPoint; - }, - - updateLabelPositions: function() { - - if (!this._V.labels) return this; - - // This method assumes all the label nodes are stored in the `this._labelCache` hash table - // by their indexes in the `this.get('labels')` array. This is done in the `renderLabels()` method. - - var labels = this.model.get('labels') || []; - if (!labels.length) return this; - - var connectionElement = this._V.connection.node; - var connectionLength = connectionElement.getTotalLength(); - - // Firefox returns connectionLength=NaN in odd cases (for bezier curves). - // In that case we won't update labels at all. - if (!_.isNaN(connectionLength)) { - - var samples; - - _.each(labels, function(label, idx) { - - var position = label.position; - var distance = _.isObject(position) ? position.distance : position; - var offset = _.isObject(position) ? position.offset : { x: 0, y: 0 }; - - distance = (distance > connectionLength) ? connectionLength : distance; // sanity check - distance = (distance < 0) ? connectionLength + distance : distance; - distance = (distance > 1) ? distance : connectionLength * distance; - - var labelCoordinates = connectionElement.getPointAtLength(distance); - - if (_.isObject(offset)) { - - // Just offset the label by the x,y provided in the offset object. - labelCoordinates = g.point(labelCoordinates).offset(offset.x, offset.y); - - } else if (_.isNumber(offset)) { - - if (!samples) { - samples = this._samples || this._V.connection.sample(this.options.sampleInterval); - } - - // Offset the label by the amount provided in `offset` to an either - // side of the link. - - // 1. Find the closest sample & its left and right neighbours. - var minSqDistance = Infinity; - var closestSample; - var closestSampleIndex; - var p; - var sqDistance; - for (var i = 0, len = samples.length; i < len; i++) { - p = samples[i]; - sqDistance = g.line(p, labelCoordinates).squaredLength(); - if (sqDistance < minSqDistance) { - minSqDistance = sqDistance; - closestSample = p; - closestSampleIndex = i; - } - } - var prevSample = samples[closestSampleIndex - 1]; - var nextSample = samples[closestSampleIndex + 1]; - - // 2. Offset the label on the perpendicular line between - // the current label coordinate ("at `distance`") and - // the next sample. - var angle = 0; - if (nextSample) { - angle = g.point(labelCoordinates).theta(nextSample); - } else if (prevSample) { - angle = g.point(prevSample).theta(labelCoordinates); - } - labelCoordinates = g.point(labelCoordinates).offset(offset).rotate(labelCoordinates, angle - 90); - } - - this._labelCache[idx].attr('transform', 'translate(' + labelCoordinates.x + ', ' + labelCoordinates.y + ')'); - - }, this); - } - - return this; - }, - - - updateToolsPosition: function() { - - if (!this._V.linkTools) return this; - - // Move the tools a bit to the target position but don't cover the `sourceArrowhead` marker. - // Note that the offset is hardcoded here. The offset should be always - // more than the `this.$('.marker-arrowhead[end="source"]')[0].bbox().width` but looking - // this up all the time would be slow. - - var scale = ''; - var offset = this.options.linkToolsOffset; - var connectionLength = this.getConnectionLength(); - - // Firefox returns connectionLength=NaN in odd cases (for bezier curves). - // In that case we won't update tools position at all. - if (!_.isNaN(connectionLength)) { - - // If the link is too short, make the tools half the size and the offset twice as low. - if (connectionLength < this.options.shortLinkLength) { - scale = 'scale(.5)'; - offset /= 2; - } - - var toolPosition = this.getPointAtLength(offset); - - this._toolCache.attr('transform', 'translate(' + toolPosition.x + ', ' + toolPosition.y + ') ' + scale); - - if (this.options.doubleLinkTools && connectionLength >= this.options.longLinkLength) { - - var doubleLinkToolsOffset = this.options.doubleLinkToolsOffset || offset; - - toolPosition = this.getPointAtLength(connectionLength - doubleLinkToolsOffset); - this._tool2Cache.attr('transform', 'translate(' + toolPosition.x + ', ' + toolPosition.y + ') ' + scale); - this._tool2Cache.attr('visibility', 'visible'); - - } else if (this.options.doubleLinkTools) { - - this._tool2Cache.attr('visibility', 'hidden'); - } - } - - return this; - }, - - - updateArrowheadMarkers: function() { - - if (!this._V.markerArrowheads) return this; - - // getting bbox of an element with `display="none"` in IE9 ends up with access violation - if ($.css(this._V.markerArrowheads.node, 'display') === 'none') return this; - - var sx = this.getConnectionLength() < this.options.shortLinkLength ? .5 : 1; - this._V.sourceArrowhead.scale(sx); - this._V.targetArrowhead.scale(sx); - - this._translateAndAutoOrientArrows(this._V.sourceArrowhead, this._V.targetArrowhead); - - return this; - }, - - // Returns a function observing changes on an end of the link. If a change happens and new end is a new model, - // it stops listening on the previous one and starts listening to the new one. - createWatcher: function(endType) { - - // create handler for specific end type (source|target). - var onModelChange = _.partial(this.onEndModelChange, endType); - - function watchEndModel(link, end) { - - end = end || {}; - - var endModel = null; - var previousEnd = link.previous(endType) || {}; - - if (previousEnd.id) { - this.stopListening(this.paper.getModelById(previousEnd.id), 'change', onModelChange); - } - - if (end.id) { - // If the observed model changes, it caches a new bbox and do the link update. - endModel = this.paper.getModelById(end.id); - this.listenTo(endModel, 'change', onModelChange); - } - - onModelChange.call(this, endModel, { cacheOnly: true }); - - return this; - } - - return watchEndModel; - }, - - onEndModelChange: function(endType, endModel, opt) { - - var doUpdate = !opt.cacheOnly; - var end = this.model.get(endType) || {}; - - if (endModel) { - - var selector = this.constructor.makeSelector(end); - var oppositeEndType = endType == 'source' ? 'target' : 'source'; - var oppositeEnd = this.model.get(oppositeEndType) || {}; - var oppositeSelector = oppositeEnd.id && this.constructor.makeSelector(oppositeEnd); - - // Caching end models bounding boxes - if (opt.isLoop && selector == oppositeSelector) { - - // Source and target elements are identical. We are handling `change` event for the - // second time now. There is no need to calculate bbox and find magnet element again. - // It was calculated already for opposite link end. - this[endType + 'BBox'] = this[oppositeEndType + 'BBox']; - this[endType + 'View'] = this[oppositeEndType + 'View']; - this[endType + 'Magnet'] = this[oppositeEndType + 'Magnet']; - - } else if (opt.translateBy) { - - var bbox = this[endType + 'BBox']; - bbox.x += opt.tx; - bbox.y += opt.ty; - - } else { - - var view = this.paper.findViewByModel(end.id); - var magnetElement = view.el.querySelector(selector); - - this[endType + 'BBox'] = view.getStrokeBBox(magnetElement); - this[endType + 'View'] = view; - this[endType + 'Magnet'] = magnetElement; - } - - if (opt.isLoop && opt.translateBy && - this.model.isEmbeddedIn(endModel) && - !_.isEmpty(this.model.get('vertices'))) { - // If the link is embedded, has a loop and vertices and the end model - // has been translated, do not update yet. There are vertices still to be updated. - doUpdate = false; - } - - if (!this.updatePostponed && oppositeEnd.id) { - - var oppositeEndModel = this.paper.getModelById(oppositeEnd.id); - - // Passing `isLoop` flag via event option. - // Note that if we are listening to the same model for event 'change' twice. - // The same event will be handled by this method also twice. - opt.isLoop = end.id == oppositeEnd.id; - - if (opt.isLoop || (opt.translateBy && oppositeEndModel.isEmbeddedIn(opt.translateBy))) { - - // Here are two options: - // - Source and target are connected to the same model (not necessary the same port) - // - both end models are translated by same ancestor. We know that opposte end - // model will be translated in the moment as well. - // In both situations there will be more changes on model that will trigger an - // update. So there is no need to update the linkView yet. - this.updatePostponed = true; - doUpdate = false; - } - } - - } else { - - // the link end is a point ~ rect 1x1 - this[endType + 'BBox'] = g.rect(end.x || 0, end.y || 0, 1, 1); - this[endType + 'View'] = this[endType + 'Magnet'] = null; - } - - // keep track which end had been changed very last - this.lastEndChange = endType; - - doUpdate && this.update(); - }, - - _translateAndAutoOrientArrows: function(sourceArrow, targetArrow) { - - // Make the markers "point" to their sticky points being auto-oriented towards - // `targetPosition`/`sourcePosition`. And do so only if there is a markup for them. - if (sourceArrow) { - sourceArrow.translateAndAutoOrient( - this.sourcePoint, - _.first(this.route) || this.targetPoint, - this.paper.viewport - ); - } - - if (targetArrow) { - targetArrow.translateAndAutoOrient( - this.targetPoint, - _.last(this.route) || this.sourcePoint, - this.paper.viewport - ); - } - }, - - removeVertex: function(idx) { - - var vertices = _.clone(this.model.get('vertices')); - - if (vertices && vertices.length) { - - vertices.splice(idx, 1); - this.model.set('vertices', vertices, { ui: true }); - } - - return this; - }, - - // This method ads a new vertex to the `vertices` array of `.connection`. This method - // uses a heuristic to find the index at which the new `vertex` should be placed at assuming - // the new vertex is somewhere on the path. - addVertex: function(vertex) { - - // As it is very hard to find a correct index of the newly created vertex, - // a little heuristics is taking place here. - // The heuristics checks if length of the newly created - // path is lot more than length of the old path. If this is the case, - // new vertex was probably put into a wrong index. - // Try to put it into another index and repeat the heuristics again. - - var vertices = (this.model.get('vertices') || []).slice(); - // Store the original vertices for a later revert if needed. - var originalVertices = vertices.slice(); - - // A `` element used to compute the length of the path during heuristics. - var path = this._V.connection.node.cloneNode(false); - - // Length of the original path. - var originalPathLength = path.getTotalLength(); - // Current path length. - var pathLength; - // Tolerance determines the highest possible difference between the length - // of the old and new path. The number has been chosen heuristically. - var pathLengthTolerance = 20; - // Total number of vertices including source and target points. - var idx = vertices.length + 1; - - // Loop through all possible indexes and check if the difference between - // path lengths changes significantly. If not, the found index is - // most probably the right one. - while (idx--) { - - vertices.splice(idx, 0, vertex); - V(path).attr('d', this.getPathData(this.findRoute(vertices))); - - pathLength = path.getTotalLength(); - - // Check if the path lengths changed significantly. - if (pathLength - originalPathLength > pathLengthTolerance) { - - // Revert vertices to the original array. The path length has changed too much - // so that the index was not found yet. - vertices = originalVertices.slice(); - - } else { - - break; - } - } - - if (idx === -1) { - // If no suitable index was found for such a vertex, make the vertex the first one. - idx = 0; - vertices.splice(idx, 0, vertex); - } - - this.model.set('vertices', vertices, { ui: true }); - - return idx; - }, - - // Send a token (an SVG element, usually a circle) along the connection path. - // Example: `paper.findViewByModel(link).sendToken(V('circle', { r: 7, fill: 'green' }).node)` - // `duration` is optional and is a time in milliseconds that the token travels from the source to the target of the link. Default is `1000`. - // `callback` is optional and is a function to be called once the token reaches the target. - sendToken: function(token, duration, callback) { - - duration = duration || 1000; - - V(this.paper.viewport).append(token); - V(token).animateAlongPath({ dur: duration + 'ms', repeatCount: 1 }, this._V.connection.node); - _.delay(function() { V(token).remove(); callback && callback(); }, duration); - }, - - findRoute: function(oldVertices) { - - var router = this.model.get('router'); - - if (!router) { - - if (this.model.get('manhattan')) { - // backwards compability - router = { name: 'orthogonal' }; - } else { - - return oldVertices; - } - } - - var fn = joint.routers[router.name]; - - if (!_.isFunction(fn)) { - - throw 'unknown router: ' + router.name; - } - - var newVertices = fn.call(this, oldVertices || [], router.args || {}, this); - - return newVertices; - }, - - // Return the `d` attribute value of the `` element representing the link - // between `source` and `target`. - getPathData: function(vertices) { - - var connector = this.model.get('connector'); - - if (!connector) { - - // backwards compability - connector = this.model.get('smooth') ? { name: 'smooth' } : { name: 'normal' }; - } - - if (!_.isFunction(joint.connectors[connector.name])) { - - throw 'unknown connector: ' + connector.name; - } - - var pathData = joint.connectors[connector.name].call( - this, - this._markerCache.sourcePoint, // Note that the value is translated by the size - this._markerCache.targetPoint, // of the marker. (We'r not using this.sourcePoint) - vertices || (this.model.get('vertices') || {}), - connector.args || {}, // options - this - ); - - return pathData; - }, - - // Find a point that is the start of the connection. - // If `selectorOrPoint` is a point, then we're done and that point is the start of the connection. - // If the `selectorOrPoint` is an element however, we need to know a reference point (or element) - // that the link leads to in order to determine the start of the connection on the original element. - getConnectionPoint: function(end, selectorOrPoint, referenceSelectorOrPoint) { - - var spot; - - // If the `selectorOrPoint` (or `referenceSelectorOrPoint`) is `undefined`, the `source`/`target` of the link model is `undefined`. - // We want to allow this however so that one can create links such as `var link = new joint.dia.Link` and - // set the `source`/`target` later. - _.isEmpty(selectorOrPoint) && (selectorOrPoint = { x: 0, y: 0 }); - _.isEmpty(referenceSelectorOrPoint) && (referenceSelectorOrPoint = { x: 0, y: 0 }); - - if (!selectorOrPoint.id) { - - // If the source is a point, we don't need a reference point to find the sticky point of connection. - spot = g.point(selectorOrPoint); - - } else { - - // If the source is an element, we need to find a point on the element boundary that is closest - // to the reference point (or reference element). - // Get the bounding box of the spot relative to the paper viewport. This is necessary - // in order to follow paper viewport transformations (scale/rotate). - // `_sourceBbox` (`_targetBbox`) comes from `_sourceBboxUpdate` (`_sourceBboxUpdate`) - // method, it exists since first render and are automatically updated - var spotBbox = end === 'source' ? this.sourceBBox : this.targetBBox; - - var reference; - - if (!referenceSelectorOrPoint.id) { - - // Reference was passed as a point, therefore, we're ready to find the sticky point of connection on the source element. - reference = g.point(referenceSelectorOrPoint); - - } else { - - // Reference was passed as an element, therefore we need to find a point on the reference - // element boundary closest to the source element. - // Get the bounding box of the spot relative to the paper viewport. This is necessary - // in order to follow paper viewport transformations (scale/rotate). - var referenceBbox = end === 'source' ? this.targetBBox : this.sourceBBox; - - reference = g.rect(referenceBbox).intersectionWithLineFromCenterToPoint(g.rect(spotBbox).center()); - reference = reference || g.rect(referenceBbox).center(); - } - - // If `perpendicularLinks` flag is set on the paper and there are vertices - // on the link, then try to find a connection point that makes the link perpendicular - // even though the link won't point to the center of the targeted object. - if (this.paper.options.perpendicularLinks || this.options.perpendicular) { - - var horizontalLineRect = g.rect(0, reference.y, this.paper.options.width, 1); - var verticalLineRect = g.rect(reference.x, 0, 1, this.paper.options.height); - var nearestSide; - - if (horizontalLineRect.intersect(g.rect(spotBbox))) { - - nearestSide = g.rect(spotBbox).sideNearestToPoint(reference); - switch (nearestSide) { - case 'left': - spot = g.point(spotBbox.x, reference.y); - break; - case 'right': - spot = g.point(spotBbox.x + spotBbox.width, reference.y); - break; - default: - spot = g.rect(spotBbox).center(); - break; - } - - } else if (verticalLineRect.intersect(g.rect(spotBbox))) { - - nearestSide = g.rect(spotBbox).sideNearestToPoint(reference); - switch (nearestSide) { - case 'top': - spot = g.point(reference.x, spotBbox.y); - break; - case 'bottom': - spot = g.point(reference.x, spotBbox.y + spotBbox.height); - break; - default: - spot = g.rect(spotBbox).center(); - break; - } - - } else { - - // If there is no intersection horizontally or vertically with the object bounding box, - // then we fall back to the regular situation finding straight line (not perpendicular) - // between the object and the reference point. - - spot = g.rect(spotBbox).intersectionWithLineFromCenterToPoint(reference); - spot = spot || g.rect(spotBbox).center(); - } - - } else if (this.paper.options.linkConnectionPoint) { - - var view = end === 'target' ? this.targetView : this.sourceView; - var magnet = end === 'target' ? this.targetMagnet : this.sourceMagnet; - - spot = this.paper.options.linkConnectionPoint(this, view, magnet, reference); - - } else { - - spot = g.rect(spotBbox).intersectionWithLineFromCenterToPoint(reference); - spot = spot || g.rect(spotBbox).center(); - } - } - - return spot; - }, - - // Public API - // ---------- - - getConnectionLength: function() { - - return this._V.connection.node.getTotalLength(); - }, - - getPointAtLength: function(length) { - - return this._V.connection.node.getPointAtLength(length); - }, - - // Interaction. The controller part. - // --------------------------------- - - _beforeArrowheadMove: function() { - - this._z = this.model.get('z'); - this.model.toFront(); - - // Let the pointer propagate throught the link view elements so that - // the `evt.target` is another element under the pointer, not the link itself. - this.el.style.pointerEvents = 'none'; - - if (this.paper.options.markAvailable) { - this._markAvailableMagnets(); - } - }, - - _afterArrowheadMove: function() { - - if (this._z) { - this.model.set('z', this._z, { ui: true }); - delete this._z; - } - - // Put `pointer-events` back to its original value. See `startArrowheadMove()` for explanation. - // Value `auto` doesn't work in IE9. We force to use `visiblePainted` instead. - // See `https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events`. - this.el.style.pointerEvents = 'visiblePainted'; - - if (this.paper.options.markAvailable) { - this._unmarkAvailableMagnets(); - } - }, - - _createValidateConnectionArgs: function(arrowhead) { - // It makes sure the arguments for validateConnection have the following form: - // (source view, source magnet, target view, target magnet and link view) - var args = []; - - args[4] = arrowhead; - args[5] = this; - - var oppositeArrowhead; - var i = 0; - var j = 0; - - if (arrowhead === 'source') { - i = 2; - oppositeArrowhead = 'target'; - } else { - j = 2; - oppositeArrowhead = 'source'; - } - - var end = this.model.get(oppositeArrowhead); - - if (end.id) { - args[i] = this.paper.findViewByModel(end.id); - args[i + 1] = end.selector && args[i].el.querySelector(end.selector); - } - - function validateConnectionArgs(cellView, magnet) { - args[j] = cellView; - args[j + 1] = cellView.el === magnet ? undefined : magnet; - return args; - } - - return validateConnectionArgs; - }, - - _markAvailableMagnets: function() { - - var elements = this.paper.model.getElements(); - var validate = this.paper.options.validateConnection; - - _.chain(elements).map(this.paper.findViewByModel, this.paper).each(function(view) { - - var isElementAvailable = view.el.getAttribute('magnet') !== 'false' && - validate.apply(this.paper, this._validateConnectionArgs(view, null)); - - var availableMagnets = _.filter(view.el.querySelectorAll('[magnet]'), function(magnet) { - return validate.apply(this.paper, this._validateConnectionArgs(view, magnet)); - }, this); - - if (isElementAvailable) { - V(view.el).addClass('available-magnet'); - } - - _.each(availableMagnets, function(magnet) { - V(magnet).addClass('available-magnet'); - }); - - if (isElementAvailable || availableMagnets.length) { - V(view.el).addClass('available-cell'); - } - - }, this); - }, - - _unmarkAvailableMagnets: function() { - - _.each(this.paper.el.querySelectorAll('.available-cell, .available-magnet'), function(magnet) { - V(magnet).removeClass('available-magnet').removeClass('available-cell'); - }); - }, - - startArrowheadMove: function(end) { - // Allow to delegate events from an another view to this linkView in order to trigger arrowhead - // move without need to click on the actual arrowhead dom element. - this._action = 'arrowhead-move'; - this._arrowhead = end; - this._validateConnectionArgs = this._createValidateConnectionArgs(this._arrowhead); - this._beforeArrowheadMove(); - }, - - // Return `true` if the link is allowed to perform a certain UI `feature`. - // Example: `can('vertexMove')`, `can('labelMove')`. - can: function(feature) { - - var interactive = _.isFunction(this.options.interactive) ? this.options.interactive(this, 'pointerdown') : this.options.interactive; - if (!_.isObject(interactive) || interactive[feature] !== false) return true; - return false; - }, - - pointerdown: function(evt, x, y) { - - joint.dia.CellView.prototype.pointerdown.apply(this, arguments); - this.notify('link:pointerdown', evt, x, y); - - this._dx = x; - this._dy = y; - - // if are simulating pointerdown on a link during a magnet click, skip link interactions - if (evt.target.getAttribute('magnet') != null) return; - - var interactive = _.isFunction(this.options.interactive) ? this.options.interactive(this, 'pointerdown') : this.options.interactive; - if (interactive === false) return; - - var className = evt.target.getAttribute('class'); - var parentClassName = evt.target.parentNode.getAttribute('class'); - var labelNode; - if (parentClassName === 'label') { - className = parentClassName; - labelNode = evt.target.parentNode; - } else { - labelNode = evt.target; - } - - switch (className) { - - case 'marker-vertex': - if (this.can('vertexMove')) { - this._action = 'vertex-move'; - this._vertexIdx = evt.target.getAttribute('idx'); - } - break; - - case 'marker-vertex-remove': - case 'marker-vertex-remove-area': - if (this.can('vertexRemove')) { - this.removeVertex(evt.target.getAttribute('idx')); - } - break; - - case 'marker-arrowhead': - if (this.can('arrowheadMove')) { - this.startArrowheadMove(evt.target.getAttribute('end')); - } - break; - - case 'label': - if (this.can('labelMove')) { - this._action = 'label-move'; - this._labelIdx = parseInt(V(labelNode).attr('label-idx'), 10); - // Precalculate samples so that we don't have to do that - // over and over again while dragging the label. - this._samples = this._V.connection.sample(1); - this._linkLength = this._V.connection.node.getTotalLength(); - } - break; - - default: - - var targetParentEvent = evt.target.parentNode.getAttribute('event'); - if (targetParentEvent) { - - // `remove` event is built-in. Other custom events are triggered on the paper. - if (targetParentEvent === 'remove') { - this.model.remove(); - } else { - this.paper.trigger(targetParentEvent, evt, this, x, y); - } - - } else { - if (this.can('vertexAdd')) { - - // Store the index at which the new vertex has just been placed. - // We'll be update the very same vertex position in `pointermove()`. - this._vertexIdx = this.addVertex({ x: x, y: y }); - this._action = 'vertex-move'; - } - } - } - }, - - pointermove: function(evt, x, y) { - - switch (this._action) { - - case 'vertex-move': - - var vertices = _.clone(this.model.get('vertices')); - vertices[this._vertexIdx] = { x: x, y: y }; - this.model.set('vertices', vertices, { ui: true }); - break; - - case 'label-move': - - var dragPoint = { x: x, y: y }; - var label = this.model.get('labels')[this._labelIdx]; - var samples = this._samples; - var minSqDistance = Infinity; - var closestSample; - var closestSampleIndex; - var p; - var sqDistance; - for (var i = 0, len = samples.length; i < len; i++) { - p = samples[i]; - sqDistance = g.line(p, dragPoint).squaredLength(); - if (sqDistance < minSqDistance) { - minSqDistance = sqDistance; - closestSample = p; - closestSampleIndex = i; - } - } - var prevSample = samples[closestSampleIndex - 1]; - var nextSample = samples[closestSampleIndex + 1]; - - var closestSampleDistance = g.point(closestSample).distance(dragPoint); - var offset = 0; - if (prevSample && nextSample) { - offset = g.line(prevSample, nextSample).pointOffset(dragPoint); - } else if (prevSample) { - offset = g.line(prevSample, closestSample).pointOffset(dragPoint); - } else if (nextSample) { - offset = g.line(closestSample, nextSample).pointOffset(dragPoint); - } - - this.model.label(this._labelIdx, { - position: { - distance: closestSample.distance / this._linkLength, - offset: offset - } - }); - break; - - case 'arrowhead-move': - - if (this.paper.options.snapLinks) { - - // checking view in close area of the pointer - - var r = this.paper.options.snapLinks.radius || 50; - var viewsInArea = this.paper.findViewsInArea({ x: x - r, y: y - r, width: 2 * r, height: 2 * r }); - - this._closestView && this._closestView.unhighlight(this._closestEnd.selector, { connecting: true, snapping: true }); - this._closestView = this._closestEnd = null; - - var distance; - var minDistance = Number.MAX_VALUE; - var pointer = g.point(x, y); - - _.each(viewsInArea, function(view) { - - // skip connecting to the element in case '.': { magnet: false } attribute present - if (view.el.getAttribute('magnet') !== 'false') { - - // find distance from the center of the model to pointer coordinates - distance = view.model.getBBox().center().distance(pointer); - - // the connection is looked up in a circle area by `distance < r` - if (distance < r && distance < minDistance) { - - if (this.paper.options.validateConnection.apply( - this.paper, this._validateConnectionArgs(view, null) - )) { - minDistance = distance; - this._closestView = view; - this._closestEnd = { id: view.model.id }; - } - } - } - - view.$('[magnet]').each(_.bind(function(index, magnet) { - - var bbox = V(magnet).bbox(false, this.paper.viewport); - - distance = pointer.distance({ - x: bbox.x + bbox.width / 2, - y: bbox.y + bbox.height / 2 - }); - - if (distance < r && distance < minDistance) { - - if (this.paper.options.validateConnection.apply( - this.paper, this._validateConnectionArgs(view, magnet) - )) { - minDistance = distance; - this._closestView = view; - this._closestEnd = { - id: view.model.id, - selector: view.getSelector(magnet), - port: magnet.getAttribute('port') - }; - } - } - - }, this)); - - }, this); - - this._closestView && this._closestView.highlight(this._closestEnd.selector, { connecting: true, snapping: true }); - - this.model.set(this._arrowhead, this._closestEnd || { x: x, y: y }, { ui: true }); - - } else { - - // checking views right under the pointer - - // Touchmove event's target is not reflecting the element under the coordinates as mousemove does. - // It holds the element when a touchstart triggered. - var target = (evt.type === 'mousemove') - ? evt.target - : document.elementFromPoint(evt.clientX, evt.clientY); - - if (this._targetEvent !== target) { - // Unhighlight the previous view under pointer if there was one. - this._magnetUnderPointer && this._viewUnderPointer.unhighlight(this._magnetUnderPointer, { connecting: true }); - this._viewUnderPointer = this.paper.findView(target); - if (this._viewUnderPointer) { - // If we found a view that is under the pointer, we need to find the closest - // magnet based on the real target element of the event. - this._magnetUnderPointer = this._viewUnderPointer.findMagnet(target); - - if (this._magnetUnderPointer && this.paper.options.validateConnection.apply( - this.paper, - this._validateConnectionArgs(this._viewUnderPointer, this._magnetUnderPointer) - )) { - // If there was no magnet found, do not highlight anything and assume there - // is no view under pointer we're interested in reconnecting to. - // This can only happen if the overall element has the attribute `'.': { magnet: false }`. - this._magnetUnderPointer && this._viewUnderPointer.highlight(this._magnetUnderPointer, { connecting: true }); - } else { - // This type of connection is not valid. Disregard this magnet. - this._magnetUnderPointer = null; - } - } else { - // Make sure we'll delete previous magnet - this._magnetUnderPointer = null; - } - } - - this._targetEvent = target; - - this.model.set(this._arrowhead, { x: x, y: y }, { ui: true }); - } - - break; - } - - this._dx = x; - this._dy = y; - - joint.dia.CellView.prototype.pointermove.apply(this, arguments); - this.notify('link:pointermove', evt, x, y); - }, - - pointerup: function(evt, x, y) { - - if (this._action === 'label-move') { - - this._samples = null; - - } else if (this._action === 'arrowhead-move') { - - if (this.paper.options.snapLinks) { - - this._closestView && this._closestView.unhighlight(this._closestEnd.selector, { connecting: true, snapping: true }); - this._closestView = this._closestEnd = null; - - } else { - - if (this._magnetUnderPointer) { - this._viewUnderPointer.unhighlight(this._magnetUnderPointer, { connecting: true }); - // Find a unique `selector` of the element under pointer that is a magnet. If the - // `this._magnetUnderPointer` is the root element of the `this._viewUnderPointer` itself, - // the returned `selector` will be `undefined`. That means we can directly pass it to the - // `source`/`target` attribute of the link model below. - this.model.set(this._arrowhead, { - id: this._viewUnderPointer.model.id, - selector: this._viewUnderPointer.getSelector(this._magnetUnderPointer), - port: $(this._magnetUnderPointer).attr('port') - }, { ui: true }); - } - - delete this._viewUnderPointer; - delete this._magnetUnderPointer; - } - - // Reparent the link if embedding is enabled - if (this.paper.options.embeddingMode && this.model.reparent()) { - - // Make sure we don't reverse to the original 'z' index (see afterArrowheadMove()). - delete this._z; - } - - this._afterArrowheadMove(); - } - - delete this._action; - - this.notify('link:pointerup', evt, x, y); - joint.dia.CellView.prototype.pointerup.apply(this, arguments); - - } - -}, { - - makeSelector: function(end) { - - var selector = '[model-id="' + end.id + '"]'; - // `port` has a higher precendence over `selector`. This is because the selector to the magnet - // might change while the name of the port can stay the same. - if (end.port) { - selector += ' [port="' + end.port + '"]'; - } else if (end.selector) { - selector += ' ' + end.selector; - } - - return selector; - } - -}); - -// JointJS library. -// (c) 2011-2013 client IO - - -joint.dia.Paper = Backbone.View.extend({ - - className: 'paper', - - options: { - - width: 800, - height: 600, - origin: { x: 0, y: 0 }, // x,y coordinates in top-left corner - gridSize: 50, - perpendicularLinks: false, - elementView: joint.dia.ElementView, - linkView: joint.dia.LinkView, - snapLinks: false, // false, true, { radius: value } - - // Marks all available magnets with 'available-magnet' class name and all available cells with - // 'available-cell' class name. Marks them when dragging a link is started and unmark - // when the dragging is stopped. - markAvailable: false, - - // Defines what link model is added to the graph after an user clicks on an active magnet. - // Value could be the Backbone.model or a function returning the Backbone.model - // defaultLink: function(elementView, magnet) { return condition ? new customLink1() : new customLink2() } - defaultLink: new joint.dia.Link, - - /* CONNECTING */ - - // Check whether to add a new link to the graph when user clicks on an a magnet. - validateMagnet: function(cellView, magnet) { - return magnet.getAttribute('magnet') !== 'passive'; - }, - - // Check whether to allow or disallow the link connection while an arrowhead end (source/target) - // being changed. - validateConnection: function(cellViewS, magnetS, cellViewT, magnetT, end, linkView) { - return (end === 'target' ? cellViewT : cellViewS) instanceof joint.dia.ElementView; - }, - - /* EMBEDDING */ - - // Enables embedding. Reparents the dragged element with elements under it and makes sure that - // all links and elements are visible taken the level of embedding into account. - embeddingMode: false, - - // Check whether to allow or disallow the element embedding while an element being translated. - validateEmbedding: function(childView, parentView) { - // by default all elements can be in relation child-parent - return true; - }, - - // Determines the way how a cell finds a suitable parent when it's dragged over the paper. - // The cell with the highest z-index (visually on the top) will be choosen. - findParentBy: 'bbox', // 'bbox'|'center'|'origin'|'corner'|'topRight'|'bottomLeft' - - // If enabled only the element on the very front is taken into account for the embedding. - // If disabled the elements under the dragged view are tested one by one - // (from front to back) until a valid parent found. - frontParentOnly: true, - - // Interactive flags. See online docs for the complete list of interactive flags. - interactive: { - labelMove: false - } - }, - - events: { - - 'mousedown': 'pointerdown', - 'dblclick': 'mousedblclick', - 'click': 'mouseclick', - 'touchstart': 'pointerdown', - 'mousemove': 'pointermove', - 'touchmove': 'pointermove', - 'mouseover .element': 'cellMouseover', - 'mouseover .link': 'cellMouseover', - 'mouseout .element': 'cellMouseout', - 'mouseout .link': 'cellMouseout' - }, - - constructor: function(options) { - - this._configure(options); - Backbone.View.apply(this, arguments); - }, - - _configure: function(options) { - - if (this.options) options = _.extend({}, _.result(this, 'options'), options); - this.options = options; - }, - - initialize: function() { - - _.bindAll(this, 'addCell', 'sortCells', 'resetCells', 'pointerup', 'asyncRenderCells'); - - this.svg = V('svg').node; - this.viewport = V('g').addClass('viewport').node; - this.defs = V('defs').node; - - // Append `` element to the SVG document. This is useful for filters and gradients. - V(this.svg).append([this.viewport, this.defs]); - - this.$el.append(this.svg); - - this.setOrigin(); - this.setDimensions(); - - this.listenTo(this.model, 'add', this.onAddCell); - this.listenTo(this.model, 'reset', this.resetCells); - this.listenTo(this.model, 'sort', this.sortCells); - - $(document).on('mouseup touchend', this.pointerup); - - // Hold the value when mouse has been moved: when mouse moved, no click event will be triggered. - this._mousemoved = false; - - // default cell highlighting - this.on({ 'cell:highlight': this.onCellHighlight, 'cell:unhighlight': this.onCellUnhighlight }); - }, - - remove: function() { - - //clean up all DOM elements/views to prevent memory leaks - this.removeCells(); - - $(document).off('mouseup touchend', this.pointerup); - - Backbone.View.prototype.remove.call(this); - }, - - setDimensions: function(width, height) { - - width = this.options.width = width || this.options.width; - height = this.options.height = height || this.options.height; - - V(this.svg).attr({ width: width, height: height }); - - this.trigger('resize', width, height); - }, - - setOrigin: function(ox, oy) { - - this.options.origin.x = ox || 0; - this.options.origin.y = oy || 0; - - V(this.viewport).translate(ox, oy, { absolute: true }); - - this.trigger('translate', ox, oy); - }, - - // Expand/shrink the paper to fit the content. Snap the width/height to the grid - // defined in `gridWidth`, `gridHeight`. `padding` adds to the resulting width/height of the paper. - // When options { fitNegative: true } it also translates the viewport in order to make all - // the content visible. - fitToContent: function(gridWidth, gridHeight, padding, opt) { // alternatively function(opt) - - if (_.isObject(gridWidth)) { - // first parameter is an option object - opt = gridWidth; - gridWidth = opt.gridWidth || 1; - gridHeight = opt.gridHeight || 1; - padding = opt.padding || 0; - - } else { - - opt = opt || {}; - gridWidth = gridWidth || 1; - gridHeight = gridHeight || 1; - padding = padding || 0; - } - - padding = _.isNumber(padding) - ? { left: padding, right: padding, top: padding, bottom: padding } - : { left: padding.left || 0, right: padding.right || 0, top: padding.top || 0, bottom: padding.bottom || 0 }; - - // Calculate the paper size to accomodate all the graph's elements. - var bbox = V(this.viewport).bbox(true, this.svg); - - var currentScale = V(this.viewport).scale(); - - bbox.x *= currentScale.sx; - bbox.y *= currentScale.sy; - bbox.width *= currentScale.sx; - bbox.height *= currentScale.sy; - - var calcWidth = Math.max(Math.ceil((bbox.width + bbox.x) / gridWidth), 1) * gridWidth; - var calcHeight = Math.max(Math.ceil((bbox.height + bbox.y) / gridHeight), 1) * gridHeight; - - var tx = 0; - var ty = 0; - - if ((opt.allowNewOrigin == 'negative' && bbox.x < 0) || (opt.allowNewOrigin == 'positive' && bbox.x >= 0) || opt.allowNewOrigin == 'any') { - tx = Math.ceil(-bbox.x / gridWidth) * gridWidth; - tx += padding.left; - calcWidth += tx; - } - - if ((opt.allowNewOrigin == 'negative' && bbox.y < 0) || (opt.allowNewOrigin == 'positive' && bbox.y >= 0) || opt.allowNewOrigin == 'any') { - ty = Math.ceil(-bbox.y / gridHeight) * gridHeight; - ty += padding.top; - calcHeight += ty; - } - - calcWidth += padding.right; - calcHeight += padding.bottom; - - // Make sure the resulting width and height are greater than minimum. - calcWidth = Math.max(calcWidth, opt.minWidth || 0); - calcHeight = Math.max(calcHeight, opt.minHeight || 0); - - var dimensionChange = calcWidth != this.options.width || calcHeight != this.options.height; - var originChange = tx != this.options.origin.x || ty != this.options.origin.y; - - // Change the dimensions only if there is a size discrepency or an origin change - if (originChange) { - this.setOrigin(tx, ty); - } - if (dimensionChange) { - this.setDimensions(calcWidth, calcHeight); - } - }, - - scaleContentToFit: function(opt) { - - var contentBBox = this.getContentBBox(); - - if (!contentBBox.width || !contentBBox.height) return; - - opt = opt || {}; - - _.defaults(opt, { - padding: 0, - preserveAspectRatio: true, - scaleGrid: null, - minScale: 0, - maxScale: Number.MAX_VALUE - //minScaleX - //minScaleY - //maxScaleX - //maxScaleY - //fittingBBox - }); - - var padding = opt.padding; - - var minScaleX = opt.minScaleX || opt.minScale; - var maxScaleX = opt.maxScaleX || opt.maxScale; - var minScaleY = opt.minScaleY || opt.minScale; - var maxScaleY = opt.maxScaleY || opt.maxScale; - - var fittingBBox = opt.fittingBBox || ({ - x: this.options.origin.x, - y: this.options.origin.y, - width: this.options.width, - height: this.options.height - }); - - fittingBBox = g.rect(fittingBBox).moveAndExpand({ - x: padding, - y: padding, - width: -2 * padding, - height: -2 * padding - }); - - var currentScale = V(this.viewport).scale(); - - var newSx = fittingBBox.width / contentBBox.width * currentScale.sx; - var newSy = fittingBBox.height / contentBBox.height * currentScale.sy; - - if (opt.preserveAspectRatio) { - newSx = newSy = Math.min(newSx, newSy); - } - - // snap scale to a grid - if (opt.scaleGrid) { - - var gridSize = opt.scaleGrid; - - newSx = gridSize * Math.floor(newSx / gridSize); - newSy = gridSize * Math.floor(newSy / gridSize); - } - - // scale min/max boundaries - newSx = Math.min(maxScaleX, Math.max(minScaleX, newSx)); - newSy = Math.min(maxScaleY, Math.max(minScaleY, newSy)); - - this.scale(newSx, newSy); - - var contentTranslation = this.getContentBBox(); - - var newOx = fittingBBox.x - contentTranslation.x; - var newOy = fittingBBox.y - contentTranslation.y; - - this.setOrigin(newOx, newOy); - }, - - getContentBBox: function() { - - var crect = this.viewport.getBoundingClientRect(); - - // Using Screen CTM was the only way to get the real viewport bounding box working in both - // Google Chrome and Firefox. - var screenCTM = this.viewport.getScreenCTM(); - - // for non-default origin we need to take the viewport translation into account - var viewportCTM = this.viewport.getCTM(); - - var bbox = g.rect({ - x: crect.left - screenCTM.e + viewportCTM.e, - y: crect.top - screenCTM.f + viewportCTM.f, - width: crect.width, - height: crect.height - }); - - return bbox; - }, - - createViewForModel: function(cell) { - - var view; - - var type = cell.get('type'); - var module = type.split('.')[0]; - var entity = type.split('.')[1]; - - // If there is a special view defined for this model, use that one instead of the default `elementView`/`linkView`. - if (joint.shapes[module] && joint.shapes[module][entity + 'View']) { - - view = new joint.shapes[module][entity + 'View']({ model: cell, interactive: this.options.interactive }); - - } else if (cell instanceof joint.dia.Element) { - - view = new this.options.elementView({ model: cell, interactive: this.options.interactive }); - - } else { - - view = new this.options.linkView({ model: cell, interactive: this.options.interactive }); - } - - return view; - }, - - onAddCell: function(cell, graph, options) { - - if (this.options.async && options.async !== false && _.isNumber(options.position)) { - - this._asyncCells = this._asyncCells || []; - this._asyncCells.push(cell); - - if (options.position == 0) { - - if (this._frameId) throw 'another asynchronous rendering in progress'; - - this.asyncRenderCells(this._asyncCells); - delete this._asyncCells; - } - - } else { - - this.addCell(cell); - } - }, - - addCell: function(cell) { - - var view = this.createViewForModel(cell); - - V(this.viewport).append(view.el); - view.paper = this; - view.render(); - - // This is the only way to prevent image dragging in Firefox that works. - // Setting -moz-user-select: none, draggable="false" attribute or user-drag: none didn't help. - $(view.el).find('image').on('dragstart', function() { return false; }); - }, - - beforeRenderCells: function(cells) { - - // Make sure links are always added AFTER elements. - // They wouldn't find their sources/targets in the DOM otherwise. - cells.sort(function(a, b) { return a instanceof joint.dia.Link ? 1 : -1; }); - - return cells; - }, - - afterRenderCells: function() { - - this.sortCells(); - }, - - resetCells: function(cellsCollection, opt) { - - $(this.viewport).empty(); - - var cells = cellsCollection.models.slice(); - - cells = this.beforeRenderCells(cells, opt); - - if (this._frameId) { - - joint.util.cancelFrame(this._frameId); - delete this._frameId; - } - - if (this.options.async) { - - this.asyncRenderCells(cells, opt); - // Sort the cells once all elements rendered (see asyncRenderCells()). - - } else { - - _.each(cells, this.addCell, this); - - // Sort the cells in the DOM manually as we might have changed the order they - // were added to the DOM (see above). - this.sortCells(); - } - }, - - removeCells: function() { - - this.model.get('cells').each(function(cell) { - var view = this.findViewByModel(cell); - view && view.remove(); - }, this); - }, - - asyncBatchAdded: _.identity, - - asyncRenderCells: function(cells, opt) { - - var done = false; - - if (this._frameId) { - - _.each(_.range(this.options.async && this.options.async.batchSize || 50), function() { - - var cell = cells.shift(); - done = !cell; - if (!done) this.addCell(cell); - - }, this); - - this.asyncBatchAdded(); - } - - if (done) { - - delete this._frameId; - this.afterRenderCells(opt); - this.trigger('render:done', opt); - - } else { - - this._frameId = joint.util.nextFrame(_.bind(function() { - this.asyncRenderCells(cells, opt); - }, this)); - } - }, - - sortCells: function() { - - // Run insertion sort algorithm in order to efficiently sort DOM elements according to their - // associated model `z` attribute. - - var $cells = $(this.viewport).children('[model-id]'); - var cells = this.model.get('cells'); - - this.sortElements($cells, function(a, b) { - - var cellA = cells.get($(a).attr('model-id')); - var cellB = cells.get($(b).attr('model-id')); - - return (cellA.get('z') || 0) > (cellB.get('z') || 0) ? 1 : -1; - }); - }, - - // Highly inspired by the jquery.sortElements plugin by Padolsey. - // See http://james.padolsey.com/javascript/sorting-elements-with-jquery/. - sortElements: function(elements, comparator) { - - var $elements = $(elements); - - var placements = $elements.map(function() { - - var sortElement = this; - var parentNode = sortElement.parentNode; - - // Since the element itself will change position, we have - // to have some way of storing it's original position in - // the DOM. The easiest way is to have a 'flag' node: - var nextSibling = parentNode.insertBefore( - document.createTextNode(''), - sortElement.nextSibling - ); - - return function() { - - if (parentNode === this) { - throw new Error( - "You can't sort elements if any one is a descendant of another." - ); - } - - // Insert before flag: - parentNode.insertBefore(this, nextSibling); - // Remove flag: - parentNode.removeChild(nextSibling); - - }; - }); - - return Array.prototype.sort.call($elements, comparator).each(function(i) { - placements[i].call(this); - }); - }, - - scale: function(sx, sy, ox, oy) { - - sy = sy || sx; - - if (_.isUndefined(ox)) { - - ox = 0; - oy = 0; - } - - // Remove previous transform so that the new scale is not affected by previous scales, especially - // the old translate() does not affect the new translate if an origin is specified. - V(this.viewport).attr('transform', ''); - - var oldTx = this.options.origin.x; - var oldTy = this.options.origin.y; - - // TODO: V.scale() doesn't support setting scale origin. #Fix - if (ox || oy || oldTx || oldTy) { - - var newTx = oldTx - ox * (sx - 1); - var newTy = oldTy - oy * (sy - 1); - this.setOrigin(newTx, newTy); - } - - V(this.viewport).scale(sx, sy); - - this.trigger('scale', sx, sy, ox, oy); - - return this; - }, - - rotate: function(deg, ox, oy) { - - // If the origin is not set explicitely, rotate around the center. Note that - // we must use the plain bounding box (`this.el.getBBox()` instead of the one that gives us - // the real bounding box (`bbox()`) including transformations). - if (_.isUndefined(ox)) { - - var bbox = this.viewport.getBBox(); - ox = bbox.width / 2; - oy = bbox.height / 2; - } - - V(this.viewport).rotate(deg, ox, oy); - }, - - // Find the first view climbing up the DOM tree starting at element `el`. Note that `el` can also - // be a selector or a jQuery object. - findView: function(el) { - - var $el = this.$(el); - - if ($el.length === 0 || $el[0] === this.el) { - - return undefined; - } - - return $el.data('view') || this.findView($el.parent()); - }, - - // Find a view for a model `cell`. `cell` can also be a string representing a model `id`. - findViewByModel: function(cell) { - - var id = _.isString(cell) ? cell : cell.id; - var $view = this.$('[model-id="' + id + '"]'); - - return $view.length ? $view.data('view') : undefined; - }, - - // Find all views at given point - findViewsFromPoint: function(p) { - - p = g.point(p); - - var views = _.map(this.model.getElements(), this.findViewByModel); - - return _.filter(views, function(view) { - return view && g.rect(V(view.el).bbox(false, this.viewport)).containsPoint(p); - }, this); - }, - - // Find all views in given area - findViewsInArea: function(r) { - - r = g.rect(r); - - var views = _.map(this.model.getElements(), this.findViewByModel); - - return _.filter(views, function(view) { - return view && r.intersect(g.rect(V(view.el).bbox(false, this.viewport))); - }, this); - }, - - getModelById: function(id) { - - return this.model.getCell(id); - }, - - snapToGrid: function(p) { - - // Convert global coordinates to the local ones of the `viewport`. Otherwise, - // improper transformation would be applied when the viewport gets transformed (scaled/rotated). - var localPoint = V(this.viewport).toLocalPoint(p.x, p.y); - - return { - x: g.snapToGrid(localPoint.x, this.options.gridSize), - y: g.snapToGrid(localPoint.y, this.options.gridSize) - }; - }, - - // Transform client coordinates to the paper local coordinates. - // Useful when you have a mouse event object and you'd like to get coordinates - // inside the paper that correspond to `evt.clientX` and `evt.clientY` point. - // Exmaple: var paperPoint = paper.clientToLocalPoint({ x: evt.clientX, y: evt.clientY }); - clientToLocalPoint: function(p) { - - var svgPoint = this.svg.createSVGPoint(); - svgPoint.x = p.x; - svgPoint.y = p.y; - - // This is a hack for Firefox! If there wasn't a fake (non-visible) rectangle covering the - // whole SVG area, `$(paper.svg).offset()` used below won't work. - var fakeRect = V('rect', { width: this.options.width, height: this.options.height, x: 0, y: 0, opacity: 0 }); - V(this.svg).prepend(fakeRect); - - var paperOffset = $(this.svg).offset(); - - // Clean up the fake rectangle once we have the offset of the SVG document. - fakeRect.remove(); - - var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; - var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft; - - svgPoint.x += scrollLeft - paperOffset.left; - svgPoint.y += scrollTop - paperOffset.top; - - // Transform point into the viewport coordinate system. - var pointTransformed = svgPoint.matrixTransform(this.viewport.getCTM().inverse()); - - return pointTransformed; - }, - - getDefaultLink: function(cellView, magnet) { - - return _.isFunction(this.options.defaultLink) - // default link is a function producing link model - ? this.options.defaultLink.call(this, cellView, magnet) - // default link is the Backbone model - : this.options.defaultLink.clone(); - }, - - // Cell highlighting - // ----------------- - - onCellHighlight: function(cellView, el) { - V(el).addClass('highlighted'); - }, - - onCellUnhighlight: function(cellView, el) { - V(el).removeClass('highlighted'); - }, - - // Interaction. - // ------------ - - mousedblclick: function(evt) { - - evt.preventDefault(); - evt = joint.util.normalizeEvent(evt); - - var view = this.findView(evt.target); - var localPoint = this.snapToGrid({ x: evt.clientX, y: evt.clientY }); - - if (view) { - - view.pointerdblclick(evt, localPoint.x, localPoint.y); - - } else { - - this.trigger('blank:pointerdblclick', evt, localPoint.x, localPoint.y); - } - }, - - mouseclick: function(evt) { - - // Trigger event when mouse not moved. - if (!this._mousemoved) { - - evt = joint.util.normalizeEvent(evt); - - var view = this.findView(evt.target); - var localPoint = this.snapToGrid({ x: evt.clientX, y: evt.clientY }); - - if (view) { - - view.pointerclick(evt, localPoint.x, localPoint.y); - - } else { - - this.trigger('blank:pointerclick', evt, localPoint.x, localPoint.y); - } - } - - this._mousemoved = false; - }, - - pointerdown: function(evt) { - - evt = joint.util.normalizeEvent(evt); - - var view = this.findView(evt.target); - - var localPoint = this.snapToGrid({ x: evt.clientX, y: evt.clientY }); - - if (view) { - - this.sourceView = view; - - view.pointerdown(evt, localPoint.x, localPoint.y); - - } else { - - this.trigger('blank:pointerdown', evt, localPoint.x, localPoint.y); - } - }, - - pointermove: function(evt) { - - evt.preventDefault(); - evt = joint.util.normalizeEvent(evt); - - if (this.sourceView) { - - // Mouse moved. - this._mousemoved = true; - - var localPoint = this.snapToGrid({ x: evt.clientX, y: evt.clientY }); - - this.sourceView.pointermove(evt, localPoint.x, localPoint.y); - } - }, - - pointerup: function(evt) { - - evt = joint.util.normalizeEvent(evt); - - var localPoint = this.snapToGrid({ x: evt.clientX, y: evt.clientY }); - - if (this.sourceView) { - - this.sourceView.pointerup(evt, localPoint.x, localPoint.y); - - //"delete sourceView" occasionally throws an error in chrome (illegal access exception) - this.sourceView = null; - - } else { - - this.trigger('blank:pointerup', evt, localPoint.x, localPoint.y); - } - }, - - cellMouseover: function(evt) { - - evt = joint.util.normalizeEvent(evt); - var view = this.findView(evt.target); - if (view) { - - view.mouseover(evt); - } - }, - - cellMouseout: function(evt) { - - evt = joint.util.normalizeEvent(evt); - var view = this.findView(evt.target); - if (view) { - - view.mouseout(evt); - } - } -}); - -// JointJS library. -// (c) 2011-2013 client IO - -joint.shapes.basic = {}; - -joint.shapes.basic.Generic = joint.dia.Element.extend({ - - defaults: joint.util.deepSupplement({ - - type: 'basic.Generic', - attrs: { - '.': { fill: '#FFFFFF', stroke: 'none' } - } - - }, joint.dia.Element.prototype.defaults) -}); - -joint.shapes.basic.Rect = joint.shapes.basic.Generic.extend({ - - markup: '', - - defaults: joint.util.deepSupplement({ - - type: 'basic.Rect', - attrs: { - 'rect': { fill: '#FFFFFF', stroke: 'black', width: 100, height: 60 }, - 'text': { 'font-size': 14, text: '', 'ref-x': .5, 'ref-y': .5, ref: 'rect', 'y-alignment': 'middle', 'x-alignment': 'middle', fill: 'black', 'font-family': 'Arial, helvetica, sans-serif' } - } - - }, joint.shapes.basic.Generic.prototype.defaults) -}); - -joint.shapes.basic.TextView = joint.dia.ElementView.extend({ - - initialize: function() { - joint.dia.ElementView.prototype.initialize.apply(this, arguments); - // The element view is not automatically rescaled to fit the model size - // when the attribute 'attrs' is changed. - this.listenTo(this.model, 'change:attrs', this.resize); - } -}); - -joint.shapes.basic.Text = joint.shapes.basic.Generic.extend({ - - markup: '', - - defaults: joint.util.deepSupplement({ - - type: 'basic.Text', - attrs: { - 'text': { 'font-size': 18, fill: 'black' } - } - - }, joint.shapes.basic.Generic.prototype.defaults) -}); - -joint.shapes.basic.Circle = joint.shapes.basic.Generic.extend({ - - markup: '', - - defaults: joint.util.deepSupplement({ - - type: 'basic.Circle', - size: { width: 60, height: 60 }, - attrs: { - 'circle': { fill: '#FFFFFF', stroke: 'black', r: 30, transform: 'translate(30, 30)' }, - 'text': { 'font-size': 14, text: '', 'text-anchor': 'middle', 'ref-x': .5, 'ref-y': .5, ref: 'circle', 'y-alignment': 'middle', fill: 'black', 'font-family': 'Arial, helvetica, sans-serif' } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); - -joint.shapes.basic.Ellipse = joint.shapes.basic.Generic.extend({ - - markup: '', - - defaults: joint.util.deepSupplement({ - - type: 'basic.Ellipse', - size: { width: 60, height: 40 }, - attrs: { - 'ellipse': { fill: '#FFFFFF', stroke: 'black', rx: 30, ry: 20, transform: 'translate(30, 20)' }, - 'text': { 'font-size': 14, text: '', 'text-anchor': 'middle', 'ref-x': .5, 'ref-y': .5, ref: 'ellipse', 'y-alignment': 'middle', fill: 'black', 'font-family': 'Arial, helvetica, sans-serif' } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); - -joint.shapes.basic.Polygon = joint.shapes.basic.Generic.extend({ - - markup: '', - - defaults: joint.util.deepSupplement({ - - type: 'basic.Polygon', - size: { width: 60, height: 40 }, - attrs: { - 'polygon': { fill: '#FFFFFF', stroke: 'black' }, - 'text': { 'font-size': 14, text: '', 'text-anchor': 'middle', 'ref-x': .5, 'ref-dy': 20, ref: 'polygon', 'y-alignment': 'middle', fill: 'black', 'font-family': 'Arial, helvetica, sans-serif' } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); - -joint.shapes.basic.Polyline = joint.shapes.basic.Generic.extend({ - - markup: '', - - defaults: joint.util.deepSupplement({ - - type: 'basic.Polyline', - size: { width: 60, height: 40 }, - attrs: { - 'polyline': { fill: '#FFFFFF', stroke: 'black' }, - 'text': { 'font-size': 14, text: '', 'text-anchor': 'middle', 'ref-x': .5, 'ref-dy': 20, ref: 'polyline', 'y-alignment': 'middle', fill: 'black', 'font-family': 'Arial, helvetica, sans-serif' } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); - -joint.shapes.basic.Image = joint.shapes.basic.Generic.extend({ - - markup: '', - - defaults: joint.util.deepSupplement({ - - type: 'basic.Image', - attrs: { - 'text': { 'font-size': 14, text: '', 'text-anchor': 'middle', 'ref-x': .5, 'ref-dy': 20, ref: 'image', 'y-alignment': 'middle', fill: 'black', 'font-family': 'Arial, helvetica, sans-serif' } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); - -joint.shapes.basic.Path = joint.shapes.basic.Generic.extend({ - - markup: '', - - defaults: joint.util.deepSupplement({ - - type: 'basic.Path', - size: { width: 60, height: 60 }, - attrs: { - 'path': { fill: '#FFFFFF', stroke: 'black' }, - 'text': { 'font-size': 14, text: '', 'text-anchor': 'middle', 'ref-x': .5, 'ref-dy': 20, ref: 'path', 'y-alignment': 'middle', fill: 'black', 'font-family': 'Arial, helvetica, sans-serif' } - } - }, joint.shapes.basic.Generic.prototype.defaults) -}); - -joint.shapes.basic.Rhombus = joint.shapes.basic.Path.extend({ - - defaults: joint.util.deepSupplement({ - - type: 'basic.Rhombus', - attrs: { - 'path': { d: 'M 30 0 L 60 30 30 60 0 30 z' }, - 'text': { 'ref-y': .5 } - } - - }, joint.shapes.basic.Path.prototype.defaults) -}); - - -// PortsModelInterface is a common interface for shapes that have ports. This interface makes it easy -// to create new shapes with ports functionality. It is assumed that the new shapes have -// `inPorts` and `outPorts` array properties. Only these properties should be used to set ports. -// In other words, using this interface, it is no longer recommended to set ports directly through the -// `attrs` object. - -// Usage: -// joint.shapes.custom.MyElementWithPorts = joint.shapes.basic.Path.extend(_.extend({}, joint.shapes.basic.PortsModelInterface, { -// getPortAttrs: function(portName, index, total, selector, type) { -// var attrs = {}; -// var portClass = 'port' + index; -// var portSelector = selector + '>.' + portClass; -// var portTextSelector = portSelector + '>text'; -// var portCircleSelector = portSelector + '>circle'; -// -// attrs[portTextSelector] = { text: portName }; -// attrs[portCircleSelector] = { port: { id: portName || _.uniqueId(type) , type: type } }; -// attrs[portSelector] = { ref: 'rect', 'ref-y': (index + 0.5) * (1 / total) }; -// -// if (selector === '.outPorts') { attrs[portSelector]['ref-dx'] = 0; } -// -// return attrs; -// } -//})); -joint.shapes.basic.PortsModelInterface = { - - initialize: function() { - - this.updatePortsAttrs(); - this.on('change:inPorts change:outPorts', this.updatePortsAttrs, this); - - // Call the `initialize()` of the parent. - this.constructor.__super__.constructor.__super__.initialize.apply(this, arguments); - }, - - updatePortsAttrs: function(eventName) { - - // Delete previously set attributes for ports. - var currAttrs = this.get('attrs'); - _.each(this._portSelectors, function(selector) { - if (currAttrs[selector]) delete currAttrs[selector]; - }); - - // This holds keys to the `attrs` object for all the port specific attribute that - // we set in this method. This is necessary in order to remove previously set - // attributes for previous ports. - this._portSelectors = []; - - var attrs = {}; - - _.each(this.get('inPorts'), function(portName, index, ports) { - var portAttributes = this.getPortAttrs(portName, index, ports.length, '.inPorts', 'in'); - this._portSelectors = this._portSelectors.concat(_.keys(portAttributes)); - _.extend(attrs, portAttributes); - }, this); - - _.each(this.get('outPorts'), function(portName, index, ports) { - var portAttributes = this.getPortAttrs(portName, index, ports.length, '.outPorts', 'out'); - this._portSelectors = this._portSelectors.concat(_.keys(portAttributes)); - _.extend(attrs, portAttributes); - }, this); - - // Silently set `attrs` on the cell so that noone knows the attrs have changed. This makes sure - // that, for example, command manager does not register `change:attrs` command but only - // the important `change:inPorts`/`change:outPorts` command. - this.attr(attrs, { silent: true }); - // Manually call the `processPorts()` method that is normally called on `change:attrs` (that we just made silent). - this.processPorts(); - // Let the outside world (mainly the `ModelView`) know that we're done configuring the `attrs` object. - this.trigger('process:ports'); - }, - - getPortSelector: function(name) { - - var selector = '.inPorts'; - var index = this.get('inPorts').indexOf(name); - - if (index < 0) { - selector = '.outPorts'; - index = this.get('outPorts').indexOf(name); - - if (index < 0) throw new Error("getPortSelector(): Port doesn't exist."); - } - - return selector + '>g:nth-child(' + (index + 1) + ')>circle'; - } -}; - -joint.shapes.basic.PortsViewInterface = { - - initialize: function() { - - // `Model` emits the `process:ports` whenever it's done configuring the `attrs` object for ports. - this.listenTo(this.model, 'process:ports', this.update); - - joint.dia.ElementView.prototype.initialize.apply(this, arguments); - }, - - update: function() { - - // First render ports so that `attrs` can be applied to those newly created DOM elements - // in `ElementView.prototype.update()`. - this.renderPorts(); - joint.dia.ElementView.prototype.update.apply(this, arguments); - }, - - renderPorts: function() { - - var $inPorts = this.$('.inPorts').empty(); - var $outPorts = this.$('.outPorts').empty(); - - var portTemplate = _.template(this.model.portMarkup); - - _.each(_.filter(this.model.ports, function(p) { return p.type === 'in'; }), function(port, index) { - - $inPorts.append(V(portTemplate({ id: index, port: port })).node); - }); - _.each(_.filter(this.model.ports, function(p) { return p.type === 'out'; }), function(port, index) { - - $outPorts.append(V(portTemplate({ id: index, port: port })).node); - }); - } -}; - -joint.shapes.basic.TextBlock = joint.shapes.basic.Generic.extend({ - - markup: ['', - - // if foreignObject supported - - '', - '
', - '', - - // else foreignObject is not supported (fallback for IE) - '', - - ''].join(''), - - defaults: joint.util.deepSupplement({ - - type: 'basic.TextBlock', - - // see joint.css for more element styles - attrs: { - rect: { - fill: '#ffffff', - stroke: '#000000', - width: 80, - height: 100 - }, - text: { - fill: '#000000', - 'font-size': 14, - 'font-family': 'Arial, helvetica, sans-serif' - }, - '.content': { - text: '', - ref: 'rect', - 'ref-x': .5, - 'ref-y': .5, - 'y-alignment': 'middle', - 'x-alignment': 'middle' - } - }, - - content: '' - - }, joint.shapes.basic.Generic.prototype.defaults), - - initialize: function() { - - if (typeof SVGForeignObjectElement !== 'undefined') { - - // foreignObject supported - this.setForeignObjectSize(this, this.get('size')); - this.setDivContent(this, this.get('content')); - this.listenTo(this, 'change:size', this.setForeignObjectSize); - this.listenTo(this, 'change:content', this.setDivContent); - - } - - joint.shapes.basic.Generic.prototype.initialize.apply(this, arguments); - }, - - setForeignObjectSize: function(cell, size) { - - // Selector `foreignObject' doesn't work accross all browsers, we'r using class selector instead. - // We have to clone size as we don't want attributes.div.style to be same object as attributes.size. - cell.attr({ - '.fobj': _.clone(size), - div: { style: _.clone(size) } - }); - }, - - setDivContent: function(cell, content) { - - // Append the content to div as html. - cell.attr({ div : { - html: content - }}); - } - -}); - -// TextBlockView implements the fallback for IE when no foreignObject exists and -// the text needs to be manually broken. -joint.shapes.basic.TextBlockView = joint.dia.ElementView.extend({ - - initialize: function() { - - joint.dia.ElementView.prototype.initialize.apply(this, arguments); - - if (typeof SVGForeignObjectElement === 'undefined') { - - this.noSVGForeignObjectElement = true; - - this.listenTo(this.model, 'change:content', function(cell) { - // avoiding pass of extra paramters - this.updateContent(cell); - }); - } - }, - - update: function(cell, renderingOnlyAttrs) { - - if (this.noSVGForeignObjectElement) { - - var model = this.model; - - // Update everything but the content first. - var noTextAttrs = _.omit(renderingOnlyAttrs || model.get('attrs'), '.content'); - joint.dia.ElementView.prototype.update.call(this, model, noTextAttrs); - - if (!renderingOnlyAttrs || _.has(renderingOnlyAttrs, '.content')) { - // Update the content itself. - this.updateContent(model, renderingOnlyAttrs); - } - - } else { - - joint.dia.ElementView.prototype.update.call(this, model, renderingOnlyAttrs); - } - }, - - updateContent: function(cell, renderingOnlyAttrs) { - - // Create copy of the text attributes - var textAttrs = _.merge({}, (renderingOnlyAttrs || cell.get('attrs'))['.content']); - - delete textAttrs.text; - - // Break the content to fit the element size taking into account the attributes - // set on the model. - var text = joint.util.breakText(cell.get('content'), cell.get('size'), textAttrs, { - // measuring sandbox svg document - svgDocument: this.paper.svg - }); - - // Create a new attrs with same structure as the model attrs { text: { *textAttributes* }} - var attrs = joint.util.setByPath({}, '.content', textAttrs, '/'); - - // Replace text attribute with the one we just processed. - attrs['.content'].text = text; - - // Update the view using renderingOnlyAttributes parameter. - joint.dia.ElementView.prototype.update.call(this, cell, attrs); - } -}); - -joint.routers.orthogonal = (function() { - - // bearing -> opposite bearing - var opposite = { - N: 'S', - S: 'N', - E: 'W', - W: 'E' - }; - - // bearing -> radians - var radians = { - N: -Math.PI / 2 * 3, - S: -Math.PI / 2, - E: 0, - W: Math.PI - }; - - // HELPERS // - - // simple bearing method (calculates only orthogonal cardinals) - function bearing(from, to) { - if (from.x == to.x) return from.y > to.y ? 'N' : 'S'; - if (from.y == to.y) return from.x > to.x ? 'W' : 'E'; - return null; - } - - // returns either width or height of a bbox based on the given bearing - function boxSize(bbox, brng) { - return bbox[brng == 'W' || brng == 'E' ? 'width' : 'height']; - } - - // expands a box by specific value - function expand(bbox, val) { - return g.rect(bbox).moveAndExpand({ x: -val, y: -val, width: 2 * val, height: 2 * val }); - } - - // transform point to a rect - function pointBox(p) { - return g.rect(p.x, p.y, 0, 0); - } - - // returns a minimal rect which covers the given boxes - function boundary(bbox1, bbox2) { - - var x1 = Math.min(bbox1.x, bbox2.x); - var y1 = Math.min(bbox1.y, bbox2.y); - var x2 = Math.max(bbox1.x + bbox1.width, bbox2.x + bbox2.width); - var y2 = Math.max(bbox1.y + bbox1.height, bbox2.y + bbox2.height); - - return g.rect(x1, y1, x2 - x1, y2 - y1); - } - - // returns a point `p` where lines p,p1 and p,p2 are perpendicular and p is not contained - // in the given box - function freeJoin(p1, p2, bbox) { - - var p = g.point(p1.x, p2.y); - if (bbox.containsPoint(p)) p = g.point(p2.x, p1.y); - // kept for reference - // if (bbox.containsPoint(p)) p = null; - return p; - } - - // PARTIAL ROUTERS // - - function vertexVertex(from, to, brng) { - - var p1 = g.point(from.x, to.y); - var p2 = g.point(to.x, from.y); - var d1 = bearing(from, p1); - var d2 = bearing(from, p2); - var xBrng = opposite[brng]; - - var p = (d1 == brng || (d1 != xBrng && (d2 == xBrng || d2 != brng))) ? p1 : p2; - - return { points: [p], direction: bearing(p, to) }; - } - - function elementVertex(from, to, fromBBox) { - - var p = freeJoin(from, to, fromBBox); - - return { points: [p], direction: bearing(p, to) }; - } - - function vertexElement(from, to, toBBox, brng) { - - var route = {}; - - var pts = [g.point(from.x, to.y), g.point(to.x, from.y)]; - var freePts = _.filter(pts, function(pt) { return !toBBox.containsPoint(pt); }); - var freeBrngPts = _.filter(freePts, function(pt) { return bearing(pt, from) != brng; }); - - var p; - - if (freeBrngPts.length > 0) { - - // try to pick a point which bears the same direction as the previous segment - p = _.filter(freeBrngPts, function(pt) { return bearing(from, pt) == brng; }).pop(); - p = p || freeBrngPts[0]; - - route.points = [p]; - route.direction = bearing(p, to); - - } else { - - // Here we found only points which are either contained in the element or they would create - // a link segment going in opposite direction from the previous one. - // We take the point inside element and move it outside the element in the direction the - // route is going. Now we can join this point with the current end (using freeJoin). - - p = _.difference(pts, freePts)[0]; - - var p2 = g.point(to).move(p, -boxSize(toBBox, brng) / 2); - var p1 = freeJoin(p2, from, toBBox); - - route.points = [p1, p2]; - route.direction = bearing(p2, to); - } - - return route; - } - - function elementElement(from, to, fromBBox, toBBox) { - - var route = elementVertex(to, from, toBBox); - var p1 = route.points[0]; - - if (fromBBox.containsPoint(p1)) { - - route = elementVertex(from, to, fromBBox); - var p2 = route.points[0]; - - if (toBBox.containsPoint(p2)) { - - var fromBorder = g.point(from).move(p2, -boxSize(fromBBox, bearing(from, p2)) / 2); - var toBorder = g.point(to).move(p1, -boxSize(toBBox, bearing(to, p1)) / 2); - var mid = g.line(fromBorder, toBorder).midpoint(); - - var startRoute = elementVertex(from, mid, fromBBox); - var endRoute = vertexVertex(mid, to, startRoute.direction); - - route.points = [startRoute.points[0], endRoute.points[0]]; - route.direction = endRoute.direction; - } - } - - return route; - } - - // Finds route for situations where one of end is inside the other. - // Typically the route is conduct outside the outer element first and - // let go back to the inner element. - function insideElement(from, to, fromBBox, toBBox, brng) { - - var route = {}; - var bndry = expand(boundary(fromBBox, toBBox), 1); - - // start from the point which is closer to the boundary - var reversed = bndry.center().distance(to) > bndry.center().distance(from); - var start = reversed ? to : from; - var end = reversed ? from : to; - - var p1, p2, p3; - - if (brng) { - // Points on circle with radius equals 'W + H` are always outside the rectangle - // with width W and height H if the center of that circle is the center of that rectangle. - p1 = g.point.fromPolar(bndry.width + bndry.height, radians[brng], start); - p1 = bndry.pointNearestToPoint(p1).move(p1, -1); - } else { - p1 = bndry.pointNearestToPoint(start).move(start, 1); - } - - p2 = freeJoin(p1, end, bndry); - - if (p1.round().equals(p2.round())) { - p2 = g.point.fromPolar(bndry.width + bndry.height, g.toRad(p1.theta(start)) + Math.PI / 2, end); - p2 = bndry.pointNearestToPoint(p2).move(end, 1).round(); - p3 = freeJoin(p1, p2, bndry); - route.points = reversed ? [p2, p3, p1] : [p1, p3, p2]; - } else { - route.points = reversed ? [p2, p1] : [p1, p2]; - } - - route.direction = reversed ? bearing(p1, to) : bearing(p2, to); - - return route; - } - - // MAIN ROUTER // - - // Return points that one needs to draw a connection through in order to have a orthogonal link - // routing from source to target going through `vertices`. - function findOrthogonalRoute(vertices, opt, linkView) { - - var padding = opt.elementPadding || 20; - - var orthogonalVertices = []; - var sourceBBox = expand(linkView.sourceBBox, padding); - var targetBBox = expand(linkView.targetBBox, padding); - - vertices = _.map(vertices, g.point); - vertices.unshift(sourceBBox.center()); - vertices.push(targetBBox.center()); - - var brng; - - for (var i = 0, max = vertices.length - 1; i < max; i++) { - - var route = null; - var from = vertices[i]; - var to = vertices[i + 1]; - var isOrthogonal = !!bearing(from, to); - - if (i == 0) { - - if (i + 1 == max) { // route source -> target - - // Expand one of elements by 1px so we detect also situations when they - // are positioned one next other with no gap between. - if (sourceBBox.intersect(expand(targetBBox, 1))) { - route = insideElement(from, to, sourceBBox, targetBBox); - } else if (!isOrthogonal) { - route = elementElement(from, to, sourceBBox, targetBBox); - } - - } else { // route source -> vertex - - if (sourceBBox.containsPoint(to)) { - route = insideElement(from, to, sourceBBox, expand(pointBox(to), padding)); - } else if (!isOrthogonal) { - route = elementVertex(from, to, sourceBBox); - } - } - - } else if (i + 1 == max) { // route vertex -> target - - var orthogonalLoop = isOrthogonal && bearing(to, from) == brng; - - if (targetBBox.containsPoint(from) || orthogonalLoop) { - route = insideElement(from, to, expand(pointBox(from), padding), targetBBox, brng); - } else if (!isOrthogonal) { - route = vertexElement(from, to, targetBBox, brng); - } - - } else if (!isOrthogonal) { // route vertex -> vertex - route = vertexVertex(from, to, brng); - } - - if (route) { - Array.prototype.push.apply(orthogonalVertices, route.points); - brng = route.direction; - } else { - // orthogonal route and not looped - brng = bearing(from, to); - } - - if (i + 1 < max) { - orthogonalVertices.push(to); - } - } - - return orthogonalVertices; - }; - - return findOrthogonalRoute; - -})(); - -joint.routers.manhattan = (function() { - - 'use strict'; - - var config = { - - // size of the step to find a route - step: 10, - - // use of the perpendicular linkView option to connect center of element with first vertex - perpendicular: true, - - // tells how to divide the paper when creating the elements map - mapGridSize: 100, - - // should be source or target not to be consider as an obstacle - excludeEnds: [], // 'source', 'target' - - // should be any element with a certain type not to be consider as an obstacle - excludeTypes: ['basic.Text'], - - // if number of route finding loops exceed the maximum, stops searching and returns - // fallback route - maximumLoops: 500, - - // possible starting directions from an element - startDirections: ['left', 'right', 'top', 'bottom'], - - // possible ending directions to an element - endDirections: ['left', 'right', 'top', 'bottom'], - - // specify directions above - directionMap: { - right: { x: 1, y: 0 }, - bottom: { x: 0, y: 1 }, - left: { x: -1, y: 0 }, - top: { x: 0, y: -1 } - }, - - // maximum change of the direction - maxAllowedDirectionChange: 1, - - // padding applied on the element bounding boxes - paddingBox: function() { - - var step = this.step; - - return { - x: -step, - y: -step, - width: 2 * step, - height: 2 * step - }; - }, - - // an array of directions to find next points on the route - directions: function() { - - var step = this.step; - - return [ - { offsetX: step , offsetY: 0 , cost: step }, - { offsetX: 0 , offsetY: step , cost: step }, - { offsetX: -step , offsetY: 0 , cost: step }, - { offsetX: 0 , offsetY: -step , cost: step } - ]; - }, - - // a penalty received for direction change - penalties: function() { - - return [0, this.step / 2, this.step]; - }, - - // heurestic method to determine the distance between two points - estimateCost: function(from, to) { - - return from.manhattanDistance(to); - }, - - // a simple route used in situations, when main routing method fails - // (exceed loops, inaccessible). - fallbackRoute: function(from, to, opts) { - - // Find an orthogonal route ignoring obstacles. - - var prevDirIndexes = opts.prevDirIndexes || {}; - - var point = (prevDirIndexes[from] || 0) % 2 - ? g.point(from.x, to.y) - : g.point(to.x, from.y); - - return [point, to]; - }, - - // if a function is provided, it's used to route the link while dragging an end - // i.e. function(from, to, opts) { return []; } - draggingRoute: null - }; - - // reconstructs a route by concating points with their parents - function reconstructRoute(parents, point) { - - var route = []; - var prevDiff = { x: 0, y: 0 }; - var current = point; - var parent; - - while ((parent = parents[current])) { - - var diff = parent.difference(current); - - if (!diff.equals(prevDiff)) { - - route.unshift(current); - prevDiff = diff; - } - - current = parent; - } - - route.unshift(current); - - return route; - }; - - // find points around the rectangle taking given directions in the account - function getRectPoints(bbox, directionList, opts) { - - var step = opts.step; - - var center = bbox.center(); - - var startPoints = _.chain(opts.directionMap).pick(directionList).map(function(direction) { - - var x = direction.x * bbox.width / 2; - var y = direction.y * bbox.height / 2; - - var point = g.point(center).offset(x, y).snapToGrid(step); - - if (bbox.containsPoint(point)) { - - point.offset(direction.x * step, direction.y * step); - } - - return point; - - }).value(); - - return startPoints; - }; - - // returns a direction index from start point to end point - function getDirection(start, end, dirLen) { - - var dirAngle = 360 / dirLen; - - var q = Math.floor(start.theta(end) / dirAngle); - - return dirLen - q; - } - - // finds the route between to points/rectangles implementing A* alghoritm - function findRoute(start, end, map, opt) { - - var startDirections = opt.reversed ? opt.endDirections : opt.startDirections; - var endDirections = opt.reversed ? opt.startDirections : opt.endDirections; - - // set of points we start pathfinding from - var startSet = start instanceof g.rect - ? getRectPoints(start, startDirections, opt) - : [start]; - - // set of points we want the pathfinding to finish at - var endSet = end instanceof g.rect - ? getRectPoints(end, endDirections, opt) - : [end]; - - var startCenter = startSet.length > 1 ? start.center() : startSet[0]; - var endCenter = endSet.length > 1 ? end.center() : endSet[0]; - - // take into account only accessible end points - var endPoints = _.filter(endSet, function(point) { - - var mapKey = g.point(point).snapToGrid(opt.mapGridSize).toString(); - - var accesible = _.every(map[mapKey], function(obstacle) { - return !obstacle.containsPoint(point); - }); - - return accesible; - }); - - - if (endPoints.length) { - - var step = opt.step; - var penalties = opt.penalties; - - // choose the end point with the shortest estimated path cost - var endPoint = _.chain(endPoints).invoke('snapToGrid', step).min(function(point) { - - return opt.estimateCost(startCenter, point); - - }).value(); - - var parents = {}; - var costFromStart = {}; - var totalCost = {}; - - // directions - var dirs = opt.directions; - var dirLen = dirs.length; - var dirHalfLen = dirLen / 2; - var dirIndexes = opt.previousDirIndexes || {}; - - // The set of point already evaluated. - var closeHash = {}; // keeps only information whether a point was evaluated' - - // The set of tentative points to be evaluated, initially containing the start points - var openHash = {}; // keeps only information whether a point is to be evaluated' - var openSet = _.chain(startSet).invoke('snapToGrid', step).each(function(point) { - - var key = point.toString(); - - costFromStart[key] = 0; // Cost from start along best known path. - totalCost[key] = opt.estimateCost(point, endPoint); - dirIndexes[key] = dirIndexes[key] || getDirection(startCenter, point, dirLen); - openHash[key] = true; - - }).map(function(point) { - - return point.toString(); - - }).sortBy(function(pointKey) { - - return totalCost[pointKey]; - - }).value(); - - var loopCounter = opt.maximumLoops; - - var maxAllowedDirectionChange = opt.maxAllowedDirectionChange; - - // main route finding loop - while (openSet.length && loopCounter--) { - - var currentKey = openSet[0]; - var currentPoint = g.point(currentKey); - - if (endPoint.equals(currentPoint)) { - - opt.previousDirIndexes = _.pick(dirIndexes, currentKey); - return reconstructRoute(parents, currentPoint); - } - - // remove current from the open list - openSet.splice(0, 1); - openHash[neighborKey] = null; - - // add current to the close list - closeHash[neighborKey] = true; - - var currentDirIndex = dirIndexes[currentKey]; - var currentDist = costFromStart[currentKey]; - - for (var dirIndex = 0; dirIndex < dirLen; dirIndex++) { - - var dirChange = Math.abs(dirIndex - currentDirIndex); - - if (dirChange > dirHalfLen) { - - dirChange = dirLen - dirChange; - } - - // if the direction changed rapidly don't use this point - if (dirChange > maxAllowedDirectionChange) { - - continue; - } - - var dir = dirs[dirIndex]; - - var neighborPoint = g.point(currentPoint).offset(dir.offsetX, dir.offsetY); - var neighborKey = neighborPoint.toString(); - - if (closeHash[neighborKey]) { - - continue; - } - - // is point accesible - no obstacle in the way - - var mapKey = g.point(neighborPoint).snapToGrid(opt.mapGridSize).toString(); - - var isAccesible = _.every(map[mapKey], function(obstacle) { - return !obstacle.containsPoint(neighborPoint); - }); - - if (!isAccesible) { - - continue; - } - - var inOpenSet = _.has(openHash, neighborKey); - - var costToNeighbor = currentDist + dir.cost; - - if (!inOpenSet || costToNeighbor < costFromStart[neighborKey]) { - - parents[neighborKey] = currentPoint; - dirIndexes[neighborKey] = dirIndex; - costFromStart[neighborKey] = costToNeighbor; - - totalCost[neighborKey] = costToNeighbor + - opt.estimateCost(neighborPoint, endPoint) + - penalties[dirChange]; - - if (!inOpenSet) { - - var openIndex = _.sortedIndex(openSet, neighborKey, function(openKey) { - - return totalCost[openKey]; - }); - - openSet.splice(openIndex, 0, neighborKey); - openHash[neighborKey] = true; - } - }; - }; - } - } - - // no route found ('to' point wasn't either accessible or finding route took - // way to much calculations) - return opt.fallbackRoute(startCenter, endCenter, opt); - }; - - // initiation of the route finding - function router(oldVertices, opt) { - - // resolve some of the options - opt.directions = _.result(opt, 'directions'); - opt.penalties = _.result(opt, 'penalties'); - opt.paddingBox = _.result(opt, 'paddingBox'); - - // enable/disable linkView perpendicular option - this.options.perpendicular = !!opt.perpendicular; - - // As route changes its shape rapidly when we start finding route from different point - // it's necessary to start from the element that was not interacted with - // (the position was changed) at very last. - var reverseRouting = opt.reversed = (this.lastEndChange === 'source'); - - var sourceBBox = reverseRouting ? g.rect(this.targetBBox) : g.rect(this.sourceBBox); - var targetBBox = reverseRouting ? g.rect(this.sourceBBox) : g.rect(this.targetBBox); - - // expand boxes by specific padding - sourceBBox.moveAndExpand(opt.paddingBox); - targetBBox.moveAndExpand(opt.paddingBox); - - // building an elements map - - var link = this.model; - var graph = this.paper.model; - - // source or target element could be excluded from set of obstacles - var excludedEnds = _.chain(opt.excludeEnds) - .map(link.get, link) - .pluck('id') - .map(graph.getCell, graph).value(); - - var mapGridSize = opt.mapGridSize; - - var excludeAncestors = []; - - var sourceId = link.get('source').id; - if (sourceId !== undefined) { - var source = graph.getCell(sourceId); - if (source !== undefined) { - excludeAncestors = _.union(excludeAncestors, _.map(source.getAncestors(), 'id')); - }; - } - - var targetId = link.get('target').id; - if (targetId !== undefined) { - var target = graph.getCell(targetId); - if (target !== undefined) { - excludeAncestors = _.union(excludeAncestors, _.map(target.getAncestors(), 'id')); - } - } - - // builds a map of all elements for quicker obstacle queries (i.e. is a point contained - // in any obstacle?) (a simplified grid search) - // The paper is divided to smaller cells, where each of them holds an information which - // elements belong to it. When we query whether a point is in an obstacle we don't need - // to go through all obstacles, we check only those in a particular cell. - var map = _.chain(graph.getElements()) - // remove source and target element if required - .difference(excludedEnds) - // remove all elements whose type is listed in excludedTypes array - .reject(function(element) { - // reject any element which is an ancestor of either source or target - return _.contains(opt.excludeTypes, element.get('type')) || _.contains(excludeAncestors, element.id); - }) - // change elements (models) to their bounding boxes - .invoke('getBBox') - // expand their boxes by specific padding - .invoke('moveAndExpand', opt.paddingBox) - // build the map - .foldl(function(res, bbox) { - - var origin = bbox.origin().snapToGrid(mapGridSize); - var corner = bbox.corner().snapToGrid(mapGridSize); - - for (var x = origin.x; x <= corner.x; x += mapGridSize) { - for (var y = origin.y; y <= corner.y; y += mapGridSize) { - - var gridKey = x + '@' + y; - - res[gridKey] = res[gridKey] || []; - res[gridKey].push(bbox); - } - } - - return res; - - }, {}).value(); - - // pathfinding - - var newVertices = []; - - var points = _.map(oldVertices, g.point); - - var tailPoint = sourceBBox.center(); - - // find a route by concating all partial routes (routes need to go through the vertices) - // startElement -> vertex[1] -> ... -> vertex[n] -> endElement - for (var i = 0, len = points.length; i <= len; i++) { - - var partialRoute = null; - - var from = to || sourceBBox; - var to = points[i]; - - if (!to) { - - to = targetBBox; - - // 'to' is not a vertex. If the target is a point (i.e. it's not an element), we - // might use dragging route instead of main routing method if that is enabled. - var endingAtPoint = !this.model.get('source').id || !this.model.get('target').id; - - if (endingAtPoint && _.isFunction(opt.draggingRoute)) { - // Make sure we passing points only (not rects). - var dragFrom = from instanceof g.rect ? from.center() : from; - partialRoute = opt.draggingRoute(dragFrom, to.origin(), opt); - } - } - - // if partial route has not been calculated yet use the main routing method to find one - partialRoute = partialRoute || findRoute(from, to, map, opt); - - var leadPoint = _.first(partialRoute); - - if (leadPoint && leadPoint.equals(tailPoint)) { - - // remove the first point if the previous partial route had the same point as last - partialRoute.shift(); - } - - tailPoint = _.last(partialRoute) || tailPoint; - - newVertices = newVertices.concat(partialRoute); - }; - - // we might have to reverse the result if we swapped source and target at the beginning - return reverseRouting ? newVertices.reverse() : newVertices; - }; - - // public function - return function(vertices, opt, linkView) { - - return router.call(linkView, vertices, _.extend({}, config, opt)); - }; - -})(); - -joint.routers.metro = (function() { - - if (!_.isFunction(joint.routers.manhattan)) { - - throw('Metro requires the manhattan router.'); - } - - var config = { - - // cost of a diagonal step (calculated if not defined). - diagonalCost: null, - - // an array of directions to find next points on the route - directions: function() { - - var step = this.step; - var diagonalCost = this.diagonalCost || Math.ceil(Math.sqrt(step * step << 1)); - - return [ - { offsetX: step , offsetY: 0 , cost: step }, - { offsetX: step , offsetY: step , cost: diagonalCost }, - { offsetX: 0 , offsetY: step , cost: step }, - { offsetX: -step , offsetY: step , cost: diagonalCost }, - { offsetX: -step , offsetY: 0 , cost: step }, - { offsetX: -step , offsetY: -step , cost: diagonalCost }, - { offsetX: 0 , offsetY: -step , cost: step }, - { offsetX: step , offsetY: -step , cost: diagonalCost } - ]; - }, - - // a simple route used in situations, when main routing method fails - // (exceed loops, inaccessible). - fallbackRoute: function(from, to, opts) { - - // Find a route which breaks by 45 degrees ignoring all obstacles. - - var theta = from.theta(to); - - var a = { x: to.x, y: from.y }; - var b = { x: from.x, y: to.y }; - - if (theta % 180 > 90) { - var t = a; - a = b; - b = t; - } - - var p1 = (theta % 90) < 45 ? a : b; - - var l1 = g.line(from, p1); - - var alpha = 90 * Math.ceil(theta / 90); - - var p2 = g.point.fromPolar(l1.squaredLength(), g.toRad(alpha + 135), p1); - - var l2 = g.line(to, p2); - - var point = l1.intersection(l2); - - return point ? [point.round(), to] : [to]; - } - }; - - // public function - return function(vertices, opts, linkView) { - - return joint.routers.manhattan(vertices, _.extend({}, config, opts), linkView); - }; - -})(); - -joint.connectors.normal = function(sourcePoint, targetPoint, vertices) { - - // Construct the `d` attribute of the `` element. - var d = ['M', sourcePoint.x, sourcePoint.y]; - - _.each(vertices, function(vertex) { - - d.push(vertex.x, vertex.y); - }); - - d.push(targetPoint.x, targetPoint.y); - - return d.join(' '); -}; - -joint.connectors.rounded = function(sourcePoint, targetPoint, vertices, opts) { - - var offset = opts.radius || 10; - - var c1, c2, d1, d2, prev, next; - - // Construct the `d` attribute of the `` element. - var d = ['M', sourcePoint.x, sourcePoint.y]; - - _.each(vertices, function(vertex, index) { - - // the closest vertices - prev = vertices[index - 1] || sourcePoint; - next = vertices[index + 1] || targetPoint; - - // a half distance to the closest vertex - d1 = d2 || g.point(vertex).distance(prev) / 2; - d2 = g.point(vertex).distance(next) / 2; - - // control points - c1 = g.point(vertex).move(prev, -Math.min(offset, d1)).round(); - c2 = g.point(vertex).move(next, -Math.min(offset, d2)).round(); - - d.push(c1.x, c1.y, 'S', vertex.x, vertex.y, c2.x, c2.y, 'L'); - }); - - d.push(targetPoint.x, targetPoint.y); - - return d.join(' '); -}; - -joint.connectors.smooth = function(sourcePoint, targetPoint, vertices) { - - var d; - - if (vertices.length) { - - d = g.bezier.curveThroughPoints([sourcePoint].concat(vertices).concat([targetPoint])); - - } else { - // if we have no vertices use a default cubic bezier curve, cubic bezier requires - // two control points. The two control points are both defined with X as mid way - // between the source and target points. SourceControlPoint Y is equal to sourcePoint Y - // and targetControlPointY being equal to targetPointY. Handle situation were - // sourcePointX is greater or less then targetPointX. - var controlPointX = (sourcePoint.x < targetPoint.x) - ? targetPoint.x - ((targetPoint.x - sourcePoint.x) / 2) - : sourcePoint.x - ((sourcePoint.x - targetPoint.x) / 2); - - d = [ - 'M', sourcePoint.x, sourcePoint.y, - 'C', controlPointX, sourcePoint.y, controlPointX, targetPoint.y, - targetPoint.x, targetPoint.y - ]; - } - - return d.join(' '); -}; - - - return joint; - -})); diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/joint.css b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/joint.css deleted file mode 100644 index a5fcfebfd..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/joint.css +++ /dev/null @@ -1,249 +0,0 @@ -/*! JointJS v0.9.3 - JavaScript diagramming library 2015-05-22 - - -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - -/* -A complete list of SVG properties that can be set through CSS is here: -http://www.w3.org/TR/SVG/styling.html - -Important note: Presentation attributes have a lower precedence over CSS style rules. -*/ - - -/* .viewport is a node wrapping all diagram elements in the paper */ -.viewport { - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; -} - -/* -1. IE can't handle paths without the `d` attribute for bounding box calculation -2. IE can't even handle 'd' attribute as a css selector (e.g path[d]) so the following rule will - break the links rendering. - -path:not([d]) { - display: none; -} - -*/ - -/* .magnet is an element that can be either source or a target of a link */ -/* -.magnet { - fill: black; - fill-opacity: 0; - stroke: black; - stroke-width: 15; - stroke-opacity: 0; - pointer-events: visibleStroke; - cursor: crosshair; - vector-effect: non-scaling-stroke; -} - -.magnet:hover { - stroke-opacity: .5; -} -*/ - -[magnet=true]:not(.element) { - cursor: crosshair; -} -[magnet=true]:not(.element):hover { - opacity: .7; -} - -/* - -Elements have CSS classes named by their types. E.g. type: basic.Rect has a CSS class "element basic Rect". -This makes it possible to easilly style elements in CSS and have generic CSS rules applying to -the whole group of elements. Each plugin can provide its own stylesheet. - -*/ - -.element { - /* Give the user a hint that he can drag&drop the element. */ - cursor: move; -} - -.element * { - /* The default behavior when scaling an element is not to scale the stroke in order to prevent the ugly effect of stroke with different proportions. */ - vector-effect: non-scaling-stroke; - -moz-user-select: none; - user-drag: none; -} - - -/* - -connection-wrap is a element of the joint.dia.Link that follows the .connection of that link. -In other words, the `d` attribute of the .connection-wrap contains the same data as the `d` attribute of the -.connection . The advantage of using .connection-wrap is to be able to catch pointer events -in the neighborhood of the .connection . This is especially handy if the .connection is -very thin. - -*/ - -.connection-wrap { - fill: none; - stroke: black; - stroke-width: 15; - stroke-linecap: round; - stroke-linejoin: round; - opacity: 0; - cursor: move; -} -.connection-wrap:hover { - opacity: .4; - stroke-opacity: .4; -} - - -.connection { - /* stroke: black; */ - /* stroke width cannot be overriden by attribute? */ - /* stroke-width: 1; */ - fill: none; - stroke-linejoin: round; -} - -.marker-source, .marker-target { -/* Cannot be in CSS otherwise it could not be overruled by attributes. - fill: black; - stroke: black; -*/ - /* This makes the arrowheads point to the border of objects even though the transform: scale() is applied on them. */ - vector-effect: non-scaling-stroke; -} - -/* - -Vertex markers are `` elements that appear at connection vertex positions. - -*/ - -/* element wrapping .marker-vertex-group. */ -.marker-vertices { - opacity: 0; - cursor: move; -} -.marker-arrowheads { - opacity: 0; - cursor: move; - cursor: -webkit-grab; - cursor: -moz-grab; -/* display: none; */ /* setting `display: none` on .marker-arrowheads effectivelly switches of links reconnecting */ -} -.link-tools { - opacity: 0; - cursor: pointer; -} -.link-tools .tool-options { - display: none; /* by default, we don't display link options tool */ -} -.link-tools .tool-remove circle { - fill: red; -} -.link-tools .tool-remove path { - fill: white; -} -.link:hover .marker-vertices, -.link:hover .marker-arrowheads, -.link:hover .link-tools { - opacity: 1; -} - -/* element inside .marker-vertex-group element */ -.marker-vertex { - fill: #1ABC9C; -} -.marker-vertex:hover { - fill: #34495E; - stroke: none; -} - -.marker-arrowhead { - fill: #1ABC9C; -} -.marker-arrowhead:hover { - fill: #F39C12; - stroke: none; -} - -/* element used to remove a vertex */ -.marker-vertex-remove { - cursor: pointer; - opacity: .1; - fill: white; -} - -.marker-vertex-group:hover .marker-vertex-remove { - opacity: 1; -} - -.marker-vertex-remove-area { - opacity: .1; - cursor: pointer; -} -.marker-vertex-group:hover .marker-vertex-remove-area { - opacity: 1; -} - -/* Cell highlighting - e.g a cell underneath the dragged link get highlighted. - See joint.dia.cell.js highlight(); */ -.highlighted { - opacity: 0.7; -} - -/* For some reason, CSS `outline` property - does not work on `` elements. */ -text.highlighted { - fill: #FF0000; -} - -/* `outline` doesn't work in Firefox, Opera and IE9+. - The only engine supporting outlines on SVG elements is Webkit. */ -@media screen and (-webkit-min-device-pixel-ratio:0) { - .highlighted { - outline: 2px solid #FF0000; - opacity: initial; - } -} - -/* -Example of custom changes (in pure CSS only!): - -Do not show marker vertices at all: .marker-vertices { display: none; } -Do not allow adding new vertices: .connection-wrap { pointer-events: none; } -*/ - -/* foreignObject inside the elements (i.e joint.shapes.basic.TextBlock) */ -.element .fobj body { - background-color: transparent; - margin: 0px; -} -.element .fobj div { - text-align: center; - vertical-align: middle; - display: table-cell; - padding: 0px 5px 0px 5px; -} - -svg { - border: none; - border-radius: none; - background-image: none; -} - -text.text1, text.text2 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; -} diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/lodash.min.js b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/lodash.min.js deleted file mode 100644 index 4d6e9ff0b..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/lodash.min.js +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @license - * lodash 3.9.3 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE - * Build: `lodash modern -o ./lodash.js` - */ -;(function(){function n(n,t){if(n!==t){var r=null===n,e=n===m,u=n===n,i=null===t,o=t===m,f=t===t;if(n>t&&!i||!u||r&&!o&&f||e&&f)return 1;if(n=n&&9<=n&&13>=n||32==n||160==n||5760==n||6158==n||8192<=n&&(8202>=n||8232==n||8233==n||8239==n||8287==n||12288==n||65279==n); -}function _(n,t){for(var r=-1,e=n.length,u=-1,i=[];++ro(t,l,0)&&u.push(l);return u}function at(n,t){var r=true;return Mu(n,function(n,e,u){return r=!!t(n,e,u)}),r}function ct(n,t,r,e){var u=e,i=u;return Mu(n,function(n,o,f){o=+t(n,o,f),(r(o,u)||o===e&&o===i)&&(u=o,i=n)}),i}function st(n,t){var r=[];return Mu(n,function(n,e,u){t(n,e,u)&&r.push(n); -}),r}function pt(n,t,r,e){var u;return r(n,function(n,r,i){return t(n,r,i)?(u=e?r:n,false):void 0}),u}function ht(n,t,r){for(var e=-1,u=n.length,i=-1,o=[];++et&&(t=-t>u?0:u+t),r=r===m||r>u?u:+r||0,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Me(u);++eu(l,s,0)&&((t||f)&&l.push(s),a.push(c))}return a}function Ft(n,t){for(var r=-1,e=t.length,u=Me(e);++r>>1,o=n[i];(r?o<=t:ou?m:i,u=1);++earguments.length;return typeof e=="function"&&i===m&&Ti(r)?n(r,e,u,o):Et(r,mr(e,i,4),u,o,t)}}function sr(n,t,r,e,u,i,o,f,l,a){function c(){for(var w=arguments.length,A=w,j=Me(w);A--;)j[A]=arguments[A];if(e&&(j=qt(j,e,u)),i&&(j=Dt(j,i,o)),v||y){var A=c.placeholder,k=_(j,A),w=w-k.length; -if(wt?0:t)):[]}function qr(n,t,r){var e=n?n.length:0;return e?((r?Cr(n,t,r):null==t)&&(t=1), -t=e-(+t||0),Ct(n,0,0>t?0:t)):[]}function Dr(n){return n?n[0]:m}function Kr(n,t,e){var u=n?n.length:0;if(!u)return-1;if(typeof e=="number")e=0>e?ku(u+e,0):e;else if(e)return e=zt(n,t),n=n[e],(t===t?t===n:n!==n)?e:-1;return r(n,t,e||0)}function Vr(n){var t=n?n.length:0;return t?n[t-1]:m}function Yr(n){return Pr(n,1)}function Zr(n,t,e,u){if(!n||!n.length)return[];null!=t&&typeof t!="boolean"&&(u=e,e=Cr(n,t,u)?null:t,t=false);var i=mr();if((null!=e||i!==it)&&(e=i(e,u,3)),t&&br()==r){t=e;var o;e=-1,u=n.length; -for(var i=-1,f=[];++er?ku(u+r,0):r||0,typeof n=="string"||!Ti(n)&&me(n)?rt?0:+t||0,e);++r=n&&(t=null),r}}function fe(n,t,r){function e(){var r=t-(wi()-a);0>=r||r>t?(f&&cu(f),r=p,f=s=p=m,r&&(h=wi(),l=n.apply(c,o),s||f||(o=c=null))):s=gu(e,r)}function u(){s&&cu(s),f=s=p=m,(v||_!==t)&&(h=wi(),l=n.apply(c,o),s||f||(o=c=null))}function i(){if(o=arguments,a=wi(),c=this,p=v&&(s||!g),false===_)var r=g&&!s;else{f||g||(h=a);var i=_-(a-h),y=0>=i||i>_;y?(f&&(f=cu(f)),h=a,l=n.apply(c,o)):f||(f=gu(u,i))}return y&&s?s=cu(s):s||t===_||(s=gu(e,t)),r&&(y=true,l=n.apply(c,o)), -!y||s||f||(o=c=null),l}var o,f,l,a,c,s,p,h=0,_=false,v=true;if(typeof n!="function")throw new Je(N);if(t=0>t?0:+t||0,true===r)var g=true,v=false;else ve(r)&&(g=r.leading,_="maxWait"in r&&ku(+r.maxWait||0,t),v="trailing"in r?r.trailing:v);return i.cancel=function(){s&&cu(s),f&&cu(f),f=s=p=m},i}function le(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;return i.has(u)?i.get(u):(e=n.apply(this,e),r.cache=i.set(u,e),e)}if(typeof n!="function"||t&&typeof t!="function")throw new Je(N);return r.cache=new le.Cache, -r}function ae(n,t){if(typeof n!="function")throw new Je(N);return t=ku(t===m?n.length-1:+t||0,0),function(){for(var r=arguments,e=-1,u=ku(r.length-t,0),i=Me(u);++et}function se(n){return p(n)&&Ir(n)&&uu.call(n)==z}function pe(n){return!!n&&1===n.nodeType&&p(n)&&-1t||!n||!Au(t))return r;do t%2&&(r+=n),t=su(t/2),n+=n;while(t);return r}function Se(n,t,r){var e=n;return(n=u(n))?(r?Cr(e,t,r):null==t)?n.slice(v(n),g(n)+1):(t+="",n.slice(i(n,t),o(n,t)+1)):n}function Te(n,t,r){ -return r&&Cr(n,t,r)&&(t=null),n=u(n),n.match(t||Wn)||[]}function Ue(n,t,r){return r&&Cr(n,t,r)&&(t=null),p(n)?Ne(n):it(n,t)}function $e(n){return function(){return n}}function Fe(n){return n}function Ne(n){return xt(ot(n,true))}function Le(n,t,r){if(null==r){var e=ve(t),u=e?Ki(t):null;((u=u&&u.length?yt(t,u):null)?u.length:e)||(u=false,r=t,t=n,n=this)}u||(u=yt(t,Ki(t)));var i=true,e=-1,o=$i(n),f=u.length;false===r?i=false:ve(r)&&"chain"in r&&(i=r.chain);for(;++e=S)return r}else n=0;return Ku(r,e)}}(),Ju=ae(function(n,t){return Ir(n)?lt(n,ht(t,false,true)):[]}),Xu=tr(),Hu=tr(true),Qu=ae(function(n){for(var t=n.length,e=t,u=Me(c),i=br(),o=i==r,f=[];e--;){var l=n[e]=Ir(l=n[e])?l:[];u[e]=o&&120<=l.length?Vu(e&&l):null}var o=n[0],a=-1,c=o?o.length:0,s=u[0]; -n:for(;++a(s?qn(s,l):i(f,l,0))){for(e=t;--e;){var p=u[e];if(0>(p?qn(p,l):i(n[e],l,0)))continue n}s&&s.push(l),f.push(l)}return f}),ni=ae(function(t,r){r=ht(r);var e=et(t,r);return Rt(t,r.sort(n)),e}),ti=_r(),ri=_r(true),ei=ae(function(n){return $t(ht(n,false,true))}),ui=ae(function(n,t){return Ir(n)?lt(n,t):[]}),ii=ae(Gr),oi=ae(function(n){var t=n.length,r=2--n?t.apply(this,arguments):void 0}},Nn.ary=function(n,t,r){return r&&Cr(n,t,r)&&(t=null),t=n&&null==t?n.length:ku(+t||0,0),vr(n,I,null,null,null,null,t)},Nn.assign=Ni,Nn.at=fi,Nn.before=oe,Nn.bind=bi,Nn.bindAll=xi,Nn.bindKey=Ai,Nn.callback=Ue,Nn.chain=Hr,Nn.chunk=function(n,t,r){t=(r?Cr(n,t,r):null==t)?1:ku(+t||1,1),r=0;for(var e=n?n.length:0,u=-1,i=Me(au(e/t));rr&&(r=-r>u?0:u+r),e=e===m||e>u?u:+e||0,0>e&&(e+=u),u=r>e?0:e>>>0,r>>>=0;rt?0:t)):[]},Nn.takeRight=function(n,t,r){var e=n?n.length:0;return e?((r?Cr(n,t,r):null==t)&&(t=1),t=e-(+t||0),Ct(n,0>t?0:t)):[]},Nn.takeRightWhile=function(n,t,r){return n&&n.length?Nt(n,mr(t,r,3),false,true):[]},Nn.takeWhile=function(n,t,r){return n&&n.length?Nt(n,mr(t,r,3)):[]; -},Nn.tap=function(n,t,r){return t.call(r,n),n},Nn.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new Je(N);return false===r?e=false:ve(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),Fn.leading=e,Fn.maxWait=+t,Fn.trailing=u,fe(n,t,Fn)},Nn.thru=Qr,Nn.times=function(n,t,r){if(n=su(n),1>n||!Au(n))return[];var e=-1,u=Me(Ou(n,4294967295));for(t=Mt(t,r,1);++ee?u[e]=t(e):t(e);return u},Nn.toArray=xe,Nn.toPlainObject=Ae,Nn.transform=function(n,t,r,e){var u=Ti(n)||we(n); -return t=mr(t,e,4),null==r&&(u||ve(n)?(e=n.constructor,r=u?Ti(n)?new e:[]:Bu($i(e)?e.prototype:null)):r={}),(u?Kn:vt)(n,function(n,e,u){return t(r,n,e,u)}),r},Nn.union=ei,Nn.uniq=Zr,Nn.unzip=Gr,Nn.unzipWith=Jr,Nn.values=Re,Nn.valuesIn=function(n){return Ft(n,ke(n))},Nn.where=function(n,t){return te(n,xt(t))},Nn.without=ui,Nn.wrap=function(n,t){return t=null==t?Fe:t,vr(t,O,null,[n],[])},Nn.xor=function(){for(var n=-1,t=arguments.length;++nr?0:+r||0,e),r-=t.length,0<=r&&n.indexOf(t,r)==r},Nn.escape=function(n){return(n=u(n))&&pn.test(n)?n.replace(cn,a):n},Nn.escapeRegExp=Ee,Nn.every=ne,Nn.find=ai,Nn.findIndex=Xu,Nn.findKey=zi,Nn.findLast=ci,Nn.findLastIndex=Hu,Nn.findLastKey=Bi,Nn.findWhere=function(n,t){return ai(n,xt(t))},Nn.first=Dr,Nn.get=function(n,t,r){ -return n=null==n?m:dt(n,Br(t),t+""),n===m?r:n},Nn.gt=ce,Nn.gte=function(n,t){return n>=t},Nn.has=function(n,t){if(null==n)return false;var r=ru.call(n,t);if(!r&&!Wr(t)){if(t=Br(t),n=1==t.length?n:dt(n,Ct(t,0,-1)),null==n)return false;t=Vr(t),r=ru.call(n,t)}return r||Tr(n.length)&&Er(t,n.length)&&(Ti(n)||se(n))},Nn.identity=Fe,Nn.includes=re,Nn.indexOf=Kr,Nn.inRange=function(n,t,r){return t=+t||0,"undefined"===typeof r?(r=t,t=0):r=+r||0,n>=Ou(t,r)&&nr?ku(e+r,0):Ou(r||0,e-1))+1;else if(r)return u=zt(n,t,true)-1,n=n[u],(t===t?t===n:n!==n)?u:-1;if(t!==t)return s(n,u,true);for(;u--;)if(n[u]===t)return u;return-1},Nn.lt=be,Nn.lte=function(n,t){return n<=t},Nn.max=oo,Nn.min=fo,Nn.noConflict=function(){return h._=iu,this},Nn.noop=ze,Nn.now=wi, -Nn.pad=function(n,t,r){n=u(n),t=+t;var e=n.length;return er?0:+r||0,n.length),n.lastIndexOf(t,r)==r},Nn.sum=function(n,t,r){r&&Cr(n,t,r)&&(t=null);var e=mr(),u=null==t;if(u&&e===it||(u=false, -t=e(t,r,3)),u){for(n=Ti(n)?n:Lr(n),t=n.length,r=0;t--;)r+=+n[t]||0;n=r}else n=Ut(n,t);return n},Nn.template=function(n,t,r){var e=Nn.templateSettings;r&&Cr(n,t,r)&&(t=r=null),n=u(n),t=tt(rt({},r||t),e,nt),r=tt(rt({},t.imports),e.imports,nt);var i,o,f=Ki(r),l=Ft(r,f),a=0;r=t.interpolate||En;var s="__p+='";r=Ze((t.escape||En).source+"|"+r.source+"|"+(r===vn?An:En).source+"|"+(t.evaluate||En).source+"|$","g");var p="sourceURL"in t?"//# sourceURL="+t.sourceURL+"\n":"";if(n.replace(r,function(t,r,e,u,f,l){ -return e||(e=u),s+=n.slice(a,l).replace(Cn,c),r&&(i=true,s+="'+__e("+r+")+'"),f&&(o=true,s+="';"+f+";\n__p+='"),e&&(s+="'+((__t=("+e+"))==null?'':__t)+'"),a=l+t.length,t}),s+="';",(t=t.variable)||(s="with(obj){"+s+"}"),s=(o?s.replace(on,""):s).replace(fn,"$1").replace(ln,"$1;"),s="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(i?",__e=_.escape":"")+(o?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+s+"return __p}",t=eo(function(){return De(f,p+"return "+s).apply(m,l); -}),t.source=s,_e(t))throw t;return t},Nn.trim=Se,Nn.trimLeft=function(n,t,r){var e=n;return(n=u(n))?n.slice((r?Cr(e,t,r):null==t)?v(n):i(n,t+"")):n},Nn.trimRight=function(n,t,r){var e=n;return(n=u(n))?(r?Cr(e,t,r):null==t)?n.slice(0,g(n)+1):n.slice(0,o(n,t+"")+1):n},Nn.trunc=function(n,t,r){r&&Cr(n,t,r)&&(t=null);var e=C;if(r=W,null!=t)if(ve(t)){var i="separator"in t?t.separator:i,e="length"in t?+t.length||0:e;r="omission"in t?u(t.omission):r}else e=+t||0;if(n=u(n),e>=n.length)return n;if(e-=r.length, -1>e)return r;if(t=n.slice(0,e),null==i)return t+r;if(de(i)){if(n.slice(e).search(i)){var o,f=n.slice(0,e);for(i.global||(i=Ze(i.source,(jn.exec(i)||"")+"g")),i.lastIndex=0;n=i.exec(f);)o=n.index;t=t.slice(0,null==o?e:o)}}else n.indexOf(i,e)!=e&&(i=t.lastIndexOf(i),-1u.__dir__?"Right":"")}),u},Bn.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse(); -},Bn.prototype[n+"RightWhile"]=function(n,t){return this.reverse()[r](n,t).reverse()}}),Kn(["first","last"],function(n,t){var r="take"+(t?"Right":"");Bn.prototype[n]=function(){return this[r](1).value()[0]}}),Kn(["initial","rest"],function(n,t){var r="drop"+(t?"":"Right");Bn.prototype[n]=function(){return this[r](1)}}),Kn(["pluck","where"],function(n,t){var r=t?"filter":"map",e=t?xt:Be;Bn.prototype[n]=function(n){return this[r](e(n))}}),Bn.prototype.compact=function(){return this.filter(Fe)},Bn.prototype.reject=function(n,t){ -return n=mr(n,t,1),this.filter(function(t){return!n(t)})},Bn.prototype.slice=function(n,t){n=null==n?0:+n||0;var r=this;return 0>n?r=this.takeRight(-n):n&&(r=this.drop(n)),t!==m&&(t=+t||0,r=0>t?r.dropRight(-t):r.take(t-n)),r},Bn.prototype.toArray=function(){return this.drop(0)},vt(Bn.prototype,function(n,t){var r=Nn[t];if(r){var e=/^(?:filter|map|reject)|While$/.test(t),u=/^(?:first|last)$/.test(t);Nn.prototype[t]=function(){function t(n){return n=[n],_u.apply(n,i),r.apply(Nn,n)}var i=arguments,o=this.__chain__,f=this.__wrapped__,l=!!this.__actions__.length,a=f instanceof Bn,c=i[0],s=a||Ti(f); -return s&&e&&typeof c=="function"&&1!=c.length&&(a=s=false),a=a&&!l,u&&!o?a?n.call(f):r.call(Nn,this.value()):s?(f=n.apply(a?f:new Bn(this),i),u||!l&&!f.__actions__||(f.__actions__||(f.__actions__=[])).push({func:Qr,args:[t],thisArg:Nn}),new zn(f,o)):this.thru(t)}}}),Kn("concat join pop push replace shift sort splice split unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?Qe:Xe)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:join|pop|replace|shift)$/.test(n);Nn.prototype[n]=function(){ -var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),vt(Bn.prototype,function(n,t){var r=Nn[t];if(r){var e=r.name;(Lu[e]||(Lu[e]=[])).push({name:t,func:r})}}),Lu[sr(null,x).name]=[{name:"wrapper",func:null}],Bn.prototype.clone=function(){var n=this.__actions__,t=this.__iteratees__,r=this.__views__,e=new Bn(this.__wrapped__);return e.__actions__=n?Dn(n):null,e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=t?Dn(t):null, -e.__takeCount__=this.__takeCount__,e.__views__=r?Dn(r):null,e},Bn.prototype.reverse=function(){if(this.__filtered__){var n=new Bn(this);n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},Bn.prototype.value=function(){var n=this.__wrapped__.value();if(!Ti(n))return Lt(n,this.__actions__);var t,r=this.__dir__,e=0>r;t=n.length;for(var u=this.__views__,i=0,o=-1,f=u?u.length:0;++op.index:u=_:!h(s))))continue n}else if(p=h(s),_==F)s=p;else if(!p){if(_==$)continue n;break n}}a[l++]=s}return a},Nn.prototype.chain=function(){ -return Hr(this)},Nn.prototype.commit=function(){return new zn(this.value(),this.__chain__)},Nn.prototype.plant=function(n){for(var t,r=this;r instanceof Ln;){var e=Mr(r);t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},Nn.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Bn?(this.__actions__.length&&(n=new Bn(this)),new zn(n.reverse(),this.__chain__)):this.thru(function(n){return n.reverse()})},Nn.prototype.toString=function(){return this.value()+""},Nn.prototype.run=Nn.prototype.toJSON=Nn.prototype.valueOf=Nn.prototype.value=function(){ -return Lt(this.__wrapped__,this.__actions__)},Nn.prototype.collect=Nn.prototype.map,Nn.prototype.head=Nn.prototype.first,Nn.prototype.select=Nn.prototype.filter,Nn.prototype.tail=Nn.prototype.rest,Nn}var m,w="3.9.3",b=1,x=2,A=4,j=8,k=16,O=32,R=64,I=128,E=256,C=30,W="...",S=150,T=16,U=0,$=1,F=2,N="Expected a function",L="__lodash_placeholder__",z="[object Arguments]",B="[object Array]",M="[object Boolean]",P="[object Date]",q="[object Error]",D="[object Function]",K="[object Number]",V="[object Object]",Y="[object RegExp]",Z="[object String]",G="[object ArrayBuffer]",J="[object Float32Array]",X="[object Float64Array]",H="[object Int8Array]",Q="[object Int16Array]",nn="[object Int32Array]",tn="[object Uint8Array]",rn="[object Uint8ClampedArray]",en="[object Uint16Array]",un="[object Uint32Array]",on=/\b__p\+='';/g,fn=/\b(__p\+=)''\+/g,ln=/(__e\(.*?\)|\b__t\))\+'';/g,an=/&(?:amp|lt|gt|quot|#39|#96);/g,cn=/[&<>"'`]/g,sn=RegExp(an.source),pn=RegExp(cn.source),hn=/<%-([\s\S]+?)%>/g,_n=/<%([\s\S]+?)%>/g,vn=/<%=([\s\S]+?)%>/g,gn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,yn=/^\w*$/,dn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g,mn=/[.*+?^${}()|[\]\/\\]/g,wn=RegExp(mn.source),bn=/[\u0300-\u036f\ufe20-\ufe23]/g,xn=/\\(\\)?/g,An=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,jn=/\w*$/,kn=/^0[xX]/,On=/^\[object .+?Constructor\]$/,Rn=/^\d+$/,In=/[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g,En=/($^)/,Cn=/['\n\r\u2028\u2029\\]/g,Wn=RegExp("[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?=[A-Z\\xc0-\\xd6\\xd8-\\xde][a-z\\xdf-\\xf6\\xf8-\\xff]+)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+|[A-Z\\xc0-\\xd6\\xd8-\\xde]+|[0-9]+","g"),Sn=" \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",Tn="Array ArrayBuffer Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Math Number Object RegExp Set String _ clearTimeout document isFinite parseFloat parseInt setTimeout TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap window".split(" "),Un={}; -Un[J]=Un[X]=Un[H]=Un[Q]=Un[nn]=Un[tn]=Un[rn]=Un[en]=Un[un]=true,Un[z]=Un[B]=Un[G]=Un[M]=Un[P]=Un[q]=Un[D]=Un["[object Map]"]=Un[K]=Un[V]=Un[Y]=Un["[object Set]"]=Un[Z]=Un["[object WeakMap]"]=false;var $n={};$n[z]=$n[B]=$n[G]=$n[M]=$n[P]=$n[J]=$n[X]=$n[H]=$n[Q]=$n[nn]=$n[K]=$n[V]=$n[Y]=$n[Z]=$n[tn]=$n[rn]=$n[en]=$n[un]=true,$n[q]=$n[D]=$n["[object Map]"]=$n["[object Set]"]=$n["[object WeakMap]"]=false;var Fn={leading:false,maxWait:0,trailing:false},Nn={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A", -"\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u", -"\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss"},Ln={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},zn={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},Bn={"function":true,object:true},Mn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Pn=Bn[typeof exports]&&exports&&!exports.nodeType&&exports,qn=Bn[typeof module]&&module&&!module.nodeType&&module,Dn=Bn[typeof self]&&self&&self.Object&&self,Kn=Bn[typeof window]&&window&&window.Object&&window,Vn=qn&&qn.exports===Pn&&Pn,Yn=Pn&&qn&&typeof global=="object"&&global&&global.Object&&global||Kn!==(this&&this.window)&&Kn||Dn||this,Zn=d(); -typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Yn._=Zn, define(function(){return Zn})):Pn&&qn?Vn?(qn.exports=Zn)._=Zn:Pn._=Zn:Yn._=Zn}).call(this); \ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/vectorizer.js b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/vectorizer.js deleted file mode 100644 index fe2a05da1..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/js/vectorizer.js +++ /dev/null @@ -1,1055 +0,0 @@ -/*! JointJS v0.9.3 - JavaScript diagramming library 2015-05-22 - - -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -// Vectorizer. -// ----------- - -// A tiny library for making your live easier when dealing with SVG. -// The only Vectorizer dependency is the Geometry library. - -// Copyright © 2012 - 2015 client IO (http://client.io) - -(function(root, factory) { - - if (typeof define === 'function' && define.amd) { - - // AMD. Register as an anonymous module. - define(['app/gbp-old/js/geometry'], function(g) { - return factory(g); - }); - - - } else if (typeof exports === 'object') { - - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - - } else { - - // Browser globals. - root.Vectorizer = root.V = factory(); - - } - -}(this, function(g) { - - var SVGsupported = typeof window === 'object' && !!(window.SVGAngle || document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1')); - - // SVG support is required. - if (!SVGsupported) return function() {}; - - // XML namespaces. - var ns = { - xmlns: 'http://www.w3.org/2000/svg', - xlink: 'http://www.w3.org/1999/xlink' - }; - // SVG version. - var SVGversion = '1.1'; - - // A function returning a unique identifier for this client session with every call. - var idCounter = 0; - function uniqueId() { - var id = ++idCounter + ''; - return 'v-' + id; - } - - // Create an SVG document element. - // If `content` is passed, it will be used as the SVG content of the `` root element. - function createSvgDocument(content) { - - var svg = '' + (content || '') + ''; - var parser = new DOMParser(); - parser.async = false; - return parser.parseFromString(svg, 'text/xml').documentElement; - } - - // Create SVG element. - // ------------------- - - function createElement(el, attrs, children) { - - var i, len; - - if (!el) return undefined; - - // If `el` is an object, it is probably a native SVG element. Wrap it to VElement. - if (typeof el === 'object') { - return new VElement(el); - } - attrs = attrs || {}; - - // If `el` is a `'svg'` or `'SVG'` string, create a new SVG canvas. - if (el.toLowerCase() === 'svg') { - - return new VElement(createSvgDocument()); - - } else if (el[0] === '<') { - // Create element from an SVG string. - // Allows constructs of type: `document.appendChild(Vectorizer('').node)`. - - var svgDoc = createSvgDocument(el); - - // Note that `createElement()` might also return an array should the SVG string passed as - // the first argument contain more then one root element. - if (svgDoc.childNodes.length > 1) { - - // Map child nodes to `VElement`s. - var ret = []; - for (i = 0, len = svgDoc.childNodes.length; i < len; i++) { - - var childNode = svgDoc.childNodes[i]; - ret.push(new VElement(document.importNode(childNode, true))); - } - return ret; - } - - return new VElement(document.importNode(svgDoc.firstChild, true)); - } - - el = document.createElementNS(ns.xmlns, el); - - // Set attributes. - for (var key in attrs) { - - setAttribute(el, key, attrs[key]); - } - - // Normalize `children` array. - if (Object.prototype.toString.call(children) != '[object Array]') children = [children]; - - // Append children if they are specified. - for (i = 0, len = (children[0] && children.length) || 0; i < len; i++) { - var child = children[i]; - el.appendChild(child instanceof VElement ? child.node : child); - } - - return new VElement(el); - } - - function setAttribute(el, name, value) { - - if (name.indexOf(':') > -1) { - // Attribute names can be namespaced. E.g. `image` elements - // have a `xlink:href` attribute to set the source of the image. - var combinedKey = name.split(':'); - el.setAttributeNS(ns[combinedKey[0]], combinedKey[1], value); - - } else if (name === 'id') { - el.id = value; - } else { - el.setAttribute(name, value); - } - } - - function parseTransformString(transform) { - var translate, - rotate, - scale; - - if (transform) { - - var separator = /[ ,]+/; - - var translateMatch = transform.match(/translate\((.*)\)/); - if (translateMatch) { - translate = translateMatch[1].split(separator); - } - var rotateMatch = transform.match(/rotate\((.*)\)/); - if (rotateMatch) { - rotate = rotateMatch[1].split(separator); - } - var scaleMatch = transform.match(/scale\((.*)\)/); - if (scaleMatch) { - scale = scaleMatch[1].split(separator); - } - } - - var sx = (scale && scale[0]) ? parseFloat(scale[0]) : 1; - - return { - translate: { - tx: (translate && translate[0]) ? parseInt(translate[0], 10) : 0, - ty: (translate && translate[1]) ? parseInt(translate[1], 10) : 0 - }, - rotate: { - angle: (rotate && rotate[0]) ? parseInt(rotate[0], 10) : 0, - cx: (rotate && rotate[1]) ? parseInt(rotate[1], 10) : undefined, - cy: (rotate && rotate[2]) ? parseInt(rotate[2], 10) : undefined - }, - scale: { - sx: sx, - sy: (scale && scale[1]) ? parseFloat(scale[1]) : sx - } - }; - } - - - // Matrix decomposition. - // --------------------- - - function deltaTransformPoint(matrix, point) { - - var dx = point.x * matrix.a + point.y * matrix.c + 0; - var dy = point.x * matrix.b + point.y * matrix.d + 0; - return { x: dx, y: dy }; - } - - function decomposeMatrix(matrix) { - - // @see https://gist.github.com/2052247 - - // calculate delta transform point - var px = deltaTransformPoint(matrix, { x: 0, y: 1 }); - var py = deltaTransformPoint(matrix, { x: 1, y: 0 }); - - // calculate skew - var skewX = ((180 / Math.PI) * Math.atan2(px.y, px.x) - 90); - var skewY = ((180 / Math.PI) * Math.atan2(py.y, py.x)); - - return { - - translateX: matrix.e, - translateY: matrix.f, - scaleX: Math.sqrt(matrix.a * matrix.a + matrix.b * matrix.b), - scaleY: Math.sqrt(matrix.c * matrix.c + matrix.d * matrix.d), - skewX: skewX, - skewY: skewY, - rotation: skewX // rotation is the same as skew x - }; - } - - // VElement. - // --------- - - function VElement(el) { - this.node = el; - if (!this.node.id) { - this.node.id = uniqueId(); - } - } - - // VElement public API. - // -------------------- - - VElement.prototype = { - - translate: function(tx, ty, opt) { - - opt = opt || {}; - ty = ty || 0; - - var transformAttr = this.attr('transform') || ''; - var transform = parseTransformString(transformAttr); - - // Is it a getter? - if (typeof tx === 'undefined') { - return transform.translate; - } - - transformAttr = transformAttr.replace(/translate\([^\)]*\)/g, '').trim(); - - var newTx = opt.absolute ? tx : transform.translate.tx + tx; - var newTy = opt.absolute ? ty : transform.translate.ty + ty; - var newTranslate = 'translate(' + newTx + ',' + newTy + ')'; - - // Note that `translate()` is always the first transformation. This is - // usually the desired case. - this.attr('transform', (newTranslate + ' ' + transformAttr).trim()); - return this; - }, - - rotate: function(angle, cx, cy, opt) { - - opt = opt || {}; - - var transformAttr = this.attr('transform') || ''; - var transform = parseTransformString(transformAttr); - - // Is it a getter? - if (typeof angle === 'undefined') { - return transform.rotate; - } - - transformAttr = transformAttr.replace(/rotate\([^\)]*\)/g, '').trim(); - - angle %= 360; - - var newAngle = opt.absolute ? angle : transform.rotate.angle + angle; - var newOrigin = (cx !== undefined && cy !== undefined) ? ',' + cx + ',' + cy : ''; - var newRotate = 'rotate(' + newAngle + newOrigin + ')'; - - this.attr('transform', (transformAttr + ' ' + newRotate).trim()); - return this; - }, - - // Note that `scale` as the only transformation does not combine with previous values. - scale: function(sx, sy) { - sy = (typeof sy === 'undefined') ? sx : sy; - - var transformAttr = this.attr('transform') || ''; - var transform = parseTransformString(transformAttr); - - // Is it a getter? - if (typeof sx === 'undefined') { - return transform.scale; - } - - transformAttr = transformAttr.replace(/scale\([^\)]*\)/g, '').trim(); - - var newScale = 'scale(' + sx + ',' + sy + ')'; - - this.attr('transform', (transformAttr + ' ' + newScale).trim()); - return this; - }, - - // Get SVGRect that contains coordinates and dimension of the real bounding box, - // i.e. after transformations are applied. - // If `target` is specified, bounding box will be computed relatively to `target` element. - bbox: function(withoutTransformations, target) { - - // If the element is not in the live DOM, it does not have a bounding box defined and - // so fall back to 'zero' dimension element. - if (!this.node.ownerSVGElement) return { x: 0, y: 0, width: 0, height: 0 }; - - var box; - try { - - box = this.node.getBBox(); - - // Opera returns infinite values in some cases. - // Note that Infinity | 0 produces 0 as opposed to Infinity || 0. - // We also have to create new object as the standard says that you can't - // modify the attributes of a bbox. - box = { x: box.x | 0, y: box.y | 0, width: box.width | 0, height: box.height | 0 }; - - } catch (e) { - - // Fallback for IE. - box = { - x: this.node.clientLeft, - y: this.node.clientTop, - width: this.node.clientWidth, - height: this.node.clientHeight - }; - } - - if (withoutTransformations) { - - return box; - } - - var matrix = this.node.getTransformToElement(target || this.node.ownerSVGElement); - - return V.transformRect(box, matrix); - }, - - text: function(content, opt) { - - opt = opt || {}; - var lines = content.split('\n'); - var i = 0; - var tspan; - - // `alignment-baseline` does not work in Firefox. - // Setting `dominant-baseline` on the `` element doesn't work in IE9. - // In order to have the 0,0 coordinate of the `` element (or the first ``) - // in the top left corner we translate the `` element by `0.8em`. - // See `http://www.w3.org/Graphics/SVG/WG/wiki/How_to_determine_dominant_baseline`. - // See also `http://apike.ca/prog_svg_text_style.html`. - this.attr('y', '0.8em'); - - // An empty text gets rendered into the DOM in webkit-based browsers. - // In order to unify this behaviour across all browsers - // we rather hide the text element when it's empty. - this.attr('display', content ? null : 'none'); - - // Preserve spaces. In other words, we do not want consecutive spaces to get collapsed to one. - this.node.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve'); - - // Easy way to erase all `` children; - this.node.textContent = ''; - - var textNode = this.node; - - if (opt.textPath) { - - // Wrap the text in the SVG element that points - // to a path defined by `opt.textPath` inside the internal `` element. - var defs = this.find('defs'); - if (defs.length === 0) { - defs = createElement('defs'); - this.append(defs); - } - - // If `opt.textPath` is a plain string, consider it to be directly the - // SVG path data for the text to go along (this is a shortcut). - // Otherwise if it is an object and contains the `d` property, then this is our path. - var d = Object(opt.textPath) === opt.textPath ? opt.textPath.d : opt.textPath; - if (d) { - var path = createElement('path', { d: d }); - defs.append(path); - } - - var textPath = createElement('textPath'); - // Set attributes on the ``. The most important one - // is the `xlink:href` that points to our newly created `` element in ``. - // Note that we also allow the following construct: - // `t.text('my text', { textPath: { 'xlink:href': '#my-other-path' } })`. - // In other words, one can completely skip the auto-creation of the path - // and use any other arbitrary path that is in the document. - if (!opt.textPath['xlink:href'] && path) { - textPath.attr('xlink:href', '#' + path.node.id); - } - - if (Object(opt.textPath) === opt.textPath) { - textPath.attr(opt.textPath); - } - this.append(textPath); - // Now all the ``s will be inside the ``. - textNode = textPath.node; - } - - if (lines.length === 1) { - textNode.textContent = content; - return this; - } - - for (; i < lines.length; i++) { - - // Shift all the but first by one line (`1em`) - tspan = V('tspan', { dy: (i == 0 ? '0em' : opt.lineHeight || '1em'), x: this.attr('x') || 0 }); - tspan.addClass('v-line'); - if (!lines[i]) { - tspan.addClass('v-empty-line'); - } - // Make sure the textContent is never empty. If it is, add an additional - // space (an invisible character) so that following lines are correctly - // relatively positioned. `dy=1em` won't work with empty lines otherwise. - tspan.node.textContent = lines[i] || ' '; - - V(textNode).append(tspan); - } - return this; - }, - - attr: function(name, value) { - - if (typeof name === 'undefined') { - // Return all attributes. - var attributes = this.node.attributes; - var attrs = {}; - for (var i = 0; i < attributes.length; i++) { - attrs[attributes[i].nodeName] = attributes[i].nodeValue; - } - return attrs; - } - - if (typeof name === 'string' && typeof value === 'undefined') { - return this.node.getAttribute(name); - } - - if (typeof name === 'object') { - - for (var attrName in name) { - if (name.hasOwnProperty(attrName)) { - setAttribute(this.node, attrName, name[attrName]); - } - } - - } else { - - setAttribute(this.node, name, value); - } - - return this; - }, - - remove: function() { - if (this.node.parentNode) { - this.node.parentNode.removeChild(this.node); - } - }, - - append: function(el) { - - var els = el; - - if (Object.prototype.toString.call(el) !== '[object Array]') { - - els = [el]; - } - - for (var i = 0, len = els.length; i < len; i++) { - el = els[i]; - this.node.appendChild(el instanceof VElement ? el.node : el); - } - - return this; - }, - - prepend: function(el) { - this.node.insertBefore(el instanceof VElement ? el.node : el, this.node.firstChild); - }, - - svg: function() { - - return this.node instanceof window.SVGSVGElement ? this : V(this.node.ownerSVGElement); - }, - - defs: function() { - - var defs = this.svg().node.getElementsByTagName('defs'); - - return (defs && defs.length) ? V(defs[0]) : undefined; - }, - - clone: function() { - var clone = V(this.node.cloneNode(true)); - // Note that clone inherits also ID. Therefore, we need to change it here. - clone.node.id = uniqueId(); - return clone; - }, - - findOne: function(selector) { - - var found = this.node.querySelector(selector); - return found ? V(found) : undefined; - }, - - find: function(selector) { - - var nodes = this.node.querySelectorAll(selector); - - // Map DOM elements to `VElement`s. - for (var i = 0, len = nodes.length; i < len; i++) { - nodes[i] = V(nodes[i]); - } - return nodes; - }, - - // Find an index of an element inside its container. - index: function() { - - var index = 0; - var node = this.node.previousSibling; - - while (node) { - // nodeType 1 for ELEMENT_NODE - if (node.nodeType === 1) index++; - node = node.previousSibling; - } - - return index; - }, - - // Convert global point into the coordinate space of this element. - toLocalPoint: function(x, y) { - - var svg = this.svg().node; - - var p = svg.createSVGPoint(); - p.x = x; - p.y = y; - - try { - - var globalPoint = p.matrixTransform(svg.getScreenCTM().inverse()); - var globalToLocalMatrix = this.node.getTransformToElement(svg).inverse(); - - } catch (e) { - // IE9 throws an exception in odd cases. (`Unexpected call to method or property access`) - // We have to make do with the original coordianates. - return p; - } - - return globalPoint.matrixTransform(globalToLocalMatrix); - }, - - translateCenterToPoint: function(p) { - - var bbox = this.bbox(); - var center = g.rect(bbox).center(); - - this.translate(p.x - center.x, p.y - center.y); - }, - - // Efficiently auto-orient an element. This basically implements the orient=auto attribute - // of markers. The easiest way of understanding on what this does is to imagine the element is an - // arrowhead. Calling this method on the arrowhead makes it point to the `position` point while - // being auto-oriented (properly rotated) towards the `reference` point. - // `target` is the element relative to which the transformations are applied. Usually a viewport. - translateAndAutoOrient: function(position, reference, target) { - - // Clean-up previously set transformations except the scale. If we didn't clean up the - // previous transformations then they'd add up with the old ones. Scale is an exception as - // it doesn't add up, consider: `this.scale(2).scale(2).scale(2)`. The result is that the - // element is scaled by the factor 2, not 8. - - var s = this.scale(); - this.attr('transform', ''); - this.scale(s.sx, s.sy); - - var svg = this.svg().node; - var bbox = this.bbox(false, target); - - // 1. Translate to origin. - var translateToOrigin = svg.createSVGTransform(); - translateToOrigin.setTranslate(-bbox.x - bbox.width / 2, -bbox.y - bbox.height / 2); - - // 2. Rotate around origin. - var rotateAroundOrigin = svg.createSVGTransform(); - var angle = g.point(position).changeInAngle(position.x - reference.x, position.y - reference.y, reference); - rotateAroundOrigin.setRotate(angle, 0, 0); - - // 3. Translate to the `position` + the offset (half my width) towards the `reference` point. - var translateFinal = svg.createSVGTransform(); - var finalPosition = g.point(position).move(reference, bbox.width / 2); - translateFinal.setTranslate(position.x + (position.x - finalPosition.x), position.y + (position.y - finalPosition.y)); - - // 4. Apply transformations. - var ctm = this.node.getTransformToElement(target); - var transform = svg.createSVGTransform(); - transform.setMatrix( - translateFinal.matrix.multiply( - rotateAroundOrigin.matrix.multiply( - translateToOrigin.matrix.multiply( - ctm))) - ); - - // Instead of directly setting the `matrix()` transform on the element, first, decompose - // the matrix into separate transforms. This allows us to use normal Vectorizer methods - // as they don't work on matrices. An example of this is to retrieve a scale of an element. - // this.node.transform.baseVal.initialize(transform); - - var decomposition = decomposeMatrix(transform.matrix); - - this.translate(decomposition.translateX, decomposition.translateY); - this.rotate(decomposition.rotation); - // Note that scale has been already applied, hence the following line stays commented. (it's here just for reference). - //this.scale(decomposition.scaleX, decomposition.scaleY); - - return this; - }, - - animateAlongPath: function(attrs, path) { - - var animateMotion = V('animateMotion', attrs); - var mpath = V('mpath', { 'xlink:href': '#' + V(path).node.id }); - - animateMotion.append(mpath); - - this.append(animateMotion); - try { - animateMotion.node.beginElement(); - } catch (e) { - // Fallback for IE 9. - // Run the animation programatically if FakeSmile (`http://leunen.me/fakesmile/`) present - if (document.documentElement.getAttribute('smiling') === 'fake') { - - // Register the animation. (See `https://answers.launchpad.net/smil/+question/203333`) - var animation = animateMotion.node; - animation.animators = []; - - var animationID = animation.getAttribute('id'); - if (animationID) id2anim[animationID] = animation; - - var targets = getTargets(animation); - for (var i = 0, len = targets.length; i < len; i++) { - var target = targets[i]; - var animator = new Animator(animation, target, i); - animators.push(animator); - animation.animators[i] = animator; - animator.register(); - } - } - } - }, - - hasClass: function(className) { - - return new RegExp('(\\s|^)' + className + '(\\s|$)').test(this.node.getAttribute('class')); - }, - - addClass: function(className) { - - if (!this.hasClass(className)) { - var prevClasses = this.node.getAttribute('class') || ''; - this.node.setAttribute('class', (prevClasses + ' ' + className).trim()); - } - - return this; - }, - - removeClass: function(className) { - - if (this.hasClass(className)) { - var newClasses = this.node.getAttribute('class').replace(new RegExp('(\\s|^)' + className + '(\\s|$)', 'g'), '$2'); - this.node.setAttribute('class', newClasses); - } - - return this; - }, - - toggleClass: function(className, toAdd) { - - var toRemove = typeof toAdd === 'undefined' ? this.hasClass(className) : !toAdd; - - if (toRemove) { - this.removeClass(className); - } else { - this.addClass(className); - } - - return this; - }, - - // Interpolate path by discrete points. The precision of the sampling - // is controlled by `interval`. In other words, `sample()` will generate - // a point on the path starting at the beginning of the path going to the end - // every `interval` pixels. - // The sampler can be very useful for e.g. finding intersection between two - // paths (finding the two closest points from two samples). - sample: function(interval) { - - interval = interval || 1; - var node = this.node; - var length = node.getTotalLength(); - var samples = []; - var distance = 0; - var sample; - while (distance < length) { - sample = node.getPointAtLength(distance); - samples.push({ x: sample.x, y: sample.y, distance: distance }); - distance += interval; - } - return samples; - }, - - convertToPath: function() { - - var path = createElement('path'); - path.attr(this.attr()); - var d = this.convertToPathData(); - if (d) { - path.attr('d', d); - } - return path; - }, - - convertToPathData: function() { - - var tagName = this.node.tagName.toUpperCase(); - - switch (tagName) { - case 'PATH': - return this.attr('d'); - case 'LINE': - return convertLineToPathData(this.node); - case 'POLYGON': - return convertPolygonToPathData(this.node); - case 'POLYLINE': - return convertPolylineToPathData(this.node); - case 'ELLIPSE': - return convertEllipseToPathData(this.node); - case 'CIRCLE': - return convertCircleToPathData(this.node); - case 'RECT': - return convertRectToPathData(this.node); - } - - throw new Error(tagName + ' cannot be converted to PATH.'); - }, - - // Find the intersection of a line starting in the center - // of the SVG `node` ending in the point `ref`. - // `target` is an SVG element to which `node`s transformations are relative to. - // In JointJS, `target` is the `paper.viewport` SVG group element. - // Note that `ref` point must be in the coordinate system of the `target` for this function to work properly. - // Returns a point in the `target` coordinte system (the same system as `ref` is in) if - // an intersection is found. Returns `undefined` otherwise. - findIntersection: function(ref, target) { - - var svg = this.svg().node; - target = target || svg; - var bbox = g.rect(this.bbox(false, target)); - var center = bbox.center(); - var spot = bbox.intersectionWithLineFromCenterToPoint(ref); - - if (!spot) return undefined; - - var tagName = this.node.localName.toUpperCase(); - - // Little speed up optimalization for `` element. We do not do conversion - // to path element and sampling but directly calculate the intersection through - // a transformed geometrical rectangle. - if (tagName === 'RECT') { - - var gRect = g.rect( - parseFloat(this.attr('x') || 0), - parseFloat(this.attr('y') || 0), - parseFloat(this.attr('width')), - parseFloat(this.attr('height')) - ); - // Get the rect transformation matrix with regards to the SVG document. - var rectMatrix = this.node.getTransformToElement(target); - // Decompose the matrix to find the rotation angle. - var rectMatrixComponents = V.decomposeMatrix(rectMatrix); - // Now we want to rotate the rectangle back so that we - // can use `intersectionWithLineFromCenterToPoint()` passing the angle as the second argument. - var resetRotation = svg.createSVGTransform(); - resetRotation.setRotate(-rectMatrixComponents.rotation, center.x, center.y); - var rect = V.transformRect(gRect, resetRotation.matrix.multiply(rectMatrix)); - spot = g.rect(rect).intersectionWithLineFromCenterToPoint(ref, rectMatrixComponents.rotation); - - } else if (tagName === 'PATH' || tagName === 'POLYGON' || tagName === 'POLYLINE' || tagName === 'CIRCLE' || tagName === 'ELLIPSE') { - - var pathNode = (tagName === 'PATH') ? this : this.convertToPath(); - var samples = pathNode.sample(); - var minDistance = Infinity; - var closestSamples = []; - - for (var i = 0, len = samples.length; i < len; i++) { - - var sample = samples[i]; - // Convert the sample point in the local coordinate system to the global coordinate system. - var gp = V.createSVGPoint(sample.x, sample.y); - gp = gp.matrixTransform(this.node.getTransformToElement(target)); - sample = g.point(gp); - var centerDistance = sample.distance(center); - // Penalize a higher distance to the reference point by 10%. - // This gives better results. This is due to - // inaccuracies introduced by rounding errors and getPointAtLength() returns. - var refDistance = sample.distance(ref) * 1.1; - var distance = centerDistance + refDistance; - if (distance < minDistance) { - minDistance = distance; - closestSamples = [{ sample: sample, refDistance: refDistance }]; - } else if (distance < minDistance + 1) { - closestSamples.push({ sample: sample, refDistance: refDistance }); - } - } - closestSamples.sort(function(a, b) { return a.refDistance - b.refDistance; }); - spot = closestSamples[0].sample; - } - - return spot; - } - }; - - function convertLineToPathData(line) { - - line = createElement(line); - var d = [ - 'M', line.attr('x1'), line.attr('y1'), - 'L', line.attr('x2'), line.attr('y2') - ].join(' '); - return d; - } - - function convertPolygonToPathData(polygon) { - - polygon = createElement(polygon); - var points = polygon.node.points; - - var d = []; - var p; - for (var i = 0; i < points.length; i++) { - p = points[i]; - d.push(i === 0 ? 'M' : 'L', p.x, p.y); - } - d.push('Z'); - return d.join(' '); - } - - function convertPolylineToPathData(polyline) { - - polyline = createElement(polyline); - var points = polyline.node.points; - - var d = []; - var p; - for (var i = 0; i < points.length; i++) { - p = points[i]; - d.push(i === 0 ? 'M' : 'L', p.x, p.y); - } - return d.join(' '); - } - - var KAPPA = 0.5522847498307935; - - function convertCircleToPathData(circle) { - - circle = createElement(circle); - var cx = parseFloat(circle.attr('cx')) || 0; - var cy = parseFloat(circle.attr('cy')) || 0; - var r = parseFloat(circle.attr('r')); - var cd = r * KAPPA; // Control distance. - - var d = [ - 'M', cx, cy - r, // Move to the first point. - 'C', cx + cd, cy - r, cx + r, cy - cd, cx + r, cy, // I. Quadrant. - 'C', cx + r, cy + cd, cx + cd, cy + r, cx, cy + r, // II. Quadrant. - 'C', cx - cd, cy + r, cx - r, cy + cd, cx - r, cy, // III. Quadrant. - 'C', cx - r, cy - cd, cx - cd, cy - r, cx, cy - r, // IV. Quadrant. - 'Z' - ].join(' '); - return d; - } - - function convertEllipseToPathData(ellipse) { - - ellipse = createElement(ellipse); - var cx = parseFloat(ellipse.attr('cx')) || 0; - var cy = parseFloat(ellipse.attr('cy')) || 0; - var rx = parseFloat(ellipse.attr('rx')); - var ry = parseFloat(ellipse.attr('ry')) || rx; - var cdx = rx * KAPPA; // Control distance x. - var cdy = ry * KAPPA; // Control distance y. - - var d = [ - 'M', cx, cy - ry, // Move to the first point. - 'C', cx + cdx, cy - ry, cx + rx, cy - cdy, cx + rx, cy, // I. Quadrant. - 'C', cx + rx, cy + cdy, cx + cdx, cy + ry, cx, cy + ry, // II. Quadrant. - 'C', cx - cdx, cy + ry, cx - rx, cy + cdy, cx - rx, cy, // III. Quadrant. - 'C', cx - rx, cy - cdy, cx - cdx, cy - ry, cx, cy - ry, // IV. Quadrant. - 'Z' - ].join(' '); - return d; - } - - function convertRectToPathData(rect) { - - rect = createElement(rect); - var x = parseFloat(rect.attr('x')) || 0; - var y = parseFloat(rect.attr('y')) || 0; - var width = parseFloat(rect.attr('width')) || 0; - var height = parseFloat(rect.attr('height')) || 0; - var rx = parseFloat(rect.attr('rx')) || 0; - var ry = parseFloat(rect.attr('ry')) || 0; - var bbox = g.rect(x, y, width, height); - - var d; - - if (!rx && !ry) { - - d = [ - 'M', bbox.origin().x, bbox.origin().y, - 'H', bbox.corner().x, - 'V', bbox.corner().y, - 'H', bbox.origin().x, - 'V', bbox.origin().y, - 'Z' - ].join(' '); - - } else { - - var r = x + width; - var b = y + height; - d = [ - 'M', x + rx, y, - 'L', r - rx, y, - 'Q', r, y, r, y + ry, - 'L', r, y + height - ry, - 'Q', r, b, r - rx, b, - 'L', x + rx, b, - 'Q', x, b, x, b - rx, - 'L', x, y + ry, - 'Q', x, y, x + rx, y, - 'Z' - ].join(' '); - } - return d; - } - - // Convert a rectangle to SVG path commands. `r` is an object of the form: - // `{ x: [number], y: [number], width: [number], height: [number], top-ry: [number], top-ry: [number], bottom-rx: [number], bottom-ry: [number] }`, - // where `x, y, width, height` are the usual rectangle attributes and [top-/bottom-]rx/ry allows for - // specifying radius of the rectangle for all its sides (as opposed to the built-in SVG rectangle - // that has only `rx` and `ry` attributes). - function rectToPath(r) { - - var topRx = r.rx || r['top-rx'] || 0; - var bottomRx = r.rx || r['bottom-rx'] || 0; - var topRy = r.ry || r['top-ry'] || 0; - var bottomRy = r.ry || r['bottom-ry'] || 0; - - return [ - 'M', r.x, r.y + topRy, - 'v', r.height - topRy - bottomRy, - 'a', bottomRx, bottomRy, 0, 0, 0, bottomRx, bottomRy, - 'h', r.width - 2 * bottomRx, - 'a', bottomRx, bottomRy, 0, 0, 0, bottomRx, -bottomRy, - 'v', -(r.height - bottomRy - topRy), - 'a', topRx, topRy, 0, 0, 0, -topRx, -topRy, - 'h', -(r.width - 2 * topRx), - 'a', topRx, topRy, 0, 0, 0, -topRx, topRy - ].join(' '); - } - - var V = createElement; - - V.decomposeMatrix = decomposeMatrix; - V.rectToPath = rectToPath; - - var svgDocument = V('svg').node; - - V.createSVGMatrix = function(m) { - - var svgMatrix = svgDocument.createSVGMatrix(); - for (var component in m) { - svgMatrix[component] = m[component]; - } - - return svgMatrix; - }; - - V.createSVGTransform = function() { - - return svgDocument.createSVGTransform(); - }; - - V.createSVGPoint = function(x, y) { - - var p = svgDocument.createSVGPoint(); - p.x = x; - p.y = y; - return p; - }; - - V.transformRect = function(r, matrix) { - - var p = svgDocument.createSVGPoint(); - - p.x = r.x; - p.y = r.y; - var corner1 = p.matrixTransform(matrix); - - p.x = r.x + r.width; - p.y = r.y; - var corner2 = p.matrixTransform(matrix); - - p.x = r.x + r.width; - p.y = r.y + r.height; - var corner3 = p.matrixTransform(matrix); - - p.x = r.x; - p.y = r.y + r.height; - var corner4 = p.matrixTransform(matrix); - - var minX = Math.min(corner1.x, corner2.x, corner3.x, corner4.x); - var maxX = Math.max(corner1.x, corner2.x, corner3.x, corner4.x); - var minY = Math.min(corner1.y, corner2.y, corner3.y, corner4.y); - var maxY = Math.max(corner1.y, corner2.y, corner3.y, corner4.y); - - return { x: minX, y: minY, width: maxX - minX, height: maxY - minY }; - }; - - return V; - -})); diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/action-ref.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/action-ref.tpl.html deleted file mode 100644 index 17f6e2968..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/action-ref.tpl.html +++ /dev/null @@ -1,29 +0,0 @@ -
- -
- -
-
- - -
- - -
- -
- - -
- - -
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/actions.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/actions.tpl.html deleted file mode 100644 index cfc2833b9..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/actions.tpl.html +++ /dev/null @@ -1,50 +0,0 @@ -
-

Actions

- -
- -
-
- - - -
- - -
- -
- - -
- -
-
-
-
- - -
-
- - - - -
-
-
-
- - -
-
- - - - - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/contract-content-static.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/contract-content-static.tpl.html deleted file mode 100644 index d8b37ff94..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/contract-content-static.tpl.html +++ /dev/null @@ -1,106 +0,0 @@ -
-

Contract

- -
- -
- - {{selectedObj.id}} -
- -
- - {{selectedObj.description}} -
- -
- - {{selectedObj.parent}} -
- -
- -
- - -
- - {{clause.name}} -
- -
- - {{subj}} -
-
- - -
- -
- - {{subject.name}} - -
- -
- - - {{provider}} - -
- -
- - - {{consumer}} - -
- -
- -
- - {{rule.name}} - - -
- - -
- - {{classifier.name}} -
- -
- - {{classifier['instance-name']}} -
- -
- - {{classifier.direction}} -
- -
- - {{classifier['connection-tracking']}} -
- -
- - -
-
- - {{action.name}} -
- -
- -
-
- -
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/ep-content-static.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/ep-content-static.tpl.html deleted file mode 100644 index d66656391..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/ep-content-static.tpl.html +++ /dev/null @@ -1,25 +0,0 @@ -
-

Endpoint

- -
-
- - {{selectedObj['endpoint-group']}} -
- -
- - {{selectedObj['network-containment']}} -
- -
- - {{selectedObj['l2-context']}} -
- -
- - {{selectedObj['mac-address']}} -
-
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/epg-content-static.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/epg-content-static.tpl.html deleted file mode 100644 index ae4075db0..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/epg-content-static.tpl.html +++ /dev/null @@ -1,73 +0,0 @@ -
-

Endpoint groups

- -
- -
- - {{selectedObj.id}} -
- -
- - {{selectedObj.name}} -
- -
- - {{selectedObj.description}} -
- -
- - {{selectedObj['intra-group-policy']}} -
- -
- - {{selectedObj['network-domain']}} -
- -
- - {{selectedObj.parent}} -
- -
- - -
- -
- - {{cns.name}} -
- -
- - {{con}} -
- -
-
- -
- - -
- -
- - {{pns.name}} -
- -
- - {{con}} -
- -
-
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/rule-content-static.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/rule-content-static.tpl.html deleted file mode 100644 index 2386bebf9..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/rule-content-static.tpl.html +++ /dev/null @@ -1,38 +0,0 @@ -
-

Rule

- -
-
- - {{selectedObj.name}} - - -
- - -
- - {{classifier.name}} -
- -
- - {{classifier.direction}} -
-
- -
- - - -
- - {{action.name}} -
- -
- -
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/subject-content-static.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/subject-content-static.tpl.html deleted file mode 100644 index 3216f88cf..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/box/subject-content-static.tpl.html +++ /dev/null @@ -1,85 +0,0 @@ -
-

Subject

- -
-
- - {{selectedObj.name}} - -
- -
- -
    -
  • - {{getLabel(provider, 'providerItems')}} -
  • -
-
- -
- -
    -
  • - {{getLabel(consumer, 'consumerItems')}} -
  • -
-
- -
- -

Rules

- -
- -
- - {{rule.name}} - - -
- -
- - {{classifier.name}} -
- -
- - {{classifier['instance-name']}} -
- -
- - {{classifier.direction}} -
-
- - {{classifier['connection-tracking']}} -
- - - -
-
- - {{param['int-value']}} -
-
-
- -
- - - -
- - {{action.name}} -
- -
- -
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/classifier-ref.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/classifier-ref.tpl.html deleted file mode 100644 index 41d9163a5..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/classifier-ref.tpl.html +++ /dev/null @@ -1,41 +0,0 @@ -
- -
- -
-
- - -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/classifiers.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/classifiers.tpl.html deleted file mode 100644 index dc4e91d87..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/classifiers.tpl.html +++ /dev/null @@ -1,54 +0,0 @@ -
-

Classifiers

- -
- -
-
- - - -
- - -
- -
- - -
- -
-
-
-
- - -
-
- - -
- -
-
- -
- -
-
-
-
- - -
-
- - - - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/clause.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/clause.tpl.html deleted file mode 100644 index d3d2af7c9..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/clause.tpl.html +++ /dev/null @@ -1,34 +0,0 @@ -
- -
- -
-
- - -
- - -
- -
- - - -
-
- -
- -
-
- - -
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/cns.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/cns.tpl.html deleted file mode 100644 index 0869522a2..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/cns.tpl.html +++ /dev/null @@ -1,34 +0,0 @@ -
- -
- -
-
- - -
- - -
- -
- - - -
-
- -
- -
-
- - -
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/contracts.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/contracts.tpl.html deleted file mode 100644 index f3f5ac88e..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/contracts.tpl.html +++ /dev/null @@ -1,46 +0,0 @@ -
- -

Contracts

- - -
- -
- - - -
- - -
- -
- - -
- -
- - -
- - -
- -
-
-
- -
-
-
- - - - - -
- - diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/docs.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/docs.tpl.html deleted file mode 100644 index 4b16089ae..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/docs.tpl.html +++ /dev/null @@ -1,5 +0,0 @@ -
-

Docs

- - -
diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/endpoint.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/endpoint.tpl.html deleted file mode 100644 index 5a233c629..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/endpoint.tpl.html +++ /dev/null @@ -1,108 +0,0 @@ -
- -

Endpoint

- -
- -
-
- - -
- - -
- -
- - -
- -
- - - -
-
-
- -
-
- -
-
- -
- - - -
-
-
- -
-
- -
-
- -
- - -
- -
- - -
- -
- - - -
-
-
-
-
-
- - -
- -
- - -
-
- -
-
- - -
-
- - - - - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/epg.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/epg.tpl.html deleted file mode 100644 index 303e92919..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/epg.tpl.html +++ /dev/null @@ -1,64 +0,0 @@ -
-

Endpoint groups

- -
- -
-
- - -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
-
- -
-
-
- -
-
-
- - - - - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/gateway.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/gateway.tpl.html deleted file mode 100644 index cbb96dab3..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/gateway.tpl.html +++ /dev/null @@ -1,25 +0,0 @@ -
- -
- -
-
- - -
- - -
- - -
-
- -
-
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/delivered-policy.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/delivered-policy.tpl.html deleted file mode 100644 index f576bcbfb..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/delivered-policy.tpl.html +++ /dev/null @@ -1,34 +0,0 @@ -
-
- -
- -
-
-
- -
- - -
-
    -
  • consumes
  • -
  • provides
  • -
-
- - -
-
- -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/epg-detail.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/epg-detail.tpl.html deleted file mode 100644 index f15386aaa..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/epg-detail.tpl.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
- -
- -
-
-
- -
- - -
-
- -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/expressed-policy.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/expressed-policy.tpl.html deleted file mode 100644 index f9436285a..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/expressed-policy.tpl.html +++ /dev/null @@ -1,34 +0,0 @@ -
-
- -
- -
-
-
- -
- - -
-
    -
  • consumes
  • -
  • provides
  • -
-
- - -
-
- -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/main.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/main.tpl.html deleted file mode 100644 index 21091d96e..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/main.tpl.html +++ /dev/null @@ -1,58 +0,0 @@ -
-

Health

-
- - -
-
- -
-
- -
- -
- -
- -
- -
-
- -
-
- -
-
- -
-
- - -
- -
- -
- -
- -
- -
-
- -
-
- -
-
- -
-
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/node-structure.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/node-structure.tpl.html deleted file mode 100644 index 389638e4b..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/node-structure.tpl.html +++ /dev/null @@ -1,37 +0,0 @@ -
- -
- - - - -
- -
- -
- -
-
- -
- - - {{ key }} - - {{value}} -
-
- -
-
- -
-
- - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/renderer-configuration.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/renderer-configuration.tpl.html deleted file mode 100644 index 96c5a6be8..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/renderer-configuration.tpl.html +++ /dev/null @@ -1 +0,0 @@ -renderer-configuration \ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/renderer-state.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/renderer-state.tpl.html deleted file mode 100644 index 17ab2a24a..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/renderer-state.tpl.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
-
-
-
-
- diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/subject-detail.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/subject-detail.tpl.html deleted file mode 100644 index 149d5eeb2..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/governance/subject-detail.tpl.html +++ /dev/null @@ -1,25 +0,0 @@ -
-
-
- -
-
-
- -
- - -
-
- -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/index.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/index.tpl.html deleted file mode 100644 index 707af51f9..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/index.tpl.html +++ /dev/null @@ -1,10 +0,0 @@ -
- - -
-
-
- - - - diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/l2l3.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/l2l3.tpl.html deleted file mode 100644 index 648b2f0cd..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/l2l3.tpl.html +++ /dev/null @@ -1,175 +0,0 @@ -
-
- -
-
- - - - -
- - -
- -
- - -
- -
- - -
- - -
-
-
- -

- -
- -
- -
-
- - - -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
-
-
- -

- -
- -
- -
-
- - - -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
-
-
- -

- -
- -
- -
-
- - - -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
-
- -
-
-
- -
- - - -
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/l3-endpoint.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/l3-endpoint.tpl.html deleted file mode 100644 index ff6460931..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/l3-endpoint.tpl.html +++ /dev/null @@ -1,130 +0,0 @@ -
- -

L3 Prefix Endpoint

- -
- -
-
- - -
- - -
- -
- - - -
-
-
- -
-
- -
-
- -
- - - -
-
-
- -
-
- -
-
- -
- - -
- -
- - - -
-
-
-
-
-
- - -
- -
- - -
-
- -
-
- -
- - - -
-
-
-
-
-
- - -
- -
- - -
-
- -
-
- -
- -
- - -
- - -
-
- - - - - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/governance.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/governance.tpl.html deleted file mode 100644 index 317d2fd97..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/governance.tpl.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
- -
- -
- - - - -
-
-
-
- diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/main.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/main.tpl.html deleted file mode 100644 index f9cfa6fb9..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/main.tpl.html +++ /dev/null @@ -1,39 +0,0 @@ -

GBP

- - \ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/policy-renderer.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/policy-renderer.tpl.html deleted file mode 100644 index 4983e0dfe..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/main/policy-renderer.tpl.html +++ /dev/null @@ -1,141 +0,0 @@ -
- -
-
-
- - -
-
-
- {{ 'Subject: ' + subject.name }} -
- -
- -
- Classifier: -
    -
  • {{key}}: {{value}}
  • -
-
-
- Action: -
    -
  • {{key}}: {{value}}
  • -
-
-
-
-
-
-
- - -
-
-
- -
- -
- - - -
-
- -
- - - - -
-
-
-
diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/menu/main-menu.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/menu/main-menu.tpl.html deleted file mode 100644 index 1a86da3d7..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/menu/main-menu.tpl.html +++ /dev/null @@ -1,31 +0,0 @@ - - -
- -
- - - -
- - - - - - - -
- - - - - - - -
- - - - -
- diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/breadcrumbs.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/breadcrumbs.tpl.html deleted file mode 100644 index b4ea0dd8c..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/breadcrumbs.tpl.html +++ /dev/null @@ -1 +0,0 @@ -{{ key !== 'l1' ? ' > ' : ''}}{{value}} \ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/crud-endpoint.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/crud-endpoint.tpl.html deleted file mode 100644 index d3a99343b..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/crud-endpoint.tpl.html +++ /dev/null @@ -1,32 +0,0 @@ -
-
- - - -
- -
-
- - -
- -
- - -
-
- -
- - -
- -
- - - -
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/crud.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/crud.tpl.html deleted file mode 100644 index 141bdd0df..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/crud.tpl.html +++ /dev/null @@ -1,15 +0,0 @@ -
- - -
- -
- -
- - - -
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/param.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/param.tpl.html deleted file mode 100644 index a6862efa9..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/parts/param.tpl.html +++ /dev/null @@ -1,5 +0,0 @@ -
- - - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/pns.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/pns.tpl.html deleted file mode 100644 index 67889bc6a..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/pns.tpl.html +++ /dev/null @@ -1,37 +0,0 @@ -
- -
- -
-
- - -
- - -
- -
- - - - -
- -
- -
- - -
-
- - -
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/prefix.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/prefix.tpl.html deleted file mode 100644 index 2d8ee0352..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/prefix.tpl.html +++ /dev/null @@ -1,21 +0,0 @@ -
- -
- -
-
- - -
- - -
- - -
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/root.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/root.tpl.html deleted file mode 100644 index b07c00c51..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/root.tpl.html +++ /dev/null @@ -1 +0,0 @@ -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/rules.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/rules.tpl.html deleted file mode 100644 index 6bffd4004..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/rules.tpl.html +++ /dev/null @@ -1,36 +0,0 @@ -
- -
- -
-
- - -
- - -
- -
- - -
- - -
-
- -
-
-
- -
-
-
- -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/subjects.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/subjects.tpl.html deleted file mode 100644 index 1973ebe47..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/subjects.tpl.html +++ /dev/null @@ -1,31 +0,0 @@ -
- -
- -
-
- - -
- - -
- -
- - -
- - -
-
- -
-
-
-
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/tenants.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/tenants.tpl.html deleted file mode 100644 index 95228f77e..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/tenants.tpl.html +++ /dev/null @@ -1,38 +0,0 @@ -
- -

Tenants

- - -
- -
-
- - - -
- - -
- -
- - -
- -
- - -
- - -
-
- - - - - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/wizards/accessModelWizard.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/wizards/accessModelWizard.tpl.html deleted file mode 100644 index f007c8f21..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/wizards/accessModelWizard.tpl.html +++ /dev/null @@ -1,400 +0,0 @@ -
- - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/wizards/actionReferenceWizard.tpl.html b/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/wizards/actionReferenceWizard.tpl.html deleted file mode 100644 index 5190c7963..000000000 --- a/groupbasedpolicy-old-ui/module/src/main/resources/gbp-old/views/wizards/actionReferenceWizard.tpl.html +++ /dev/null @@ -1,153 +0,0 @@ -
- - -
\ No newline at end of file diff --git a/groupbasedpolicy-old-ui/pom.xml b/groupbasedpolicy-old-ui/pom.xml deleted file mode 100644 index 9f9ed01a2..000000000 --- a/groupbasedpolicy-old-ui/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - 4.0.0 - - org.opendaylight.groupbasedpolicy - groupbasedpolicy-old-ui - groupbasedpolicy-old-ui - Resources - 0.4.0-SNAPSHOT - pom - - - 3.0 - - - - module - bundle - - - diff --git a/pom.xml b/pom.xml index cbf1f5bbd..ba05e3a48 100644 --- a/pom.xml +++ b/pom.xml @@ -31,9 +31,7 @@ neutron-mapper neutron-vpp-mapper neutron-ovsdb - ui-backend groupbasedpolicy-ui - groupbasedpolicy-old-ui distribution-karaf features sxp-mapper diff --git a/ui-backend/pom.xml b/ui-backend/pom.xml deleted file mode 100644 index 2516e069b..000000000 --- a/ui-backend/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - 4.0.0 - - - org.opendaylight.controller - config-parent - 0.5.0-SNAPSHOT - - - - org.opendaylight.groupbasedpolicy - ui-backend - 0.4.0-SNAPSHOT - bundle - - - - org.opendaylight.groupbasedpolicy - groupbasedpolicy - ${project.version} - - - - - - - - org.apache.felix - maven-bundle-plugin - true - - - - - - ${project.basedir}/META-INF - - - - - \ No newline at end of file diff --git a/ui-backend/src/main/config/default-config.xml b/ui-backend/src/main/config/default-config.xml deleted file mode 100755 index d8d994571..000000000 --- a/ui-backend/src/main/config/default-config.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - binding-impl:ui-backend-impl - - ui-backend-impl - - - - binding:binding-async-data-broker - - binding-data-broker - - - - - binding:binding-rpc-registry - - binding-rpc-broker - - - - - - - - urn:opendaylight:params:xml:ns:yang:controller:config:ui-backend:impl?module=ui-backend-impl&revision=2015-05-11 - - - diff --git a/ui-backend/src/main/java/org/opendaylight/controller/config/yang/config/ui_backend/impl/UiBackendModule.java b/ui-backend/src/main/java/org/opendaylight/controller/config/yang/config/ui_backend/impl/UiBackendModule.java deleted file mode 100644 index a9c45960c..000000000 --- a/ui-backend/src/main/java/org/opendaylight/controller/config/yang/config/ui_backend/impl/UiBackendModule.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.controller.config.yang.config.ui_backend.impl; - -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.groupbasedpolicy.ui.backend.UiBackendServiceImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Preconditions; - -public class UiBackendModule extends org.opendaylight.controller.config.yang.config.ui_backend.impl.AbstractUiBackendModule { - - private static final Logger LOG = LoggerFactory.getLogger(UiBackendModule.class); - - public UiBackendModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } - - public UiBackendModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.config.ui_backend.impl.UiBackendModule oldModule, java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } - - @Override - public void customValidation() { - // add custom validation form module attributes here. - } - - @Override - public java.lang.AutoCloseable createInstance() { - DataBroker dataProvider = Preconditions.checkNotNull(getDataBrokerDependency()); - final UiBackendServiceImpl pgnApplicationService = new UiBackendServiceImpl(dataProvider, - getRpcRegistryDependency()); - LOG.info("ui-backend started."); - - return new AutoCloseable() { - - @Override - public void close() throws Exception { - pgnApplicationService.close(); - } - }; - } - -} diff --git a/ui-backend/src/main/java/org/opendaylight/controller/config/yang/config/ui_backend/impl/UiBackendModuleFactory.java b/ui-backend/src/main/java/org/opendaylight/controller/config/yang/config/ui_backend/impl/UiBackendModuleFactory.java deleted file mode 100644 index e9c5ba22a..000000000 --- a/ui-backend/src/main/java/org/opendaylight/controller/config/yang/config/ui_backend/impl/UiBackendModuleFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -/* -* Generated file -* -* Generated from: yang module name: ui-backend-impl yang module local name: ui-backend-impl -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Mon May 11 01:23:43 CEST 2015 -* -* Do not modify this file unless it is present under src/main directory -*/ -package org.opendaylight.controller.config.yang.config.ui_backend.impl; -public class UiBackendModuleFactory extends org.opendaylight.controller.config.yang.config.ui_backend.impl.AbstractUiBackendModuleFactory { - -} diff --git a/ui-backend/src/main/java/org/opendaylight/groupbasedpolicy/ui/backend/UiBackendServiceImpl.java b/ui-backend/src/main/java/org/opendaylight/groupbasedpolicy/ui/backend/UiBackendServiceImpl.java deleted file mode 100755 index 50164c9ec..000000000 --- a/ui-backend/src/main/java/org/opendaylight/groupbasedpolicy/ui/backend/UiBackendServiceImpl.java +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.groupbasedpolicy.ui.backend; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Future; - -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; -import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; -import org.opendaylight.groupbasedpolicy.dto.EgKey; -import org.opendaylight.groupbasedpolicy.dto.IndexedTenant; -import org.opendaylight.groupbasedpolicy.dto.Policy; -import org.opendaylight.groupbasedpolicy.dto.RuleGroup; -import org.opendaylight.groupbasedpolicy.util.PolicyResolverUtils; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Tenants; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.GetEndpointsFromEndpointGroupInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.GetEndpointsFromEndpointGroupOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.GetEndpointsFromEndpointGroupOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.GetSubjectsBetweenEndpointGroupsInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.GetSubjectsBetweenEndpointGroupsOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.GetSubjectsBetweenEndpointGroupsOutputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.UiBackendService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.endpoints.from.endpoint.group.output.UiEndpoint; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.endpoints.from.endpoint.group.output.UiEndpointBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.subjects.between.endpoint.groups.input.FromOperData; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.subjects.between.endpoint.groups.output.EndpointGroupPairWithSubject; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.subjects.between.endpoint.groups.output.EndpointGroupPairWithSubjectBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.subjects.between.endpoint.groups.output.endpoint.group.pair.with.subject.UiSubject; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.subjects.between.endpoint.groups.output.endpoint.group.pair.with.subject.UiSubjectBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.subjects.between.endpoint.groups.output.endpoint.group.pair.with.subject.ui.subject.UiRule; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ui.backend.rev150511.get.subjects.between.endpoint.groups.output.endpoint.group.pair.with.subject.ui.subject.UiRuleBuilder; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Table; -import com.google.common.collect.Table.Cell; -import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.Futures; - -public class UiBackendServiceImpl implements UiBackendService, AutoCloseable { - - private static final Logger LOG = LoggerFactory.getLogger(UiBackendServiceImpl.class); - - private final DataBroker dataProvider; - private final BindingAwareBroker.RpcRegistration rpcRegistration; - private final InstanceIdentifier ENDPOINTS_IID = InstanceIdentifier.builder(Endpoints.class).build(); - - public UiBackendServiceImpl(DataBroker dataBroker, RpcProviderRegistry rpcRegistry) { - Preconditions.checkNotNull(dataBroker); - Preconditions.checkNotNull(rpcRegistry); - this.dataProvider = dataBroker; - rpcRegistration = rpcRegistry.addRpcImplementation(UiBackendService.class, this); - } - - @Override - public Future> getEndpointsFromEndpointGroup( - GetEndpointsFromEndpointGroupInput input) { - LOG.trace("getEndpointsFromEndpointGroup: {}", input); - final TenantId tenantId = input.getTenantId(); - if (tenantId == null) { - throw new IllegalArgumentException("Missing tenant-Id in RPC input."); - } - final EndpointGroupId epgId = input.getEndpointGroupId(); - if (epgId == null) { - throw new IllegalArgumentException("Missing endpoint-group-id in RPC input."); - } - ReadOnlyTransaction rTx = dataProvider.newReadOnlyTransaction(); - CheckedFuture, ReadFailedException> futureEndpoints = rTx.read( - LogicalDatastoreType.OPERATIONAL, ENDPOINTS_IID); - return Futures.transform(futureEndpoints, - new Function, RpcResult>() { - - @Override - public RpcResult apply(Optional potentialEndpoints) { - GetEndpointsFromEndpointGroupOutputBuilder outputBuilder = new GetEndpointsFromEndpointGroupOutputBuilder(); - if (!potentialEndpoints.isPresent() || potentialEndpoints.get().getEndpoint() == null) { - LOG.trace("No endpoint in datastore."); - return RpcResultBuilder.success(outputBuilder.build()).build(); - } - - List endpoints = potentialEndpoints.get().getEndpoint(); - List uiEndpoints = new ArrayList<>(); - for (Endpoint ep : endpoints) { - if (tenantId.equals(ep.getTenant()) && isEpInEpg(ep, epgId)) { - uiEndpoints.add(new UiEndpointBuilder(ep).build()); - } - } - outputBuilder.setUiEndpoint(uiEndpoints); - return RpcResultBuilder.success(outputBuilder.build()).build(); - } - }); - } - - private boolean isEpInEpg(Endpoint ep, EndpointGroupId epgId) { - if (epgId.equals(ep.getEndpointGroup())) { - return true; - } - if (ep.getEndpointGroups() != null) { - for (EndpointGroupId epgFromEp : ep.getEndpointGroups()) { - if (epgId.equals(epgFromEp)) { - return true; - } - } - } - return false; - } - - @Override - public Future> getSubjectsBetweenEndpointGroups( - GetSubjectsBetweenEndpointGroupsInput input) { - LOG.trace("getSubjectsBetweenEndpointGroups: {}", input); - final TenantId tenantId = input.getTenantId(); - if (tenantId == null) { - throw new IllegalArgumentException("Missing tenant-Id in RPC input."); - } - final FromOperData fromOperData = input.getFromOperData(); - InstanceIdentifier tenantIid = InstanceIdentifier.builder(Tenants.class) - .child(Tenant.class, new TenantKey(tenantId)) - .build(); - CheckedFuture, ReadFailedException> futureTenant; - try (ReadOnlyTransaction rTx = dataProvider.newReadOnlyTransaction()) { - if (fromOperData == null) { - futureTenant = rTx.read(LogicalDatastoreType.CONFIGURATION, tenantIid); - } else { - futureTenant = rTx.read(LogicalDatastoreType.OPERATIONAL, tenantIid); - } - } - return Futures.transform(futureTenant, - new Function, RpcResult>() { - - @Override - public RpcResult apply(Optional potentialTenant) { - GetSubjectsBetweenEndpointGroupsOutputBuilder outputBuilder = new GetSubjectsBetweenEndpointGroupsOutputBuilder(); - if (!potentialTenant.isPresent()) { - LOG.trace( - "No tenant with id {} in {} datastore", - tenantId.getValue(), - fromOperData == null ? LogicalDatastoreType.CONFIGURATION : LogicalDatastoreType.OPERATIONAL); - return RpcResultBuilder.success(outputBuilder.build()).build(); - } - - Tenant tenant = potentialTenant.get(); - Table resolvedPolicy = PolicyResolverUtils.resolvePolicy(ImmutableSet.of(new IndexedTenant( - tenant))); - List epgPairsWithSubjects = new ArrayList<>(); - for (Cell policyByConsProvEpg : resolvedPolicy.cellSet()) { - Policy policy = policyByConsProvEpg.getValue(); - List subjects = getUniqueSortedSubjects(policy); - List uiSubjects = new ArrayList<>(); - for (RuleGroup subject : subjects) { - UiSubject uiSubject = new UiSubjectBuilder().setName(subject.getRelatedSubject()) - .setOrder(subject.getOrder()) - .setUiRule(getUiRules(subject.getRules())) - .build(); - uiSubjects.add(uiSubject); - } - EgKey consEgKey = policyByConsProvEpg.getRowKey(); - EgKey provEgKey = policyByConsProvEpg.getColumnKey(); - LOG.trace( - "Resolved policies from {} datastore: \nConsumer EPG: {}\nProvider EPG: {}\nPolicy: {}", - fromOperData == null ? LogicalDatastoreType.CONFIGURATION : LogicalDatastoreType.OPERATIONAL, - consEgKey, provEgKey, policy); - EndpointGroupPairWithSubject epgPairWithSubject = new EndpointGroupPairWithSubjectBuilder().setConsumerEndpointGroupId( - consEgKey.getEgId()) - .setConsumerTenantId(consEgKey.getTenantId()) - .setProviderEndpointGroupId(provEgKey.getEgId()) - .setProviderTenantId(provEgKey.getTenantId()) - .setUiSubject(uiSubjects) - .build(); - epgPairsWithSubjects.add(epgPairWithSubject); - } - GetSubjectsBetweenEndpointGroupsOutput result = outputBuilder.setEndpointGroupPairWithSubject( - epgPairsWithSubjects).build(); - return RpcResultBuilder.success(result).build(); - } - }); - } - - private List getUniqueSortedSubjects(Policy policy) { - Set uniqueSubjects = new HashSet<>(); - for (List subjects : policy.getRuleMap().values()) { - for (RuleGroup subject : subjects) { - uniqueSubjects.add(subject); - } - } - ArrayList sortedSubjects = new ArrayList<>(uniqueSubjects); - Collections.sort(sortedSubjects); - return sortedSubjects; - } - - private List getUiRules(List rules) { - if (rules == null) { - return Collections.emptyList(); - } - List uiRules = new ArrayList<>(); - for (Rule rule : rules) { - UiRule uiRule = new UiRuleBuilder().setName(rule.getName()) - .setOrder(rule.getOrder()) - .setClassifierRef(rule.getClassifierRef()) - .setActionRef(rule.getActionRef()) - .build(); - uiRules.add(uiRule); - } - return uiRules; - } - - /** - * @see java.lang.AutoCloseable#close() - */ - @Override - public void close() throws Exception { - rpcRegistration.close(); - } - -} diff --git a/ui-backend/src/main/yang/ui-backend-impl.yang b/ui-backend/src/main/yang/ui-backend-impl.yang deleted file mode 100644 index bd3f9cc45..000000000 --- a/ui-backend/src/main/yang/ui-backend-impl.yang +++ /dev/null @@ -1,52 +0,0 @@ -module ui-backend-impl { - - yang-version 1; - namespace "urn:opendaylight:params:xml:ns:yang:controller:config:ui-backend:impl"; - prefix "ui-backend-impl"; - - import config { prefix config; revision-date 2013-04-05; } - import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; } - - description - "This module contains the base YANG definitions for - ui-backend implementation."; - - revision "2015-05-11" { - description - "Initial revision."; - } - - // This is the definition of the service implementation as a module identity. - identity ui-backend-impl { - base config:module-type; - - // Specifies the prefix for generated java classes. - config:java-name-prefix UiBackend; - } - - // Augments the 'configuration' choice node under modules/module. - augment "/config:modules/config:module/config:configuration" { - case ui-backend-impl { - when "/config:modules/config:module/config:type = 'ui-backend-impl'"; - - container data-broker { - uses config:service-ref { - refine type { - mandatory true; - config:required-identity mdsal:binding-async-data-broker; - } - } - } - - container rpc-registry { - uses config:service-ref { - refine type { - mandatory true; - config:required-identity mdsal:binding-rpc-registry; - } - } - } - - } - } -} \ No newline at end of file diff --git a/ui-backend/src/main/yang/ui-backend.yang b/ui-backend/src/main/yang/ui-backend.yang deleted file mode 100755 index 128c78f99..000000000 --- a/ui-backend/src/main/yang/ui-backend.yang +++ /dev/null @@ -1,105 +0,0 @@ -module ui-backend { - namespace "urn:opendaylight:params:xml:ns:yang:controller:config:ui-backend"; - prefix "ui-backend"; - - import policy {prefix gbp-policy;} - import gbp-common {prefix gbp-common;} - import endpoint {prefix endpoint;} - - description - "Module contains RPC definitions for more easier interaction of the GUI with the GBP APIs."; - - revision "2015-05-11" { - description "Initial revision of ui-backend model"; - } - - grouping endpoint-group-identifier-fields { - leaf tenant-id { - type gbp-common:tenant-id; - } - leaf endpoint-group-id { - type gbp-common:endpoint-group-id; - } - } - - grouping consumer-endpoint-group-ref { - leaf consumer-tenant-id { - type leafref { - path "/gbp-policy:tenants/gbp-policy:tenant/gbp-policy:id"; - } - } - leaf consumer-endpoint-group-id { - type leafref { - path "/gbp-policy:tenants/gbp-policy:tenant/gbp-policy:policy/gbp-policy:endpoint-group/gbp-policy:id"; - } - } - } - - grouping provider-endpoint-group-ref { - leaf provider-tenant-id { - type leafref { - path "/gbp-policy:tenants/gbp-policy:tenant/gbp-policy:id"; - } - } - leaf provider-endpoint-group-id { - type leafref { - path "/gbp-policy:tenants/gbp-policy:tenant/gbp-policy:policy/gbp-policy:endpoint-group/gbp-policy:id"; - } - } - } - - rpc get-endpoints-from-endpoint-group { - description "Returns endpoints which are in the given endpoint group."; - input { - uses endpoint-group-identifier-fields; - } - output { - list ui-endpoint { - description - "Endpoints indexed by layer 2 addreses."; - key "l2-context mac-address"; - uses endpoint:endpoint-fields; - } - } - } - - rpc get-subjects-between-endpoint-groups { - description "Returns subjects between endpoint group pairs where endpoint groups are from the given tenant."; - input { - leaf tenant-id { - description "Tenant ID of the tenant."; - type gbp-common:tenant-id; - mandatory true; - } - container from-oper-data { - presence "Resolve subjects for endpoint gorup pairs based on operational data."; - } - } - output { - list endpoint-group-pair-with-subject { - key "consumer-endpoint-group-id consumer-tenant-id provider-endpoint-group-id provider-tenant-id"; - uses consumer-endpoint-group-ref; - uses provider-endpoint-group-ref; - list ui-subject { - key "name"; - leaf name { - description "A name for the subject"; - type gbp-common:subject-name; - } - list ui-rule { - key "name"; - leaf name { - description "A name for the rule"; - type gbp-common:rule-name; - } - uses gbp-policy:has-classifier-refs; - uses gbp-policy:has-action-refs; - uses gbp-policy:has-order; - } - uses gbp-policy:has-order; - } - } - } - } - -}