Merge "Fix PolicyControlComponent"
[portal/nonrtric-controlpanel.git] / webapp-frontend / src / app / policy / policy-instance / policy-instance.component.ts
index 0f34c43..700e929 100644 (file)
  * ========================LICENSE_END===================================
  */
 
-import { MatSort } from '@angular/material/sort';
+import { MatSort, Sort } from '@angular/material/sort';
 import { Component, OnInit, ViewChild, Input, AfterViewInit } from '@angular/core';
 import { MatDialog } from '@angular/material/dialog';
-import { PolicyTypeSchema } from '../../interfaces/policy.types';
+import { PolicyTypeSchema } from '@interfaces/policy.types';
 import { PolicyInstanceDataSource } from './policy-instance.datasource';
-import { ErrorDialogService } from '../../services/ui/error-dialog.service';
-import { NotificationService } from '../../services/ui/notification.service';
-import { PolicyService } from '../../services/policy/policy.service';
-import { ConfirmDialogService } from '../../services/ui/confirm-dialog.service';
-import { PolicyInstance } from '../../interfaces/policy.types';
+import { ErrorDialogService } from '@services/ui/error-dialog.service';
+import { NotificationService } from '@services/ui/notification.service';
+import { PolicyService } from '@services/policy/policy.service';
+import { ConfirmDialogService } from '@services/ui/confirm-dialog.service';
+import { PolicyInstance } from '@interfaces/policy.types';
 import { PolicyInstanceDialogComponent } from '../policy-instance-dialog/policy-instance-dialog.component';
 import { getPolicyDialogProperties } from '../policy-instance-dialog/policy-instance-dialog.component';
 import { HttpErrorResponse, HttpResponse } from '@angular/common/http';
-import { Observable } from 'rxjs';
-import { UiService } from '../../services/ui/ui.service';
+import { BehaviorSubject, Observable } from 'rxjs';
+import { UiService } from '@services/ui/ui.service';
+import { FormControl, FormGroup } from '@angular/forms';
+import { MatTableDataSource } from '@angular/material/table';
+
+class PolicyTypeInfo {
+  constructor(public type: PolicyTypeSchema) { }
+
+  isExpanded: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
+}
 
 @Component({
     selector: 'nrcp-policy-instance',
@@ -42,10 +50,13 @@ import { UiService } from '../../services/ui/ui.service';
 
 
 export class PolicyInstanceComponent implements OnInit, AfterViewInit {
-    instanceDataSource: PolicyInstanceDataSource;
+    policyInstanceDataSource: PolicyInstanceDataSource;
     @Input() policyTypeSchema: PolicyTypeSchema;
     @Input() expanded: Observable<boolean>;
     @ViewChild(MatSort, { static: true }) sort: MatSort;
+    policyTypeInfo = new Map<string, PolicyTypeInfo>();
+    instanceDataSource: MatTableDataSource<PolicyInstance> = new MatTableDataSource<PolicyInstance>();
+    policyInstanceForm: FormGroup;
     darkMode: boolean;
 
     constructor(
@@ -55,23 +66,58 @@ export class PolicyInstanceComponent implements OnInit, AfterViewInit {
         private notificationService: NotificationService,
         private confirmDialogService: ConfirmDialogService,
         private ui: UiService) {
+            this.policyInstanceForm = new FormGroup({
+                id: new FormControl(''),
+                target: new FormControl(''),
+                owner: new FormControl(''),
+                lastModified: new FormControl('')
+            })
     }
 
     ngOnInit() {
-        this.instanceDataSource = new PolicyInstanceDataSource(this.policySvc, this.sort, this.policyTypeSchema);
+        this.policyInstanceDataSource = new PolicyInstanceDataSource(this.policySvc, this.sort, this.notificationService, this.policyTypeSchema.id);
         this.expanded.subscribe((isExpanded: boolean) => this.onExpand(isExpanded));
+
+        this.policyInstanceDataSource.connect().subscribe((data) => {
+            this.instanceDataSource.data = data;
+        })
+
+        this.policyInstanceForm.valueChanges.subscribe(value => {
+            const filter = {...value, id: value.id.trim().toLowerCase()} as string;
+            this.instanceDataSource.filter = filter;
+        });
+
+        this.instanceDataSource.filterPredicate = ((data: PolicyInstance, filter) => {
+            return this.isDataIncluding(data.policy_id, filter.id)
+                && this.isDataIncluding(data.ric_id, filter.target)
+                && this.isDataIncluding(data.service_id, filter.owner)
+                && this.isDataIncluding(data.lastModified, filter.lastModified);
+          }) as (data: PolicyInstance, filter: any) => boolean;
+
         this.ui.darkModeState.subscribe((isDark) => {
             this.darkMode = isDark;
         });
     }
 
+    compare(a: any, b: any, isAsc: boolean) {
+      return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
+    }
+
+    stopSort(event: any){
+        event.stopPropagation();
+    }
+
+    isDataIncluding(data: string, filter: string) : boolean {
+        return !filter || data.toLowerCase().includes(filter);
+    }
+
     ngAfterViewInit() {
-        this.instanceDataSource.sort = this.sort;
+        this.policyInstanceDataSource.sort = this.sort;
     }
 
     private onExpand(isExpanded: boolean) {
         if (isExpanded) {
-            this.instanceDataSource.getPolicyInstances();
+            this.policyInstanceDataSource.getPolicyInstances();
         }
     }
 
@@ -87,7 +133,7 @@ export class PolicyInstanceComponent implements OnInit, AfterViewInit {
                     PolicyInstanceDialogComponent,
                     getPolicyDialogProperties(this.policyTypeSchema, instance, this.darkMode)).afterClosed().subscribe(
                         (_: any) => {
-                            this.instanceDataSource.getPolicyInstances();
+                            this.policyInstanceDataSource.getPolicyInstances();
                         }
                     );
             },
@@ -98,7 +144,11 @@ export class PolicyInstanceComponent implements OnInit, AfterViewInit {
     }
 
     hasInstances(): boolean {
-        return this.instanceDataSource.rowCount > 0;
+        return this.policyInstanceDataSource.rowCount > 0;
+    }
+
+    nbInstances(): number {
+        return this.policyInstanceDataSource.policyInstances.length;
     }
 
     toLocalTime(utcTime: string): string {
@@ -108,6 +158,17 @@ export class PolicyInstanceComponent implements OnInit, AfterViewInit {
 
     }
 
+    createPolicyInstance(policyTypeSchema: PolicyTypeSchema): void {
+        let dialogRef = this.dialog.open(PolicyInstanceDialogComponent,
+            getPolicyDialogProperties(policyTypeSchema, null, this.darkMode));
+        const info: PolicyTypeInfo = this.getPolicyTypeInfo(policyTypeSchema);
+        dialogRef.afterClosed().subscribe(
+            (_) => {
+                info.isExpanded.next(info.isExpanded.getValue());
+            }
+        );
+    }
+
     deleteInstance(instance: PolicyInstance): void {
         this.confirmDialogService
             .openConfirmDialog('Are you sure you want to delete this policy instance?')
@@ -120,7 +181,7 @@ export class PolicyInstanceComponent implements OnInit, AfterViewInit {
                                     switch (response.status) {
                                         case 204:
                                             this.notificationService.success('Delete succeeded!');
-                                            this.instanceDataSource.getPolicyInstances();
+                                            this.policyInstanceDataSource.getPolicyInstances();
                                             break;
                                         default:
                                             this.notificationService.warn('Delete failed ' + response.status + ' ' + response.body);
@@ -132,4 +193,17 @@ export class PolicyInstanceComponent implements OnInit, AfterViewInit {
                     }
                 });
     }
+
+    getPolicyTypeInfo(policyTypeSchema: PolicyTypeSchema): PolicyTypeInfo {
+        let info: PolicyTypeInfo = this.policyTypeInfo.get(policyTypeSchema.name);
+        if (!info) {
+            info = new PolicyTypeInfo(policyTypeSchema);
+            this.policyTypeInfo.set(policyTypeSchema.name, info);
+        }
+        return info;
+    }
+
+    refreshTable() {
+        this.policyInstanceDataSource.getPolicyInstances();
+    }
 }