App metrics visualization manage
[portal/ric-dashboard.git] / dashboard / webapp-frontend / src / app / stats / stats.component.ts
index 2993056..1737651 100644 (file)
@@ -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.
  * limitations under the License.
  * ========================LICENSE_END===================================
  */
-import { Component, OnInit, ViewChildren, QueryList } from '@angular/core';
-import { BaseChartDirective } from 'ng2-charts/ng2-charts';
+import { Component, OnInit } from '@angular/core';
 import { StatsService } from '../services/stats/stats.service';
-import { HttpClient } from '@angular/common/http';
-import { DashboardSuccessTransport } from '../interfaces/dashboard.types';
+import { ConfirmDialogService } from '../services/ui/confirm-dialog.service';
 import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
+import { MatDialog, MatTabChangeEvent } from '@angular/material';
+import { NotificationService } from '../services/ui/notification.service';
+import { UiService } from '../services/ui/ui.service';
+import { InstanceSelectorService } from '../services/instance-selector/instance-selector.service';
+import { StatsDataSource } from './stats-datasource';
+import { Subscription } from 'rxjs';
+import { StatsDialogComponent } from './stats-dialog.component';
+import { AppStats } from '../interfaces/e2-mgr.types';
+import {FormControl} from '@angular/forms';
+import { RicInstance} from '../interfaces/dashboard.types';
 
 @Component({
     selector: 'rd-stats',
@@ -31,23 +39,138 @@ import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
 })
 export class StatsComponent implements OnInit {
 
-    @ViewChildren(BaseChartDirective) charts: QueryList<BaseChartDirective>;
     checked = false;
-    metricsUrlMc: SafeResourceUrl;
-    metricsUrlMl: SafeResourceUrl;
+    darkMode: boolean;
+    panelClass: string;
+    displayedColumns: string[] = ['appName', 'metricUrl', 'editmetricUrl'];
+    dataSource: StatsDataSource;
+    private instanceChange: Subscription;
+    private instanceKey: string;
+    metricsUrl: SafeResourceUrl;
+    tabs = [];
+    showTabs = false;
+    selected = new FormControl(0);
 
-    constructor(private service: StatsService,
-        private httpClient: HttpClient,
-        private sanitize: DomSanitizer) {
+    constructor(private statsservice: StatsService,
+        private sanitize: DomSanitizer,
+        private confirmDialogService: ConfirmDialogService,
+        private notificationService: NotificationService,
+        public instanceSelectorService: InstanceSelectorService,
+        public dialog: MatDialog,
+        public ui: UiService) {
     }
 
     ngOnInit() {
-        this.service.getAppMetricsUrl('MC').subscribe((res: DashboardSuccessTransport) => {
-            this.metricsUrlMc = this.sanitize.bypassSecurityTrustResourceUrl(res.data);
+        this.dataSource = new StatsDataSource(this.statsservice, this.notificationService);
+
+        this.ui.darkModeState.subscribe((isDark) => {
+            this.darkMode = isDark;
+        });
+
+        this.instanceChange = this.instanceSelectorService.getSelectedInstance().subscribe((instance: RicInstance) => {
+            if (instance.key) {
+                this.instanceKey = instance.key;
+                this.dataSource.loadTable(instance.key);
+              }
         });
-        this.service.getAppMetricsUrl('ML').subscribe((res: DashboardSuccessTransport) => {
-            this.metricsUrlMl = this.sanitize.bypassSecurityTrustResourceUrl(res.data);
+
+    }
+
+    ngOnDestroy() {
+        this.instanceChange.unsubscribe();
+    }
+
+    setupAppMetrics() {
+        if (this.darkMode) {
+          this.panelClass = 'dark-theme';
+        } else {
+          this.panelClass = '';
+        }
+        const dialogRef = this.dialog.open(StatsDialogComponent, {
+          panelClass: this.panelClass,
+          width: '450px',
+          data: {
+            instanceKey: this.instanceKey
+          }
         });
+        dialogRef.afterClosed()
+          .subscribe((result: boolean) => {
+            if (result) {
+              this.dataSource.loadTable(this.instanceKey);
+            }
+          });
     }
 
+    editAppMetrics(stats?) {
+        const dialogRef = this.dialog.open(StatsDialogComponent, {
+          hasBackdrop: false,
+          data: {
+            instanceKey: this.instanceKey,
+            appName: stats.statsDetails.appName ? stats.statsDetails.appName : '',
+            metricUrl: stats.statsDetails.metricUrl ? stats.statsDetails.metricUrl : '',
+            appId: stats.statsDetails.appId ? stats.statsDetails.appId : 0,
+            isEdit: 'true'
+          }
+        });
+        dialogRef.afterClosed()
+          .subscribe((result: boolean) => {
+            if (result) {
+              this.dataSource.loadTable(this.instanceKey);
+            }
+          });
+      }
+
+      viewAppMetrics(stats?) {
+        this.statsservice.getAppMetricsById(this.instanceKey, stats.statsDetails.appId)  .subscribe((res: AppStats) => {
+          this.metricsUrl = this.sanitize.bypassSecurityTrustResourceUrl(res.statsDetails.metricUrl);
+          let tabNotThere:boolean = true;
+          if (this.tabs.length <= 0) {
+            this.tabs.push(res);
+            this.selected.setValue(this.tabs.length - 1);
+          }
+          else {
+            for(let i=0; i<this.tabs.length; i++){
+              if (this.tabs[i].statsDetails.appId == res.statsDetails.appId) {
+                this.tabs[i].statsDetails.appName = res.statsDetails.appName;
+                this.tabs[i].statsDetails.metricUrl = res.statsDetails.metricUrl;
+                this.selected.setValue(i);
+                tabNotThere  = false;
+                break;
+              }
+            }
+            if (tabNotThere) {
+              this.tabs.push(res);
+              this.selected.setValue(this.tabs.length - 1);
+            }
+          }
+        });
+      }
+
+      onTabChanged(event: MatTabChangeEvent) {
+        if (event.index>=0)
+          this.viewAppMetrics(this.tabs[event.index]);
+      }
+
+      deleteAppMetrics(stats?) {
+        this.confirmDialogService.openConfirmDialog('Are you sure you want to delete this entry?')
+      .afterClosed().subscribe((res: boolean) => {
+        if (res) {
+
+        this.statsservice.deleteAppMetrics(this.instanceKey, stats.statsDetails.appId).subscribe(() => {
+            for(let i=0; i<this.tabs.length; i++){
+              if (this.tabs[i].instanceKey === this.instanceKey && this.tabs[i].statsDetails.appId == stats.statsDetails.appId) {
+                this.tabs.splice(i, 1);
+                if (this.tabs.length>0) {
+                  if (this.tabs[i] == null)
+                    i=i-1;
+                  this.viewAppMetrics(this.tabs[i]);
+                }
+                break;
+              }
+            }
+            this.dataSource.loadTable(this.instanceKey);
+        });
+      }
+    });
+  }
 }