2 * ========================LICENSE_START=================================
5 * Copyright (C) 2019 Nordix Foundation
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ========================LICENSE_END===================================
21 import { Sort } from "@angular/material/sort";
22 import { Component, OnInit, Input } from "@angular/core";
23 import { MatDialog } from "@angular/material/dialog";
24 import { PolicyTypeSchema } from "@interfaces/policy.types";
25 import { NotificationService } from "@services/ui/notification.service";
26 import { PolicyService } from "@services/policy/policy.service";
27 import { ConfirmDialogService } from "@services/ui/confirm-dialog.service";
28 import { PolicyInstance } from "@interfaces/policy.types";
29 import { PolicyInstanceDialogComponent } from "../policy-instance-dialog/policy-instance-dialog.component";
30 import { getPolicyDialogProperties } from "../policy-instance-dialog/policy-instance-dialog.component";
31 import { HttpResponse } from "@angular/common/http";
32 import { BehaviorSubject, forkJoin } from "rxjs";
33 import { UiService } from "@services/ui/ui.service";
34 import { FormControl, FormGroup } from "@angular/forms";
35 import { MatTableDataSource } from "@angular/material/table";
36 import { mergeMap } from "rxjs/operators";
39 selector: "nrcp-policy-instance",
40 templateUrl: "./policy-instance.component.html",
41 styleUrls: ["./policy-instance.component.scss"],
43 export class PolicyInstanceComponent implements OnInit {
44 @Input() policyTypeSchema: PolicyTypeSchema;
46 instanceDataSource: MatTableDataSource<PolicyInstance>;
47 policyInstanceForm: FormGroup;
48 private policyInstanceSubject = new BehaviorSubject<PolicyInstance[]>([]);
49 policyInstances: PolicyInstance[] = [];
52 private policySvc: PolicyService,
53 private dialog: MatDialog,
54 private notificationService: NotificationService,
55 private confirmDialogService: ConfirmDialogService,
58 this.policyInstanceForm = new FormGroup({
59 id: new FormControl(""),
60 target: new FormControl(""),
61 owner: new FormControl(""),
62 lastModified: new FormControl(""),
67 this.getPolicyInstances();
68 this.policyInstanceSubject.subscribe((data) => {
69 this.instanceDataSource = new MatTableDataSource<PolicyInstance>(data);
71 this.instanceDataSource.filterPredicate = ((
76 this.isDataIncluding(data.policy_id, filter.id) &&
77 this.isDataIncluding(data.ric_id, filter.target) &&
78 this.isDataIncluding(data.service_id, filter.owner) &&
79 this.isDataIncluding(data.lastModified, filter.lastModified)
81 }) as (data: PolicyInstance, filter: any) => boolean;
84 this.policyInstanceForm.valueChanges.subscribe((value) => {
87 id: value.id.trim().toLowerCase(),
89 this.instanceDataSource.filter = filter;
92 this.ui.darkModeState.subscribe((isDark) => {
93 this.darkMode = isDark;
97 getPolicyInstances() {
98 this.policyInstances = [] as PolicyInstance[];
100 .getPolicyInstancesByType(this.policyTypeSchema.id)
102 mergeMap((policyIds) =>
104 policyIds.policy_ids.map((id) => {
106 this.policySvc.getPolicyInstance(id),
107 this.policySvc.getPolicyStatus(id),
113 .subscribe((res) => {
114 this.policyInstances = res.map((policy) => {
115 let policyInstance = <PolicyInstance>{};
116 policyInstance = policy[0];
117 policyInstance.lastModified = policy[1].last_modified;
118 return policyInstance;
120 this.policyInstanceSubject.next(this.policyInstances);
124 getSortedData(sort: Sort) {
125 const data = this.instanceDataSource.data;
126 data.sort((a: PolicyInstance, b: PolicyInstance) => {
127 const isAsc = sort.direction === "asc";
128 switch (sort.active) {
130 return compare(a.policy_id, b.policy_id, isAsc);
132 return compare(a.ric_id, b.ric_id, isAsc);
134 return compare(a.service_id, b.service_id, isAsc);
136 return compare(a.lastModified, b.lastModified, isAsc);
141 this.instanceDataSource.data = data;
144 stopSort(event: any) {
145 event.stopPropagation();
148 isDataIncluding(data: string, filter: string): boolean {
149 return !filter || data.toLowerCase().includes(filter);
152 createPolicyInstance(policyTypeSchema: PolicyTypeSchema): void {
153 this.openInstanceDialog(null);
156 modifyInstance(instance: PolicyInstance): void {
158 .getPolicyInstance(instance.policy_id)
159 .subscribe((refreshedJson: PolicyInstance) => {
160 this.openInstanceDialog(refreshedJson);
164 private openInstanceDialog(policy: PolicyInstance) {
165 const dialogData = getPolicyDialogProperties(
166 this.policyTypeSchema,
170 const dialogRef = this.dialog.open(
171 PolicyInstanceDialogComponent,
174 dialogRef.afterClosed().subscribe((ok: any) => {
175 if (ok) this.getPolicyInstances();
179 hasInstances(): boolean {
180 return this.instanceCount() > 0;
183 instanceCount(): number {
184 return this.policyInstances.length;
187 toLocalTime(utcTime: string): string {
188 const date = new Date(utcTime);
189 const toutc = date.toUTCString();
190 return new Date(toutc + " UTC").toLocaleString();
193 deleteInstance(instance: PolicyInstance): void {
194 this.confirmDialogService
197 "Are you sure you want to delete this policy instance?"
200 .subscribe((res: any) => {
203 .deletePolicy(instance.policy_id)
204 .subscribe((response: HttpResponse<Object>) => {
205 if (response.status === 204) {
206 this.notificationService.success("Delete succeeded!");
207 this.getPolicyInstances();
215 this.getPolicyInstances();
219 function compare(a: string, b: string, isAsc: boolean) {
220 return (a < b ? -1 : 1) * (isAsc ? 1 : -1);