BUG3685, BUG3686 48/22448/1
authorDaniel Malachovsky <dmalacho@cisco.com>
Fri, 12 Jun 2015 08:40:48 +0000 (10:40 +0200)
committerDaniel Malachovsky <dmalacho@cisco.com>
Fri, 12 Jun 2015 08:43:19 +0000 (08:43 +0000)
- sticky tenant
- action reference wizard fired from contract in expressed policy

Change-Id: I858a2645dd59f044ca85b1461157f046a78480bf
Signed-off-by: Daniel Malachovsky <dmalacho@cisco.com>
groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.controller.js
groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.less
groupbasedpolicy-ui/module/src/main/resources/gbp/gbp.services.js
groupbasedpolicy-ui/module/src/main/resources/gbp/views/box/contract-content-static.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/views/index.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/views/main/governance.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/views/main/policy-renderer.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/views/wizards/accessModelWizard.tpl.html
groupbasedpolicy-ui/module/src/main/resources/gbp/views/wizards/actionReferenceWizard.tpl.html [new file with mode: 0644]

index aa12d60a1d8db56a0ec9b5644ac288507fdcdd9f..d4cce73d348088c298499e0f3ba984931d99a025 100755 (executable)
@@ -44,6 +44,11 @@ define(modules, function(gbp) {
                                   'l2' : null,\r
                                   'l3' : null};\r
 \r
+            $scope.wizards = {\r
+                accessModelWizard: false,\r
+                actionReferenceWizard: false\r
+            };\r
+\r
             $scope.setBreadcrumb = function(level, label, visible){\r
                 $scope.breadcrumbs[level] = visible ? label : null;\r
                 if(level === 'l1'){\r
@@ -98,12 +103,14 @@ define(modules, function(gbp) {
 \r
             // TENANTS\r
             $scope.tenantList = [];\r
+            $scope.selectedTenant = null;\r
             $scope.tenantDisplayLabel = ['name' , 'id'];\r
 \r
             $scope.loadTenants = function() {\r
                 GBPTenantServices.load(\r
                     function(tenants) {\r
                         $scope.tenantList = tenants;\r
+                        console.log('$scope.tenantList', $scope.tenantList);\r
                     },\r
                     function(){\r
                         //TODO error\r
@@ -112,6 +119,11 @@ define(modules, function(gbp) {
                 DesignGbpFactory.setMainClass();\r
             };\r
 \r
+            $scope.setTenant = function(selectedTenant) {\r
+                $scope.selectedTenant = selectedTenant;\r
+                $scope.$broadcast('GBP_TENANT_RELOAD', $scope.selectedTenant);\r
+            };\r
+\r
             $scope.loadTenants();\r
 \r
             $scope.$on('GBP_GLOBAL_TENANT_RELOAD',function(){\r
@@ -122,6 +134,31 @@ define(modules, function(gbp) {
                 $scope.$broadcast(eventName, val);\r
             };\r
 \r
+\r
+            // TODO: rework, use $scope.setViewContent or something\r
+            $scope.showWizard = function(wizardName, broadcast, broadcastedData, path) {\r
+                $scope.wizards[wizardName] = true;\r
+\r
+                if ( broadcast ) {\r
+                    $scope.sendReloadEventFromRoot(broadcast, {data: broadcastedData, path: path});\r
+                }\r
+            };\r
+\r
+            $scope.closeWizard = function(wizardName) {\r
+                $scope.wizards[wizardName] = false;\r
+            };\r
+\r
+            $scope.updateList = function(list, object, key) {\r
+                var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);\r
+\r
+                if(elementPos < 0) {\r
+                    list.push(object);\r
+                }\r
+                else {\r
+                    list[elementPos] = object;\r
+                }\r
+            };\r
+\r
     }]);\r
 \r
     gbp.register.controller('governanceCtrl', ['$rootScope','$scope',\r
@@ -129,7 +166,7 @@ define(modules, function(gbp) {
             $scope.menuTpl = 'main-menu';\r
             $scope.menuBox = null;\r
             $scope.contentTpl = 'main';\r
-            $scope.selectedTenant = null;\r
+            // $scope.selectedTenant = null;\r
             $scope.rendererList = [];\r
             var broadcastObj = {};\r
 \r
@@ -146,10 +183,7 @@ define(modules, function(gbp) {
                 }\r
             };\r
 \r
-            $scope.setTenant = function(selectedTenant) {\r
-                $scope.selectedTenant = selectedTenant;\r
-                $scope.$broadcast('GBP_TENANT_RELOAD');\r
-            };\r
+            \r
 \r
             $scope.setViewContent = function(tplName, data, broadcast, tplType) {\r
 \r
@@ -191,10 +225,14 @@ define(modules, function(gbp) {
             $scope.$on('GOV_INIT', function(){\r
                 $scope.menuTpl = 'main-menu';\r
                 $scope.contentTpl = 'main';\r
-                $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');\r
+                // $scope.$emit('GBP_GLOBAL_TENANT_RELOAD');\r
                 $scope.menuBox = null;\r
             });\r
 \r
+            $scope.$on('GBP_TENANT_RELOAD', function(e, obj){\r
+                $scope.selectedTenant = obj;\r
+            });\r
+\r
 \r
     }]);\r
 \r
@@ -338,34 +376,42 @@ define(modules, function(gbp) {
 \r
                     JointGraphFactory.reloadGraph(paper.model);\r
 \r
-                    $scope.selectedTenant.contract.forEach(function(c, i) {\r
-                        var label = c.description ? $scope.sliceLabel(c.description) : c.id,\r
-                            width = JointGraphFactory.getLabelLength(label.length);\r
-                            item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.contract, c, 'Click to see contract info', GBPConstants.colors.graph['subject'], 'Contract');\r
+                    if ( $scope.selectedTenant && $scope.selectedTenant.contract ) {\r
+\r
+                        $scope.selectedTenant.contract.forEach(function(c, i) {\r
+                            var label = c.description ? $scope.sliceLabel(c.description) : c.id,\r
+                                width = JointGraphFactory.getLabelLength(label.length);\r
+                                item = JointGraphFactory.createElement(label, offsetObj.w, offsetObj.h, width, null, GBPConstants.objType.contract, c, 'Click to see contract info', GBPConstants.colors.graph['subject'], 'Contract');\r
 \r
-                        itemsArray.contract.push(item);\r
+                            itemsArray.contract.push(item);\r
 \r
-                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
-                        JointGraphFactory.addItem(paper.model, item);\r
-                        contractItems[c.id] = item;\r
-                    });\r
+                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
+                            JointGraphFactory.addItem(paper.model, item);\r
+                            contractItems[c.id] = item;\r
+                        });\r
 \r
-                    offsetHobj.contract = offsetObj.h;\r
+                        offsetHobj.contract = offsetObj.h;\r
 \r
-                    JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h > 400 ? offsetObj.h : 400);\r
-                    $scope.selectedTenant['endpoint-group'].forEach(function(e, i) {\r
-                        var label = e.name || e.id,\r
-                            width = JointGraphFactory.getLabelLength(label.length);\r
-                            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');\r
+                    }\r
 \r
-                        itemsArray.epg.push(item);\r
+                    if ( $scope.selectedTenant && $scope.selectedTenant['endpoint-group'] ) {\r
 \r
-                        JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
-                        JointGraphFactory.addItem(paper.model, item);\r
-                        epgItems[e.id] = item;\r
+                        JointGraphOffsetFactory.resetOffsets(offsetObj, offsetObj.ow, offsetObj.h > 400 ? offsetObj.h : 400);\r
+                        $scope.selectedTenant['endpoint-group'].forEach(function(e, i) {\r
+                            var label = e.name || e.id,\r
+                                width = JointGraphFactory.getLabelLength(label.length);\r
+                                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');\r
 \r
-                        createEpgLinks(e, item, contractItems);\r
-                    });\r
+                            itemsArray.epg.push(item);\r
+\r
+                            JointGraphOffsetFactory.updateOffsets(JointGraphOffsetFactory.createWHObj(width), offsetObj, marginObj, JointGraphOffsetFactory.createWHObj(paper.options.width, paper.options.height), paper);\r
+                            JointGraphFactory.addItem(paper.model, item);\r
+                            epgItems[e.id] = item;\r
+\r
+                            createEpgLinks(e, item, contractItems);\r
+                        });\r
+                        \r
+                    }\r
 \r
                     offsetHobj.epg = JointGraphOffsetFactory.getCurrentOffset(itemsArray.contract, 'y');\r
                     JointGraphOffsetFactory.checkObjsHoffsets(itemsArray.epg ,offsetHobj.epg, paper);\r
@@ -675,7 +721,7 @@ define(modules, function(gbp) {
             loadData();\r
     }]);\r
 \r
- gbp.register.controller('epgDetailCtrl', ['$scope', 'JointGraphFactory', 'TopologyDataLoaders', 'GBPEpgServices', 'JointGraphOffsetFactory', 'GBPConstants',\r
   gbp.register.controller('epgDetailCtrl', ['$scope', 'JointGraphFactory', 'TopologyDataLoaders', 'GBPEpgServices', 'JointGraphOffsetFactory', 'GBPConstants',\r
         function ($scope, JointGraphFactory, TopologyDataLoaders, GBPEpgServices, JointGraphOffsetFactory, GBPConstants) {\r
             var paper = JointGraphFactory.createGraph(),\r
                 epgItem = {},\r
@@ -792,11 +838,8 @@ define(modules, function(gbp) {
                 button: false\r
             };\r
 \r
-            $scope.wizards = {\r
-                accessModelWizard: false\r
-            };\r
 \r
-            $scope.selectedTenant = null;\r
+            // $scope.selectedTenant = null;\r
 \r
             $scope.mandatoryProperties = [];\r
             $scope.loadTopology = function(type, args) {\r
@@ -853,8 +896,7 @@ define(modules, function(gbp) {
                 }\r
             };\r
 \r
-            $scope.setTenant = function() {\r
-                $scope.$broadcast('GBP_TENANT_RELOAD');\r
+            $scope.loadTopo = function() {\r
                 if($scope.selectedTenant) {\r
                     $scope.loadTopology($scope.topologyType, { tenantId: $scope.selectedTenant.id });\r
                 }\r
@@ -887,16 +929,11 @@ define(modules, function(gbp) {
             $scope.validateForm = function(form) {\r
                 return form.$valid;\r
             };\r
+          \r
+            $scope.$on('GBP_TENANT_RELOAD', function(e, obj){\r
+                $scope.selectedTenant = obj;\r
+            });\r
 \r
-            $scope.showWizard = function(wizardName) {\r
-                $scope.wizards[wizardName] = true;\r
-            };\r
-\r
-            $scope.closeWizard = function(wizardName) {\r
-                $scope.wizards[wizardName] = false;\r
-            };\r
-\r
-            \r
     }]);\r
 \r
     gbp.register.controller('topoDataCtrl',['$scope', 'TopoServices',  function($scope, TopoServices){\r
@@ -3013,6 +3050,10 @@ define(modules, function(gbp) {
             //console.info($scope.parameter, ' got GBP_SET_PARAM_VALUE', name, intVal, strVal, event);\r
             \r
         });\r
+\r
+        $scope.$on('GBP_RESET_PARAM', function(event){\r
+            $scope.value = null;\r
+        });\r
     }]);\r
 \r
     gbp.register.controller('classifiersCtrl', ['$scope', 'GBPClassifierInstanceServices', 'GPBServices', '$filter',\r
@@ -3844,20 +3885,20 @@ define(modules, function(gbp) {
             });\r
         };\r
 \r
-        $scope.updateList = function(list, object, key) {\r
-            var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);\r
+        // $scope.updateList = function(list, object, key) {\r
+        //     var elementPos = list.map(function(x) {return x[key]; }).indexOf(object[key]);\r
 \r
-            if(elementPos < 0) {\r
-                list.push(object);\r
-            }\r
-            else {\r
-                list[elementPos] = object;\r
-            }\r
-        };\r
+        //     if(elementPos < 0) {\r
+        //         list.push(object);\r
+        //     }\r
+        //     else {\r
+        //         list[elementPos] = object;\r
+        //     }\r
+        // };\r
     }]);\r
 \r
     gbp.register.controller('wizardTenantCtrl', ['$scope', '$filter', 'GBPTenantServices', function($scope, $filter, GBPTenantServices){ \r
-        $scope.tenantList = [];\r
+        // $scope.tenantList = [];\r
         $scope.newTenantObj = GBPTenantServices.createObj();\r
         $scope.displayLabel = ['name' , 'id'];\r
 \r
@@ -3865,21 +3906,21 @@ define(modules, function(gbp) {
             tenantEdit: false\r
         };\r
 \r
-        $scope.init = function() {\r
-            $scope.getTenants();\r
-        };\r
+        // $scope.init = function() {\r
+        //     $scope.getTenants();\r
+        // };\r
 \r
-        $scope.getTenants = function() {\r
-            GBPTenantServices.load(\r
-                function(data) {\r
-                    $scope.tenantList = data;\r
-                    $scope.newTenantObj = GBPTenantServices.createObj();\r
-                },\r
-                function(){\r
-                    //TODO error\r
-                }\r
-            );\r
-        };\r
+        // $scope.getTenants = function() {\r
+        //     GBPTenantServices.load(\r
+        //         function(data) {\r
+        //             $scope.tenantList = data;\r
+        //             $scope.newTenantObj = GBPTenantServices.createObj();\r
+        //         },\r
+        //         function(){\r
+        //             //TODO error\r
+        //         }\r
+        //     );\r
+        // };\r
 \r
         $scope.reloadTenants = function(selectedObject) {\r
             if(!selectedObject) {\r
@@ -4777,7 +4818,6 @@ define(modules, function(gbp) {
         });\r
     }]);\r
 \r
-\r
     gbp.register.controller('rendererStateCtrl', ['$scope', 'GPBServices', function($scope, GPBServices){\r
         $scope.data = {'subject-feature-definitions' : {}};\r
         $scope.view_path = 'src/app/gbp/views/governance';\r
@@ -4839,6 +4879,168 @@ define(modules, function(gbp) {
             return result[type];\r
         };\r
     }]);\r
+\r
+    gbp.register.controller('actionReferenceWizardCtrl', ['$scope', '$filter', 'GBPRuleServices', 'GBPActionInstanceServices', function($scope, $filter, GBPRuleServices, GBPActionInstanceServices){ \r
+        $scope.wizardPage = null;\r
+        $scope.path = {};\r
+        $scope.rule = {};\r
+\r
+        $scope.actionInstanceNames = {'options' : [], 'labels' : "name"};\r
+\r
+        var actionInstanceNamesLoad = function() {\r
+            var actionInstancePath = GBPActionInstanceServices.createPathObj($scope.selectedTenant.id);\r
+            GBPActionInstanceServices.load(actionInstancePath, function(data){\r
+                $scope.actionInstanceNames.options = data;\r
+            },function(){\r
+                //TODO: error cbk\r
+            });\r
+        };\r
+\r
+        $scope.init = function() {\r
+            $scope.setPage('reference');\r
+        };\r
+\r
+        $scope.setPage = function(pageName, object) {\r
+            $scope.wizardPage = pageName;\r
+        };\r
+\r
+        $scope.submit = function() {\r
+            //if($scope.validateForm($scope.actionsForm)){\r
+                $scope.actionInstanceNames.options.forEach(function(i) {\r
+                    path = GBPActionInstanceServices.createPathObj($scope.path.tenantId, i.name);\r
+                //saveParams();\r
+\r
+                    GBPActionInstanceServices.send(path, i, function(data){\r
+                    $scope.sendReloadEventFromRoot('GBP_ACTION_INSTANCE_RELOAD');\r
+                    }, function(){\r
+                        //TODO: error cbk\r
+                    });\r
+                });\r
+                \r
+            //}\r
+\r
+            //if($scope.validateForm($scope.rulesForm)){\r
+                path = GBPRuleServices.createPathObj($scope.path.tenantId, $scope.path.contractId, $scope.path.subjectId, $scope.path.ruleId);\r
+                GBPRuleServices.send(path, $scope.rule, function(data){\r
+\r
+                    $scope.wizards.actionReferenceWizard = false;\r
+                    \r
+                    //$scope.sendReloadEventFromRoot('GBP_TENANT_RELOAD');\r
+                }, function(){\r
+                    //TODO: error cbk\r
+                });\r
+            //}\r
+            //$scope.\r
+        };\r
+\r
+        $scope.$on('ACTION_RULE_WIZARD_LOAD', function(event, data){\r
+            $scope.rule = angular.copy(data.data);\r
+            $scope.path = data.path;\r
+        });\r
+\r
+        $scope.$on('WIZARD_ACTIONREF_ADD', function(event, data){\r
+            if(!$scope.rule['action-ref']) {\r
+                $scope.rule['action-ref'] = [];\r
+            }\r
+            $scope.updateList($scope.rule['action-ref'], data, "name");\r
+        });\r
+\r
+        $scope.$on('WIZARD_ACTIONREF_DELETE', function(event, data){\r
+            $scope.rule['action-ref'].splice(data, 1);\r
+        });\r
+\r
+        $scope.$on('WIZARD_ACTIONINSTANCE_ADD', function(event, data){\r
+            $scope.updateList($scope.actionInstanceNames.options, data, "name");\r
+\r
+            $scope.setPage('reference');\r
+        });\r
+\r
+        $scope.$on('GBP_TENANT_RELOAD',function(){\r
+            actionInstanceNamesLoad();\r
+        });\r
+\r
+    }]);\r
+\r
+    gbp.register.controller('actionsRefListCtrl', ['$scope', '$filter', function($scope, $filter){ \r
+        \r
+        $scope.actionReferenceForm = false;\r
+\r
+        $scope.showForm = function(object) {\r
+            $scope.actionReferenceForm = true;\r
+            $scope.newActionRefObj = object || null;\r
+        };\r
+\r
+        $scope.closeForm = function() {\r
+            $scope.actionReferenceForm = false;\r
+        };\r
+\r
+        $scope.save = function(){\r
+            $scope.$emit('WIZARD_ACTIONREF_ADD', $scope.newActionRefObj);\r
+            $scope.resetObject();\r
+        };\r
+\r
+        $scope.deleteElemAt = function(index) {\r
+            $scope.$emit('WIZARD_ACTIONREF_DELETE', index);\r
+            $scope.resetObject();\r
+        };\r
+\r
+        $scope.resetObject = function() {\r
+            $scope.newActionRefObj = null;\r
+        };\r
+\r
+        \r
+\r
+    }]);\r
+\r
+    gbp.register.controller('actionInstanceWizardCtrl', ['$scope', '$filter', 'GPBServices', 'GBPActionInstanceServices', function($scope, $filter, GPBServices, GBPActionInstanceServices){ \r
+        $scope.actionDefinitions = {'options' : [], 'labels' : "name"};\r
+        $scope.newActionObj = GBPActionInstanceServices.createObj();\r
+\r
+        var loadDefinitions = function() {\r
+            GPBServices.getDefinitions(function(classifierDefs, actionDefs) {\r
+                $scope.actionDefinitions.options = actionDefs;\r
+                //$scope.getDisplayLabelsFromCtrl('GBP_ACTIONS_LABEL', $scope.actionDefinitions);\r
+            });\r
+        };\r
+\r
+        $scope.reloadDefs = function(){\r
+            $scope.defs = angular.copy($scope.getDefinitionObjParams($scope.newActionObj['action-definition-id']));\r
+\r
+            //TODO: rework\r
+            if($scope.defs.length && $scope.defs[0].name === 'sfc-chain-name') {\r
+                GPBServices.getServiceFunctionChains(function(data) {\r
+                    $scope.serviceFunctionChains = data;\r
+                });\r
+            }\r
+        };\r
+\r
+        $scope.getDefinitionObjParams = function(id){\r
+            return GPBServices.getDefinitionObjParams($scope.actionDefinitions.options, id);\r
+        };\r
+\r
+        $scope.save = function(){\r
+            $scope.newActionObj['parameter-value'] = [];\r
+            $scope.$broadcast('GBP_SAVE_PARAM');\r
+            $scope.$emit('WIZARD_ACTIONINSTANCE_ADD', $scope.newActionObj);\r
+            $scope.resetObject();\r
+        };\r
+\r
+        $scope.resetObject = function() {\r
+            $scope.newActionObj = GBPActionInstanceServices.createObj();\r
+        };\r
+\r
+        $scope.saveParam = function() {\r
+            \r
+        };\r
+\r
+        $scope.addParam = function(name, type, value) {\r
+            $scope.newActionObj['parameter-value'].push(GPBServices.createParamObj(name, type, value));\r
+        };\r
+\r
+        loadDefinitions();\r
+\r
+    }]);\r
+\r
 });\r
 \r
 \r
index e46266aa2666f32135660ca00e3ea07d88cf5406..8b7041729a33d467d51c8679d24a7e4610b025c9 100755 (executable)
       padding: 0 50px 0 20px;\r
       height: 580px;\r
     }\r
+\r
     .bottom-navigation {\r
       height: 50px;\r
       bottom: 0;\r
index 11bc0882e1f184df067fe651fe1b14506f9e224b..22a1410cb657df0b021bf0124168e8293f38359a 100755 (executable)
@@ -472,6 +472,20 @@ define(['app/gbp/gbp.module', 'app/gbp/js/joint.clean.build'], function(gbp, joi
             });\r
         };\r
 \r
+        s.getServiceFunctionChains = function(successCbk, errorCbk) {\r
+            var restObj = GBPRestangular.one('restconf').one('config').one('service-function-chain:service-function-chains');\r
+\r
+            restObj.get().then(function(data) {\r
+                if(data['service-function-chains']) {\r
+                    successCbk(data['service-function-chains']['service-function-chain']);\r
+                } else {\r
+                    //TODO log error\r
+                }\r
+            }, function(res) {\r
+                // errorCbk(res);\r
+            });\r
+        };\r
+\r
         s.getUUIDnumber = function() {\r
             var d = new Date().getTime();\r
             return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r
index b8d9ec17bef0eb73603733b2b6d7d0444f2ebb31..d8b37ff94dd8998103c60e9d16a17d84d2515684 100644 (file)
                     
                 </section>
 
+                <label class="block mb0"><span>Action ref</span> <button class="btn btn-primary" ng-click="showWizard('actionReferenceWizard', 'ACTION_RULE_WIZARD_LOAD', rule, {tenantId: selectedTenant.id, contractId: selectedObj.id, subjectId: subject.name, ruleId: rule.name})">Manage</button></label>
                 <section class="mb10" ng-show="rule['action-ref']" ng-repeat="action in rule['action-ref'] track by $index">
-
-                        <label class="block mb0"><span>Action ref</span></label>
-
                         <div class="rowWrapper">
                             <label class="basicLabel mb0">Name:</label>
                             <span>{{action.name}}</span>
index f30f17c26544d572f92caed37cdc26dba3946d17..d52f902b7a3e7348595f871b37e8b188af966b48 100755 (executable)
@@ -3,7 +3,6 @@
     <section class="mainNavigationWrapper" ng-show="mainView.main" ng-include src="view_path+'main/main.tpl.html'"></section>\r
     <section ng-show="mainView.governance" ng-include src="view_path+'main/governance.tpl.html'"></section>\r
     <section ng-show="mainView['policy-renderer']" ng-include src="view_path+'main/policy-renderer.tpl.html'"></section>\r
-\r
 </section>\r
 \r
 \r
index ee18b13b6dc6bdb8fdd01359d7879a912c8753b3..825a049545122a56d1ca2035a5ef3b48d9b5ecbd 100755 (executable)
@@ -14,5 +14,9 @@
             <section class="mb50" ng-if="menuBox" ng-include src="view_path + 'box/' + menuBox + '.tpl.html'" onload="broadcastCalling('menuBox')"></section>\r
         </section>\r
     </aside>\r
+\r
+    <section ng-show="wizards.actionReferenceWizard">\r
+        <div ng-include src="view_path+'wizards/actionReferenceWizard.tpl.html'"></div>\r
+    </section>\r
 </section>\r
 \r
index cdc89ca2d8a5bfdcb991e6dad126045e053c6647..8181f0223be23fba41a17f317cdf5bc470da551e 100755 (executable)
@@ -72,7 +72,7 @@
                 <div class="rowWrapper clearfix">\r
                     <label class="block"><span>Tenants list</span></label>\r
                     <div class="selectWrapper col-md-12">\r
-                        <select class="form-control" ng-model="selectedTenant" ng-change="setTenant()" ng-options="getDisplayLabel(d, tenantDisplayLabel) for d in tenantList">\r
+                        <select class="form-control" ng-model="selectedTenant" ng-change="setTenant(selectedTenant);loadTopo();" ng-options="getDisplayLabel(d, tenantDisplayLabel) for d in tenantList">\r
                             <option value="">Select option</option>\r
                         </select>\r
                     </div>\r
index 86c0fe5db1b18925883793bfcec71748a5398bc7..f007c8f2111c4d88354d909f6c7fba1b1cd98300 100755 (executable)
@@ -1,4 +1,4 @@
-<div ng-controller="accessModelWizardCtrl" ng-init="init()">
+<div ng-controller="accessModelWizardCtrl">
     <div class="modal-canvas"></div>
     <div class="modal-dialog">
         <div class="modal-header">
diff --git a/groupbasedpolicy-ui/module/src/main/resources/gbp/views/wizards/actionReferenceWizard.tpl.html b/groupbasedpolicy-ui/module/src/main/resources/gbp/views/wizards/actionReferenceWizard.tpl.html
new file mode 100644 (file)
index 0000000..5190c79
--- /dev/null
@@ -0,0 +1,153 @@
+<div ng-controller="actionReferenceWizardCtrl" ng-init="init()">
+    <div class="modal-canvas"></div>
+    <div class="modal-dialog">
+        <div class="modal-header">
+            <i class="icon-remove align-right padding" ng-click="closeWizard('actionReferenceWizard')"></i>
+            <h2>Action reference wizard</h2>
+        </div>
+        <aside class="modal-navigation">
+            <ul>
+                <li class="navigation-item {{wizardPage === 'reference' ? 'selected' : ''}}">References</li>
+                <li class="navigation-item {{wizardPage === 'instance' ? 'selected' : ''}}">Instances</li>
+            </ul>
+        </aside>
+        <section class="modal-content-container">
+            <div ng-show="wizardPage === 'reference'" ng-controller="actionsRefListCtrl">
+                <div class="content">
+                    <label class="basicLabel mb0">Action references list:</label>
+                    <table class="table table-hover">
+                        <thead>
+                            <tr>
+                              <th>Order</th>
+                              <th>Name</th>
+                              <th><button class="btn btn-primary" tooltip="Add Action reference" ng-click="showForm()"><i class="icon-plus"></i></button></th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                                <tr ng-repeat="action in rule['action-ref'] track by $index | orderBy:'order'">
+                                  <th>{{action.order}}</th>
+                                  <td>{{action.name}}</td>
+                                  <td>
+                                    <button class="btn btn-primary" ng-click="showForm(action)" tooltil="Edit Action reference" >
+                                        <i class="icon-pencil"></i>
+                                    </button>
+                                    <button class="btn btn-danger" ng-click="deleteElemAt($index)" tooltip="Remove Action reference">
+                                        <i class="icon-remove"></i>
+                                    </button>
+                                  </td>
+                                </tr>
+                        </tbody>
+                    </table>
+                    <div ng-show="actionReferenceForm">
+                        <form name="actionRefForm" novalidate="novalidate">
+                            <i class="icon-remove align-right padding" ng-click="closeForm()"></i>
+                            <div class="rowWrapper">
+                                <label class="block basicLabel"><span>Instance name:</span>
+                                    <i class="icon-exclamation-sign red" tooltip="Required field" ng-show="actionRefForm.name.$error.required"></i>
+                                </label>
+                                <select class="form-control" ng-model="newActionRefObj.name" ng-options="c.name as getDisplayLabel(c, actionInstanceNames.labels) for c in actionInstanceNames.options" name="name" ng-required="true" >
+                                    <option>--</option>
+                                </select>
+                                <button class="btn btn-primary" tooltip="Add Action instance" ng-click="setPage('instance')"><i class="icon-plus"></i></button>
+                            </div>
+
+                            <div class="rowWrapper" ng-hide="internalView.edit === 'view' && !newActionRefObj['order']">
+                                <label class="block basicLabel"><span>Order:</span>
+                                    <i class="icon-exclamation-sign red" tooltip="Invalid pattern" ng-show="errors.int32"></i>
+                                </label>
+                                <input class="form-control" type="text" ng-model="newActionRefObj.order" ng-change="validate(newActionRefObj.order, errors)"/>
+                            </div>
+
+                            <div class="rowWrapper">
+                                <button ng-click="save()" class="btn btn-primary col-md-12" ng-disabled="!actionRefForm.$valid">Save</button>
+                            </div>
+                        </form>
+                    </div>
+
+                </div>
+                <div class="bottom-navigation clearfix">
+                    <button class="btn btn-primary" ng-click="submit()">Submit</button>
+                </div>
+            </div>
+
+            <div ng-show="wizardPage === 'instance'" ng-controller="actionInstanceWizardCtrl" ng-init="init()">
+                <div class="content">
+                    <section class="formWrapper clearfix">
+                        <form name="actionsForm" novalidate="novalidate">
+                            <label class="block">Add actions</label>
+
+                            <div class="rowWrapper">
+                                <label class="block basicLabel">Name
+                                    <i class="icon-exclamation-sign red" tooltip="{{actionsForm.name.$error.required ? 'Required field' : actionsForm.name.$error.pattern ? 'Value must start with letter followed by letters and digits without space' : ''}}" ng-show="actionsForm.name.$error.required || actionsForm.name.$error.pattern"></i>
+                                </label>
+                                <input class="form-control" type="text" name="name" ng-required="true" ng-model="newActionObj.name" ng-pattern="/^[a-zA-Z]([a-zA-Z0-9\-_.])*$/"/>
+                            </div>
+
+                            <div class="rowWrapper" ng-hide="edit === 'view' && !newActionObj['action-definition-id']">
+                                <label class="block basicLabel">Definition</label>
+                                <select class="form-control" ng-model="newActionObj['action-definition-id']" ng-options="d.id as getDisplayLabel(d, actionDefinitions.labels) for d in actionDefinitions.options" ng-change="reloadDefs()">
+                                    <option value="">Select option</option>
+                                </select>
+                            </div>
+
+                            <div class="rowWrapper">
+                                <div ng-repeat="param in defs">
+                                    <div class="row-param" ng-controller="paramCtrl" ng-init="init(param, newActionObj['parameter-value'])">
+                                        <div ng-show="param.type !== 'range' && param.name !== 'sfc-chain-name'">
+                                            <label class="block basicLabel">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>
+                                            <input class="form-control" type="text" ng-model="value" ng-disabled="edit === 'view'"></input>
+                                        </div>
+                                        <div ng-show="param.name === 'sfc-chain-name'">
+                                            <label class="block basicLabel">Pick SFC:</label>
+                                            <input class="form-control" type="text" ng-model="value" disabled></input>
+                                            <table class="table table-hover">
+                                                <thead>
+                                                    <tr>
+                                                      <th>Symmetric</th>
+                                                      <th>Name</th>
+                                                      <th>Functions</th>
+                                                      <th>Action</th>
+                                                    </tr>
+                                                    </thead>
+                                                    <tbody>
+                                                        <tr ng-repeat="chain in serviceFunctionChains">
+                                                            <th>{{chain.symmetric}}</th>
+                                                            <td>{{chain.name}}</td>
+                                                            <td>
+                                                                <ul>
+                                                                    <li ng-repeat="function in chain['sfc-service-function']">
+                                                                        {{function.name + ' - ' + function.type}}
+                                                                    </li>
+                                                                </ul>
+                                                            </td>
+                                                            <td>
+                                                                <button class="btn btn-primary" ng-click="$parent.value = chain.name" ng-disabled="value === chain.name">
+                                                                    {{value === chain.name ? 'picked' : 'pick'}}
+                                                                </button>
+                                                            </td>
+                                                        </tr>
+                                                </tbody>
+                                            </table>
+                                        </div>
+                                        <div ng-show="param.type === 'range'">
+                                            <label class="param-label">{{ parameter.name + ' (' + parameter.type + ')' }}:</label>
+
+                                            <input class="form-control narrow-input-left" type="text" ng-model="value.min" ng-disabled="edit === 'view'"></input>
+                                            <input class="form-control narrow-input-right" type="text" ng-model="value.max" ng-disabled="edit === 'view'"></input>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <button class="btn btn-primary col-md-12" ng-click="save()" ng-hide="edit === 'view'" ng-disabled="!actionsForm.$valid">Save</button>
+                        </form>
+                    </section>
+                </div>
+
+                 <div class="bottom-navigation clearfix">
+                    <button class="btn btn-primary" ng-click="setPage('reference')">Back</button>
+                </div>
+            </div>
+        </section>
+    </div>
+</div>
\ No newline at end of file