From 6ae7be6cac43f44625e76ae65007d6372d59afdb Mon Sep 17 00:00:00 2001 From: Nicolas Hu Date: Mon, 20 Jan 2020 11:03:22 -0500 Subject: [PATCH] improve dashboard UI Add instance selector dialog component and service Repair onSidenavClose method Change-Id: I1a5806b170df698caeed9250c79be3e3d0011659 Signed-off-by: Jun (Nicolas) Hu --- docs/release-notes.rst | 2 + .../src/app/ac-xapp/ac-xapp.component.ts | 17 +- .../app-configuration.component.ts | 2 +- .../src/app/app-control/app-control.component.ts | 9 +- .../src/app/caas-ingress/caas-ingress.component.ts | 7 +- .../src/app/catalog/catalog.component.ts | 13 +- .../src/app/footer/footer.component.html | 2 +- .../sidenav-list/sidenav-list.component.ts | 2 +- .../src/app/ran-control/ran-control.component.ts | 9 +- webapp-frontend/src/app/rd.component.html | 179 ++++++++++----------- webapp-frontend/src/app/rd.component.scss | 66 ++++++-- webapp-frontend/src/app/rd.component.ts | 38 ++--- webapp-frontend/src/app/rd.module.ts | 8 +- .../instance-selector/instance-selector.service.ts | 22 +-- .../ui/instance-selector-dialog.service.spec.ts | 31 ++++ .../ui/instance-selector-dialog.service.ts | 52 ++++++ .../instance-selector-dialog.component.html | 39 +++++ .../instance-selector-dialog.component.spec.ts | 45 ++++++ .../instance-selector-dialog.component.ts | 75 +++++++++ 19 files changed, 452 insertions(+), 166 deletions(-) create mode 100644 webapp-frontend/src/app/services/ui/instance-selector-dialog.service.spec.ts create mode 100644 webapp-frontend/src/app/services/ui/instance-selector-dialog.service.ts create mode 100644 webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.html create mode 100644 webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.spec.ts create mode 100644 webapp-frontend/src/app/ui/instance-selector-dialog/instance-selector-dialog.component.ts diff --git a/docs/release-notes.rst b/docs/release-notes.rst index 55202c86..87fe784d 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -19,6 +19,8 @@ Version 2.0.0, 20 Jan 2020 * Upgrade A1 Mediator API and submodule to tag 2.1.0 * Upgrade App Manager API and submodule to tag 0.3.3 * Upgrade E2 Manager API and submodule to tag 3.0.3 +* Add instance selector dialog component and service +* Repair onSidenavClose method Version 1.3.0, 26 Nov 2019 -------------------------- diff --git a/webapp-frontend/src/app/ac-xapp/ac-xapp.component.ts b/webapp-frontend/src/app/ac-xapp/ac-xapp.component.ts index b4e41cef..1f1d61e2 100644 --- a/webapp-frontend/src/app/ac-xapp/ac-xapp.component.ts +++ b/webapp-frontend/src/app/ac-xapp/ac-xapp.component.ts @@ -19,14 +19,15 @@ */ import { HttpErrorResponse } from '@angular/common/http'; -import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { Subscription } from 'rxjs'; import { ACAdmissionIntervalControl } from '../interfaces/ac-xapp.types'; +import { RicInstance } from '../interfaces/dashboard.types'; import { ACXappService } from '../services/ac-xapp/ac-xapp.service'; -import { ErrorDialogService } from '../services/ui/error-dialog.service'; -import { NotificationService } from './../services/ui/notification.service'; -import { Subscription } from 'rxjs'; import { InstanceSelectorService } from '../services/instance-selector/instance-selector.service'; +import { ErrorDialogService } from '../services/ui/error-dialog.service'; +import { NotificationService } from '../services/ui/notification.service'; @Component({ selector: 'rd-ac-xapp', @@ -55,11 +56,11 @@ export class AcXappComponent implements OnInit, OnDestroy { trigger_threshold: new FormControl('', [Validators.required, Validators.min(1)]) }); - this.instanceChange = this.instanceSelectorService.getSelectedInstancekey().subscribe((instanceKey: string) => { - if (instanceKey) { + this.instanceChange = this.instanceSelectorService.getSelectedInstance().subscribe((instance: RicInstance) => { + if (instance.key) { // TODO: show pending action indicator - this.instanceKey = instanceKey; - this.acXappService.getPolicy(instanceKey).subscribe((res: ACAdmissionIntervalControl) => { + this.instanceKey = instance.key; + this.acXappService.getPolicy(instance.key).subscribe((res: ACAdmissionIntervalControl) => { this.acForm.controls['class'].setValue(res.class); this.acForm.controls['enforce'].setValue(res.enforce); this.acForm.controls['window_length'].setValue(res.window_length); diff --git a/webapp-frontend/src/app/app-configuration/app-configuration.component.ts b/webapp-frontend/src/app/app-configuration/app-configuration.component.ts index 406c3509..0e734137 100644 --- a/webapp-frontend/src/app/app-configuration/app-configuration.component.ts +++ b/webapp-frontend/src/app/app-configuration/app-configuration.component.ts @@ -26,7 +26,7 @@ import { AppMgrService } from '../services/app-mgr/app-mgr.service'; import { ErrorDialogService } from '../services/ui/error-dialog.service'; import { LoadingDialogService } from '../services/ui/loading-dialog.service'; import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; -import { NotificationService } from './../services/ui/notification.service'; +import { NotificationService } from '../services/ui/notification.service'; @Component({ selector: 'rd-app-configuration', diff --git a/webapp-frontend/src/app/app-control/app-control.component.ts b/webapp-frontend/src/app/app-control/app-control.component.ts index 7b1a1b40..fd2b26c0 100644 --- a/webapp-frontend/src/app/app-control/app-control.component.ts +++ b/webapp-frontend/src/app/app-control/app-control.component.ts @@ -24,6 +24,7 @@ import { Router } from '@angular/router'; import { Subscription } from 'rxjs'; import { finalize } from 'rxjs/operators'; import { XappControlRow } from '../interfaces/app-mgr.types'; +import { RicInstance } from '../interfaces/dashboard.types'; import { AppMgrService } from '../services/app-mgr/app-mgr.service'; import { InstanceSelectorService } from '../services/instance-selector/instance-selector.service'; import { ConfirmDialogService } from '../services/ui/confirm-dialog.service'; @@ -59,10 +60,10 @@ export class AppControlComponent implements OnInit, OnDestroy { ngOnInit() { this.dataSource = new AppControlDataSource(this.appMgrSvc, this.sort, this.notificationService); - this.instanceChange = this.instanceSelectorService.getSelectedInstancekey().subscribe((instanceKey: string) => { - if (instanceKey) { - this.instanceKey = instanceKey; - this.dataSource.loadTable(instanceKey); + this.instanceChange = this.instanceSelectorService.getSelectedInstance().subscribe((instance: RicInstance) => { + if (instance.key) { + this.instanceKey = instance.key; + this.dataSource.loadTable(instance.key); } }); } diff --git a/webapp-frontend/src/app/caas-ingress/caas-ingress.component.ts b/webapp-frontend/src/app/caas-ingress/caas-ingress.component.ts index c389cc91..13ff7af8 100644 --- a/webapp-frontend/src/app/caas-ingress/caas-ingress.component.ts +++ b/webapp-frontend/src/app/caas-ingress/caas-ingress.component.ts @@ -21,6 +21,7 @@ import { Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { MatSort } from '@angular/material/sort'; import { Subscription } from 'rxjs'; +import { RicInstance } from '../interfaces/dashboard.types'; import { CaasIngressService } from '../services/caas-ingress/caas-ingress.service'; import { InstanceSelectorService } from '../services/instance-selector/instance-selector.service'; import { ConfirmDialogService } from '../services/ui/confirm-dialog.service'; @@ -56,9 +57,9 @@ export class CaasIngressComponent implements OnInit, OnDestroy { ngOnInit() { this.dataSource = new CaasIngressDataSource(this.caasIngressSvc, this.sort, this.notificationService); - this.instanceChange = this.instanceSelectorService.getSelectedInstancekey().subscribe((instanceKey: string) => { - if (instanceKey) { - this.dataSource.loadTable(instanceKey, this.cluster, this.namespace); + this.instanceChange = this.instanceSelectorService.getSelectedInstance().subscribe((instance: RicInstance) => { + if (instance.key) { + this.dataSource.loadTable(instance.key, this.cluster, this.namespace); } }); } diff --git a/webapp-frontend/src/app/catalog/catalog.component.ts b/webapp-frontend/src/app/catalog/catalog.component.ts index d46c99f7..ad90b361 100644 --- a/webapp-frontend/src/app/catalog/catalog.component.ts +++ b/webapp-frontend/src/app/catalog/catalog.component.ts @@ -23,14 +23,15 @@ import { MatDialog } from '@angular/material/dialog'; import { MatSort } from '@angular/material/sort'; import { Subscription } from 'rxjs'; import { finalize } from 'rxjs/operators'; +import { RicInstance } from '../interfaces/dashboard.types'; import { XMDeployableApp } from '../interfaces/app-mgr.types'; import { AppMgrService } from '../services/app-mgr/app-mgr.service'; import { InstanceSelectorService } from '../services/instance-selector/instance-selector.service'; import { LoadingDialogService } from '../services/ui/loading-dialog.service'; import { UiService } from '../services/ui/ui.service'; import { AppConfigurationComponent } from './../app-configuration/app-configuration.component'; -import { ConfirmDialogService } from './../services/ui/confirm-dialog.service'; -import { NotificationService } from './../services/ui/notification.service'; +import { ConfirmDialogService } from '../services/ui/confirm-dialog.service'; +import { NotificationService } from '../services/ui/notification.service'; import { CatalogDataSource } from './catalog.datasource'; @Component({ @@ -64,10 +65,10 @@ export class CatalogComponent implements OnInit, OnDestroy { this.darkMode = isDark; }); - this.instanceChange = this.instanceSelectorService.getSelectedInstancekey().subscribe((instanceKey: string) => { - if (instanceKey) { - this.instanceKey = instanceKey; - this.dataSource.loadTable(instanceKey); + this.instanceChange = this.instanceSelectorService.getSelectedInstance().subscribe((instance: RicInstance) => { + if (instance.key) { + this.instanceKey = instance.key; + this.dataSource.loadTable(instance.key); } }); } diff --git a/webapp-frontend/src/app/footer/footer.component.html b/webapp-frontend/src/app/footer/footer.component.html index 5dd1c364..7d78f92c 100644 --- a/webapp-frontend/src/app/footer/footer.component.html +++ b/webapp-frontend/src/app/footer/footer.component.html @@ -18,7 +18,7 @@ ========================LICENSE_END=================================== --> diff --git a/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.ts b/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.ts index c0f05afc..f8b23d0c 100644 --- a/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.ts +++ b/webapp-frontend/src/app/navigation/sidenav-list/sidenav-list.component.ts @@ -27,7 +27,7 @@ import { UiService } from '../../services/ui/ui.service'; }) export class SidenavListComponent implements OnInit { darkMode: boolean; - @Output() sidenavClose = new EventEmitter(); + @Output() sidenavClose: EventEmitter = new EventEmitter(); constructor(public ui: UiService) { } diff --git a/webapp-frontend/src/app/ran-control/ran-control.component.ts b/webapp-frontend/src/app/ran-control/ran-control.component.ts index 1cffdd82..ac995f07 100644 --- a/webapp-frontend/src/app/ran-control/ran-control.component.ts +++ b/webapp-frontend/src/app/ran-control/ran-control.component.ts @@ -22,6 +22,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { Subscription } from 'rxjs'; import { finalize } from 'rxjs/operators'; +import { RicInstance } from '../interfaces/dashboard.types'; import { E2ManagerService } from '../services/e2-mgr/e2-mgr.service'; import { InstanceSelectorService } from '../services/instance-selector/instance-selector.service'; import { ConfirmDialogService } from '../services/ui/confirm-dialog.service'; @@ -62,10 +63,10 @@ export class RanControlComponent implements OnInit, OnDestroy { this.darkMode = isDark; }); - this.instanceChange = this.instanceSelectorService.getSelectedInstancekey().subscribe((instanceKey: string) => { - if (instanceKey) { - this.instanceKey = instanceKey; - this.dataSource.loadTable(instanceKey); + this.instanceChange = this.instanceSelectorService.getSelectedInstance().subscribe((instance: RicInstance) => { + if (instance.key) { + this.instanceKey = instance.key; + this.dataSource.loadTable(instance.key); } }); } diff --git a/webapp-frontend/src/app/rd.component.html b/webapp-frontend/src/app/rd.component.html index 85cbbcd8..61e0b458 100644 --- a/webapp-frontend/src/app/rd.component.html +++ b/webapp-frontend/src/app/rd.component.html @@ -7,9 +7,9 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -18,33 +18,32 @@ ========================LICENSE_END=================================== --> - + - -