Add Static Routing dialog to set/remove L3 Subnets 26/52826/1
authorElisha Oren <elisha.oren@hpe.com>
Mon, 23 Jan 2017 14:30:38 +0000 (16:30 +0200)
committerElisha Oren <elisha.oren@hpe.com>
Sun, 5 Mar 2017 12:23:15 +0000 (14:23 +0200)
+ few small fixes

Change-Id: Ifcc9bd0214aae705855f461d6c19e4d825f9c753
Signed-off-by: Elisha Oren <elisha.oren@hpe.com>
dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/AddEvc.tpl.html
dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/EditVlans.tpl.html [deleted file]
dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/StaticRouting.tpl.html [new file with mode: 0644]
dlux/cpeui/cpeui-module/src/main/resources/cpeui/services/cpeui.dialogs.js
dlux/cpeui/cpeui-module/src/main/resources/cpeui/services/cpeui.services.js
dlux/cpeui/cpeui-module/src/main/resources/cpeui/static/cpeui-custom.css
dlux/cpeui/cpeui-module/src/main/resources/cpeui/tenant.controller.js
dlux/cpeui/cpeui-module/src/main/resources/cpeui/tenant.tpl.html
dlux/cpeui/cpeui-module/src/main/resources/cpeui/tenantsTable.tpl.html

index 5620cd09177c19ec02bc387f2df95b4b31992e3c..9c0392497b69ac804acb132f7414edd32234b332 100644 (file)
 
 <div layout="column" ng-cloak>
   <md-content layout-padding>
-      <md-input-container class="md-block">
+      <md-input-container class="md-block" ng-init="initObj(params.svc)">
         <label>EVC Name</label>
-        <input type="text" required name="svcName" ng-model="obj.svc_name">
+        <input type="text" required name="svcName" ng-model="obj.name">
         <div ng-messages="projectForm.svcName.$error">
               <div ng-message="required">Name is required!</div>
         </div>
       </md-input-container>
       <md-input-container class="md-block">
         <label>Service Type</label>
-        <md-select required ng-model="obj.svc_type" name="svc_type" >
+        <md-select required ng-model="obj['svc-type']" name="svc_type" >
                <md-option ng-repeat="typ in params.svcTypes" value="{{ typ }}">{{ typ }}</md-option>
         </md-select>
         <div ng-messages="projectForm.svc_type.$error">
               <div ng-message="required">This is required!</div>
         </div>
       </md-input-container>
-      <md-input-container class="md-block">
+      
+     <md-input-container class="md-block">
+        <label>Segmentation ID</label>
+        <input type="number" step="1" name="segmentation_id" ng-model="obj.evc['segmentation-id']">
+      </md-input-container>
+      <!-- //////////////////////////// 
+      <md-input-container class="md-block" ng-init="item=params.svc">
+        <div>Service UNIs 
+        <button><i class="icon-plus"></i></button>
+        </div>
+      <table class="footable table table-striped inner-table" ng-if="!isEmpty(item.device2unis)" ng-init="expandFlags.L2[item['svc-id']] = true">
+                                <thead ng-if="!expandFlags.L2[item['svc-id']]">
+                                    <tr>
+                                        <th class="minimal-width"><i ng-click="expandFlags.L2[item['svc-id']] = true" class="expand-btn icon-caret-right"></i> Show UNIs</th>
+                                    </tr>
+                                </thead>
+                                <thead ng-if-start="expandFlags.L2[item['svc-id']]">
+                                    <tr>
+                                        <th class="minimal-width"><i ng-click="expandFlags.L2[item['svc-id']] = false" class="expand-btn icon-caret-down"></i> Device </th>
+                                        <th class="minimal-width">Port</th>
+                                        <th class="minimal-width">VLANs <span style="font-size:small;color:inherit;"> (click to edit)</span></th>
+                                        <th class="minimal-width" ng-if="item.isTree" >Role</th>
+                                        <th>Bandwidth Profile</th>
+                                        <th class="minimal-width"></th>
+                                    </tr>
+                                </thead>
+                                <tbody ng-if-end>
+                                    <tr ng-repeat-start="(ce, unis) in item.device2unis | orderBy : ce ">
+                                        <td class="minimal-width" rowspan="{{unis.length}}">{{ cesDisplayNames[ce] }}</td>
+                                        <td class="minimal-width" ng-repeat-start="uni in unis | orderBy: sortUni | limitTo :1">{{ uni.prettyID }}</td>
+                                        <td class="clickable" ng-click="!item.evc['preserve-ce-vlan-id'] ? editVlanDialog.show($event, {svcid:item['svc-id'], uniid:uni['uni-id'], vlans:uni.vlans}) : 0">
+                                        {{ uni.vlans.join(', ') }} {{item.evc['preserve-ce-vlan-id'] ? '(Preserved)' : ''}}
+                                        </td>
+                                        <td class="minimal-width" ng-if="item.isTree">{{ uni['role'] }}</td>
+                                        <td >{{ uni['ingress-bw-profile'] }}</td>
+                                        <td ng-repeat-end class="minimal-width" style="white-space: nowrap;">
+                                        <button class="btn btn-md btn-danger" ng-click="deleteEvcUni(item['svc-id'], uni['uni-id'])"> <i class="icon-trash"></i> </button>
+                                        </td>
+                                    </tr>
+                                    <tr ng-repeat-end ng-repeat="uni in unis | orderBy: sortUni | limitTo :(unis.length-1) :1">
+                                        <td>{{ uni.prettyID }}</td>
+                                        <td ng-if="item.isTree">{{ uni['role'] }}</td>
+                                        <td class="clickable" ng-click="!item.evc['preserve-ce-vlan-id'] ? editVlanDialog.show($event, {svcid:item['svc-id'], uniid:uni['uni-id'], vlans:uni.vlans}) : 0">
+                                        {{ uni.vlans.join(', ') }} {{item.evc['preserve-ce-vlan-id'] ? '(Preserved)' : ''}}
+                                        </td>
+                                        <td class="minimal-width">{{ uni['ingress-bw-profile'] }}</td>
+                                            <td class="minimal-width" style="white-space: nowrap;">
+                                            <button class="btn btn-md btn-danger" ng-click="deleteEvcUni(item['svc-id'], uni['uni-id'])">
+                                                <i class="icon-trash"></i>
+                                            </button>
+                                        </td>
+                                    </tr>
+                                </tbody>
+                            </table>
+        </md-input-container>
+       //////////////////////////// -->
+     <a ng-init="advancedCollapsed=true" ng-click="advancedCollapsed = !advancedCollapsed" class="btn btn-navbar btn-info">{{advancedCollapsed ? 'Show' : 'Hide'}} Advanced Options</a>
+      <md-input-container class="md-block" ng-if-start="!advancedCollapsed">
         <label>Maximum Number of UNIs</label>
         <input type="number" step="1" name="max_uni" ng-model="obj.max_uni">
       </md-input-container>
 
-     <a ng-init="advancedCollapsed=true" ng-click="advancedCollapsed = !advancedCollapsed" class="btn btn-navbar btn-info">{{advancedCollapsed ? 'Show' : 'Hide'}} Advanced Options</a>
-     <md-input-container class="md-block" ng-if-start="!advancedCollapsed">
-        <label>Segmentation ID</label>
-        <input type="number" step="1" name="segmentation_id" ng-model="obj.segmentation_id">
-      </md-input-container>
       <md-input-container class="md-block">
         <label>Subnet</label>
-        <input type="text" name="subnet" ng-model="obj.subnet" ng-pattern="/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:[1-2]?[0-9]|3[0-2])\b/">
+        <input type="text" name="subnet" ng-model="obj.evc.subnet" ng-pattern="/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:[1-2]?[0-9]|3[0-2])\b/">
         <div ng-messages="projectForm.subnet.$error">
               <div ng-message="pattern">IP/Mask is required! (ex. 127.0.0.1/32)</div>
         </div>
               <!--
                   <md-switch name="is_preserve_vlan" ng-model="obj.is_preserve_vlan">{{obj.is_preserve_vlan ? "" : "Do Not"}} Preserve VLAN</md-switch>
                -->
-                   <md-checkbox name="is_preserve_vlan" ng-model="obj.is_preserve_vlan">Preserve VLAN</md-checkbox>
+                   <md-checkbox name="is_preserve_vlan" ng-model="obj.evc['preserve-ce-vlan-id']">Preserve VLAN</md-checkbox>
               </md-input-container>
-              <md-input-container class="md-block" ng-if="obj.is_preserve_vlan" flex-gt-sm style="margin-bottom: 0px;">
+              <md-input-container class="md-block" ng-if="obj.evc['preserve-ce-vlan-id']" flex-gt-sm style="margin-bottom: 0px;">
                   <label>Preserved VLAN</label>
-                  <input required type="number" step="1" name="p_vlan" ng-model="obj.preserved_vlan">
+                  <input required type="number" step="1" name="p_vlan" ng-model="obj.evc['preserved-vlan']">
                   <div ng-messages="projectForm.p_vlan.$error">
                       <div ng-message="required">Number is required!</div>
                 </div>
               </md-input-container>
           </div>
-          <md-input-container class="md-block" ng-init="obj.mac_timeout = 300">
+          <md-input-container class="md-block">
             <label>Learned MAC Expiration Time (seconds)</label>
-            <input type="number" step="1" name="mac_timeout" min="0" ng-model="obj.mac_timeout">
+            <input type="number" step="1" name="mac_timeout" min="0" ng-model="obj.evc['mac-timeout']">
             <div ng-messages="projectForm.mac_timeout.$error">
                   <div ng-message="min">Number must be positive</div>
             </div>
           </md-input-container>
-          <md-input-container class="md-block" ng-init="obj.mtu_size = 1522">
+          <md-input-container class="md-block">
             <label>EVC MTU size</label>
-            <input type="number" step="1" name="mtu" min="1522" max="16384" ng-model="obj.mtu_size">
+            <input type="number" step="1" name="mtu" min="1522" max="16384" ng-model="obj.evc['max-svc-frame-size']">
             <div ng-messages="projectForm.mtu.$error">
                   <div ng-message="min">Number must be in range [1522..16384]</div>
                   <div ng-message="max">Number must be in range [1522..16384]</div>
           </md-input-container>
           <md-input-container class="md-block">
               <label>Unicast Service Frame Delivery</label>
-              <md-select ng-model="obj.unicast" name="unicast">
+              <md-select ng-model="obj.evc['unicast-svc-frm-delivery']" name="unicast">
                    <md-option value="{{ undefined }}"></md-option>
                    <md-option value="discard">Discard</md-option>
                    <md-option value="unconditional">Unconditional</md-option>
           </md-input-container>
           <md-input-container class="md-block" ng-if-end>
               <label>Multicast Service Frame Delivery</label>
-              <md-select ng-model="obj.multicast" name="multicast">
+              <md-select ng-model="obj.evc['multicast-svc-frm-delivery']" name="multicast">
                    <md-option value="{{ undefined }}"></md-option>
                    <md-option value="discard">Discard</md-option>
                    <md-option value="unconditional">Unconditional</md-option>
diff --git a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/EditVlans.tpl.html b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/EditVlans.tpl.html
deleted file mode 100644 (file)
index b246ec5..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<md-dialog class="cpe-dialog" aria-label="Update vlans" ng-cloak>
-<md-toolbar>
-<div class="md-toolbar-tools">
-       <h2>VLANs</h2>
-       <span flex></span>
-       <md-button class="md-icon-button" aria-label="Close dialog"
-               ng-click="cancel()"> <i class="icon-remove-sign"></i> </md-button>
-</div>
-</md-toolbar> <md-dialog-content>
-
-<div ng-controller="AppCtrl" layout="column" ng-cloak
-       ng-init="obj.role = 'root'">
-       <md-content layout-padding>
-       <table class="inner-table table table-striped">
-               <thead>
-               </thead>
-               <tbody id="l2_table">
-                       <tr ng-repeat="vlan in params.vlans | orderBy">
-                               <td>{{ vlan }}</td>
-                               <td class="minimal-width"><button class="btn btn-md btn-danger"
-                                               ng-click="deleteVlan(params.svcid, params.uniid, vlan, params.vlans)">
-                                               <i class="icon-trash"></i>
-                                       </button></td>
-                       </tr>
-                       <tr>
-                               <td><input id="vlan_input" type="number" name="vlan" ng-model="obj.vlan"></td>
-                               <td class="minimal-width"><button class="btn btn-md btn-info"
-                                               ng-click="addVlan(params.svcid, params.uniid, obj.vlan, params.vlans)">
-                                               <i class="icon-plus"></i> ADD</button>
-                                               </td>
-                       </tr>
-               </tbody>
-       </table>
-       </md-content>
-</div>
-
-</md-dialog-content>
-<md-dialog-actions layout="row">
-      <span flex></span>
-      <md-button ng-click="cancel()">Close</md-button>
-    </md-dialog-actions>
- </md-dialog>
\ No newline at end of file
diff --git a/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/StaticRouting.tpl.html b/dlux/cpeui/cpeui-module/src/main/resources/cpeui/dialogs/StaticRouting.tpl.html
new file mode 100644 (file)
index 0000000..9e39874
--- /dev/null
@@ -0,0 +1,86 @@
+<md-dialog class="cpe-dialog" ng-cloak>
+    <md-toolbar>
+      <div class="md-toolbar-tools">
+        <h2>Intranet</h2>
+        <span flex></span>
+        <md-button class="md-icon-button" aria-label="Close dialog" ng-click="cancel()">
+        <i class="icon-remove-sign"></i>
+        </md-button>
+      </div>
+    </md-toolbar>
+    <md-dialog-content>
+    <div layout="column" ng-cloak>
+        <md-content layout-padding>
+            <div>Static Routes</div>
+            <form name="projectForm" novalidate ng-submit="add(obj)">
+              <table class="footable table table-striped inner-table">
+                      <thead>
+                          <tr>
+                              <th>Network</th>
+                              <th>Gateway</th>
+                              <th>Device</th>
+                              <th>Port</th>
+                              <th>VLAN</th>
+                              <th class="minimal-width"></th>
+                          </tr>
+                      </thead>
+                      <tbody ng-repeat="u in params.ipvc.ipvc.unis.uni" ng-if="u.subnets">
+                          <tr ng-repeat="subnet in u.subnets">
+                              <td>{{subnet.subnet}}</td>
+                              <td>{{subnet.gateway}}</td>
+                              <td> {{u.deviceName}} </td>
+                              <td> {{u.prettyID}}</td>
+                              <td>{{u.vlan}}</td>
+                              <td class="minimal-width" style="white-space: nowrap;">
+                              <button type="button" class="btn btn-md btn-danger" ng-click="removeSubnet(u,subnet)"> <i class="icon-trash"></i> </button>
+                              </td>
+                          </tr>
+                      </tbody>
+                      <tbody>
+                          <tr>
+                              <td>
+                                <md-input-container>
+                                    <input type="text" required name="network" ng-model="obj.network" ng-pattern="/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:[1-2]?[0-9]|3[0-2])\b/" />
+                                    <div ng-messages="projectForm.network.$error">
+                                          <div ng-message="required">Network is required!</div>
+                                          <div ng-message="pattern">IP/Mask is required! (ex. 127.0.0.1/32)</div>
+                                    </div>
+                                 </md-input-container>
+                              </td>
+                              <td>
+                                <md-input-container class="">
+                                    <label>Gateway</label>
+                                    <input type="text" required name="gateway" ng-model="obj.gateway" ng-pattern="/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/" />
+                                    <div ng-messages="projectForm.gateway.$error">
+                                          <div ng-message="required">Gateway is required!</div>
+                                          <div ng-message="pattern">IP is required! (ex. 224.224.224.1)</div>
+                                    </div>
+                                  </md-input-container>
+                              </td>
+                              <td colspan="3">
+                                     <md-input-container style="width:100%">
+                                                               <label>Device, Port, vlan</label>
+                                                               <md-select required name="selectedUni" ng-model="obj.selectedUni">
+                                                                <md-option ng-value="u" ng-repeat="u in params.ipvc.ipvc.unis.uni">{{u.deviceName}}, {{u.prettyID}} {{u.vlan ? 'vlan:'+u.vlan : ''}}</md-option>
+                                                               </md-select>
+                                                               <div ng-messages="projectForm.device.$error">
+                                                                     <div ng-message="required">This is required!</div>
+                                                               </div>
+                                                             </md-input-container>
+                               </td>
+                              <td class="minimal-width" style="white-space: nowrap;">
+                              <button class="btn btn-md btn-info" type="submit">Add</button>
+                              </td>
+                          </tr>
+                      </tbody>
+                  </table>
+             </form>
+        </md-content>
+      </div>
+    </md-dialog-content>
+    <md-dialog-actions layout="row">
+      <span flex></span>
+      <md-button ng-click="cancel()">Cancel</md-button>
+      <md-button type="button" ng-click="done(obj)">Save Changes</md-button>
+    </md-dialog-actions>
+</md-dialog>
index 6d4a45561b07b03becd985ec11f4d86e59a66c42..efe3bd1b8d8109ac95d5f05886dd4db605ea4647 100644 (file)
@@ -26,7 +26,7 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) {
         };
 
         if (customController != undefined) {
-          customController($scope, $mdDialog, params);
+          customController($scope, $mdDialog, params, CpeuiSvc);
         }
 
       };
@@ -37,7 +37,7 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) {
           templateUrl : 'src/app/cpeui/dialogs/' + tpl + '.tpl.html',
           parent : angular.element(document.body),
           targetEvent : ev,
-          clickOutsideToClose : true,
+          clickOutsideToClose : false,
           fullscreen : this.customFullscreen,
           locals : {
             params : params
index 8b14c5946b5b0269415f1d8560dff102405f69f6..a75b98d12ef9420ccb9290ea96ad62a338b40902 100644 (file)
@@ -367,20 +367,36 @@ define(['app/cpeui/cpeui.module'],function(cpeui) {
           method:'GET',
           url : "/restconf/config/mef-interfaces:mef-interfaces/subnets/"
       }).then(function successCallback(response) {
-          var raw_subnets = response.data["subnets"]["subnet"];
-          var subnets ={}
-          raw_subnets.forEach(function(sub){
-            if (subnets[sub["uni-id"]] == undefined) {
-              subnets[sub["uni-id"]] = {};
-            }
-            if (subnets[sub["uni-id"]][sub["ip-uni-id"]] == undefined) {
-              subnets[sub["uni-id"]][sub["ip-uni-id"]] = [];
-            }
-            subnets[sub["uni-id"]][sub["ip-uni-id"]].push(sub);
-          });
+          var subnets = response.data["subnets"]["subnet"];
+          if (!subnets) {
+              subnets = [];
+          }
           if (callback != undefined) {
               callback(subnets);
           }
+      }, function errorCallback(response) {
+          if (response.status == 404) {
+              callback([]);
+          } else {
+              console.log(response);
+          }
+      });
+  };
+
+  svc.setAllSubnets = function(subnets, callback) {
+      var data = {
+              subnets:{
+                  subnet:subnets
+              }
+          };
+      $http({
+          method:'PUT',
+          url : "/restconf/config/mef-interfaces:mef-interfaces/subnets/",
+          data:data
+      }).then(function(response){
+          if (callback != undefined) {
+              callback();
+          }
       }, function errorCallback(response) {
           console.log(response);
       });
@@ -459,40 +475,57 @@ define(['app/cpeui/cpeui.module'],function(cpeui) {
     svc.addEvc = function(evc, evc_type, tenant, callback) {
             var uni_json = getJsonUnis(evc.unis);
 //            preserved-vlan
-            var evcId = CpeUiUtils.randomId();
+            if (evc['svc-id']) {
+                var evcId = evc['svc-id'];
+            } else {
+                var evcId = CpeUiUtils.randomId();
+            }
+            var unis = [];
+            if (!evc.evc) {
+                evc.evc = {};
+            }
+            if (evc.evc.unis && evc.evc.unis.uni){
+                evc.evc.unis.uni.forEach(function(u){
+                    unis.push({
+                        "uni-id": u["uni-id"],
+                        "admin-state-enabled": u["admin-state-enabled"],
+                        "role": u["role"],
+                        "evc-uni-ce-vlans":u["evc-uni-ce-vlans"],
+                        "ingress-bw-profile":u["ingress-bw-profile"],
+                    });
+                });
+            }
             var data = {
               "mef-service" :  {
                 "svc-id" : evcId,
-                "name" : evc.svc_name,
-                "svc-type" : evc.svc_type,
+                "name" : evc['name'],
+                "svc-type" : evc['svc-type'],
                 "tenant-id" : tenant,
                 "evc" : {
                   "evc-id" : evcId,
                   "evc-type" : evc_type,
-                  "preserve-ce-vlan-id" : evc.is_preserve_vlan,
-                  "max-svc-frame-size" : evc.mtu_size,
-                  "unicast-svc-frm-delivery" : evc.unicast,
-                  "multicast-svc-frm-delivery" : evc.multicast,
-                  "mac-timeout":evc.mac_timeout,
-                  "unis" : {
-                    "uni" : uni_json
-                  },
+                  "preserve-ce-vlan-id" : evc.evc['preserve-ce-vlan-id'],
+                  "max-svc-frame-size" : evc.evc['max-svc-frame-size'],
+                  "unicast-svc-frm-delivery" : evc.evc['unicast-svc-frm-delivery'],
+                  "multicast-svc-frm-delivery" : evc.evc['multicast-svc-frm-delivery'],
+                  "mac-timeout":evc.evc['mac-timeout'],
+                  "unis" : {"uni":unis},
                   "admin-state-enabled" : true
                 }
               }
             };
-            if (evc.is_preserve_vlan) {
-              data["mef-service"]["evc"]["preserved-vlan"] = evc.preserved_vlan;
+            if (evc.evc['preserve-ce-vlan-id']) {
+              data["mef-service"]["evc"]["preserved-vlan"] = evc.evc['preserved-vlan']
             }
-            if (evc.subnet) {
-              data["mef-service"]["evc"].subnet = evc.subnet;
+            if (evc.evc.subnet) {
+              data["mef-service"]["evc"].subnet = evc.evc.subnet;
             }
-            if (evc.segmentation_id) {
-              data["mef-service"]["evc"]["segmentation-id"] = evc.segmentation_id;
+            if (evc.evc['segmentation-id']) {
+              data["mef-service"]["evc"]["segmentation-id"] = evc.evc['segmentation-id'];
             }
             $http({
-                method:'POST',
-                url:"/restconf/config/mef-services:mef-services/",
+                method:'PUT',
+                url:"/restconf/config/mef-services:mef-services/mef-service/"+evcId,
                 data:data
             }).then(function successCallback(response) {
                 if (callback != undefined) {
@@ -500,6 +533,7 @@ define(['app/cpeui/cpeui.module'],function(cpeui) {
                 }
             });
         };
+
         svc.getServices = function(tenantid, callback) {
             var evcs;
             $http({
index de9e0ae8b4614bff41e292898f51aef64bca1896..a1b945d60475273ca3246e86474cd6aa00a29ac7 100644 (file)
@@ -116,6 +116,7 @@ MD-TOOLBAR:active {
        border: 1px solid;
        margin-top: 0;
        margin-bottom: 0;
+       padding: 0 !important;
 }
 .clickable {
        cursor: pointer;
index 8fd8a3c71190782e9cc76169574ce82bd2fbe831..0af1d1019c6c0ab33df0eaa3a123bd259488e324 100644 (file)
@@ -22,7 +22,6 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) {
         "inventory" : 0,
         "L2" : 1,
         "L3" : 2,
-        "unis" : 6,
       }
     if ($stateParams.tenantTabName in tabIndexs) {
       $scope.tab.tenantData = tabIndexs[$stateParams.tenantTabName];
@@ -101,12 +100,14 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) {
             } else {
                 if (uni["ip-uni-id"]) {
                     var ipuni = $scope.unis.filterByField('uni-id',uni['uni-id'])[0];
-                    ipuni["ip-unis"]["ip-uni"].forEach(function(ipu){
-                        if (ipu['ip-uni-id'] == uni["ip-uni-id"]){
-                            var vlan = ipu.vlan ? ipu.vlan : 0;
-                            uniObj.vlanToService.push({"vlan":vlan, "svc":service});
-                        }
-                    });
+                    if (ipuni && ipuni["ip-unis"] && ipuni["ip-unis"]["ip-uni"]) {
+                        ipuni["ip-unis"]["ip-uni"].forEach(function(ipu){
+                            if (ipu['ip-uni-id'] == uni["ip-uni-id"]){
+                                var vlan = ipu.vlan ? ipu.vlan : 0;
+                                uniObj.vlanToService.push({"vlan":vlan, "svc":service});
+                            }
+                        });
+                    }
                 } else {
                     uniObj.vlanToService.push({"vlan":0, "svc":service});
                 }
@@ -137,7 +138,19 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) {
           }
         });
       });
-      CpeuiSvc.getAllIpUniSubnets(function(subnets){
+      CpeuiSvc.getAllIpUniSubnets(function(raw_subnets){
+          var subnets ={}
+          if (raw_subnets) {
+              raw_subnets.forEach(function(sub) {
+                if (subnets[sub["uni-id"]] == undefined) {
+                  subnets[sub["uni-id"]] = {};
+                }
+                if (subnets[sub["uni-id"]][sub["ip-uni-id"]] == undefined) {
+                  subnets[sub["uni-id"]][sub["ip-uni-id"]] = [];
+                }
+                subnets[sub["uni-id"]][sub["ip-uni-id"]].push(sub);
+              });
+          }
         $scope.subnets = subnets;
       });
     };
@@ -171,6 +184,18 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) {
     }
 
     var addEvcController = function($scope, $mdDialog) {
+      $scope.initObj = function(svc) {
+          $scope.obj = angular.merge($scope.obj, svc);
+          if (!$scope.obj.evc) {
+              $scope.obj.evc = {};
+          }
+          if (!$scope.obj.evc['max-svc-frame-size']){
+              $scope.obj.evc['max-svc-frame-size'] = 1522;
+          }
+          if (!$scope.obj.evc['mac-timeout']){
+              $scope.obj.evc['mac-timeout'] = 300;
+          }
+      }
       $scope.validate = function(form) {
         form.svc_type.$setTouched(); // patch because angular bug http://stackoverflow.com/questions/36138442/error-not-showing-for-angular-material-md-select
         console.log($scope);
@@ -178,6 +203,20 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) {
       };
     };
 
+    $scope.editEvc = function($event, svc) {
+        new CpeuiDialogs.Dialog('AddEvc', {}, function(obj) {
+            obj['svc-id'] = svc['svc-id'];
+            CpeuiSvc.addEvc(obj, evcTypes[obj.svc_type], $scope.curTenant, function() {
+                  $scope.updateEvcView();
+                });
+          }, addEvcController).show($event, {'svcTypes':$scope.svcTypes, svc:svc});
+    }
+
+    $scope.openMenu = function($mdOpenMenu, ev) {
+        originatorEv = ev;
+        $mdOpenMenu(ev);
+      };
+
     $scope.evcDialog = new CpeuiDialogs.Dialog('AddEvc', {}, function(obj) {
       CpeuiSvc.addEvc(obj, evcTypes[obj.svc_type], $scope.curTenant, function() {
             $scope.updateEvcView();
@@ -229,6 +268,95 @@ define([ 'app/cpeui/cpeui.module' ], function(cpeui) {
       $scope.ipUniDialog.show(event,{'uniid':uni['uni-id'], uni:uni})
     }
 
+
+    var staticRoutingController = function($scope, $mdDialog, params) {
+        $scope.add = function(obj){
+            if ($scope.projectForm.$valid) {
+                if (!obj.selectedUni.subnets) {
+                    obj.selectedUni.subnets = [];
+                }
+                obj.selectedUni.subnets.push({"subnet":obj.network,"gateway":obj.gateway});
+
+                if (!$scope.toAdd) {
+                    $scope.toAdd = [];
+                }
+                $scope.toAdd.push(obj);
+
+                // reset form
+                $scope.obj={};
+                $scope.projectForm.$setPristine();
+                $scope.projectForm.$setUntouched();
+
+            }
+        };
+
+        $scope.removeSubnet = function(u,subnet) {
+            if (!$scope.toRemove) {
+                $scope.toRemove = [];
+            }
+            u.subnets = u.subnets.filter(s=>s!=subnet);
+            $scope.toRemove.push({"uni":u, "subnet":subnet});
+        }
+
+        $scope.done = function() {
+//            if (!angular.equals({},$scope.obj)){
+//                $scope.projectForm.$setSubmitted();
+//                return;
+//            }
+            if (!$scope.toRemove && !$scope.toAdd) {
+                $mdDialog.hide();
+                return;
+            }
+            CpeuiSvc.getAllIpUniSubnets(function(subnets){
+                if ($scope.toRemove) {
+                    $scope.toRemove.forEach(function(u){
+                        subnets = subnets.filter(function(s) {
+                            if (s['uni-id'] != u.uni['uni-id']) {
+                                return true;
+                            } else if (s['ip-uni-id'] != u.uni['ip-uni-id']) {
+                                return true;
+                            } else if (s.subnet != u.subnet.subnet) {
+                                return true;
+                            }
+                            return false;
+                        });
+                    });
+                }
+                if ($scope.toAdd) {
+                    $scope.toAdd.forEach(function(added){
+                        var u = added.selectedUni;
+                        subnets.push({
+                            "ip-uni-id":u['ip-uni-id'],
+                            "subnet":added.network,
+                            "gateway":added.gateway,
+                            "uni-id":u['uni-id'],
+                        });
+                    });
+                }
+                CpeuiSvc.setAllSubnets(subnets, $scope.callback);
+            });
+          $mdDialog.hide();
+        };
+
+      };
+
+    $scope.openRoutingDialog = function(ipvc) {
+        if (ipvc.ipvc.unis && ipvc.ipvc.unis.uni) {
+            ipvc.ipvc.unis.uni.forEach(function(u){
+                var mefUni = $scope.getMefInterfaceIpvc(u['uni-id'],u['ip-uni-id']);
+                u.ipAddress = mefUni['ip-address'];
+                u.deviceName = $scope.cesDisplayNames[u.device];
+                if ($scope.subnets[u['uni-id']]) {
+                    u.subnets = $scope.subnets[u['uni-id']][u['ip-uni-id']];
+                }
+                if (mefUni.vlan) { u.vlan = mefUni.vlan };
+            });
+        }
+        new CpeuiDialogs.Dialog('StaticRouting', {}, function() {
+            $scope.updateEvcView();
+        }, staticRoutingController).show(undefined, {"ipvc":ipvc, "subnets":angular.copy($scope.subnets)});
+    }
+
     $scope.ipUniSubnetDialog = new CpeuiDialogs.Dialog('AddIpUniSubnet', {}, function(obj) {
       CpeuiSvc.addIpUniSubnet(obj.uniid, obj.ipuniid, obj.subnet, obj.gateway, function() {
         if ($scope.subnets[obj.uniid] == undefined){
index fbdcade972f0169ab79de1ff4702206560f071eb..71b62cd5e3b1a723b34bd8fdd996819042b87b35 100644 (file)
             <li ng-class="{ active: isTabSet('tenantData',5)}" ng-click="setTab('tenantData',5)" >
                 <a href="#/cpeui/tenant/{{curTenant}}/servicemonitor" > <i class="icon-bar-chart"></i> Service Monitor</a>
             </li>
-             -->
             <li ng-class="{ active: isTabSet('tenantData',6)}" ng-click="setTab('tenantData',6)" >
                 <a id="tenant-uni-tab" href="#/cpeui/tenant/{{curTenant}}/unis"> <i class="icon-tasks"></i> UNIs</a>
             </li>
+             -->
             <li id="refresh_btn" class="active refresh-btn" ng-click="updateEvcView()">
                 <button class="btn add-row"> <i class="icon-refresh"></i> Refresh</button>
             </li>
                                     <tr>
                                         <th class="minimal-width"><i ng-click="expandFlags.L2[item['svc-id']] = false" class="expand-btn icon-caret-down"></i> Device </th>
                                         <th class="minimal-width">Port</th>
-                                        <th class="minimal-width">VLANs <span style="font-size:small;color:inherit;"> (click to edit)</span></th>
+                                        <th class="minimal-width">VLANs</th>
                                         <th class="minimal-width" ng-if="item.isTree" >Role</th>
                                         <th>Bandwidth Profile</th>
                                         <th class="minimal-width"></th>
                                     </tr>
                                 </thead>
-                                <tbody ng-if-end>
-                                    <tr ng-repeat-start="(ce, unis) in item.device2unis | orderBy : ce ">
-                                        <td class="minimal-width" rowspan="{{unis.length}}">{{ cesDisplayNames[ce] }}</td>
-                                        <td class="minimal-width" ng-repeat-start="uni in unis | orderBy: sortUni | limitTo :1">{{ uni.prettyID }}</td>
-                                        <td class="clickable" ng-click="!item.evc['preserve-ce-vlan-id'] ? editVlanDialog.show($event, {svcid:item['svc-id'], uniid:uni['uni-id'], vlans:uni.vlans}) : 0">
+                                <tbody ng-if-end ng-repeat="(ce, unis) in item.device2unis | orderBy : ce ">
+                                    <tr ng-repeat="uni in unis | orderBy: sortUni">
+                                        <td ng-if="$first" class="minimal-width" rowspan="{{unis.length}}">{{ cesDisplayNames[ce] }}</td>
+                                        <td class="minimal-width">{{ uni.prettyID }}</td>
+                                        <td>
                                         {{ uni.vlans.join(', ') }} {{item.evc['preserve-ce-vlan-id'] ? '(Preserved)' : ''}}
                                         </td>
                                         <td class="minimal-width" ng-if="item.isTree">{{ uni['role'] }}</td>
                                         <td >{{ uni['ingress-bw-profile'] }}</td>
-                                        <td ng-repeat-end class="minimal-width" style="white-space: nowrap;">
+                                        <td class="minimal-width" style="white-space: nowrap;">
                                         <button class="btn btn-md btn-danger" ng-click="deleteEvcUni(item['svc-id'], uni['uni-id'])"> <i class="icon-trash"></i> </button>
                                         </td>
                                     </tr>
-                                    <tr ng-repeat-end ng-repeat="uni in unis | orderBy: sortUni | limitTo :(unis.length-1) :1">
-                                        <td>{{ uni.prettyID }}</td>
-                                        <td ng-if="item.isTree">{{ uni['role'] }}</td>
-                                        <td class="clickable" ng-click="!item.evc['preserve-ce-vlan-id'] ? editVlanDialog.show($event, {svcid:item['svc-id'], uniid:uni['uni-id'], vlans:uni.vlans}) : 0">
-                                        {{ uni.vlans.join(', ') }} {{item.evc['preserve-ce-vlan-id'] ? '(Preserved)' : ''}}
-                                        </td>
-                                        <td class="minimal-width">{{ uni['ingress-bw-profile'] }}</td>
-                                            <td class="minimal-width" style="white-space: nowrap;">
-                                            <button class="btn btn-md btn-danger" ng-click="deleteEvcUni(item['svc-id'], uni['uni-id'])">
-                                                <i class="icon-trash"></i>
-                                            </button>
-                                        </td>
-                                    </tr>
                                 </tbody>
                             </table>
                         </td>
 
                         <td class="minimal-width">
-                            <button class="btn btn-md btn-danger" ng-click="deleteEvc(item['svc-id'])"> <i class="icon-trash"></i> </button>
+                            <button class="btn btn-md btn-action" ng-click="editEvc($event,item)"> <i class="icon-edit"></i> </button>
                             <button class="btn btn-md btn-info" ng-click="linkEvcUniDialog.show($event, {svc:item, unis:unis, ces:ces, profiles:profiles})">
                                 <i class="icon-plus"></i>
                                     <md-tooltip>Add UNI</md-tooltip>
                             </button>
+                            <button class="btn btn-md btn-danger" ng-click="deleteEvc(item['svc-id'])"> <i class="icon-trash"></i> </button>
                         </td>
                     </tr>
                 </tbody>
                             </table>
                         </td>
                         <td class="minimal-width">
-                            <button class="btn btn-md btn-danger" ng-click="deleteEvc(ipvc['svc-id'])"> <i class="icon-trash"></i> </button>
-                            <button class="btn btn-md btn-info" ng-click="linkIpvcUniDialog.show($event, {svc:ipvc, unis:unis, ces:ces, profiles:profiles})"> <i class="icon-plus"></i> </button>
+                            <div layout="column">
+                                <div layout="row">
+                                    <button class="btn btn-md btn-danger" ng-click="deleteEvc(ipvc['svc-id'])"> <i class="icon-trash"></i> </button>
+                                    <button class="btn btn-md btn-info" ng-click="linkIpvcUniDialog.show($event, {svc:ipvc, unis:unis, ces:ces, profiles:profiles})"> <i class="icon-plus"></i> </button>
+                                </div>
+                                <md-menu>
+                                                             <button class="btn btn-md btn-action" ng-click="openMenu($mdOpenMenu, $event)" style="width:100%">
+                                                               More
+                                                             </button>
+                                                             <md-menu-content width="4">
+                                                               <md-menu-item>
+                                                                 <md-button ng-click="openRoutingDialog(ipvc)">Routing</md-button>
+                                                               </md-menu-item>
+                                                               <!--
+                                                               <md-menu-item>
+                                      <md-button>DHCP</md-button>
+                                    </md-menu-item>
+                                    <md-menu-item>
+                                      <md-button>NAT</md-button>
+                                    </md-menu-item>
+                                    <md-menu-item>
+                                      <md-button>ACLs</md-button>
+                                    </md-menu-item>
+                                                                -->
+                                                             </md-menu-content>
+                                                           </md-menu>
+                            </div>
                         </td>
                         <!--
                             <button ng-show="!unisTables[ipvc.ipvc['ipvc-id']]" class="btn add-row btn-block" ng-click="unisTables[ipvc.ipvc['ipvc-id']] = true;">Show Unis</button>
                 </tbody>
             </table>
         </div>
+        <!-- 
         <div ng-show="isTabSet('tenantData',6)">
             <div class="table-header">Tenant UNIs</div>
             <table class="footable table table-striped">
                 </tbody>
             </table>
         </div>
+        -->
     </div>
     <div class="clear">
         <button class="btn btn-default pull-right" onclick="window.location='#/cpeui/admin/tenants'" > Back </button>
index 6cc5557b382dc9171d36417032bd8fbf6119d48a..67e85fc0ece99a44a7bd5d2ad9da537b403eccbf 100644 (file)
@@ -5,7 +5,7 @@
                   <tr>
                   <th>Name</th>
                   <th>
-                     <button class="btn btn-md btn-info" ng-click="tenantDialog.show($event)">
+                     <button class="btn btn-md btn-info right" ng-click="tenantDialog.show($event)">
                            <i class="icon-plus"></i> 
                            <md-tooltip>Create Tenant</md-tooltip>
               </button>