Possibility to create and edit typeless policies
[portal/nonrtric-controlpanel.git] / webapp-frontend / src / app / policy-control / no-type-policy-instance-dialog.component.ts
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2020 Nordix Foundation
6  * %%
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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===================================
19  */
20 import { Component, Inject, OnInit } from '@angular/core';
21 import { FormControl, FormGroup, Validators, ValidatorFn, AbstractControl } from '@angular/forms';
22 import { MAT_DIALOG_DATA } from '@angular/material/dialog';
23 import { PolicyService } from '../services/policy/policy.service';
24 import { NotificationService } from '../services/ui/notification.service';
25 import { UiService } from '../services/ui/ui.service';
26 import { HttpErrorResponse } from '@angular/common/http';
27 import { ErrorDialogService } from '../services/ui/error-dialog.service';
28 import * as uuid from 'uuid';
29
30 @Component({
31   selector: 'rd-no-type-policy-instance-dialog',
32   templateUrl: './no-type-policy-instance-dialog.component.html',
33   styleUrls: ['./no-type-policy-instance-dialog.component.scss']
34 })
35 export class NoTypePolicyInstanceDialogComponent implements OnInit {
36
37   // Declare following variables as Public variable. Private variables should not be used in template HTML
38   instanceForm: FormGroup;
39
40   policyInstanceId: string; // null if not yet created
41   policyJson: string;
42   darkMode: boolean;
43   ric: string;
44   allRics: string[];
45
46   constructor(
47     private policySvc: PolicyService,
48     private errorService: ErrorDialogService,
49     private notificationService: NotificationService,
50     @Inject(MAT_DIALOG_DATA) private data,
51     private ui: UiService) {
52     this.policyInstanceId = data.instanceId;
53     this.policyJson = data.instanceJson ? JSON.stringify(JSON.parse(data.instanceJson), null, 2) : '';
54     this.ric = data.ric;
55   }
56
57   ngOnInit() {
58     this.ui.darkModeState.subscribe((isDark) => {
59       this.darkMode = isDark;
60     });
61     this.instanceForm = new FormGroup({
62       'ricSelector': new FormControl(this.ric, [
63         Validators.required
64       ]),
65       'policyJsonTextArea': new FormControl(this.policyJson, [
66         Validators.required,
67         jsonValidator()
68       ])
69     });
70     if (!this.policyInstanceId) {
71       this.fetchRics();
72     }
73   }
74
75   get policyJsonTextArea() { return this.instanceForm.get('policyJsonTextArea'); }
76
77   get ricSelector() { return this.instanceForm.get('ricSelector'); }
78
79   onSubmit() {
80     if (this.policyInstanceId == null) {
81         this.policyInstanceId = uuid.v4();
82     }
83     const self: NoTypePolicyInstanceDialogComponent = this;
84     this.policySvc.putPolicy('', this.policyInstanceId, this.policyJsonTextArea.value, this.ric).subscribe(
85       {
86         next(_) {
87           self.notificationService.success('Policy without type:' + self.policyInstanceId + ' submitted');
88         },
89         error(error: HttpErrorResponse) {
90           self.errorService.displayError('Submit failed: ' + error.error);
91         },
92         complete() { }
93       });
94   }
95
96   private fetchRics() {
97     const self: NoTypePolicyInstanceDialogComponent = this;
98     this.policySvc.getRics('').subscribe(
99       {
100         next(value) {
101           self.allRics = value;
102           console.log(value);
103         },
104         error(error: HttpErrorResponse) {
105           self.errorService.displayError('Fetching of rics failed: ' + error.message);
106         },
107         complete() { }
108       });
109   }
110 }
111
112 export function jsonValidator(): ValidatorFn {
113   return (control: AbstractControl): { [key: string]: any } | null => {
114     const notValid = !isJsonValid(control.value);
115     return notValid ? { 'invalidJson': { value: control.value } } : null;
116   };
117 }
118
119 export function isJsonValid(json: string) {
120   try {
121     if (json != null) {
122       JSON.parse(json);
123       return true;
124     }
125   } catch (jsonError) {
126     return false;
127   }
128 }