Add tests of PolicyInstanceDialog
[portal/nonrtric-controlpanel.git] / webapp-frontend / src / app / policy / no-type-policy-editor / no-type-policy-editor.component.ts
1 // -
2 //   ========================LICENSE_START=================================
3 //   O-RAN-SC
4 //   %%
5 //   Copyright (C) 2021: 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
21 import { Component, Input, OnInit, Output } from "@angular/core";
22 import {
23   AbstractControl,
24   ControlContainer,
25   FormControl,
26   FormGroup,
27   FormGroupDirective,
28   ValidatorFn,
29   Validators,
30 } from "@angular/forms";
31 import { EventEmitter } from "@angular/core";
32
33 @Component({
34   selector: "nrcp-no-type-policy-editor",
35   templateUrl: "./no-type-policy-editor.component.html",
36   styleUrls: ["./no-type-policy-editor.component.scss"],
37   viewProviders: [
38     { provide: ControlContainer, useExisting: FormGroupDirective },
39   ],
40 })
41 export class NoTypePolicyEditorComponent implements OnInit {
42   @Input() policyJson: string = null;
43   @Output() validJson: EventEmitter<string> = new EventEmitter<string>();
44
45   instanceForm: FormGroup = new FormGroup({});
46
47   constructor() {}
48
49   ngOnInit(): void {
50     this.instanceForm.addControl(
51       "policyJsonTextArea",
52       new FormControl(this.policyJson, [
53         Validators.required,
54         this.jsonValidator(),
55       ])
56     );
57     if (!this.policyJson) this.policyJson = "{}";
58   }
59
60   get policyJsonTextArea(): AbstractControl {
61     return this.instanceForm
62       ? this.instanceForm.get("policyJsonTextArea")
63       : null;
64   }
65
66   formatJsonInput(): void {
67     let jsonBefore: string = this.policyJsonTextArea.value;
68     let jsonAfter = formatJsonString(JSON.parse(jsonBefore));
69     this.policyJsonTextArea.setValue(jsonAfter);
70   }
71
72   jsonValidator(): ValidatorFn {
73     return (control: AbstractControl): { [key: string]: any } | null => {
74       const notValid = !this.isJsonValid(control.value);
75       this.handleJsonChangeEvent(notValid, control.value);
76       return notValid ? { invalidJson: { value: control.value } } : null;
77     };
78   }
79
80   handleJsonChangeEvent(notValid: boolean, newValue: string): void {
81     let json = newValue;
82     if (notValid) {
83       json = null;
84     }
85     this.validJson.emit(json);
86   }
87
88   isJsonValid(json: string): boolean {
89     let valid = false as boolean;
90     try {
91       if (json != null) {
92         JSON.parse(json);
93         valid = true;
94       }
95     } catch (jsonError) {}
96     return valid;
97   }
98 }
99
100 export function formatJsonString(jsonToFormat: any): string {
101   return JSON.stringify(jsonToFormat, null, 2);
102 }