Implemented table building functions
Change-Id: Ie4003080b13725561df22de41ec85f8c3f31c794
diff --git a/web/gui2/src/main/webapp/app/view/device/device.component.css b/web/gui2/src/main/webapp/app/view/device/device.component.css
index c578112..4d8454d 100644
--- a/web/gui2/src/main/webapp/app/view/device/device.component.css
+++ b/web/gui2/src/main/webapp/app/view/device/device.component.css
@@ -17,12 +17,15 @@
/*
ONOS GUI -- Device View (layout) -- CSS file
*/
+#ov-device .tabular-header {
+ text-align: left;
+}
#ov-device h2 {
display: inline-block;
}
-#ov-device div.ctrl-btns {
+#ov-device, div.ctrl-btns {
}
diff --git a/web/gui2/src/main/webapp/app/view/device/device.component.html b/web/gui2/src/main/webapp/app/view/device/device.component.html
index febc99a..e2d3fda 100644
--- a/web/gui2/src/main/webapp/app/view/device/device.component.html
+++ b/web/gui2/src/main/webapp/app/view/device/device.component.html
@@ -1,3 +1,99 @@
<div id="ov-device">
- <p>device works!</p>
+ <div class="tabular-header">
+ <h2>Devices ({{ tableData.length }} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" (click)="toggleRefresh()">
+ <!-- See icon.theme.css for the defintions of the classes active and refresh-->
+ <onos-icon classes="{{ autoRefresh?'active refresh':'refresh' }}"
+ iconId="refresh" iconSize="42" toolTip="{{ autoRefreshTip }}"></onos-icon>
+ </div>
+ <div class="separator"></div>
+
+ <div>
+ <onos-icon classes="{{ selId ? 'current-view':undefined }}"
+ iconId="deviceTable" iconSize="42"></onos-icon>
+ </div>
+
+ <div routerLink="/flow" routerLinkActive="active">
+ <onos-icon classes="{{ selId ? 'active':undefined }}"
+ iconId="flowTable" iconSize="42" toolTip="{{ flowTip }}"></onos-icon>
+ </div>
+
+ <div routerLink="/port" routerLinkActive="active">
+ <onos-icon classes="{{ selId ? 'active':undefined }}"
+ iconId="portTable" iconSize="42" toolTip="{{ portTip }}"></onos-icon>
+ </div>
+
+ <div routerLink="/group" routerLinkActive="active">
+ <onos-icon classes="{{ selId ? 'active':undefined }}"
+ iconId="groupTable" iconSize="42" toolTip="{{ groupTip }}"></onos-icon>
+ </div>
+
+ <div routerLink="/meter" routerLinkActive="active">
+ <onos-icon classes="{{ selId ? 'active':undefined }}"
+ iconId="meterTable" iconSize="42" toolTip="{{ meterTip }}"></onos-icon>
+ </div>
+
+ <div routerLink="/pipeconf" routerLinkActive="active">
+ <onos-icon classes="{{ selId ? 'active':undefined }}"
+ iconId="pipeconfTable" iconSize="42" toolTip="{{ pipeconfTip }}"></onos-icon>
+ </div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <table onos-flash-changes id-prop="id" width="100%">
+ <tr class="table-header">
+ <th colId="available" class="table-icon" sortable></th>
+ <th colId="type" class="table-icon"></th>
+ <th colId="name" sortable>Friendly Name </th>
+ <th colId="id" sortable>Device ID </th>
+ <th colId="masterid" [ngClass]="{width: '130px'}" sortable>Master </th>
+ <th colId="num_ports" [ngClass]="{width: '70px'}" sortable>Ports </th>
+ <th colId="mfr" sortable>Vendor </th>
+ <th colId="hw" sortable>H/W Version </th>
+ <th colId="sw" sortable>S/W Version </th>
+ <th colId="protocol" [ngClass]="{width: '100px'}" sortable>Protocol </th>
+ </tr>
+
+ <tr class="table-body" *ngIf="tableData.length === 0" class="no-data">
+ <td colspan="9">{{ annots.noRowsMsg }}</td>
+ </tr>
+
+
+ <tr class="table-body" *ngFor="let dev of tableData; trackBy $index"
+ (click)="selectCallback($event, dev)"
+ [ngClass]="{selected: dev.id === selId, 'data-change': isChanged(dev.id)}">
+ <td class="table-icon">
+ <!--[ngClass]="{width: devAvail.getBBox().width}"-->
+ <onos-icon iconId="{{dev._iconid_available}}"></onos-icon>
+ </td>
+ <td class="table-icon">
+ <onos-icon iconId="{{dev._iconid_type}}"></onos-icon>
+ </td>
+ <td>{{ dev.name }}</td>
+ <td>{{ dev.id }}</td>
+ <td>{{ dev.masterid }}</td>
+ <td>{{ dev.num_ports }}</td>
+ <td>{{ dev.mfr }}</td>
+ <td>{{ dev.hw }}</td>
+ <td>{{ dev.sw }}</td>
+ <td>{{ dev.protocol }}</td>
+ </tr>
+ </table>
+ </div>
+ <small>
+ <p>TODO (21 Jun 18): Add in:</p>
+ <ul>
+ <li>Scrolling for long lists of devices</li>
+ <li>Sorting by column</li>
+ <li>Left align header columns</li>
+ <li>Move tooltip to underneath icon</li>
+ <li>Correct width and icon colour of active and device icon columns</li>
+ <li>Add device details panel</li>
+ <li>Add more unit tests</li>
+ <li>Make icon for #undefined work (e.g. for device type olt or unknown)</li>
+ <li>Change loading service to fade in and out and have a threshold of </li>
+ </ul>
+ </small>
</div>
diff --git a/web/gui2/src/main/webapp/app/view/device/device.component.ts b/web/gui2/src/main/webapp/app/view/device/device.component.ts
index 6929f9b..f4a6fbe 100644
--- a/web/gui2/src/main/webapp/app/view/device/device.component.ts
+++ b/web/gui2/src/main/webapp/app/view/device/device.component.ts
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, OnDestroy } from '@angular/core';
import { DetailsPanelService } from '../../fw/layer/detailspanel.service';
import { FnService } from '../../fw/util/fn.service';
import { IconService } from '../../fw/svg/icon.service';
@@ -23,42 +23,78 @@
import { MastService } from '../../fw/mast/mast.service';
import { NavService } from '../../fw/nav/nav.service';
import { PanelService } from '../../fw/layer/panel.service';
-import { TableBuilderService } from '../../fw/widget/tablebuilder.service';
+import { TableBaseImpl, TableResponse } from '../../fw/widget/tablebase';
import { TableDetailService } from '../../fw/widget/tabledetail.service';
import { WebSocketService } from '../../fw/remote/websocket.service';
+interface DeviceTableResponse extends TableResponse {
+ devices: Device[];
+}
+
+interface Device {
+ available: boolean;
+ chassisid: string;
+ hw: string;
+ id: string;
+ masterid: string;
+ mfr: string;
+ name: string;
+ num_ports: number;
+ protocol: string;
+ serial: string;
+ sw: string;
+ _iconid_available: string;
+ _iconid_type: string;
+}
+
+
/**
* ONOS GUI -- Device View Component
*/
@Component({
selector: 'onos-device',
templateUrl: './device.component.html',
- styleUrls: ['./device.component.css']
+ styleUrls: ['./device.component.css', './device.theme.css', '../../fw/widget/table.css', '../../fw/widget/table-theme.css']
})
-export class DeviceComponent implements OnInit {
+export class DeviceComponent extends TableBaseImpl implements OnInit, OnDestroy {
+
+ // TODO: Update for LION
+ flowTip = 'Show flow view for selected device';
+ portTip = 'Show port view for selected device';
+ groupTip = 'Show group view for selected device';
+ meterTip = 'Show meter view for selected device';
+ pipeconfTip = 'Show pipeconf view for selected device';
constructor(
private dps: DetailsPanelService,
- private fs: FnService,
+ protected fs: FnService,
+ protected ls: LoadingService,
private is: IconService,
private ks: KeyService,
- private log: LogService,
+ protected log: LogService,
private mast: MastService,
private nav: NavService,
private ps: PanelService,
- private tbs: TableBuilderService,
private tds: TableDetailService,
- private wss: WebSocketService,
- private ls: LoadingService, // TODO: Remove - already added through tbs
- private window: Window
+ protected wss: WebSocketService,
+ private window: Window,
) {
- this.log.debug('DeviceComponent constructed');
+ super(fs, ls, log, wss, 'device');
+ this.responseCallback = this.deviceResponseCb;
}
ngOnInit() {
+ this.init();
this.log.debug('DeviceComponent initialized');
- // TODO: Remove this - it's only for demo purposes
-// this.ls.startAnim();
+ }
+
+ ngOnDestroy() {
+ this.destroy();
+ this.log.debug('DeviceComponent destroyed');
+ }
+
+ deviceResponseCb(data: DeviceTableResponse) {
+ this.log.debug('Device response received for ', data.devices.length, 'devices');
}
}
diff --git a/web/gui2/src/main/webapp/app/view/device/device.module.ts b/web/gui2/src/main/webapp/app/view/device/device.module.ts
index 8f0f351..99b15bd 100644
--- a/web/gui2/src/main/webapp/app/view/device/device.module.ts
+++ b/web/gui2/src/main/webapp/app/view/device/device.module.ts
@@ -15,9 +15,11 @@
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
+import { RouterModule, Routes } from '@angular/router';
import { DeviceComponent } from './device.component';
import { DeviceDetailsPanelDirective } from './devicedetailspanel.directive';
-import { RemoteModule } from '../../fw/remote/remote.module';
+import { SvgModule } from '../../fw/svg/svg.module';
+
/**
* ONOS GUI -- Device View Module
*/
@@ -27,7 +29,8 @@
],
imports: [
CommonModule,
- RemoteModule
+ RouterModule,
+ SvgModule
],
declarations: [
DeviceComponent,