5fa92d9e08d1d219e6e4a6518a7f8291ef832c87
[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 { AbstractControl, ControlContainer, FormBuilder, FormControl, FormGroup, FormGroupDirective, ValidatorFn, Validators } from '@angular/forms';
23 import { EventEmitter } from '@angular/core';
24
25 @Component({
26   selector: 'nrcp-no-type-policy-editor',
27   templateUrl: './no-type-policy-editor.component.html',
28   styleUrls: ['./no-type-policy-editor.component.scss'],
29   viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }]
30 })
31 export class NoTypePolicyEditorComponent implements OnInit {
32   @Input() policyJson: string = null;
33   @Output() validJson: EventEmitter<string> = new EventEmitter<string>();
34
35   instanceForm: FormGroup = new FormGroup({});
36
37   constructor(
38     private formBuilder: FormBuilder) { }
39
40     ngOnInit(): void {
41       this.instanceForm.addControl(
42         'policyJsonTextArea', new FormControl(this.policyJson, [
43           Validators.required,
44           this.jsonValidator()
45         ])
46       )
47     }
48
49     get policyJsonTextArea(): AbstractControl {
50     return this.instanceForm ? this.instanceForm.get('policyJsonTextArea') : null;
51   }
52
53   formatJsonInput(): void {
54     this.policyJson = formatJsonString(JSON.parse(this.policyJsonTextArea.value));
55   }
56
57   jsonValidator(): ValidatorFn {
58     return (control: AbstractControl): { [key: string]: any } | null => {
59       const notValid = !this.isJsonValid(control.value);
60       this.handleJsonChangeEvent(notValid, control.value);
61       return notValid ? { 'invalidJson': { value: control.value } } : null;
62     };
63   }
64
65   handleJsonChangeEvent(notValid: boolean, newValue: string): void {
66     let json = newValue;
67     if (notValid) {
68       json = null;
69     }
70     this.validJson.emit(json);
71   }
72
73   isJsonValid(json: string): boolean {
74     try {
75       if (json != null) {
76         JSON.parse(json);
77         return true;
78       } else {
79         return false;
80       }
81     } catch (jsonError) {
82       return false;
83     }
84   }
85 }
86
87 export function formatJsonString(jsonToFormat: any): string {
88   return JSON.stringify(jsonToFormat, null, 2);
89 }