diff options
Diffstat (limited to 'sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser')
15 files changed, 1726 insertions, 0 deletions
diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-bundle/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-bundle/pom.xml new file mode 100644 index 00000000..7499a987 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-bundle/pom.xml @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <artifactId>mwtnBrowser</artifactId> + <groupId>com.highstreet.technologies.odl.dlux</groupId> + <version>0.5.1-SNAPSHOT</version> + </parent> + <artifactId>mwtnBrowser-bundle</artifactId> + <name>${prefix} ${project.artifactId}</name> + <packaging>bundle</packaging> + <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + <version>${osgi.core.version}</version> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + <version>${osgi.core.version}</version> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.osgi.compendium</artifactId> + <version>${apache.felix.compendium}</version> + </dependency> + <dependency> + <groupId>org.opendaylight.dlux</groupId> + <artifactId>loader</artifactId> + <version>${dlux.loader.version}</version> + </dependency> + <dependency> + <groupId>com.highstreet.technologies.odl.dlux</groupId> + <artifactId>mwtnBrowser-module</artifactId> + <version>0.5.1-SNAPSHOT</version> + </dependency> + </dependencies> + <build> + <resources> + <resource> + <directory>target/generated-resources</directory> + </resource> + <resource> + <directory>src/main/resources</directory> + </resource> + </resources> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>2.6</version> + <executions> + <!--loader Resources --> + <execution> + <id>unpack-loader-resources</id> + <goals> + <goal>unpack-dependencies</goal> + </goals> + <phase>generate-resources</phase> + <configuration> + <outputDirectory>${project.build.directory}/generated-resources</outputDirectory> + <groupId>com.highstreet.technologies.odl.dlux</groupId> + <includeArtifactIds>mwtnBrowser-module</includeArtifactIds> + <excludes>META-INF\/**</excludes> + <excludeTransitive>true</excludeTransitive> + <ignorePermissions>false</ignorePermissions> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <Import-Package>org.osgi.service.http, + org.osgi.framework;version="1.0.0", + org.opendaylight.dlux.loader + </Import-Package> + <Export-Package></Export-Package> + </instructions> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml new file mode 100644 index 00000000..383b124b --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -0,0 +1,19 @@ +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> + <reference id="httpService" availability="mandatory" activation="eager" interface="org.osgi.service.http.HttpService"/> + <reference id="loader" availability="mandatory" activation="eager" interface="org.opendaylight.dlux.loader.DluxModuleLoader"/> + + <bean id="bundle" init-method="initialize" destroy-method="clean" class="org.opendaylight.dlux.loader.DluxModule"> + <property name="httpService" ref="httpService"/> + <property name="loader" ref="loader"/> + <property name="moduleName" value="mwtnBrowser"/> + <property name="url" value="/src/app/mwtnBrowser"/> + <property name="directory" value="/mwtnBrowser"/> + <property name="requireJs" value="app/mwtnBrowser/mwtnBrowser.module"/> + <property name="angularJs" value="app.mwtnBrowser"/> + <property name="cssDependencies"> + <list> + <value>src/app/mwtnBrowser/mwtnBrowser-custom.css</value> + </list> + </property> + </bean> +</blueprint>
\ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/pom.xml new file mode 100644 index 00000000..7c33ed89 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/pom.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project + xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <artifactId>mwtnBrowser-module</artifactId> + <name>${prefix} ${project.artifactId}</name> + <packaging>jar</packaging> + <parent> + <artifactId>mwtnBrowser</artifactId> + <groupId>com.highstreet.technologies.odl.dlux</groupId> + <version>0.5.1-SNAPSHOT</version> + </parent> +</project>
\ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/images/mwtnBrowser.png b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/images/mwtnBrowser.png Binary files differnew file mode 100755 index 00000000..ae596db7 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/images/mwtnBrowser.png diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/images/mwtnConfig.png b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/images/mwtnConfig.png Binary files differnew file mode 100755 index 00000000..ae596db7 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/images/mwtnConfig.png diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser-custom.css b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser-custom.css new file mode 100644 index 00000000..15c398c1 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser-custom.css @@ -0,0 +1,24 @@ +/** + * Add your application related css here + */ + +.json-formatter-row .constructor-name { + cursor: pointer; + color: #333333; +} + +.json-formatter-row .toggler:after { + color: darkgreen; + font-weight: bold; + display: inline-block; + transition: transform .1s ease-in; + content: ">" +} + +.owl span.key-text { + color: #333333; +} + +.owl span.colon { + color: #333333; +}
\ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.controller.js b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.controller.js new file mode 100644 index 00000000..76d3148d --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.controller.js @@ -0,0 +1,1090 @@ +/* + * @copyright 2017 highstreet technologies GmbH and others. All rights reserved. + * + * @license + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +define(['app/mwtnBrowser/mwtnBrowser.module', + 'app/mwtnBrowser/mwtnBrowser.services'], + function(mwtnBrowserApp) { + + var getControlType = function(type) { + var result = 'text' + switch (type) { + case 'boolean': + result = 'checkbox'; + break; + case 'number': + result = 'number'; + break; + case 'string': + case 'array': + case 'object': + break; + default: + var message = 'Check control type for ' + type; + $mwtnLog.warning({ component: COMPONENT, message: message }); + } + return result; + }; + + mwtnBrowserApp.register.controller('ptpDefaultDsViewController', ['$scope', '$uibModalInstance', '$mwtnGlobal', '$mwtnCommons', '$mwtnDatabase', '$mwtnLog', 'defaultDs', + function ($scope, $uibModalInstance, $mwtnGlobal, $mwtnCommons, $mwtnDatabase, $mwtnLog, defaultDs) { + + var vm = this; + var COMPONENT = 'ptpDefaultDsViewController'; + $scope.data = defaultDs; + + $scope.getType = $mwtnGlobal.getType; + + + $mwtnCommons.getPtpDefaultDs(defaultDs).then(function (success) { + + $scope.configuredData = success; + $scope.viewData = $mwtnGlobal.getViewData($scope.configuredData['default-ds']); + + $mwtnDatabase.getSchema().then(function(schema){ + var ordered = {}; + var clone = JSON.parse(JSON.stringify($scope.viewData)); + var keys = Object.keys(clone).map(function(key){ + if ($mwtnGlobal.getType(key) !== 'string') { + console.log('key', key); + return; + } + var item = clone[key]; + if (!schema[key]) { + var message = 'No schema information for ' + key; + $mwtnLog.warning({ component: COMPONENT, message: message }); + item['order-number'] = $mwtnCommons.getOrderNumber(97, item); + item.description = 'No description available.'; + item.visible = true; + return key; + } + if (schema[key].controlType === undefined) { + item.controlType = getControlType(item.type); + } else { + item.controlType = schema[key].controlType; + } + item.unit = schema[key].unit; + item['is-read-only'] = schema[key]['is-read-only']; + if (schema[key].min) { + item.min = schema[key].min; + } + if (schema[key].max) { + item.max = schema[key].max; + if (item.unit) { + item.unit = schema[key].min + '..' + schema[key].max + ' ' + item.unit; + } else { + item.unit = schema[key].min + '..' + schema[key].max; + } + } + + + item['order-number'] = $mwtnCommons.getOrderNumber(schema[key]['order-number'], item); + item.description = schema[key].description; + if (item.description === undefined || item.description === '') { + item.description = 'No description available.'; + } + // hide complex types for now -> TODO + if (item.type === 'array' || item.type === 'object') { + item.visible = false; + } + return key; + }).sort(function(a,b){ + if (clone[a]['order-number'] < clone[b]['order-number']) return -1; + if (clone[a]['order-number'] > clone[b]['order-number']) return 1; + return 0; + }).map(function(key){ + ordered[key] = clone[key]; + }); + $scope.viewData = ordered; + }, function(error){ + $scope.empty = true; + }); + + }, function (error) { + $scope.configuredData = undefined; + $mwtnLog.error({ component: COMPONENT, message: 'Requesting PTP default ds ' + JSON.stringify($scope.data) + ' failed!' }); + }); + + $scope.$watch('viewData', function(newValue, oldValue) { + if (oldValue && newValue !== oldValue) { + Object.keys(newValue).filter(function(key){ + return newValue[key]['is-read-only'] !== true && newValue[key].controlType === 'number' ; + }).map(function(key){ + if (newValue[key].value < newValue[key].min) newValue[key].value = newValue[key].min; + if (newValue[key].value > newValue[key].max) newValue[key].value = newValue[key].max; + if (!newValue[key].value) newValue[key].value = newValue[key].min; + }); + } + }, true); + + $scope.newData = {}; + $scope.ok = function () { + $scope.processing = true; + $scope.newData = {}; + Object.keys($scope.viewData).map(function(key){ + $scope.newData[key] = $scope.viewData[key].value; + }); + + $mwtnCommons.setPtpDefaultDs($scope.data, $scope.newData).then(function(success){ + $scope.applied = {text: 'Applied: ' + new Date().toISOString(), class:'mwtnSuccess'}; + $scope.processing = false; + }, function(error){ + $scope.applied = {text: 'Error: ' + new Date().toISOString(), class:'mwtnError'}; + $scope.processing = false; + $mwtnLog.error({component: COMPONENT, message: JSON.stringify(error)}); + }); + + }; + + $scope.cancel = function () { + $uibModalInstance.close($scope.newData); + }; + + // events + + + }]); + + mwtnBrowserApp.register.controller('ptpPortConfigViewController', ['$scope', '$uibModalInstance', '$mwtnGlobal', '$mwtnCommons', '$mwtnDatabase', '$mwtnLog', 'valueData', + function ($scope, $uibModalInstance, $mwtnGlobal, $mwtnCommons, $mwtnDatabase, $mwtnLog, data) { + + var vm = this; + var COMPONENT = 'ptpPortConfigViewController'; + + $scope.data = data; + + $scope.getType = $mwtnGlobal.getType; + console.warn(JSON.stringify(data)); + $mwtnCommons.getPtpPort(data).then(function (success) { + + $scope.configuredData = success; + + $scope.viewData = $mwtnGlobal.getViewData($scope.configuredData['port-ds-list'][0]); + $mwtnDatabase.getSchema().then(function(schema){ + var ordered = {}; + var clone = JSON.parse(JSON.stringify($scope.viewData)); + var keys = Object.keys(clone).map(function(key){ + if ($mwtnGlobal.getType(key) !== 'string') { + console.log('key', key); + return; + } + var item = clone[key]; + if (!schema[key]) { + var message = 'No schema information for ' + key; + $mwtnLog.warning({ component: COMPONENT, message: message }); + item['order-number'] = $mwtnCommons.getOrderNumber(97, item); + item.description = 'No description available.'; + item.visible = true; + return key; + } + if (schema[key].controlType === undefined) { + item.controlType = getControlType(item.type); + } else { + item.controlType = schema[key].controlType; + } + item.unit = schema[key].unit; + console.warn(key, schema[key]['is-read-only']); + item['is-read-only'] = schema[key]['is-read-only']; + if (schema[key].min) { + item.min = schema[key].min; + } + if (schema[key].max) { + item.max = schema[key].max; + if (item.unit) { + item.unit = schema[key].min + '..' + schema[key].max + ' ' + item.unit; + } else { + item.unit = schema[key].min + '..' + schema[key].max; + } + } + + + item['order-number'] = $mwtnCommons.getOrderNumber(schema[key]['order-number'], item); + item.description = schema[key].description; + if (item.description === undefined || item.description === '') { + item.description = 'No description available.'; + } + // hide complex types for now -> TODO + if (item.type === 'array' || item.type === 'object') { + item.visible = false; + } + return key; + }).sort(function(a,b){ + if (clone[a]['order-number'] < clone[b]['order-number']) return -1; + if (clone[a]['order-number'] > clone[b]['order-number']) return 1; + return 0; + }).map(function(key){ + ordered[key] = clone[key]; + }); + $scope.viewData = ordered; + }, function(error){ + $scope.empty = true; + }); + + }, function (error) { + $scope.configuredData = undefined; + $mwtnLog.error({ component: COMPONENT, message: 'Requesting PTP port ' + JSON.stringify($scope.data) + ' failed!' }); + }); + + $scope.$watch('viewData', function(newValue, oldValue) { + if (oldValue && newValue !== oldValue) { + Object.keys(newValue).filter(function(key){ + return newValue[key]['is-read-only'] !== true && newValue[key].controlType === 'number' ; + }).map(function(key){ + if (newValue[key].value < newValue[key].min) newValue[key].value = newValue[key].min; + if (newValue[key].value > newValue[key].max) newValue[key].value = newValue[key].max; + if (!newValue[key].value) newValue[key].value = newValue[key].min; + }); + } + }, true); + + $scope.newData = {}; + $scope.ok = function () { + $scope.processing = true; + $scope.newData = {}; + Object.keys($scope.viewData).map(function(key){ + $scope.newData[key] = $scope.viewData[key].value; + }); + + $mwtnCommons.setPtpPort($scope.data, $scope.newData).then(function(success){ + $scope.applied = {text: 'Applied: ' + new Date().toISOString(), class:'mwtnSuccess'}; + $scope.processing = false; + }, function(error){ + $scope.applied = {text: 'Error: ' + new Date().toISOString(), class:'mwtnError'}; + $scope.processing = false; + $mwtnLog.error({component: COMPONENT, message: JSON.stringify(error)}); + }); + + }; + + $scope.cancel = function () { + $uibModalInstance.close($scope.newData); + }; + + // events + + + }]); + + mwtnBrowserApp.register.controller('mwtnPtpPortsController', ['$scope', '$filter', '$uibModal', '$mwtnGlobal', '$mwtnCommons', '$mwtnLog', + function ($scope, $filter, $uibModal, $mwtnGlobal, $mwtnCommons, $mwtnLog) { + var vm = this; + var COMPONENT = 'mwtnPtpPortsController'; + + $scope.info = false; + var data = JSON.parse(JSON.stringify($scope.data)); + if (!data) { + var message = 'No data to be displayed!";' + $mwtnLog.info({ component: COMPONENT, message: message }); + data = [{'message':message}]; + } + + if ($mwtnGlobal.getType(data) !== 'array') { + var message = 'Data must be of type "array"!'; + $mwtnLog.info({ component: COMPONENT, message: message }); + data = [{'message':message}]; + } + + if (data.length === 0) { + var message = 'Data list must have at least one entry!'; + $mwtnLog.info({ component: COMPONENT, message: message }); + data = [{'message':message}]; + } + + if ($mwtnGlobal.getType(data[0]) !== 'object') { + data = data.map(function(item){ + return {value: item}; + }); + } + + $scope.ptpPorts = []; + + $scope.gridOptions = JSON.parse(JSON.stringify($mwtnCommons.gridOptions)); + $scope.gridOptions.data = 'ptpPorts'; + $scope.highlightFilteredHeader = $mwtnCommons.highlightFilteredHeader; + + // $scope.getTableHeight = function() { + // var rowHeight = 30; + // var headerHeight = 40; + // var maxCount = 12; + // var rowCount = $scope.gridOptions.data.length + 2; + // if (rowCount > maxCount) { + // return { + // height: (maxCount * rowHeight + headerHeight) + 'px' + // }; + // } + // return {}; // use auto-resize feature + // }; + + var getCellTemplate = function(field) { + var object = ['transmission-mode-list', 'performance-data']; + if (object.contains(field)) { + return ['<div class="ui-grid-cell-contents">', + '<i class="fa fa-info-circle pointer" aria-hidden="true"', + ' ng-click="grid.appScope.show(grid.getCellValue(row, col))"></i> ', + '{{grid.getCellValue(row, col)}}</div>'].join(''); + } else if (field === 'action') { + return [ + '<a class="vCenter" ng-class="{attention: grid.appScope.hover, hidden: onfAirInterfaceRevision}" >', + ' <i class="fa fa-pencil-square-o pointer" aria-hidden="true" ng-click="grid.appScope.show(row.entity)"></i>', + '</a>' ].join('<span> </span>'); + } else { + return '<div class="ui-grid-cell-contents">{{grid.getCellValue(row, col)}}</div>'; + } + }; + + $scope.show = function(value){ + var type = $mwtnGlobal.getType(value); + // if (type === 'object') + var modalInstance = $uibModal.open({ + animation: true, + ariaLabelledBy: 'modal-title', + ariaDescribedBy: 'modal-body', + templateUrl: 'src/app/mwtnBrowser/templates/ptpPortConfigView.tpl.html', + controller: 'ptpPortConfigViewController', + size: 'huge', + resolve: { + valueData: function () { + return {networkElement: $scope.networkElement, value:value}; + } + } + }); + modalInstance.result.then(function(object) { + console.warn(JSON.stringify(object)); + $scope.ptpPorts.map(function(row, index){ + if (row['port-number'] === object['port-number']) { + console.log($scope.ptpPorts[index]['onf-ptp-dataset:master-only']); + $scope.ptpPorts[index] = object; + console.log($scope.ptpPorts[index]['onf-ptp-dataset:master-only']); + }; + }); + }, function () { + // ignore; + }); + }; + + var enable = data.length > 10; + $scope.gridOptions.columnDefs = Object.keys(data[0]).map(function (field) { + var type = $mwtnGlobal.getType(data[0][field]); + var labelId = $mwtnGlobal.getLabelId(field); + var displayName = $filter('translate')(labelId); + var visible = $mwtnGlobal.getVisibilityOf(field); + if (labelId.contains('$$') || labelId === 'MWTN_SPEC') { + visible = false; + } + return { + field: field, + type: type, + displayName: displayName, + enableSorting: true, + enableFiltering: enable, + headerCellClass: $scope.highlightFilteredHeader, + cellTemplate: getCellTemplate(field), + cellClass: type, + visible: visible + }; + }); + $scope.gridOptions.columnDefs.push({ + field: 'action', + displayName: 'Action', + enableSorting: false, + enableFiltering: false, + headerCellClass: $scope.highlightFilteredHeader, + cellTemplate: getCellTemplate('action'), + width: 100, + visible: true, + pinnedRight : true + + }); + if ($scope.gridOptions.data.length < 10) { + $scope.gridOptions.minRowsToShow = data.length; // 10 is default + } + $scope.ptpPorts = data.map(function(item){ + item.action = ''; + return item; + }); + // .sort(function(a, b){ + // if (a.type === 'object') return -1; + // if (a.type === 'array' ) return -2; + // return 0; + // }) + + $scope.myClipboard = { + data: $scope.data, + supported: true, + getJson: function () { + return JSON.stringify(this.data, null, ' '); + }, + copyToClipboard: function () { + var message = 'Copied to clipboard! ' + this.getJson(); + $mwtnLog.info({ component: COMPONENT, message: message }); + }, + error: function (err) { + $mwtnLog.error({ component: COMPONENT, message: err }); + } + }; + }]); + + mwtnBrowserApp.register.directive('mwtnPtpPorts', function () { + return { + restrict: 'E', + scope: { + data: '=', + path: '=', + networkElement: '=' + }, + controller: 'mwtnPtpPortsController', + controllerAs: 'vm', + templateUrl: 'src/app/mwtnBrowser/templates/mwtnPtpPorts.tpl.html' + }; + }); + + mwtnBrowserApp.register.controller('mwtnPtpClockViewerController', ['$scope', '$timeout', '$uibModal', '$mwtnGlobal', '$mwtnCommons', '$mwtnDatabase', '$mwtnLog', '$mwtnBrowser', + function ($scope, $timeout, $uibModal, $mwtnGlobal, $mwtnCommons, $mwtnDatabase, $mwtnLog, $mwtnBrowser) { + var vm = this; + var COMPONENT = 'mwtnPtpClockViewerController'; + if ($scope.data) { + $scope.replace = false; + if ($scope.path && $scope.path.endsWith('-configuration') ) { + $scope.replace = true; + } + $scope.viewData = $mwtnGlobal.getViewData($scope.data, $scope.ne); + var path = [undefined, undefined, undefined]; + if ($scope.path) { + path = $scope.path.split($mwtnCommons.separator); + } + + var processData = function(schema) { + var ordered = {}; + var clone = JSON.parse(JSON.stringify($scope.viewData)); + var keys = Object.keys(clone).map(function(key){ + if ($mwtnGlobal.getType(key) !== 'string') { + console.log('key', key); + return; + } + var item = clone[key]; + if (!schema[key]) { + var message = 'No schema information for ' + key; + $mwtnLog.warning({ component: COMPONENT, message: message }); + item['order-number'] = $mwtnCommons.getOrderNumber(97, item); + item.description = 'No description available.'; + item.visible = true; + return key; + } + item.unit = schema[key].unit; + item.description = schema[key].description; + item['order-number'] = $mwtnCommons.getOrderNumber(schema[key]['order-number'], item); + if (item.description === undefined || item.description === '') { + item.description = 'No description available.'; + } + return key; + }).sort(function(a,b){ + if (clone[a]['order-number'] < clone[b]['order-number']) return -1; + if (clone[a]['order-number'] > clone[b]['order-number']) return 1; + return 0; + }).map(function(key){ + if ($mwtnGlobal.getType( clone[key].value ) === 'object') { + Object.keys(clone[key].value).filter(function(subKey){ + return subKey.endsWith('-identity'); + }).map(function(subKey){ + var clockId = clone[key].value[subKey]; + if ($mwtnGlobal.getType(clockId) === 'object') { + if (clockId['clock-identity']) { + var ascii = clockId['clock-identity'].base64ToHex(); + clone[key].value[subKey]['clock-identity'] = [clone[key].value[subKey]['clock-identity'], '(ascii:', ascii, ')'].join(' '); + } + } else { + var ascii = clone[key].value[subKey].base64ToHex(); + clone[key].value[subKey] = [clone[key].value[subKey], '(ascii:', ascii, ')'].join(' '); + } + }); + ordered[key] = clone[key]; + } else { + ordered[key] = clone[key]; + } + }); + $scope.info = false; + if (Object.keys(ordered).length === 0) { + $scope.info = 'An empty object is displayed. Please check if the NetConf server has send an empty object.'; + } + return ordered; + }; + + + $mwtnDatabase.getSchema().then(function(schema){ + $scope.schema = schema; + $scope.viewData = processData($scope.schema); + }, function(error){ + // ignore; + }); + } + + $scope.show = function(value){ + var type = $mwtnGlobal.getType(value); + var modalInstance = $uibModal.open({ + animation: true, + ariaLabelledBy: 'modal-title', + ariaDescribedBy: 'modal-body', + templateUrl: 'src/app/mwtnBrowser/templates/ptpDefaultDsConfigView.tpl.html', + controller: 'ptpDefaultDsViewController', + size: 'huge', + resolve: { + defaultDs: function () { + return {networkElement: $scope.networkElement, value:value}; + } + } + }); + modalInstance.result.then(function(object) { + $mwtnBrowser.refreshPTP(); + }, function () { + // ignore; + }); + }; + }]); + + mwtnBrowserApp.register.directive('mwtnPtpClockViewer', function () { + return { + restrict: 'E', + scope: { + data: '=', + path: '=', + ne: '=', // flag if ne class + networkElement: '=' + }, + controller: 'mwtnPtpClockViewerController', + controllerAs: 'vm', + templateUrl: 'src/app/mwtnBrowser/templates/mwtnPtpClockViewer.tpl.html' + }; + }); + + + mwtnBrowserApp.register.controller('mwtnBrowserCtrl', ['$scope', '$rootScope', '$mwtnLog', '$mwtnCommons', '$mwtnEthernet', '$mwtnBrowser', '$translate', 'OnfNetworkElement', 'PtpClock', 'LogicalTerminationPoint', + function($scope, $rootScope, $mwtnLog, $mwtnCommons, $mwtnEthernet, $mwtnBrowser, $translate, OnfNetworkElement, PtpClock, LogicalTerminationPoint) { + + var COMPONENT = 'mwtnBrowserCtrl'; + $mwtnLog.info({component: COMPONENT, message: 'mwtnBrowserCtrl started!'}); + $rootScope.section_logo = 'src/app/mwtnBrowser/images/mwtnBrowser.png'; // Add your topbar logo location here such as 'assets/images/logo_topology.gif' + + var pacTemplate = { + 'layer-protocol': 'unknown' + }; + + $scope.fcDeletion = { + nodeId: $scope.networkElementId, + ltp:'', + info: 'handle with care, no further warning, qualified user expected ;)' + }; + $scope.deleteForwardingConstruct = function() { + $scope.fcDeletion.nodeId = $scope.networkElementId; + $scope.fcDeletion.info = 'Processing ...'; + $scope.fcDeletion.error = undefined; + if ($scope.fcDeletion.ltp === undefined || $scope.fcDeletion.ltp === '') { + $scope.fcDeletion.error = 'Please select a valid LTP#1.!'; + return; + } + $mwtnEthernet.deleteForwardingConstruct($scope.fcDeletion).then(function(success){ + console.log(success); + $scope.fcDeletion.info = success; + }, function(error){ + console.log(error); + $scope.fcDeletion.error = error; + }); + } + + $scope.fcCreation = { + nodeId: $scope.networkElementId, + ltp1:'', + ltp2:'', + vlan:42, + info:'handle with care, no further warning, qualified user expected ;)' + }; + $scope.createForwardingConstruct = function() { + console.warn(JSON.stringify($scope.networkElementId)); + console.warn(JSON.stringify($scope.networkElement)); + $scope.fcCreation.nodeId = $scope.networkElementId; + $scope.fcCreation.info = 'Processing ...'; + $scope.fcCreation.error = undefined; + if ($scope.fcCreation.ltp1 === undefined || $scope.fcCreation.ltp1 === '') { + $scope.fcCreation.error = 'Please select a valid LTP#1!'; + return; + } + if ($scope.fcCreation.ltp2 === undefined || $scope.fcCreation.ltp2 === '') { + $scope.fcCreation.error = 'Please select a valid LTP#2!'; + return; + } + if ($scope.fcCreation.vlan === undefined) { + $scope.fcCreation.error = 'Please select a valid vlan-id!'; + return; + } + if ($scope.fcCreation.ltp1 === $scope.fcCreation.ltp2) { + $scope.fcCreation.error = 'Please select different LTPs. Loopback is not supported yet!'; + return; + } + $mwtnEthernet.createForwardingConstruct($scope.fcCreation).then(function(success){ + console.log(success); + $scope.fcCreation.info = success; + }, function(error){ + console.log(error); + $scope.fcCreation.error = error; + }); + } + + // get important infromation from yang modules + console.error('help'); + $mwtnBrowser.getModules().then(function(success){ + + var pacOrder = [ + 'onf-otn-odu-conditional-packages:otn-odu-termination-pac', + 'onf-otn-odu-conditional-packages:otn-odu-connection-pac', + 'onf-ethernet-conditional-packages:ethernet-pac', + 'microwave-model:mw-air-interface-diversity-pac', + 'microwave-model:mw-air-interface-hsb-end-point-pac', + 'microwave-model:mw-air-interface-hsb-fc-switch-pac', + 'onf-core-model-conditional-packages:holder-pac', + 'onf-core-model-conditional-packages:connector-pac', + 'onf-core-model-conditional-packages:equipment-pac', + 'microwave-model:mw-ethernet-container-pac', + 'MicrowaveModel-ObjectClasses-EthernetContainer:MW_EthernetContainer_Pac', + 'microwave-model:mw-ethernet-container-pac', + 'microwave-model:mw-tdm-container-pac', + 'microwave-model:mw-pure-ethernet-structure-pac', + 'microwave-model:mw-hybrid-mw-structure-pac', + 'MicrowaveModel-ObjectClasses-PureEthernetStructure:MW_PureEthernetStructure_Pac', + 'microwave-model:mw-air-interface-pac', + 'MicrowaveModel-ObjectClasses-AirInterface:MW_AirInterface_Pac' + ]; + + $scope.modules = success; + $scope.orderedPacs = []; + $scope.parts = []; + Object.keys(success).map(function(module){ + Object.keys(success[module]).filter(function(key){ + return key.endsWith('-pac') || key.endsWith('_Pac'); + }).map(function(pacName){ + $scope.orderedPacs.push([module, pacName].join(':')); + // sort + $scope.orderedPacs.sort(function(a, b) { + if (!pacOrder.indexOf(a)) console.warn(a); + if (!pacOrder.indexOf(b)) console.warn(b); + if(pacOrder.indexOf(a) > pacOrder.indexOf(b)) return 1; + if(pacOrder.indexOf(a) < pacOrder.indexOf(b)) return -1; + return 0; + }) + + if (pacName === 'mw-air-interface-pac') { + $scope.parts = Object.keys(success[module][pacName]).filter(function(conditionalPackage){ + return success[module][pacName][conditionalPackage]['local-name']; + }).map(function(conditionalPackage){ + return success[module][pacName][conditionalPackage]['local-name']; + }); + } + }); + }); + }, function(error){ + $scope.modules = undefined; + $scope.orderedPacs = undefined; + $scope.parts = undefined; + }); + + /** + * @function updateNe + * A function, which updates onfNetworkElement by new data. + * @param {*} data New data recieved from OpenDaylight via RestConf + */ + var updateNe = function(data) { + if (!data) return; + // update onfNetworkElement + switch ($scope.mountpoint.onfCoreModelRevision) { + case '2016-03-23': + $scope.onfNetworkElement = JSON.parse(JSON.stringify(data['network-element'][0])); + $scope.onfLtps = data['network-element'][0].ltp; + $scope.onfNetworkElement.ltp = undefined; + break; + case '2016-08-09': + case '2016-08-11': + case '2017-02-17': + case '2017-03-20': + case '2017-10-20': + // console.log(JSON.stringify(data)); + $scope.onfNetworkElement = new OnfNetworkElement(data['network-element']); + var fd = $scope.onfNetworkElement.getForwardingDomain(); + $scope.forwardingDomain = undefined; + $scope.forwardingConstructs = undefined; + if (fd && fd.length > 0) { + $scope.forwardingDomain = fd[0]; // $mwtnBrowser.getViewData(fd[0]); + $scope.forwardingConstructs = []; + if (fd[0].fc) { + fd[0].fc.map(function(id){ + $mwtnBrowser.getForwardingConstruct($scope.networkElement, id).then(function(fc){ + + // TODO make robust + if (fc['forwarding-construct'] && fc['forwarding-construct'][0]) { + var item = fc['forwarding-construct'][0]; + if (item['fc-port'] && + item['fc-port'][0] && item['fc-port'][0].ltp && item['fc-port'][0].ltp[0] && + item['fc-port'][1] && item['fc-port'][1].ltp && item['fc-port'][1].ltp[0]) { + $scope.forwardingConstructs.push( { + uuid: item.uuid, + 'fc-port#1': $scope.onfNetworkElement.getLtp( item['fc-port'][0].ltp[0] ).getLabel(), + 'fc-port#2': $scope.onfNetworkElement.getLtp( item['fc-port'][1].ltp[0] ).getLabel() + }); + } + } + }); + }); + } + } + $scope.onfLtps = $scope.onfNetworkElement.getLogicalTerminationPoints(); + // $scope.onfNetworkElement.ltp = undefined; + break; + default: + $mwtnLog.info({component: COMPONENT, message: ['The ONF CoreModel revision', $scope.mountpoint.onfCoreModelRevision, ' is not supported (yet)!'].join(' ')}); + $scope.onfNetworkElement = {}; + $scope.onfLtps = {}; + } + + var order = $mwtnBrowser.layerProtocolNameOrder; + // update onfLTPs + $scope.onfLtps.sort(function(a, b){ + if(order[a.getLayer()] < order[b.getLayer()]) return -1; + if(order[a.getLayer()] > order[b.getLayer()]) return 1; + if(a.getId() < b.getId()) return -1; + if(a.getId() > b.getId()) return 1; + return 0; + }); + + // calculate conditional packages + $scope.pacs = {}; + $scope.onfLtps.map(function(ltp) { + ltp.getLayerProtocols().map( + /** + * A function processing a layer-protocol object + * @param {LayerProtocol} lp A layer-protocol object + */ + function(lp) { + var template = JSON.parse(JSON.stringify(pacTemplate)); + template['layer-protocol'] = lp.getId(); + var conditionalPackage = lp.getConditionalPackage(true); + // console.log(conditionalPackage); + if (conditionalPackage !== '') { + if ($scope.pacs[conditionalPackage] === undefined) { + // create missing pac array + $scope.pacs[conditionalPackage] = []; + } + $scope.pacs[conditionalPackage].push(template); + console.error(conditionalPackage, JSON.stringify(template)); + } else { + $mwtnLog.info({component: COMPONENT, message: 'No conditional package for ' + ltp.getLabel() }); + } + }); + }); + + // sort the conditional packages + if ($scope.orderedPacs) { + $scope.orderedPacs.filter(function(item){ + return $scope.pacs[item] !== undefined; + }).map(function(item){ + $scope.pacs[item].sort(function(a, b){ + if(a['layer-protocol'] < b['layer-protocol']) return -1; + if(a['layer-protocol'] > b['layer-protocol']) return 1; + return 0; + }); + }); + } + data.revision = undefined; + }; + + var updateNetworkElementCurrentProblems = function(data) { + if (data && data['network-element-current-problems'] && data['network-element-current-problems']['current-problem-list'] ) { + data.revision = undefined; + $scope.neCurrentProblems = data['network-element-current-problems']['current-problem-list']; + } else { + $scope.neCurrentProblems = []; + } + }; + + var updateLtp = function(data) { + $scope.onfLtps.map(function(ltp){ + if (ltp.getData().uuid === data.data.ltp[0].uuid) { + ltp = new LogicalTerminationPoint(data.data.ltp[0]); + } + }); + }; + + /** + * @deprecated since all conditaional packages are handle the same way even for + * 3rd and 4th PoC model - 2nd PoC model not supported any more. + * @param {*} lpId + * @param {*} part + * @param {*} data + */ + var updateAirInterface = function(lpId, part, data) { + // console.log(JSON.stringify(data), lpId); + $scope.airinterfaces.map(function(airinterface){ + // console.log(JSON.stringify(airinterface)); + if (airinterface['layer-protocol'] === lpId) { + if (Object.keys(data)[0].startsWith('air-interface')) { + airinterface[part] = data; + } else if (part === 'Capability') { + // 2. PoC + // console.log(part, JSON.stringify(data)); + airinterface[part] = data['mw-air-interface-pac'][0]['air-interface-capability-list']; + } else if (part === 'CurrentProblems') { + // 2. PoC + // console.log(part, JSON.stringify(data)); + airinterface[part] = data['mw-air-interface-pac'][0]['air-interface-current-problem-list']; + } + } + }); + data.revision = undefined; + }; + + /** + * @deprecated since all conditaional packages are handle the same way even for + * 3rd and 4th PoC model - 2nd PoC model not supported any more. + * @param {*} lpId + * @param {*} part + * @param {*} data + */ + var updateStructure = function(lpId, part, data) { + // console.log(JSON.stringify(data), lpId); + $scope.structures.map(function(structure){ + // console.log(JSON.stringify(structure)); + if (structure['layer-protocol'] === lpId) { + if (Object.keys(data)[0].contains('tructure')) { + structure[part] = data; + } else if (part === 'Capability') { + // 2. PoC + // console.log(part, JSON.stringify(data)); + structure[part] = data['mw-structure-pac'][0]['structure.capability-list']; + } else if (part === 'CurrentProblems') { + // 2. PoC + // console.log(part, JSON.stringify(data)); + structure[part] = data['mw-structure-pac'][0]['structure-current-problem-list']; + } + } + }); + data.revision = undefined; + }; + + /** + * @deprecated since all conditaional packages are handle the same way even for + * 3rd and 4th PoC model - 2nd PoC model not supported any more. + * @param {*} lpId + * @param {*} part + * @param {*} data + */ + var updateContainer = function(lpId, part, data) { + // console.log(JSON.stringify(data), lpId); + $scope.containers.map(function(container){ + // console.log(JSON.stringify(container)); + if (container['layer-protocol'] === lpId) { + if (Object.keys(data)[0].contains('ontainer') ) { + container[part] = data; + } else if (part === 'Capability') { + // 2. PoC + // console.log(part, JSON.stringify(data)); + container[part] = data['mw-container-pac'][0]['container-capability-list']; + } else if (part === 'CurrentProblems') { + // 2. PoC + // console.log(part, JSON.stringify(data)); + container[part] = data['mw-container-pac'][0]['container-current-problem-list']; + } + } + }); + data.revision = undefined; + }; + + /** + * Creates a template of a conditional packages with its subclasses + * @param {{pacId: string, layerProtocolId: string, partId:string}} spec - Specification object of a conditional package subclass + */ + var initPac = function(spec) { + $scope.pacs[spec.pacId].filter(function(conditionalPackage){ + return conditionalPackage['layer-protocol'] === spec.layerProtocolId; + }).map(function(pac){ + $scope.parts.map(function(localName){ + pac[localName] = {id:$mwtnBrowser.getPartGlobalId(spec, localName),localName: localName, data:'No data available'} + }); + }); + }; + + /** + * Updates an existing template of a conditional packages with its subclasses + * @param {{pacId: string, layerProtocolId: string, partId:string}} spec - Specification object of a conditional package subclass + */ + var updateSubClassData = function(spec, data) { + $scope.pacs[spec.pacId].filter(function(conditionalPackage){ + return conditionalPackage['layer-protocol'] === spec.layerProtocolId; + }).map(function(conditionalPackage){ + conditionalPackage[$mwtnBrowser.getPartLocalId(spec)].data = data[$mwtnBrowser.yangify(spec.partId)]; + }); + }; + + var updatePart = function(spec, data) { + switch (spec.pacId) { + case 'ne': + updateNe(data); + break; + case 'forwardingDomain': + // TODO $scope.forwardingDomain = new ForwardingDomain(data); + break; + case 'neCurrentProblems': + updateNetworkElementCurrentProblems(data); + break; + case 'clock': + if (data) { + $scope.clock = new PtpClock(data); + } else { + $scope.clock = undefined; + } + break; + case 'ltp': + updateLtp(data); + break; + case 'airinterface': + console.warn(JSON.stringify(spec, JSON.stringify(data))); + updateAirInterface(spec.layerProtocolId, spec.partId, data); + break; + case 'structure': + console.warn(JSON.stringify(data)); + updateStructure(spec.layerProtocolId, spec.partId, data); + break; + case 'container': + console.warn(JSON.stringify(data)); + updateContainer(spec.layerProtocolId, spec.partId, data); + break; + // 3rd Poc + case 'MicrowaveModel-ObjectClasses-AirInterface:MW_AirInterface_Pac': + case 'MicrowaveModel-ObjectClasses-PureEthernetStructure:MW_PureEthernetStructure_Pac': + case 'MicrowaveModel-ObjectClasses-EthernetContainer:MW_EthernetContainer_Pac': + // 4th Poc + case 'microwave-model:mw-air-interface-pac': + case 'microwave-model:mw-air-interface-diversity-pac': + case 'microwave-model:mw-pure-ethernet-structure-pac': + case 'microwave-model:mw-hybrid-mw-structure-pac': + case 'microwave-model:mw-tdm-container-pac': + case 'microwave-model:mw-ethernet-container-pac': + case 'onf-ethernet-conditional-packages:ethernet-pac': + if (!spec.partId) { + initPac(spec); + } else { + updateSubClassData(spec, data); + } + break; + } + }; + + // events + $scope.status = {ne:false}; + $scope.spinner = {ne:false}; + $scope.separator = $mwtnBrowser.separator; //' ' + + $scope.collapseAll = function() { + // close all groups + Object.keys($scope.status).map(function(group){ + $scope.status[group] = false; + }); + Object.keys($scope.spinner).map(function(group){ + $scope.spinner[group] = false; + }); + }; + + $scope.$watch('status', function(status, oldValue) { + Object.keys(status).filter(function(key){ + return $scope.networkElementId && status[key] && status[key] !== oldValue[key]; + }).map(function(key){ + $scope.spinner[key] = true; + var info = key.split($scope.separator); + var spec = { + nodeId: $scope.networkElementId, + revision: $scope.revision, + pacId: info[0], + layerProtocolId: info[1], + partId: info[2] + }; + $mwtnBrowser.getPacParts(spec).then(function(success){ + success = $mwtnBrowser.yangifyObject(success) + updatePart(spec, success); + $scope.spinner[key] = false; + }, function(error){ + updatePart(spec, error); + $scope.spinner[key] = false; + }); + }); + }, true); + + $scope.$watch('networkElement', function(neId, oldValue) { + if (neId && neId !== '' && neId !== oldValue) { + + $scope.collapseAll(); + + // clear old data + $scope.airinterfaces = []; + $scope.structures = []; + $scope.containers = []; + $scope.onfLtps = []; + $scope.clock = undefined; + + $scope.networkElementId = neId; + $scope.revision = $scope.mountPoints.filter(function(mountpoint){ + return mountpoint['node-id'] === neId; + }).map(function(mountpoint){ + $scope.mountpoint = mountpoint; + return mountpoint.onfCoreModelRevision; + })[0]; + + var spec = { + nodeId: $scope.networkElementId, + revision: $scope.revision, + pacId: 'ne' + }; + $mwtnBrowser.getPacParts(spec).then(function(success){ + updatePart(spec, $mwtnBrowser.yangifyObject(success)); + }, function(error){ + updatePart(spec, error); + }); + + // network element alarms + var neAlarms = $scope.mountPoints.filter(function(mountpoint){ + return mountpoint['node-id'] === neId; + }).map(function(mountpoint){ + return mountpoint.onfCapabilities.filter(function(cap){ + return cap.module === 'MicrowaveModel-NetworkElement-CurrentProblemList' || cap.module === 'onf-core-model-conditional-packages'; + }); + }); + + if (neAlarms.length === 1 && neAlarms[0].length === 1 ) { + $translate('MWTN_LOADING').then(function (translation) { + $scope.neCurrentProblems = translation; + }); + } else { + $scope.neCurrentProblems = undefined; + } + + // ptp-clock + var ptpClock = $scope.mountPoints.filter(function(mountpoint){ + return mountpoint['node-id'] === neId; + }).map(function(mountpoint){ + return mountpoint.onfCapabilities.filter(function(cap){ + return cap.module === 'onf-ptp-dataset'; + }); + }); + if (ptpClock.length === 1 && ptpClock[0].length === 1 ) { + $translate('MWTN_LOADING').then(function (translation) { + $scope.clock = {'translation': translation}; + }); + } else { + $scope.clock = undefined; + } + + } + }); + + }]); + +}); diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.module.js b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.module.js new file mode 100644 index 00000000..d529ca2f --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.module.js @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016 highstreet technologies GmbH and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +define(['angularAMD', + 'app/routingConfig', + 'app/core/core.services', + 'common/config/env.module', + 'app/mwtnCommons/mwtnCommons.module', + 'app/mwtnCommons/bower_components/angular-clipboard/angular-clipboard'], function(ng) { + var mwtnBrowserApp = angular.module('app.mwtnBrowser', ['ui.grid', 'ui.bootstrap', 'app.core', 'ui.router.state', 'config', 'angular-clipboard']); + + mwtnBrowserApp.config(function($stateProvider, $compileProvider, $controllerProvider, $provide, NavHelperProvider, $translateProvider) { + mwtnBrowserApp.register = { + controller : $controllerProvider.register, + directive : $compileProvider.directive, + factory : $provide.factory, + service : $provide.service + }; + + NavHelperProvider.addControllerUrl('app/mwtnBrowser/mwtnBrowser.controller'); + NavHelperProvider.addToMenu('mwtnBrowser', { + "link" : "#/pnfBrowser/", + "active" : "main.mwtnBrowser", + "title" : "pnf Config", + "icon" : "fa fa-cogs", // Add navigation icon css class here + "page" : { + "title" : "pnf Config", + "description" : "mwtnBrowser" + } + }); + + var access = routingConfig.accessLevels; + + $stateProvider.state('main.mwtnBrowser', { + url: 'pnfBrowser/:nodeId', + access: access.admin, + views : { + content : { + templateUrl: 'src/app/mwtnBrowser/templates/frame.tpl.html', + controller: 'mwtnBrowserCtrl' + } + } + }); + + }); + + return mwtnBrowserApp; +}); diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.services.js b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.services.js new file mode 100644 index 00000000..7cd9dc07 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/mwtnBrowser.services.js @@ -0,0 +1,37 @@ +/* + * @copyright 2017 highstreet technologies and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +define(['app/mwtnCommons/mwtnCommons.module', 'app/mwtnBrowser/mwtnBrowser.module'],function(mwtnBrowserApp) { + + mwtnBrowserApp.register.factory('$mwtnBrowser', function($mwtnCommons, $mwtnDatabase, $mwtnLog) { + + var COMPONENT = '$mwtnBrowser'; + $mwtnLog.info({component: COMPONENT, message: '$mwtnBrowser started!'}); + + var service = {}; + + service.separator = $mwtnCommons.separator; + + service.parts = $mwtnCommons.parts; + service.getPacParts = $mwtnCommons.getPacParts; + service.getModules = $mwtnDatabase.getModules; + service.getPartGlobalId = $mwtnCommons.getPartGlobalId; + service.getPartLocalId = $mwtnCommons.getPartLocalId; + service.getViewData = $mwtnCommons.getViewData; + service.getForwardingConstruct = $mwtnCommons.getForwardingConstruct; + service.layerProtocolNameOrder = $mwtnCommons.layerProtocolNameOrder; + service.yangify = $mwtnCommons.yangify; + service.yangifyObject = $mwtnCommons.yangifyObject; + + service.refreshPTP = function() { + console.error('refresh ptp'); + } + return service; + }); + +}); diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/frame.tpl.html b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/frame.tpl.html new file mode 100644 index 00000000..6d43dbd8 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/frame.tpl.html @@ -0,0 +1,191 @@ +<ht-header help-link='sdnr/pnfConfig/0.4.0/README.md'></ht-header> +<mwtn-select-network-element></mwtn-select-network-element> + +<div class="owl container" ng-if="networkElements.length !== 0 && networkElement" style="width: 100%;"> + <div class="row"> + <uib-accordion close-others="oneAtATime"> + <div class="col-md-12"> + <div uib-accordion-group class="panel-primary" is-open="status.ne"> + <uib-accordion-heading> + <i class="fa" ng-class="{'fa-chevron-down': status.ne, 'fa-chevron-right': !status.ne}"></i> + <span>{{'MWTN_NETWORKELEMENT' | translate}} '{{onfNetworkElement.getName()}}' </span> + <span> (#{{'MWTN_LTPS' | translate}}: {{onfNetworkElement.getLogicalTerminationPoints().length}})</span> + <i class="fa fa-spinner fa-pulse" ng-show="spinner.ne"></i> + </uib-accordion-heading> + <mwtn-json-viewer network-element="networkElement" data="onfNetworkElement.getData()" ne="true" ng-if="status.ne"></mwtn-json-viewer> + <br/> + + <uib-accordion close-others="oneAtATime"> + <div uib-accordion-group class="panel-default" is-open="status.neCurrentProblems" ng-if="neCurrentProblems"> + <uib-accordion-heading> + <i class="fa" ng-class="{'fa-chevron-down': status.neCurrentProblems, 'fa-chevron-right': !status.neCurrentProblems}"></i> + <span>{{'MWTN_CURRENT_PROBLEM_LIST' | translate}}</span> + <i class="fa fa-spinner fa-pulse" ng-show="spinner.neCurrentProblems"></i> + </uib-accordion-heading> + + <mwtn-grid network-element="networkElement" data="neCurrentProblems" ng-if="neCurrentProblems && !spinner.neCurrentProblems"></mwtn-grid> + </div> + + <div uib-accordion-group class="panel-default" is-open="status.forwardingDomain" ng-show="forwardingDomain"> + <uib-accordion-heading> + <i class="fa" ng-class="{'fa-chevron-down': status.forwardingDomain, 'fa-chevron-right': !status.forwardingDomain}"></i> + <span>{{'MWTN_FORWARDING_DOMAIN' | translate}}</span> + <i class="fa fa-spinner fa-pulse" ng-show="spinner.forwardingDomain"></i> + </uib-accordion-heading> + + <mwtn-json-viewer network-element="networkElement" data="forwardingDomain" ng-if="status.forwardingDomain"></mwtn-json-viewer> + </div> + + <div uib-accordion-group class="panel-default" is-open="status.forwardingConstructs" ng-show="forwardingConstructs"> + <uib-accordion-heading> + <i class="fa" ng-class="{'fa-chevron-down': status.forwardingConstructs, 'fa-chevron-right': !status.forwardingConstructs}"></i> + <span>{{'MWTN_FORWARDING_CONSTRUCTS' | translate}}</span> + <i class="fa fa-spinner fa-pulse" ng-show="spinner.forwardingConstructs"></i> + </uib-accordion-heading> + + <mwtn-grid network-element="networkElement" data="forwardingConstructs" ng-if="forwardingConstructs && !spinner.forwardingConstructs"></mwtn-grid> + + <!-- create fc --> + <div class="row"> + <div class="col col-md-3"> + <label class="owl-dark" for="vlan">{{'MWTN_LTP1' | translate}}</label><br/> + <select class="form-control" ng-model="fcCreation.ltp1"> + <option ng-repeat="ltp in forwardingDomain.ltp" value="{{ltp}}">{{ltp}}</option> + </select> + </div> + <div class="col col-md-3"> + <label class="owl-dark" for="vlan">{{'MWTN_LTP2' | translate}}</label><br/> + <select class="form-control" ng-model="fcCreation.ltp2"> + <option ng-repeat="ltp in forwardingDomain.ltp" value="{{ltp}}">{{ltp}}</option> + </select> + </div> + <div class="col col-md-1 form-group"> + <label class="owl-dark" for="vlan">{{'MWTN_SERVICE_ID' | translate}}</label><br/> + <input class="form-control" type="number" value="42" id="example-number-input" ng-model="fcCreation.vlan"> + </div> + <div class="col col-md-2"> + <label style="color:white;" for="create">create</label><br/> + <button type="button" class="btn btn-warning" ng-click="createForwardingConstruct()"> + <i class="fa fa-plus" aria-hidden="true"></i> + <span style="color:white;">{{'MWTN_CREATE' | translate}}</span> + </button> + </div> + <div class="col col-md-3"> + <span class="owl-dark" ng-if="!fcCreation.error">{{fcCreation.info}}</span> + <span class="error" ng-if="fcCreation.error">{{fcCreation.error}}</span> + </div> + </div> + + <!-- delete fc --> + <div class="row"> + <div class="col col-md-6 form-group"> + <label class="owl-dark" for="vlan">{{'MWTN_FC_UUID' | translate}}</label><br/> + <select class="form-control" ng-model="fcDeletion.ltp"> + <option ng-repeat="fc in forwardingConstructs" value="{{fc.uuid}}">{{fc.uuid}}</option> + </select> + </div> + <div class="col col-md-2 col-md-offset-1" > + <label style="color:white;" for="delete">delete</label><br/> + <button type="button" class="btn btn-danger" ng-click="deleteForwardingConstruct()"> + <i class="fa fa-times" aria-hidden="true"></i> + <span style="color:white;">{{'MWTN_DELETE' | translate}}</span> + </button> + </div> + <div class="col col-md-3"> + <span class="owl-dark" ng-if="!fcDeletion.error">{{fcDeletion.info}}</span> + <span class="error" ng-if="fcDeletion.error">{{fcDeletion.error}}</span> + </div> + </div> + + </div> + + <div ng-repeat="ltp in onfLtps" ng-show="status.ne" uib-accordion-group class="panel-default" is-open="status['ltp' + separator + ltp.getData().uuid]"> + <uib-accordion-heading> + <i class="fa" ng-class="{'fa-chevron-down': status['ltp' + separator + ltp.getData().uuid], 'fa-chevron-right': !status['ltp' + separator + ltp.getData().uuid]}"></i> + <span>{{'MWTN_LTP' | translate}}(</span> + <b>{{ltp.getLayerProtocols()[0].getItuLabel().toUpperCase()}}</b> + <span>): {{ltp.getName()}} (ID: {{ltp.getId()}})</span> + </uib-accordion-heading> + + <mwtn-json-viewer network-element="networkElement" data="ltp.getData()" ng-if="status['ltp' + separator + ltp.getData().uuid]"></mwtn-json-viewer> + </div> + </uib-accordion> + </div> + + <div uib-accordion-group class="panel-default" is-open="status.clock" ng-if="clock"> + <uib-accordion-heading> + <i class="fa" ng-class="{'fa-chevron-down': status.clock, 'fa-chevron-right': !status.clock}"></i> + <span>{{'MWTN_CLOCK' | translate}}</span> + <i class="fa fa-spinner fa-pulse" ng-show="spinner.clock"></i> + </uib-accordion-heading> + + <!-- <mwtn-json-viewer network-element="networkElement" data="clock.getData()" ng-if="clock.getData() && !spinner.clock"></mwtn-json-viewer> --> + <mwtn-ptp-clock-viewer network-element="networkElement" data="clock.getData()" ng-if="clock.getData() && !spinner.clock"></mwtn-ptp-clock-viewer> + </div> + + + </div> + + + </uib-accordion> + </div> + + <div class="row" ng-repeat="orderedPac in orderedPacs" ng-if="pacs[orderedPac]"> + <uib-accordion close-others="oneAtATime"> + <div ng-class="{ 'col-md-12': pacs[orderedPac].length === 1, 'col-md-6': pacs[orderedPac].length !== 1 }" style="margin-top: 5px;" + ng-repeat="pac in pacs[orderedPac]"> + <div uib-accordion-group class="panel-primary" is-open="status[ [orderedPac, pac['layer-protocol']].join(separator) ]"> + <uib-accordion-heading> + <i class="fa" ng-class="{'fa-chevron-down': status[ [orderedPac, pac['layer-protocol']].join(separator) ], 'fa-chevron-right': !status[ [orderedPac, pac['layer-protocol']].join(separator) ]}"></i> + <span>{{ ['mwtn', orderedPac].join('-').replaceAll('-', '_').toUpperCase() | translate }} '{{pac['layer-protocol']}}'</span> + </uib-accordion-heading> + + <div ng-repeat="part in parts" uib-accordion-group class="panel-default" is-open="status[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]"> + <uib-accordion-heading> + <i class="fa" ng-class="{'fa-chevron-down': status[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ], 'fa-chevron-right': !status[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]}"></i> + <span>{{ ['mwtn', part].join('-').replaceAll('-', '_').toUpperCase() | translate}}</span> + <i class="fa fa-spinner fa-pulse" ng-show="spinner[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]"></i> + </uib-accordion-heading> + + + <!-- current-problem-list --> + <mwtn-grid network-element="networkElement" data="pac[part].data['current-problem-list']" ng-if="pac[part].data['current-problem-list'] && !spinner[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]"></mwtn-grid> + <div ng-if="pac[part].data['current-problem-list'].length === 0">Alarm free ;)</div> + + <!-- PM Current --> + <mwtn-json-viewer network-element="networkElement" data="pac[part].data['current-performance-data-list'][0]" + path="[orderedPac, pac['layer-protocol'], pac[part].id].join(separator)" + ng-if="part === 'current-performance' && pac[part].data && !spinner[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]"></mwtn-json-viewer> + <hr ng-if="part === 'current-performance' && pac[part].data && !spinner[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]"> + <mwtn-json-viewer network-element="networkElement" data="pac[part].data['current-performance-data-list'][1]" + path="[orderedPac, pac['layer-protocol'], pac[part].id].join(separator)" + ng-if="part === 'current-performance' && pac[part].data && !spinner[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]"></mwtn-json-viewer> + + <!-- PM history --> + <mwtn-grid network-element="networkElement" data="pac[part].data['historical-performance-data-list']" + path="[orderedPac, pac['layer-protocol'], pac[part].id].join(separator)" + ng-if="pac[part].data['historical-performance-data-list'] && !spinner[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]"></mwtn-grid> + + <!-- else --> + <mwtn-json-viewer network-element="networkElement" data="pac[part].data" + path="[orderedPac, pac['layer-protocol'], pac[part].id].join(separator)" + ng-if="status[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator)] && + pac[part].data && + part !== 'current-problems' && + part !== 'current-performance' && + part !== 'historical-performances' && + !spinner[ [orderedPac, pac['layer-protocol'], pac[part].id].join(separator) ]"></mwtn-json-viewer> + + </div> + </div> + </div> + <hr class="white"> + </uib-accordion> + </div> + +</div> + +<hr /> +<div class="owl"> + <span class="white">ONAP SDN-R | ONF Wireless for @distversion@ - Build: @buildtime@</span> +</div> diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/mwtnPtpClockViewer.tpl.html b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/mwtnPtpClockViewer.tpl.html new file mode 100644 index 00000000..1a6849df --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/mwtnPtpClockViewer.tpl.html @@ -0,0 +1,66 @@ +<div class="owl"> + <div class="row text-right"> + <div class="form-group"> + <button class="btn btn-default" type="button" clipboard supported="myClipboard.supported" text="myClipboard.getJson()" + on-copied="myClipboard.copyToClipboard()" on-error="myClipboard.error(err)"> + <i class="fa fa-clipboard" aria-hidden="true"></i> + </button> + <button class="btn btn-default" type="button" ng-if="replace"> + <i class="fa fa-pencil-square-o pointer" aria-hidden="true" ng-click="openConfigView()" ></i> + </button> + <div> + </div> +</div> +<div class="owl"> + +<!-- + <div class="row" ng-repeat="(key, value) in viewData track by $index" ng-show="value.value !== undefined"> + <span class="owl-dark">{{key | json}}</span><br/> + <span class="owl-dark">{{value | json}}</span><br/> + <span class="owl-dark">{{viewData[key].labelId | translate}}</span> + <span class="owl-dark">{{viewData['instance-number'].labelId | translate}}</span> + </div> --> + + <!-- instance-number - -> + <div class="row"> + <div class="col col-md-3 text-right" title="{{viewData['instance-number'].description}}"> + <span class="owl-dark">{{viewData['instance-number'].labelId | translate}}</span> + </div> + <div class="col col-md-4"> + <b>{{viewData['instance-number'].value}}</b> + </div> + </div> --> + + <!-- current-ds --> + <div class="row"> + <div class="column col-md-6 text-left" title="{{viewData['default-ds'].description}}"> + <b>{{viewData['default-ds'].labelId | translate}}</b> + <i class="fa fa-pencil-square-o pointer" aria-hidden="true" ng-click="show(viewData['default-ds'].value)"></i> + <br/> + <mwtn-json-viewer network-element="networkElement" data="viewData['default-ds'].value" no-buttons="true" ng-if="viewData['default-ds'].value"></mwtn-json-viewer> + <hr/> + </div> + + <div class="column col-md-6 text-left" title="{{viewData['parent-ds'].description}}"> + <b>{{viewData['parent-ds'].labelId | translate}}</b> + <br/> + <mwtn-json-viewer network-element="networkElement" data="viewData['parent-ds'].value" no-buttons="true" ng-if="viewData['parent-ds'].value"></mwtn-json-viewer> + <hr/> + </div> + + <div class="column col-md-6 text-left" ng-repeat="key in ['current-ds', 'time-properties-ds']" title="{{viewData[key].description}}"> + <b>{{viewData[key].labelId | translate}}</b> + <br/> + <mwtn-json-viewer network-element="networkElement" data="viewData[key].value" no-buttons="true" ng-if="viewData[key].value"></mwtn-json-viewer> + <hr/> + </div> + </div> + + <div class="row"> + <div class="col col-md-12 text-left" > + <b>{{'MWTN_PORT_DS_LIST' | translate}}</b> + <br/> + <mwtn-ptp-ports network-element="networkElement" data="viewData['port-ds-list'].value" path="path"></mwtn-ptp-ports> + </div> + </div> +</div>
\ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/mwtnPtpPorts.tpl.html b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/mwtnPtpPorts.tpl.html new file mode 100644 index 00000000..2751ffcb --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/mwtnPtpPorts.tpl.html @@ -0,0 +1,23 @@ +<div class="owl co1ntainer" > + + <div class="row"> + <div class="col-md-12"> + + <div ng-if="info !== false"> + <span class="owl-dark">{{info}}</span> + </div> + + <div ui-grid="gridOptions" + ui-grid-exporter + ui-grid-selection + ui-grid-pinning + ui-grid-resize-columns + ui-grid-move-columns + ui-grid-auto-resize + class="mwtn-grid" + ng-style="getTableHeight()"></div> + + </div> + </div> + +</div>
\ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/ptpDefaultDsConfigView.tpl.html b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/ptpDefaultDsConfigView.tpl.html new file mode 100644 index 00000000..cb0e40c2 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/ptpDefaultDsConfigView.tpl.html @@ -0,0 +1,45 @@ +<div class="modal-header"> + <h3 class="modal-title" id="modal-title">{{'MWTN_PTP_DEFAULT_DS_CONFIGURATION' | translate}}</h3> +</div> +<div class="modal-body" id="modal-body"> + <div class="container" style="width:100%"> + <div class="row"> + <div class="col-md-3 text-right" > + {{'MWTN_NETWORKELEMENT' | translate}} + </div> + <div class="col-md-9"> + <b>{{data.networkElement}}</b> + </div> + </div> + <hr/> + <div class="row"> + + <div ng-repeat="(key, item) in viewData" ng-if="item.visible === true"> + + <!-- text, number, combo --> + <div class="col-md-3 text-right radio">{{item.labelId | translate}}</div> + <div ng-class="{'col-md-2':item.unit, 'col-md-3':!item.unit}" class="form-group" ng-if="item.controlType !== 'checkbox' && getType(item.controlType) !== 'array'"> + <input class="form-control" type="{{item.controlType}}" ng-model="item.value" ng-disabled="item['is-read-only'] === true" min="{{item.min}}" max="{{item.max}}"></input> + </div> + + <div class="col-md-3 checkbox" ng-if="item.controlType === 'checkbox' "><input type="checkbox" ng-model="item.value" ng-disabled="item['is-read-only'] === true" /></div> + <div ng-class="{'col-md-2':item.unit, 'col-md-3':!item.unit}" class="form-group" ng-if="getType(item.controlType) === 'array'"> + <select class="form-control" ng-model="item.value" ng-disabled="item['is-read-only'] === true"> + <option ng-repeat="option in item.controlType track by $index" value="{{option}}">{{option}}</option> + </select> + </div> + <div class="col-md-1 radio" ng-if="item.unit"> + <span class="owl-dark">{{item.unit}}</span> + </div> + + </div> + </div> +</div> +<div class="modal-footer"> + <div class="{{applied.class}}", ng-show="applied">{{applied.text}}</div> + <button class="btn btn-primary" type="button" ng-click="ok()"> + <span style="color: white;">{{'MWTN_APPLY' | translate}}</span> + <i class="pull-right fa fa-spinner fa-pulse" ng-show="processing"></i> + </button> + <button class="btn btn-warning" type="button" ng-click="cancel()">{{'MWTN_CLOSE' | translate}}</button> +</div>
\ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/ptpPortConfigView.tpl.html b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/ptpPortConfigView.tpl.html new file mode 100644 index 00000000..5d7d9df5 --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/mwtnBrowser-module/src/main/resources/mwtnBrowser/templates/ptpPortConfigView.tpl.html @@ -0,0 +1,53 @@ +<div class="modal-header"> + <h3 class="modal-title" id="modal-title">{{'MWTN_PTP_PORT_CONFIGURATION' | translate}}</h3> +</div> +<div class="modal-body" id="modal-body"> + <div class="container" style="width:100%"> + <div class="row"> + <div class="col-md-3 text-right" > + {{'MWTN_NETWORKELEMENT' | translate}} + </div> + <div class="col-md-9"> + <b>{{data.networkElement}}</b> + </div> + </div> + <div class="row"> + <div class="col-md-3 text-right" > + {{'MWTN_PORT_IDENTITY' | translate}} + </div> + <div class="col-md-9"> + <b>{{data.value['port-identity']['clock-identity']}}#{{data.value['port-identity']['port-number']}}</b> + </div> + </div> + <hr/> + <div class="row"> + + <div ng-repeat="(key, item) in viewData" ng-if="item.visible === true"> + + <!-- text, number, combo --> + <div class="col-md-3 text-right radio">{{item.labelId | translate}}</div> + <div ng-class="{'col-md-2':item.unit, 'col-md-3':!item.unit}" class="form-group" ng-if="item.controlType !== 'checkbox' && getType(item.controlType) !== 'array'"> + <input class="form-control" type="{{item.controlType}}" ng-model="item.value" ng-disabled="item['is-read-only'] === true" min="{{item.min}}" max="{{item.max}}"></input> + </div> + + <div class="col-md-3 checkbox" ng-if="item.controlType === 'checkbox'"><input type="checkbox" ng-model="item.value" /></div> + <div ng-class="{'col-md-2':item.unit, 'col-md-3':!item.unit}" class="form-group" ng-if="getType(item.controlType) === 'array'"> + <select class="form-control" ng-model="item.value" ng-disabled="item['is-read-only'] === true"> + <option ng-repeat="option in item.controlType track by $index" value="{{option}}">{{option}}</option> + </select> + </div> + <div class="col-md-1 radio" ng-if="item.unit"> + <span class="owl-dark">{{item.unit}}</span> + </div> + + </div> + </div> +</div> +<div class="modal-footer"> + <div class="{{applied.class}}", ng-show="applied">{{applied.text}}</div> + <button class="btn btn-primary" type="button" ng-click="ok()"> + <span style="color: white;">{{'MWTN_APPLY' | translate}}</span> + <i class="pull-right fa fa-spinner fa-pulse" ng-show="processing"></i> + </button> + <button class="btn btn-warning" type="button" ng-click="cancel()">{{'MWTN_CLOSE' | translate}}</button> +</div>
\ No newline at end of file diff --git a/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/pom.xml b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/pom.xml new file mode 100644 index 00000000..7584afdc --- /dev/null +++ b/sdnr/wireless-transport/code-Carbon-SR1/ux/mwtnBrowser/pom.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.highstreet.technologies.odl.dlux</groupId> + <artifactId>mwtnBrowser</artifactId> + <version>0.5.1-SNAPSHOT</version> + <name>${prefix} ${project.artifactId}</name> + <packaging>pom</packaging> + + <parent> + <artifactId>mwtn</artifactId> + <groupId>com.highstreet.technologies.odl.dlux</groupId> + <version>0.5.1-SNAPSHOT</version> + <relativePath>..</relativePath> + </parent> + + <modules> + <module>mwtnBrowser-module</module> + <module>mwtnBrowser-bundle</module> + </modules> +</project> |