From e8a4652f70284c414ceafc086669dfd4b935573d Mon Sep 17 00:00:00 2001 From: Steven Saunders Date: Wed, 12 Aug 2015 08:48:07 -0600 Subject: Add demo-ui folder. This folder contains HTML/CSS/Javascript code for the VCPE Demo UI. The Demo UI allows you to CRUD CoS instances, and EPL instances, and will also display information about EVCs and UNIs that were created as well Change-Id: I32eea1121c21e0b451efc057a0c0f30fe5601cd5 Signed-off-by: Steven Saunders --- demo-ui/app/views/cos-panel.html | 171 +++++++++++++++++ demo-ui/app/views/css/vcpe.css | 340 ++++++++++++++++++++++++++++++++++ demo-ui/app/views/epl-panel.html | 187 +++++++++++++++++++ demo-ui/app/views/less/vcpe.less | 365 ++++++++++++++++++++++++++++++++++++ demo-ui/app/views/mef-panel.html | 370 +++++++++++++++++++++++++++++++++++++ demo-ui/app/views/vcpe-portal.html | 71 +++++++ 6 files changed, 1504 insertions(+) create mode 100644 demo-ui/app/views/cos-panel.html create mode 100644 demo-ui/app/views/css/vcpe.css create mode 100644 demo-ui/app/views/epl-panel.html create mode 100644 demo-ui/app/views/less/vcpe.less create mode 100644 demo-ui/app/views/mef-panel.html create mode 100644 demo-ui/app/views/vcpe-portal.html (limited to 'demo-ui/app/views') diff --git a/demo-ui/app/views/cos-panel.html b/demo-ui/app/views/cos-panel.html new file mode 100644 index 0000000..682f154 --- /dev/null +++ b/demo-ui/app/views/cos-panel.html @@ -0,0 +1,171 @@ + + +
Service Levels
+
+
+ {{ cos.id }} +
+
+ +
+ + + + + + + + + +
+ +
+
+ + + +
+
Name:
+
+ + {{ cosList[selectedCosIdx].id }} + +
+
+ +
+
+ +
+
Bandwidth:
+
+ + + {{ bwText(cosList[selectedCosIdx]) }} + +
+
+ +
+
+ + + +
+
Availability:
+
+ + {{ cosList[selectedCosIdx].availbility }} + + % +
+
+ + % +
+
+ + + +
+
Frame Delay:
+
+ + {{ cosList[selectedCosIdx].frameDelay }} + + ms +
+
+ + ms +
+
+ + + +
+
Jitter:
+
+ + {{ cosList[selectedCosIdx].jitter }} + + ms +
+
+ + ms +
+
+ + + +
+
Frame Loss:
+
+ + {{ cosList[selectedCosIdx].frameLoss }} + + % +
+
+ + % +
+
+ + +
+
Please Enter Unique Name
+
+
+ +
+
+
diff --git a/demo-ui/app/views/css/vcpe.css b/demo-ui/app/views/css/vcpe.css new file mode 100644 index 0000000..0d08734 --- /dev/null +++ b/demo-ui/app/views/css/vcpe.css @@ -0,0 +1,340 @@ +input[type='number'] { + font-size: 12px; +} +.choosable { + cursor: pointer; +} +.gradient { + background: -webkit-linear-gradient(rgba(255, 255, 255, 0) 0%, #ffffff 100%); + background: linear-gradient(to bottom, #ffffff 0%, rgba(255, 255, 255, 0) 100%); +} +.my-btn-addon { + height: 30px; + width: 100px; +} +.primary-lable { + color: darkred; + font-size: large; + font-weight: bold; + text-align: center; +} +.list-item { + color: black; + font-size: small; + font-weight: normal; + text-align: left; + background-color: none; +} +.selected-item-idle { + background-color: #e3e3e3; +} +.selected-item-delete { + background-color: #FFE4E1; +} +.selected-item-update { + background-color: #FFEFD5; +} +.primary-container { + border: 3px solid black; + background-color: #e3e3e3; + border-radius: 15px; + padding: 10px; + height: 400px; +} +.secondary-container { + border: 1px solid darkgray; + background-color: white; + padding: 5px 10px; + margin: 10px 10px -1px 10px; + height: 125px; + overflow-y: scroll; +} +.action-icon-container { + border: 1px solid darkgray; + background: -webkit-linear-gradient(rgba(255, 255, 255, 0) 0%, #ffffff 100%); + background: linear-gradient(to bottom, #ffffff 0%, rgba(255, 255, 255, 0) 100%); + margin: 0px 10px; + padding: 2px 10px; +} +.action-icon { + cursor: pointer; + padding: 0px 1px; + font-size: small; + color: black; + padding: 2px; +} +.action { + color: blue !important; +} +.warning { + color: red !important; + font-size: small !important; +} +.data-row { + display: flex; + flex-flow: row nowrap; + height: 20px; + width: 300; +} +.label-col { + color: purple; + font-size: small; + font-weight: normal; + text-align: left; + flex: 0 0 auto; + order: 1; + width: 85px; +} +.data-col { + flex: 0 0 auto; + order: 2; + color: black; + font-size: small; + font-weight: normal; + text-align: left; +} +.data-label { + color: purple; + font-size: small; + font-weight: normal; + text-align: left; + vertical-align: middle; +} +.data-item { + color: black; + font-size: small; + font-weight: bold; + text-align: left; +} +.data-input { + height: 20px; + width: 70px; + border-radius: 5px; +} +.cos-dd-input { + height: 20px; + width: 70px; +} +.epl-dd-input { + height: 20px; + width: 150px; +} +.data-unit { + color: black; + font-size: small; + font-weight: normal; + text-align: left; + margin-left: 5px; + vertical-align: middle; +} +.header-container { + display: flex; + flex-flow: row nowrap; + justify-content: space-between; +} +.header-container .hdr { + flex: 1 1 auto; + order: 1; +} +.header-container .img { + flex: 1 1 auto; + order: 2; + align-self: flex-end; + margin-bottom: 12px; +} +.frame { + display: flex; + flex-flow: row nowrap; + border: 1px solid lightgray; + margin: 20px; + padding: 20px 0px; +} +.frame .left { + flex: 1 6 5%; + order: 1; +} +.frame .right { + flex: 1 6 5%; + order: 3; +} +.frame .content { + border: none; + flex: 1 6 90%; + order: 2; +} +.frame .content .action-container { + border: none; + display: flex; + flex-flow: row nowrap; +} +.frame .content .action-container .cos-container { + border: 3px solid black; + background-color: #e3e3e3; + border-radius: 15px; + padding: 10px; + height: 400px; + flex: 1 1 50%; + order: 1; + margin-right: 20px; +} +.frame .content .action-container .cos-container .cos-list { + border: 1px solid darkgray; + background-color: white; + padding: 5px 10px; + margin: 10px 10px -1px 10px; + height: 125px; + overflow-y: scroll; +} +.frame .content .action-container .cos-container .cos-info-contaier { + display: flex; + flex-flow: column nowrap; + margin: 10px 20px; +} +.frame .content .action-container .cos-container .cos-info-contaier .labelContainer { + flex: 1 1 33%; + order: 1; + min-width: 80px; + color: purple; + font-size: small; + font-weight: normal; + text-align: left; + vertical-align: middle; +} +.frame .content .action-container .cos-container .warning-container { + height: 15px; + margin-top: 10px; +} +.frame .content .action-container .epl-container { + border: 3px solid black; + background-color: #e3e3e3; + border-radius: 15px; + padding: 10px; + height: 400px; + flex: 1 1 50%; + order: 2; + margin-right: 20px; +} +.frame .content .action-container .epl-container .epl-list { + border: 1px solid darkgray; + background-color: white; + padding: 5px 10px; + margin: 10px 10px -1px 10px; + height: 125px; + overflow-y: scroll; +} +.frame .content .action-container .epl-container .epl-info-contaier { + display: flex; + flex-flow: column nowrap; + margin: 10px 20px; +} +.frame .content .action-container .epl-container .epl-info-contaier .labelContainer { + flex: 1 1 33%; + order: 1; + min-width: 80px; + color: purple; + font-size: small; + font-weight: normal; + text-align: left; + vertical-align: middle; +} +.frame .content .action-container .epl-container .warning-container { + height: 15px; + margin-top: 10px; +} +.frame .content .monitor-container .mef-container { + border: 3px solid black; + background-color: #e3e3e3; + border-radius: 15px; + padding: 10px; + height: 400px; + height: 450px; + background-color: #B0C4DE; + margin: 20px 20px 20px 0px; +} +.frame .content .monitor-container .mef-container .primary-mef-lable { + color: SteelBlue; + font-size: large; + font-weight: bold; + text-align: center; + margin-bottom: 10px; +} +.frame .content .monitor-container .mef-container .mef-panel-hdr { + border-bottom: 1px solid SlateGray; +} +.frame .content .monitor-container .mef-container .secondary-mef-label { + color: SlateGray; + font-size: small; + font-weight: bold; + text-align: center; + background-color: #e3e3e3; +} +.frame .content .monitor-container .mef-container .mef-data-label { + color: purple; + font-size: small; + font-weight: normal; + text-align: left; + vertical-align: middle; +} +.frame .content .monitor-container .mef-container .mef-label-col { + color: purple; + font-size: small; + font-weight: normal; + text-align: left; + flex: 0 0 auto; + order: 1; + padding-left: 10px; +} +.frame .content .monitor-container .mef-container .evc-label-col { + color: purple; + font-size: small; + font-weight: normal; + text-align: left; + flex: 0 0 auto; + order: 1; + padding-left: 10px; + width: 200px; +} +.frame .content .monitor-container .mef-container .uni-label-col { + color: purple; + font-size: small; + font-weight: normal; + text-align: left; + flex: 0 0 auto; + order: 1; + padding-left: 10px; + width: 100px; +} +.frame .content .monitor-container .mef-container .mef-info-container { + display: flex; + flex-flow: row nowrap; + justify-content: center; +} +.frame .content .monitor-container .mef-container .mef-info-container .mef-secondary-container { + border: 1px solid darkgray; + background-color: WhiteSmoke; + margin: 5px; +} +.frame .content .monitor-container .mef-container .mef-info-container .uni1-container { + border: 1px solid darkgray; + background-color: WhiteSmoke; + margin: 5px; + border: 2px solid SlateGray; + flex: 1 1 24%; + order: 1; +} +.frame .content .monitor-container .mef-container .mef-info-container .evc-container { + border: 1px solid darkgray; + background-color: WhiteSmoke; + margin: 5px; + border: 2px solid SlateGray; + flex: 1 1 38%; + order: 2; +} +.frame .content .monitor-container .mef-container .mef-info-container .uni2-container { + border: 1px solid darkgray; + background-color: WhiteSmoke; + margin: 5px; + border: 2px solid SlateGray; + flex: 1 1 24%; + order: 3; +} diff --git a/demo-ui/app/views/epl-panel.html b/demo-ui/app/views/epl-panel.html new file mode 100644 index 0000000..3de2523 --- /dev/null +++ b/demo-ui/app/views/epl-panel.html @@ -0,0 +1,187 @@ + + + + +
Ethernet Private Line Services
+
+
+ {{ epl.id }} +
+
+ + + + +
+ + + + + + + + + +
+ + + +
+
+ + + +
+
Name:
+
+ + {{ eplList[selectedEplIdx].id }} + +
+ +
+ +
+
+ + + +
+
Service level
+
+ + {{ eplList[selectedEplIdx].cos }} +
+
+ +
+
+ + + + +
+
UNI 1
+
+ + {{ eplList[selectedEplIdx].uniHostIpList[0] }}  + ( {{ eplList[selectedEplIdx].custAddressList[0] }} ) + +
+ +
+ +
+
+ + + + +
+
UNI 2
+
+ + {{ eplList[selectedEplIdx].uniHostIpList[1] }}  + ( {{ eplList[selectedEplIdx].custAddressList[1] }} ) + +
+ +
+ +
+
+ + + + +
+
Assoc Evc:
+
+ + {{ eplList[selectedEplIdx].evcId }} + +
+
+ + + +
+  [Please Enter Unique Name]    + [UNI-1 and UNI-2 must be different]    + [Must create SL before creating EPL]    +
+
+ +
+ + + + + +
+
diff --git a/demo-ui/app/views/less/vcpe.less b/demo-ui/app/views/less/vcpe.less new file mode 100644 index 0000000..5598160 --- /dev/null +++ b/demo-ui/app/views/less/vcpe.less @@ -0,0 +1,365 @@ +@dbg-flg: false; + +@side-panel-width: 5%; +@main-panel-width: 100%-(2*@side-panel-width); + +@backgroundGray: #E3E3E3; + +@cos-basis: 50%; +@epl-basis: 100%-(@cos-basis); + + +// +// Utilities +// + +.dbg-border( // show border if @dbg-flg is true + @dbg-bordersFlg, + @dbg-borderClr, + @dbg-borderStyle) + when (@dbg-bordersFlg=true) { + border: 3px @dbg-borderStyle @dbg-borderClr; + margin: 1px; padding: 1px; +} + +.set-text(@color, + @font-size, + @font-weight, + @text-align) { + color:@color; font-size:@font-size; + font-weight:@font-weight; text-align:@text-align; +} + +// +// Common Styles +// + +input[type='number'] { font-size: 12px; } + +.choosable { + cursor: pointer; +} + +.gradient { + background: -webkit-linear-gradient(rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%); + background: linear-gradient(to bottom, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0) 100%); +} + +.my-btn-addon { + height: 30px; + width: 100px; +} + +.primary-lable { + .set-text(darkred, large, bold, center); } + +.list-item { + .set-text(black, small, normal, left); + background-color:none; } + +.selected-item-idle { + background-color: @backgroundGray; } + +.selected-item-delete { + background-color: #FFE4E1; } + +.selected-item-update { + background-color: #FFEFD5; } + +.primary-container { + border: 3px solid black; + .dbg-border(@dbg-flg, blue, solid); + background-color: @backgroundGray; + border-radius: 15px; + padding: 10px; + height: 400px; +} + +.secondary-container { + border: 1px solid darkgray; + .dbg-border(@dbg-flg, green, solid); + background-color: white; + padding: 5px 10px; // TB RL + margin: 10px 10px -1px 10px; // T R B L + height: 125px; + overflow-y: scroll; +} + +.action-icon-container { + border: 1px solid darkgray; + .dbg-border(@dbg-flg, magenta, solid); + .gradient; + margin: 0px 10px; // TB RL + padding: 2px 10px; // TB RL +} + +.action-icon { + .choosable; + padding: 0px 1px; // TB RL + font-size: small; + color: black; + padding: 2px; +} + +.action { + color: blue !important; +} + +.warning { + color: red !important; + font-size: small !important; +} + +.data-row { + .dbg-border(@dbg-flg, red, solid); + display: flex; + flex-flow:row nowrap; + height: 20px; + width: 300; + } +.label-col { + .dbg-border(@dbg-flg, gray, solid); + .set-text(purple, small, normal, left); + flex: 0 0 auto; order: 1; + width: 85px; + } + + +.data-col { + .dbg-border(@dbg-flg, gray, solid); + flex: 0 0 auto; order: 2; + .set-text(black, small, normal, left); + + } + +.data-label { + .set-text(purple, small, normal, left); + vertical-align: middle; +} +.data-item { + .set-text(black, small, bold, left); +} +.data-input { + height: 20px; + width: 70px; + border-radius: 5px; +} +.cos-dd-input { + height: 20px; + width: 70px; +} + +.epl-dd-input { + height: 20px; + width: 150px; +} + + +.data-unit { + .set-text(black, small, normal, left); + margin-left: 5px; + vertical-align: middle; +} + +// +// Page starts here +// + +.header-container { + display: flex; + flex-flow:row nowrap; + justify-content: space-between; + .hdr { + flex: 1 1 auto; order: 1; + } + .img { + flex: 1 1 auto; order: 2; + align-self: flex-end; + margin-bottom: 12px; + } +} + + +.frame{ + .dbg-border(@dbg-flg, lightgray, solid); + display: flex; + flex-flow:row nowrap; + border: 1px solid lightgray; + + margin: 20px; // TBRL + padding: 20px 0px; // TB RL + + .left { .dbg-border(@dbg-flg, lightgray, solid); + flex: 1 6 @side-panel-width; order: 1; } + + .right{ .dbg-border(@dbg-flg, lightgray, solid); + flex: 1 6 @side-panel-width; order: 3; } + + .content { + border: none; + .dbg-border(@dbg-flg, lightgray, solid); + flex: 1 6 @main-panel-width; order: 2; + + .action-container { + border: none; + .dbg-border(@dbg-flg, yellow, solid); + + display: flex; + flex-flow:row nowrap; + + .cos-container { + .primary-container; + flex: 1 1 @cos-basis; order: 1; + margin-right: 20px; + + .cos-list { + .secondary-container; + } + .cos-info-contaier { + .dbg-border(@dbg-flg, green, solid); + display: flex; + flex-flow:column nowrap; + margin: 10px 20px; // TB RL + .labelContainer { + .dbg-border(@dbg-flg, yellow, solid); + flex: 1 1 33%; order: 1; + min-width: 80px; + .data-label; + } + } + .warning-container { + .dbg-border(@dbg-flg, magenta, solid); + height: 15px; + margin-top: 10px; + } + .button-container { + .dbg-border(@dbg-flg, magenta, solid); + } + } + .epl-container { + .primary-container; + flex: 1 1 @epl-basis; order: 2; + margin-right: 20px; + + .epl-list { + .secondary-container; + } + .epl-info-contaier { + .dbg-border(@dbg-flg, green, solid); + display: flex; + flex-flow:column nowrap; + margin: 10px 20px; // TB RL + .labelContainer { + .dbg-border(@dbg-flg, yellow, solid); + flex: 1 1 33%; order: 1; + min-width: 80px; + .data-label; + } + } + .warning-container { + .dbg-border(@dbg-flg, magenta, solid); + height: 15px; + margin-top: 10px; + } + .button-container { + .dbg-border(@dbg-flg, magenta, solid); + } + } + } + + .monitor-container { + .dbg-border(@dbg-flg, yellow, solid); + + + .mef-container { + .primary-container; + height: 450px; + + .dbg-border(@dbg-flg, blue, solid); + background-color: #B0C4DE; + margin: 20px 20px 20px 0px; // T R B L + + .primary-mef-lable { + .set-text(SteelBlue, large, bold, center); + margin-bottom: 10px; + } + + @mef-container-border-color: SlateGray; + + .mef-panel-hdr { + border-bottom: 1px solid @mef-container-border-color; + .dbg-border(@dbg-flg, blue, solid); + } + + .secondary-mef-label { + .set-text(SlateGray, small, bold, center); + background-color: @backgroundGray; + } + + .mef-data-label { + .set-text(purple, small, normal, left); + vertical-align: middle; + + } + .mef-label-col { + .dbg-border(@dbg-flg, gray, solid); + .set-text(purple, small, normal, left); + flex: 0 0 auto; order: 1; + padding-left: 10px; + } + + .evc-label-col { + .mef-label-col; + width: 200px; + + } + .uni-label-col { + .mef-label-col; + width: 100px; + } + + .mef-info-container { + display: flex; + flex-flow:row nowrap; + justify-content: center; + + .mef-secondary-container { + border: 1px solid darkgray; + .dbg-border(@dbg-flg, green, solid); + background-color: WhiteSmoke; + //padding: 5px 30px; // TB RL + margin: 5px; + } + + @evc-basis: 38%; + @uni-basis: 100%-(2*@evc-basis); + + .uni1-container { + .mef-secondary-container; + border: 2px solid @mef-container-border-color; + .dbg-border(@dbg-flg, darkred, solid); + flex: 1 1 @uni-basis; order: 1; + + } + .evc-container { + .mef-secondary-container; + border: 2px solid @mef-container-border-color; + .dbg-border(@dbg-flg, darkred, solid); + flex: 1 1 @evc-basis; order: 2; + + } + .uni2-container { + .mef-secondary-container; + border: 2px solid @mef-container-border-color; + .dbg-border(@dbg-flg, darkred, solid); + flex: 1 1 @uni-basis; order: 3; + + } + } + } + } + } +} + + + diff --git a/demo-ui/app/views/mef-panel.html b/demo-ui/app/views/mef-panel.html new file mode 100644 index 0000000..df9f60b --- /dev/null +++ b/demo-ui/app/views/mef-panel.html @@ -0,0 +1,370 @@ + + +
MEF EPL Data
+
+ + + + +
+
+
UNI-1 MEF Attributes
+
+ (Source = ODL UNI Mgr DB) +
+
+ +
+
Uni ID:
+
+ + {{ currentEvcUnis[0].uni[0]["id"] }} + +
+
+ +
+
IP Address:
+
+ + {{ currentEvcUnis[0].uni[0]["ip-address"] }} + +
+
+ +
+
MAC Address:
+
+ + {{ currentEvcUnis[0].uni[0]["mac-address"] }} + +
+
+ +
+
Speed:
+
+ + {{ uniToSpeedString(currentEvcUnis[0]) }} + +
+
+ +
+
Mac Layer:
+
+ + {{ currentEvcUnis[0].uni[0]["mac-layer"] }} + +
+
+ +
+
Phys Medium:
+
+ + {{ currentEvcUnis[0].uni[0]["physical-medium"] }} + +
+
+ +
+
MTU Size:
+
+ + {{ currentEvcUnis[0].uni[0]["mtu-size"] }} + +
+
+ +
+
Mode:
+
+ + {{ currentEvcUnis[0].uni[0]["mode"] }} + +
+
+ +
+
Type:
+
+ + {{ currentEvcUnis[0].uni[0]["type"] }} + +
+
+ +
+ + + +
+ +
+
EVC MEF Attributes
+
+ (Source = EVC Mgr DB)
+
+
+
Evc ID:
+
+ + {{ currentEplEvc.id }} + +
+
+ +
+
CoS ID:
+
+ + {{ currentEplEvc.cosId }} + +
+
+ +
+
Uni-1/2 IDs:
+
+ + + {{ "[" + currentEplEvc.uniIdList[0] + "] | [" + currentEplEvc.uniIdList[1] + "]"}} + + +
+
+ +
+
Uni-1/2 IPs:
+
+ + {{ currentEplEvc.uniIpList[0] }} + +
+
+
+
+
+ + {{ currentEplEvc.uniIpList[1] }} + +
+
+ +
+
Uni-1/2 MACs:
+
+ + {{ currentEplEvc.uniMacList[0] }} + +
+
+
+
+
+ + {{ currentEplEvc.uniMacList[1] }} + +
+
+ +
+
1-Way Availability:
+
+ + {{ currentEplEvc.oneWayAvailability }} + + % +
+
+ +
+
1-Way Frame Delay:
+
+ + {{ currentEplEvc.oneWayFrameDelay }} + + ms +
+
+ +
+
1-Way Frame Loss Ratio:
+
+ + {{ currentEplEvc.oneWayFrameLossRatio }} + + % +
+
+ +
+
EVC Type:
+
+ + {{ currentEplEvc.evcType }} + +
+
+ +
+
Unicast Frame Delivery:
+
+ + {{ currentEplEvc.unicastFrameDelivery }} + +
+
+ +
+
Broadcast Frame Delivery:
+
+ + {{ currentEplEvc.broadcastFrameDelivery }} + +
+
+ +
+
Multicast Frame Delivery:
+
+ + {{ currentEplEvc.multicastFrameDelivery }} + +
+
+ +
+
CE VLAN ID Preservation:
+
+ + {{ currentEplEvc.ceVLanIdPreservation }} + +
+
+ +
+
CE VLAN CoS Preservation:
+
+ + {{ currentEplEvc.ceVlanCosPreservation }} + +
+
+ +
+
Max Service Frame Size:
+
+ + {{ currentEplEvc.evcMaxSvcFrameSize }} + + bytes +
+
+
+ + + +
+
+
UNI-2 MEF Attributes
+
+ (Source = ODL UNI Mgr DB) +
+
+ +
+
Uni ID:
+
+ + {{ currentEvcUnis[1].uni[0]["id"] }} + +
+
+ +
+
IP Address:
+
+ + {{ currentEvcUnis[1].uni[0]["ip-address"] }} + +
+
+ +
+
MAC Address:
+
+ + {{ currentEvcUnis[1].uni[0]["mac-address"] }} + +
+
+ +
+
Speed:
+
+ + {{ uniToSpeedString(currentEvcUnis[1]) }} + +
+
+ +
+
Mac Layer:
+
+ + {{ currentEvcUnis[1].uni[0]["mac-layer"] }} + +
+
+ +
+
Phys Medium:
+
+ + {{ currentEvcUnis[1].uni[0]["physical-medium"] }} + +
+
+ +
+
MTU Size:
+
+ + {{ currentEvcUnis[0].uni[0]["mtu-size"] }} + +
+
+ +
+
Mode:
+
+ + {{ currentEvcUnis[1].uni[0]["mode"] }} + +
+
+ +
+
Type:
+
+ + {{ currentEvcUnis[1].uni[0]["type"] }} + +
+
+ +
+
\ No newline at end of file diff --git a/demo-ui/app/views/vcpe-portal.html b/demo-ui/app/views/vcpe-portal.html new file mode 100644 index 0000000..437485f --- /dev/null +++ b/demo-ui/app/views/vcpe-portal.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+

Virtual Business CPE Demo

+
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + -- cgit 1.2.3-korg