Decouple policy instance components
[portal/nonrtric-controlpanel.git] / webapp-frontend / src / app / policy / no-type-policy-editor / no-type-policy-editor.component.ts
index a4ce36f..5fa92d9 100644 (file)
@@ -1,5 +1,26 @@
-import { Component, Input, OnInit } from '@angular/core';
+// -
+//   ========================LICENSE_START=================================
+//   O-RAN-SC
+//   %%
+//   Copyright (C) 2021: Nordix Foundation
+//   %%
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//        http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+//   ========================LICENSE_END===================================
+//  /
+
+import { Component, Input, OnInit, Output } from '@angular/core';
 import { AbstractControl, ControlContainer, FormBuilder, FormControl, FormGroup, FormGroupDirective, ValidatorFn, Validators } from '@angular/forms';
+import { EventEmitter } from '@angular/core';
 
 @Component({
   selector: 'nrcp-no-type-policy-editor',
@@ -8,51 +29,61 @@ import { AbstractControl, ControlContainer, FormBuilder, FormControl, FormGroup,
   viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }]
 })
 export class NoTypePolicyEditorComponent implements OnInit {
+  @Input() policyJson: string = null;
+  @Output() validJson: EventEmitter<string> = new EventEmitter<string>();
 
-  @Input() instanceForm: FormGroup;
-  @Input() policyJson: string;
+  instanceForm: FormGroup = new FormGroup({});
 
   constructor(
     private formBuilder: FormBuilder) { }
 
-  ngOnInit(): void {
-    this.instanceForm.addControl(
-      'policyJsonTextArea', new FormControl(this.policyJson, [
-        Validators.required,
-        jsonValidator()
-      ])
-    )
-  }
+    ngOnInit(): void {
+      this.instanceForm.addControl(
+        'policyJsonTextArea', new FormControl(this.policyJson, [
+          Validators.required,
+          this.jsonValidator()
+        ])
+      )
+    }
 
-  get policyJsonTextArea(): AbstractControl {
+    get policyJsonTextArea(): AbstractControl {
     return this.instanceForm ? this.instanceForm.get('policyJsonTextArea') : null;
   }
 
   formatJsonInput(): void {
     this.policyJson = formatJsonString(JSON.parse(this.policyJsonTextArea.value));
   }
-}
 
-export function formatJsonString(jsonToFormat: any): string {
-  return JSON.stringify(jsonToFormat, null, 2);
-}
+  jsonValidator(): ValidatorFn {
+    return (control: AbstractControl): { [key: string]: any } | null => {
+      const notValid = !this.isJsonValid(control.value);
+      this.handleJsonChangeEvent(notValid, control.value);
+      return notValid ? { 'invalidJson': { value: control.value } } : null;
+    };
+  }
 
-export function jsonValidator(): ValidatorFn {
-  return (control: AbstractControl): { [key: string]: any } | null => {
-    const notValid = !isJsonValid(control.value);
-    return notValid ? { 'invalidJson': { value: control.value } } : null;
-  };
-}
+  handleJsonChangeEvent(notValid: boolean, newValue: string): void {
+    let json = newValue;
+    if (notValid) {
+      json = null;
+    }
+    this.validJson.emit(json);
+  }
 
-export function isJsonValid(json: string): boolean {
-  try {
-    if (json != null) {
-      JSON.parse(json);
-      return true;
-    } else {
+  isJsonValid(json: string): boolean {
+    try {
+      if (json != null) {
+        JSON.parse(json);
+        return true;
+      } else {
+        return false;
+      }
+    } catch (jsonError) {
       return false;
     }
-  } catch (jsonError) {
-    return false;
   }
 }
+
+export function formatJsonString(jsonToFormat: any): string {
+  return JSON.stringify(jsonToFormat, null, 2);
+}