Clean up and format
[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   }
58
59   get policyJsonTextArea(): AbstractControl {
60     return this.instanceForm
61       ? this.instanceForm.get("policyJsonTextArea")
62       : null;
63   }
64
65   formatJsonInput(): void {
66     this.policyJson = formatJsonString(
67       JSON.parse(this.policyJsonTextArea.value)
68     );
69   }
70
71   jsonValidator(): ValidatorFn {
72     return (control: AbstractControl): { [key: string]: any } | null => {
73       const notValid = !this.isJsonValid(control.value);
74       this.handleJsonChangeEvent(notValid, control.value);
75       return notValid ? { invalidJson: { value: control.value } } : null;
76     };
77   }
78
79   handleJsonChangeEvent(notValid: boolean, newValue: string): void {
80     let json = newValue;
81     if (notValid) {
82       json = null;
83     }
84     this.validJson.emit(json);
85   }
86
87   isJsonValid(json: string): boolean {
88     try {
89       if (json != null) {
90         JSON.parse(json);
91         return true;
92       } else {
93         return false;
94       }
95     } catch (jsonError) {
96       return false;
97     }
98   }
99 }
100
101 export function formatJsonString(jsonToFormat: any): string {
102   return JSON.stringify(jsonToFormat, null, 2);
103 }