<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>
+++ /dev/null
-<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
--- /dev/null
+<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>
};
if (customController != undefined) {
- customController($scope, $mdDialog, params);
+ customController($scope, $mdDialog, params, CpeuiSvc);
}
};
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
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);
});
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) {
}
});
};
+
svc.getServices = function(tenantid, callback) {
var evcs;
$http({
border: 1px solid;
margin-top: 0;
margin-bottom: 0;
+ padding: 0 !important;
}
.clickable {
cursor: pointer;
"inventory" : 0,
"L2" : 1,
"L3" : 2,
- "unis" : 6,
}
if ($stateParams.tenantTabName in tabIndexs) {
$scope.tab.tenantData = tabIndexs[$stateParams.tenantTabName];
} 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});
}
}
});
});
- 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;
});
};
}
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);
};
};
+ $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();
$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){
<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>
<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>