UNPKG

ngx-iso-form

Version:

Angular component design Reactive Form using specific JSON. The primary use of this UI library is to design ISO 20022 forms dynamically.

1 lines 98.4 kB
{"version":3,"file":"ngx-iso-form.mjs","sources":["../../../projects/ngx-iso-form/src/lib/components/controls/iso-base-control.component.ts","../../../projects/ngx-iso-form/src/lib/shared/pipe/translate.pipe.ts","../../../projects/ngx-iso-form/src/lib/shared/pipe/error.pipe.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-date.component.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-date.component.html","../../../projects/ngx-iso-form/src/lib/shared/pipe/general.pipe.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-datetime.component.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-datetime.component.html","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-input.component.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-input.component.html","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-checkbox.component.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-checkbox.component.html","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-textarea.component.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-textarea.component.html","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-select.component.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-select.component.html","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-currency.component.ts","../../../projects/ngx-iso-form/src/lib/components/controls/iso-mat-currency.component.html","../../../projects/ngx-iso-form/src/lib/shared/models/component.model.ts","../../../projects/ngx-iso-form/src/lib/shared/services/control.service.ts","../../../projects/ngx-iso-form/src/lib/shared/directives/component-content.directive.ts","../../../projects/ngx-iso-form/src/lib/shared/components/dynamic/ngx-dynamic.component.ts","../../../projects/ngx-iso-form/src/lib/components/iso-control/iso-control.component.ts","../../../projects/ngx-iso-form/src/lib/components/iso-control/iso-control.component.html","../../../projects/ngx-iso-form/src/lib/shared/services/custom-date-adapter.ts","../../../projects/ngx-iso-form/src/lib/ngx-iso-form.service.ts","../../../projects/ngx-iso-form/src/lib/ngx-iso-form.component.ts","../../../projects/ngx-iso-form/src/lib/ngx-iso-form.component.html","../../../projects/ngx-iso-form/src/lib/ngx-iso-form.module.ts","../../../projects/ngx-iso-form/src/lib/shared/services/component.service.ts","../../../projects/ngx-iso-form/src/lib/Models/IsoForm.ts","../../../projects/ngx-iso-form/src/public-api.ts","../../../projects/ngx-iso-form/src/ngx-iso-form.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { IControlModel } from '../../Models/Control';\r\nimport { FormControl } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'iso-base',\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class IsoBaseControlComponent {\r\n\r\n @Input() control: IControlModel;\r\n @Input() formControl: FormControl;\r\n\r\n getKeys(errors: any)\r\n {\r\n if(errors)\r\n {\r\n return Object.keys(errors);\r\n }\r\n return [];\r\n }\r\n}","import { Inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Pipe({\r\n name: 'trans',\r\n pure: false,\r\n standalone: false\r\n})\r\nexport class IsoTranslatePipe implements PipeTransform {\r\n\r\n constructor(private translateService: TranslateService) {\r\n\r\n }\r\n\r\n transform(value: string, id: string, defaultValue: string): string {\r\n let key = `iso.${value}`;\r\n let tran = this.translateService.instant(key);\r\n if (tran === key) {\r\n key = `iso.${id}`;\r\n tran = this.translateService.instant(key);\r\n if (tran === key) {\r\n return defaultValue;\r\n }\r\n }\r\n if(tran.label)\r\n {\r\n return tran.label;\r\n }\r\n return defaultValue;\r\n }\r\n\r\n}","import { Inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Pipe({\r\n name: 'error',\r\n pure: false,\r\n standalone: false\r\n})\r\nexport class IsoErrorPipe implements PipeTransform {\r\n\r\n constructor(private translateService: TranslateService) {\r\n\r\n }\r\n\r\n transform(value: string, id: string,errorKey:string, defaultValue: string): string {\r\n let key = `iso.${value}`;\r\n let tran = this.translateService.instant(key);\r\n if (tran === key) {\r\n key = `iso.${id}`;\r\n tran = this.translateService.instant(key);\r\n if (tran === key) {\r\n return defaultValue;\r\n }\r\n }\r\n if(tran.error && tran.error[errorKey])\r\n {\r\n return tran.error[errorKey];\r\n }\r\n return defaultValue;\r\n }\r\n\r\n}","import { Component, Input } from '@angular/core';\r\nimport { IControlModel } from '../../Models/Control';\r\nimport { FormControl } from '@angular/forms';\r\nimport { IsoBaseControlComponent } from './iso-base-control.component';\r\n\r\n@Component({\r\n selector: 'iso-mat-date',\r\n templateUrl: './iso-mat-date.component.html',\r\n standalone: false\r\n})\r\n\r\nexport class IsoMatDate extends IsoBaseControlComponent {\r\n \r\n}","<mat-form-field class=\"form-control form-control-m\">\r\n <mat-label>{{ control.name | trans: control.id : control.name }}</mat-label>\r\n <input matInput [matDatepicker]=\"picker\" [formControl]=\"formControl\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n <ng-container *ngFor=\"let item of getKeys(formControl.errors)\">\r\n <div *ngIf=\"formControl.errors?.[item] && formControl.dirty\" class=\"iso-mat-error\">\r\n {{ control.name | error: control.id : item : item + \" validation failed\" }}\r\n </div>\r\n </ng-container>\r\n</mat-form-field>","import { Inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Pipe({\r\n name: 'general',\r\n pure: false,\r\n standalone: false\r\n})\r\nexport class IsoGeneralPipe implements PipeTransform {\r\n\r\n constructor(private translateService: TranslateService) {\r\n\r\n }\r\n\r\n transform(value: string, id: string,generalKey:string, defaultValue: string): string {\r\n let key = `iso.${value}`;\r\n let tran = this.translateService.instant(key);\r\n if (tran === key) {\r\n key = `iso.${id.toLocaleLowerCase()}`;\r\n tran = this.translateService.instant(key);\r\n if (tran === key) {\r\n return defaultValue;\r\n }\r\n }\r\n if(tran.general && tran.general[generalKey])\r\n {\r\n return tran.general[generalKey];\r\n }\r\n return defaultValue;\r\n }\r\n\r\n}","import { Component } from '@angular/core';\r\nimport { IsoBaseControlComponent } from './iso-base-control.component';\r\n\r\n@Component({\r\n selector: 'iso-mat-datetime',\r\n templateUrl: './iso-mat-datetime.component.html',\r\n standalone: false\r\n})\r\nexport class IsoMatDateTime extends IsoBaseControlComponent {\r\n \r\n}","<mat-form-field class=\"form-control form-control-m\">\r\n <mat-label>{{ control.name | trans: control.id : control.name }}</mat-label>\r\n <input matInput placeholder=\"{{ control.name }}\" [formControl]=\"formControl\" [attr.minlength]=\"control.minLength\" [attr.maxlength]=\"control.maxLength\">\r\n <mat-hint>{{ control.id | general: control.id : \"format\" : \"YYYY-MM-DDThh:mm:ss.sss+/-hh:mm\" }}</mat-hint>\r\n <ng-container *ngFor=\"let item of getKeys(formControl.errors)\">\r\n <div *ngIf=\"formControl.errors?.[item] && formControl.dirty\" class=\"iso-mat-error\">\r\n {{ control.name | error: control.id : item : item + \" validation failed\" }}\r\n </div>\r\n </ng-container>\r\n \r\n</mat-form-field>","import { Component } from '@angular/core';\r\nimport { IsoBaseControlComponent } from './iso-base-control.component';\r\n\r\n@Component({\r\n selector: 'iso-mat-input',\r\n templateUrl: './iso-mat-input.component.html',\r\n standalone: false\r\n})\r\nexport class IsoMatInput extends IsoBaseControlComponent {\r\n \r\n}","<mat-form-field class=\"form-control form-control-m\" appearance=\"fill\">\r\n <mat-label>{{ control.name | trans: control.id : control.name }}</mat-label>\r\n <input matInput placeholder=\"{{ control.name }}\" [formControl]=\"formControl\" [attr.minlength]=\"control.minLength\" [attr.maxlength]=\"control.maxLength\">\r\n <ng-container *ngFor=\"let item of getKeys(formControl.errors)\">\r\n <div *ngIf=\"formControl.errors?.[item] && formControl.dirty\" class=\"iso-mat-error\">\r\n {{ control.name | error: control.id : item : item + \" validation failed\" }}\r\n </div>\r\n </ng-container>\r\n</mat-form-field>","import { Component } from '@angular/core';\r\nimport { IsoBaseControlComponent } from './iso-base-control.component';\r\n\r\n@Component({\r\n selector: 'iso-mat-checkbox',\r\n templateUrl: './iso-mat-checkbox.component.html',\r\n standalone: false\r\n})\r\nexport class IsoMatCheckbox extends IsoBaseControlComponent {\r\n \r\n}","<mat-form-field class=\"form-control form-control-m\">\r\n <mat-checkbox [formControl]=\"formControl\">{{ control.name | trans: control.id : control.name }}</mat-checkbox>\r\n <ng-container *ngFor=\"let item of getKeys(formControl.errors)\">\r\n <div *ngIf=\"formControl.errors?.[item] && formControl.dirty\">\r\n {{ control.name | error: control.id : item : item + \" validation failed\" }}\r\n </div>\r\n </ng-container>\r\n</mat-form-field>","\r\nimport { Component } from '@angular/core';\r\nimport { IsoBaseControlComponent } from './iso-base-control.component';\r\n\r\n@Component({\r\n selector: 'iso-mat-textarea',\r\n templateUrl: './iso-mat-textarea.component.html',\r\n standalone: false\r\n})\r\n\r\nexport class IsoMatTextarea extends IsoBaseControlComponent {\r\n \r\n}","<mat-form-field class=\"form-control form-control-full\">\r\n <mat-label>{{ control.name | trans: control.id : control.name }}</mat-label>\r\n <textarea matInput placeholder=\"{{control.name}}\" [formControl]=\"formControl\"></textarea>\r\n <ng-container *ngFor=\"let item of getKeys(formControl.errors)\">\r\n <div *ngIf=\"formControl.errors?.[item] && formControl.dirty\" class=\"iso-mat-error\">\r\n {{ control.name | error: control.id : item : item + \" validation failed\" }}\r\n </div>\r\n </ng-container>\r\n</mat-form-field>","\r\nimport { Component } from '@angular/core';\r\nimport { IsoBaseControlComponent } from './iso-base-control.component';\r\n\r\n@Component({\r\n selector: 'iso-mat-select',\r\n templateUrl: './iso-mat-select.component.html',\r\n standalone: false\r\n})\r\n\r\nexport class IsoMatSelect extends IsoBaseControlComponent {\r\n \r\n}","<mat-form-field class=\"form-control form-control-m\">\r\n <mat-label>{{ control.name | trans: control.id : control.name }}</mat-label>\r\n <mat-select [formControl]=\"formControl\">\r\n <mat-option *ngFor=\"let item of control.values\" [value]=\"item\">\r\n {{item}}\r\n </mat-option>\r\n </mat-select>\r\n <ng-container *ngFor=\"let item of getKeys(formControl.errors)\">\r\n <div *ngIf=\"formControl.errors?.[item] && formControl.dirty\" class=\"iso-mat-error\">\r\n {{ control.name | error: control.id : item : item + \" validation failed\" }}\r\n </div>\r\n </ng-container>\r\n </mat-form-field>","import { Component } from '@angular/core';\r\nimport { IsoBaseControlComponent } from './iso-base-control.component';\r\n\r\n@Component({\r\n selector: 'iso-mat-currency',\r\n templateUrl: './iso-mat-currency.component.html',\r\n standalone: false\r\n})\r\nexport class IsoMatCurrency extends IsoBaseControlComponent {\r\n \r\n}","<mat-form-field class=\"form-control form-control-s\">\r\n <mat-label>{{ control.name | trans: control.id : control.name }}</mat-label>\r\n <input matInput placeholder=\"{{ control.name }}\" [formControl]=\"formControl\" [attr.maxlength]=\"control.maxLength\">\r\n <ng-container *ngFor=\"let item of getKeys(formControl.errors)\">\r\n <div *ngIf=\"formControl.errors?.[item] && formControl.dirty\" class=\"iso-mat-error\">\r\n {{ control.name | error: control.id : item : item }}\r\n </div>\r\n </ng-container>\r\n</mat-form-field>","import { Type } from \"@angular/core\";\r\n\r\nexport class ComponentModel {\r\n constructor(public component: Type<any>, public prop: any) { }\r\n}","import { FormControl } from \"@angular/forms\";\r\nimport { ComponentModel } from \"../models/component.model\";\r\nimport { SchemaElement } from \"../../Models/Schema\";\r\nimport { IsoMatCurrency, IsoMatDate, IsoMatDateTime, IsoMatInput, IsoMatSelect, IsoMatTextarea } from \"../../components\";\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n })\r\nexport class ControlService {\r\n\r\n public getComponentByType(controlModel: SchemaElement, formControl: FormControl): ComponentModel {\r\n if (!controlModel.dataType) {\r\n console.log(\"controlModel name {0}\", controlModel.name);\r\n throw `Argument null exception dataType`;\r\n }\r\n switch (controlModel.dataType.toLocaleLowerCase()) {\r\n case \"string\":\r\n case \"decimal\":\r\n if(controlModel.name.toLocaleLowerCase().indexOf('ccy') > -1)\r\n {\r\n return new ComponentModel(IsoMatCurrency, { \"control\": controlModel, \"formControl\": formControl });\r\n }\r\n if (controlModel.values?.length > 0) {\r\n return new ComponentModel(IsoMatSelect, { \"control\": controlModel, \"formControl\": formControl });\r\n }\r\n if (controlModel.maxLength && parseInt(controlModel.maxLength, 10) > 50) {\r\n return new ComponentModel(IsoMatTextarea, { \"control\": controlModel, \"formControl\": formControl });\r\n }\r\n return new ComponentModel(IsoMatInput, { \"control\": controlModel, \"formControl\": formControl });\r\n case \"date\":\r\n return new ComponentModel(IsoMatDate, { \"control\": controlModel, \"formControl\": formControl });\r\n case \"datetime\":\r\n return new ComponentModel(IsoMatDateTime, { \"control\": controlModel, \"formControl\": formControl });\r\n case \"boolean\":\r\n controlModel.values = [\"true\", \"false\"];\r\n return new ComponentModel(IsoMatSelect, { \"control\": controlModel, \"formControl\": formControl });\r\n case \"any\":\r\n return new ComponentModel(IsoMatTextarea, { \"control\": controlModel, \"formControl\": formControl });\r\n default:\r\n return new ComponentModel(IsoMatInput, { \"control\": controlModel, \"formControl\": formControl });\r\n }\r\n }\r\n}","import { Directive, ViewContainerRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[componentContent]',\r\n standalone: false\r\n})\r\nexport class ComponentDirective {\r\n constructor(public viewContainerRef: ViewContainerRef) { }\r\n}","import { Component, Input, OnInit, Type, ViewChild } from '@angular/core';\r\nimport { ComponentDirective } from '../../directives/component-content.directive';\r\nimport { ComponentModel } from '../../models/component.model';\r\n\r\n@Component({\r\n selector: 'ngx-dynamic',\r\n template: `<div><ng-template componentContent></ng-template></div>`,\r\n standalone: false\r\n})\r\nexport class NgxDynamicComponent implements OnInit {\r\n\r\n @Input() componentModel: ComponentModel;\r\n @ViewChild(ComponentDirective, { static: true }) componentContent!: ComponentDirective;\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.loadComponent();\r\n }\r\n\r\n loadComponent() {\r\n const viewContainerRef = this.componentContent.viewContainerRef;\r\n viewContainerRef.clear();\r\n const componentRef = viewContainerRef.createComponent<any>(this.componentModel.component);\r\n if (this.componentModel.prop) {\r\n Object.assign(componentRef.instance, this.componentModel.prop);\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnChanges, OnInit, SimpleChanges, forwardRef } from '@angular/core';\r\nimport { ControlService } from '../../shared/services/control.service';\r\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';\r\nimport { ComponentModel } from '../../shared/models/component.model';\r\nimport { SchemaElement } from '../../Models/Schema';\r\n\r\n@Component({\r\n selector: 'ngx-iso-control',\r\n templateUrl: './iso-control.component.html',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxIsoControlComponent),\r\n multi: true,\r\n }\r\n ],\r\n standalone: false\r\n})\r\n\r\nexport class NgxIsoControlComponent implements OnInit, ControlValueAccessor {\r\n @Input() formControl: FormControl;\r\n @Input() control: SchemaElement\r\n component: ComponentModel\r\n constructor(private controlService: ControlService) {\r\n\r\n }\r\n ngOnInit(): void {\r\n this.addValidator();\r\n this.component = this.controlService.getComponentByType(this.control, this.formControl);\r\n }\r\n\r\n writeValue(obj: any): void {\r\n }\r\n registerOnChange(fn: any): void {\r\n }\r\n registerOnTouched(fn: any): void {\r\n }\r\n setDisabledState?(isDisabled: boolean): void {\r\n }\r\n\r\n private addValidator = (): void => {\r\n try {\r\n const minOccurs = parseInt(this.control.minOccurs, 10);\r\n let minLength = parseInt(this.control.minLength, 10);\r\n const maxLength = parseInt(this.control.maxLength, 10);\r\n if (minOccurs) {\r\n this.formControl.addValidators(Validators.required);\r\n }\r\n if (!Number.isNaN(minLength)) {\r\n this.formControl.addValidators(Validators.minLength(minLength));\r\n }\r\n if (!Number.isNaN(maxLength)) {\r\n this.formControl.addValidators(Validators.maxLength(maxLength));\r\n }\r\n if (this.control.pattern) {\r\n this.formControl.addValidators(Validators.pattern(this.control.pattern));\r\n }\r\n if (this.control.fractionDigits) {\r\n minLength = Number.isNaN(minLength) ? 0 : minLength;\r\n const pattern = `^[\\\\d\\\\.\\\\d{0,${this.control.fractionDigits}}]{${minLength},${this.control.totalDigits}}$`\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n}","<ngx-dynamic *ngIf=\"component\" [componentModel]=\"component\"></ngx-dynamic>","import { Injectable } from '@angular/core';\r\nimport { NativeDateAdapter, MatDateFormats } from '@angular/material/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n })\r\nexport class CustomDateAdapter extends NativeDateAdapter {\r\n public override format(date: Date, displayFormat: Object): string {\r\n const day = this._to2digit(date.getDate());\r\n const month = this._to2digit(date.getMonth() + 1); // Months are zero-based\r\n const year = date.getFullYear();\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n private _to2digit(n: number) {\r\n return ('00' + n).slice(-2);\r\n }\r\n}\r\n\r\nexport const CUSTOM_DATE_FORMATS: MatDateFormats = {\r\n parse: {\r\n dateInput: 'YYYY-MM-DD',\r\n },\r\n display: {\r\n dateInput: 'YYYY-MM-DD',\r\n monthYearLabel: 'MMM YYYY',\r\n dateA11yLabel: 'LL',\r\n monthYearA11yLabel: 'MMMM YYYY',\r\n },\r\n};\r\n","import { Injectable } from '@angular/core';\nimport { FormGroup, FormControl, FormArray, FormBuilder } from '@angular/forms';\nimport { SchemaModel } from './Models/Schema';\nimport { CustomDateAdapter } from './shared/services/custom-date-adapter';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgxIsoService {\n public _formModel: any[] = [];\n public excludes: string[] = [];\n constructor(\n private fb: FormBuilder,\n private dateService: CustomDateAdapter\n ) {}\n\n public maxOccurs(maxOccurs: string): boolean {\n return maxOccurs === 'unbounded' || parseInt(maxOccurs, 10) > 1;\n }\n\n public initFormModel(\n model: any,\n form: FormGroup | FormArray,\n prev_key: string\n ): void {\n if (typeof model === 'object') {\n for (const key in model) {\n const __key = !prev_key ? key : `${prev_key}_${key}`;\n const parentNode = this.getFormModel(this._formModel[0], __key);\n\n if (parentNode && parentNode.multi || Array.isArray(model[key])) {\n if ((!Array.isArray(model[key])) && parentNode && parentNode.multi) {\n model[key] = [model[key]];\n }\n const item = model[key];\n const formArray = form.get(__key) as FormArray;\n if (formArray && formArray.length !== item.length) {\n const newEle = structuredClone(\n parentNode.elements[parentNode.elements.length - 1]\n );\n if (\n !(\n newEle.maxOccurs &&\n parseInt(newEle.maxOccurs, 10) <= parentNode.elements.length\n )\n ) {\n const newKeys: any = [];\n const groupControls = this.getFormGroupControls(\n newEle.elements,\n newKeys,\n parentNode.elements.length - 1\n );\n parentNode.elements.push(newEle);\n formArray.push(groupControls);\n parentNode.elements.forEach((element: SchemaModel) => {\n if (\n !element.minOccurs ||\n parseInt(element.minOccurs, 10) === 0\n ) {\n element.minOccurs = '1';\n }\n });\n }\n }\n\n for (let i = 0; i < item.length; i++) {\n parentNode.elements[i].expanded = true;\n const formArray = form.get(__key);\n if (formArray) {\n const frmGroup = (formArray as FormArray).at(i);\n if (frmGroup) {\n this.initFormModel(item[i], frmGroup as FormGroup, __key);\n }\n }\n }\n } else if (typeof model[key] === 'object') {\n const node = this.getFormModel(this._formModel[0], __key);\n node.expanded = true;\n if (node && (!node.minOccurs || parseInt(node.minOccurs, 10) === 0)) {\n node.minOccurs = '1';\n }\n const _form = form.get(__key) as FormGroup;\n if (_form) {\n if (node.dataType === 'choice') {\n const choiceKey = Object.keys(model[key])[0];\n const _choiceKey = `${__key}_${choiceKey}`;\n const choiceEle = node.elements.find(\n (item: SchemaModel) => item.id === _choiceKey\n );\n node.choiceKey = _choiceKey;\n choiceEle.hidden = false;\n choiceEle.expanded = true;\n const newNode = structuredClone(choiceEle);\n if (newNode.elements.length) {\n const group = this.getFormGroupControls(\n newNode.elements,\n [],\n 0,\n false\n );\n _form.addControl(newNode.id, group);\n } else {\n const control = this.getFormControl('');\n _form.addControl(newNode.id, control);\n }\n }\n this.initFormModel(model[key], _form, __key);\n }\n } else {\n const _form = form.get(__key) as FormControl;\n _form.setValue(model[key]);\n }\n }\n } else if (Array.isArray(model)) {\n for (let i = 0; i < model.length; i++) {\n const frmGroup = (form as FormArray).at(i);\n this.initFormModel(model[i], frmGroup as FormGroup, '');\n }\n }\n }\n\n public getFormGroupControls(\n json: SchemaModel[],\n keys: any,\n index: number = 0,\n choiceEle: boolean = false\n ): FormGroup {\n let control: any = {};\n let controls: any;\n let value = {};\n\n json.forEach((item: SchemaModel) => {\n if (\n (this.excludes.length > 0 && !this.excludes.includes(item.id)) ||\n this.excludes.length == 0\n ) {\n item.hidden = choiceEle;\n value = item.elements;\n const id = item.id;\n const element = { ...item, elements: [], id };\n if (item.elements.length > 0) {\n let choice = item.dataType === 'choice';\n if (choice) {\n element.choiceKey = '';\n }\n if (this.maxOccurs(item.maxOccurs)) {\n element.uniqueId = `${element.id}_${index}`;\n keys.push({\n id: element.id,\n multi: true,\n xpath: element.xpath,\n elements: [element],\n });\n const data = this.getFormGroupControls(\n item.elements,\n element.elements,\n index,\n choice\n );\n controls = this.fb.array([]);\n if (!choice) {\n controls.push(data);\n }\n control[id] = controls;\n } else if (item.multi && !item.isFormControls) {\n keys.push({\n id: element.id,\n multi: true,\n xpath: element.xpath,\n elements: element.elements,\n });\n const data = this.getFormGroupControls(\n item.elements[item.elements.length - 1].elements,\n element.elements,\n index,\n choice\n );\n controls = this.fb.array([]);\n if (!choice) {\n controls.push(data);\n }\n control[id] = controls;\n } else if (item.multi && item.isFormControls) {\n if (item.elements.length > 1) {\n item.elements.splice(1, item.elements.length - 1);\n }\n keys.push(item);\n control[id] = this.fb.array([\n this.getFormControl(item.value || ''),\n ]);\n } else {\n keys.push(element);\n const data = this.getFormGroupControls(\n item.elements,\n element.elements,\n index,\n choice\n );\n if (!choice) {\n control[id] = data;\n } else {\n control[id] = this.fb.group({});\n }\n }\n } else if (this.maxOccurs(item.maxOccurs)) {\n keys.push({\n id: element.id,\n multi: true,\n xpath: element.xpath,\n elements: [element],\n isFormControls: true,\n });\n control[id] = this.fb.array([this.getFormControl(item.value)]);\n } else if (item.isCurrency) {\n const _amountCurrency = this.getAmountCurrency(item);\n keys.push(element);\n const data = this.getFormGroupControls(\n _amountCurrency,\n element.elements,\n 0,\n false\n );\n control[item.id] = data;\n } else {\n keys.push(element);\n control[id] = this.getFormControl(item.value || '');\n }\n }\n });\n return new FormGroup(control);\n }\n\n public getFormControl(values: any): FormControl {\n return new FormControl(values || '', {\n updateOn: 'blur',\n });\n }\n\n public sanitize = (obj: any): any => {\n if (obj === null || obj === '') {\n return null;\n }\n\n if (Array.isArray(obj)) {\n const cleanedObj: any = [];\n for (const index in obj) {\n const cleanedValue = this.sanitize(obj[index]);\n if (\n cleanedValue !== null &&\n cleanedValue !== '' &&\n Object.keys(cleanedValue).length > 0 &&\n (!Array.isArray(cleanedValue) || cleanedValue.length > 0)\n ) {\n cleanedObj.push(cleanedValue);\n }\n }\n return cleanedObj;\n } else if (typeof obj === 'object' && obj instanceof Date) {\n const cleanedObj = this.dateService.format(obj, 'YYYY-MM-DD');\n return cleanedObj;\n } else if (typeof obj === 'object') {\n const cleanedObj: any = {};\n\n for (const key in obj) {\n const cleanedValue = this.sanitize(obj[key]);\n if (\n cleanedValue !== null &&\n cleanedValue !== '' &&\n Object.keys(cleanedValue).length > 0 &&\n (!Array.isArray(cleanedValue) || cleanedValue.length > 0)\n ) {\n const _keys = key.split('_');\n const newKey = _keys[_keys.length - 1];\n cleanedObj[newKey] = cleanedValue;\n }\n }\n return cleanedObj;\n }\n\n return obj;\n };\n\n private getFormModel = (object: any, key: string): any => {\n if (object) {\n if (object.elements.length) {\n if (object.id === key) {\n return object;\n }\n for (let i = 0; i < object.elements.length; i++) {\n const obj = this.getFormModel(object.elements[i], key);\n if (obj) return obj;\n }\n } else {\n if (object.id === key) {\n return object;\n }\n }\n }\n };\n\n private getAmountCurrency(item: SchemaModel): SchemaModel[] {\n const elements: SchemaModel[] = [];\n const ccy = structuredClone(item);\n const amt = structuredClone(item);\n\n ccy.id = `${ccy.id}_Ccy`;\n ccy.name = 'Ccy';\n ccy.fractionDigits = '';\n ccy.totalDigits = '';\n ccy.maxLength = '3';\n ccy.xpath = `${ccy.xpath}@Ccy`;\n ccy.isCurrency = false;\n elements.push(ccy);\n\n amt.id = `${amt.id}_Amt`;\n amt.xpath = `${amt.xpath}/Amt`;\n amt.isCurrency = false;\n amt.pattern = '';\n elements.push(amt);\n return elements;\n }\n}\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnChanges,\r\n SimpleChanges\r\n} from '@angular/core';\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormArray,\r\n AbstractControl\r\n} from '@angular/forms';\r\n\r\nimport { SchemaModel } from './Models/Schema';\r\nimport { NgxIsoService } from './ngx-iso-form.service';\r\nimport { IsoForm } from './Models/IsoForm';\r\n\r\n@Component({\r\n selector: 'ngx-iso-form',\r\n templateUrl: './ngx-iso-form.component.html',\r\n styleUrls: ['./ngx-iso-form.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class NgxIsoFormComponent implements OnChanges {\r\n @Input({ required: true }) form: IsoForm;\r\n @Input({ required: true }) schema: SchemaModel;\r\n @Input() excludes: string[];\r\n protected _form: FormGroup;\r\n private _isFormInitiate: boolean;\r\n private _ngModel: any;\r\n\r\n constructor(private service: NgxIsoService, private changeDetection: ChangeDetectorRef) {\r\n }\r\n\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['schema'] && changes['schema'].currentValue) {\r\n this.initiateForm();\r\n }\r\n if (changes['form'] && changes['form'].currentValue) {\r\n this.initiateFormModel();\r\n }\r\n if (changes['excludes'] && changes['excludes'].currentValue) {\r\n this.service.excludes = this.excludes; \r\n }\r\n }\r\n\r\n public get model(): any {\r\n if (this._form)\r\n return this.service.sanitize(this._form.value);\r\n }\r\n\r\n protected get getFormModel(): any[] {\r\n return this.service._formModel;\r\n }\r\n\r\n public get invalid(): boolean {\r\n return this._form.invalid;\r\n }\r\n\r\n private initiateForm(): void {\r\n this.service._formModel = [this.structuredClone(this.schema)];\r\n this.service._formModel[0].elements = [];\r\n let group: any = {};\r\n const schemaElements = this.schema.elements.length > 0 ? this.structuredClone(this.schema.elements) : this.schema.elements;\r\n const formElements = this.service._formModel[0].elements.length > 0 ? this.structuredClone(this.service._formModel[0].elements) : this.service._formModel[0].elements;\r\n group[this.schema.id] = this.service.getFormGroupControls(schemaElements, formElements);\r\n this._form = new FormGroup(group);\r\n if (!this._isFormInitiate) {\r\n this.initiateFormModel();\r\n }\r\n }\r\n\r\n private structuredClone(data: any): any {\r\n let cloneData;\r\n try {\r\n cloneData = structuredClone(data);\r\n } catch(e) {\r\n cloneData = JSON.parse(JSON.stringify(data));\r\n }\r\n return cloneData;\r\n }\r\n\r\n private initiateFormModel(): void {\r\n if (this._form) {\r\n this._ngModel = this.form.isoFormModel;\r\n this.form.getFormModel = () => {\r\n return this.model;\r\n };\r\n\r\n \r\n this._isFormInitiate = true;\r\n this.service.initFormModel(this._ngModel, this._form,\"\");\r\n }\r\n }\r\n\r\n protected onChoiceSelectionChange(id: string, formElement: any, node: SchemaModel): void {\r\n node.elements.forEach((element: SchemaModel) => {\r\n element.hidden = true;\r\n formElement.removeControl(element.id);\r\n if (element.id === id) {\r\n node.choiceKey = id;\r\n element.hidden = false;\r\n if (element.elements.length) {\r\n // element.elements[0].hidden = false;\r\n const group = this.service.getFormGroupControls(element.elements, [], 0, false);\r\n formElement.addControl(element.id, group);\r\n } else {\r\n const control = this.service.getFormControl('');\r\n formElement.addControl(element.id, control);\r\n }\r\n\r\n }\r\n });\r\n }\r\n\r\n protected maxOccurs(maxOccurs: string): boolean {\r\n return maxOccurs !== null && maxOccurs !== undefined && this.service.maxOccurs(maxOccurs);\r\n }\r\n\r\n protected expand(minOccurs: string): boolean {\r\n return minOccurs !== null && minOccurs !== undefined && parseInt(minOccurs, 10) > 0;\r\n }\r\n\r\n protected addSection($event: Event, node: SchemaModel, parentNode: SchemaModel, parentFormEle: FormGroup): void {\r\n $event.stopPropagation();\r\n const control: FormArray = parentFormEle.get(node.id) as FormArray;\r\n if (node.maxOccurs && parseInt(node.maxOccurs, 10) <= parentNode.elements.length) {\r\n return;\r\n }\r\n const newEle = this.structuredClone(parentNode.elements[0]);\r\n const newKeys: any = [];\r\n const groupControls = this.service.getFormGroupControls(newEle.elements, newKeys, parentNode.elements.length - 1);\r\n parentNode.elements.push(newEle);\r\n control.push(groupControls);\r\n this.changeDetection.detectChanges();\r\n }\r\n\r\n protected removeSection($event: Event, parentNode: SchemaModel, parentFormEle: FormGroup, index: number): void {\r\n $event.stopPropagation();\r\n const control: FormArray = parentFormEle.get(parentNode.id) as FormArray;\r\n parentNode.elements.splice(index, 1);\r\n control.removeAt(index);\r\n this.changeDetection.detectChanges();\r\n }\r\n\r\n protected addNewControl($event: Event, node: SchemaModel, parentNode: SchemaModel, parentFormEle: FormGroup): void {\r\n $event.stopPropagation();\r\n if (node.maxOccurs && parseInt(node.maxOccurs, 10) <= parentNode.elements.length) {\r\n return;\r\n }\r\n const control: FormArray = parentFormEle.get(node.id) as FormArray;\r\n const newControl = this.service.getFormControl('');\r\n const newEle = this.structuredClone(parentNode.elements[parentNode.elements.length - 1]);\r\n control.push(newControl);\r\n parentNode.elements.push(newEle);\r\n this.changeDetection.detectChanges();\r\n }\r\n\r\n protected removeNewControl($event: Event, parentNode: SchemaModel, parentFormEle: FormGroup, index: number): void {\r\n $event.stopPropagation();\r\n const control: FormArray = parentFormEle.get(parentNode.id) as FormArray;\r\n parentNode.elements.splice(index, 1);\r\n control.removeAt(index);\r\n this.changeDetection.detectChanges();\r\n }\r\n\r\n protected isArray(myKey: Object | Array<any>): boolean {\r\n if (myKey instanceof Array) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n protected isEmpty(formElement: FormGroup): boolean {\r\n return formElement.controls && Object.keys(formElement.controls).length === 0;\r\n }\r\n\r\n protected getElement(formElement: FormGroup, element: any): AbstractControl<any, any> | undefined {\r\n if (element.hidden) {\r\n return;\r\n }\r\n let _element;\r\n if (element.multi) {\r\n _element = element.elements[element.elements.length - 1];\r\n } else {\r\n _element = element;\r\n }\r\n\r\n let formControl = formElement.controls[_element.id];\r\n if (!formControl) {\r\n formControl = (formElement as any)[_element.id];\r\n if (!formControl)\r\n throw `FormControl not found ${_element.id}`;\r\n }\r\n if (formControl instanceof FormArray) {\r\n const formGroup = formControl.controls.find((item: any) => {\r\n if (item instanceof FormControl)\r\n return true;\r\n return Object.keys(item.controls).find((ctrl) => {\r\n return ctrl.indexOf(element.id) > -1;\r\n })\r\n });\r\n if (formGroup)\r\n return formControl.at(formControl.length - 1);\r\n }\r\n return formControl;\r\n }\r\n\r\n protected getFormControl(node: SchemaModel): FormControl {\r\n return this.service.getFormControl('');\r\n }\r\n\r\n protected getChoiceFormControl(choiceKey:string){\r\n const formControl = this.service.getFormControl('');\r\n formControl.setValue(choiceKey);\r\n return formControl;\r\n }\r\n}\r\n","<form *ngIf=\"_form && schema\" [formGroup]=\"_form\">\r\n <div class=\"form-group\">\r\n <ng-template #nodeTemplateRef let-node=\"node\" let-formElement=\"formElement\" let-index=\"index\"\r\n let-parentNode=\"parentNode\" let-parentFormElement=\"parentFormElement\">\r\n <ng-container *ngIf=\"node.multi then arr else obj\"></ng-container>\r\n <ng-template #arr>\r\n <ng-template *ngFor=\"let model of node.elements;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: formElement,\r\n parentFormElement: parentFormElement,\r\n parentNode: node,\r\n index: i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #obj>\r\n <ng-container *ngIf=\"node.elements.length\">\r\n <mat-accordion [formGroup]=\"formElement\" *ngIf=\"!node.hidden\">\r\n <mat-expansion-panel multi [expanded]=\"expand(node.minOccurs) || node.expanded\" #expan>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{ node.name | trans: node.id : node.name }}\r\n </mat-panel-title>\r\n <mat-panel-description *ngIf=\"maxOccurs(node.maxOccurs)\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addSection($event, node,parentNode, parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeSection($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </mat-panel-description>\r\n </mat-expansion-panel-header>\r\n <ng-container *ngIf=\"expan.expanded\">\r\n <mat-form-field *ngIf=\"node.dataType === 'choice'\">\r\n <mat-label>{{ node.name | trans: node.id : node.name }}</mat-label>\r\n <mat-select (selectionChange)=\"onChoiceSelectionChange($event.value,formElement, node)\" [formControl]=\"getChoiceFormControl(node.choiceKey)\">\r\n <mat-option *ngFor=\"let item of node.elements\" [value]=\"item.id\">\r\n {{item.name}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <ng-container *ngIf=\"!isEmpty(formElement)\">\r\n <ng-template *ngFor=\"let model of node.elements; let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(formElement,model),\r\n parentFormElement: formElement\r\n }\">\r\n </ng-template>\r\n </ng-container>\r\n <div *ngIf=\"node.elements.length === 0\">\r\n <ngx-iso-control *ngIf=\"!node.hidden\" [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </div>\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n </ng-container>\r\n <ng-container *ngIf=\"!node.elements.length && !node.hidden\">\r\n <div *ngIf=\"maxOccurs(node.maxOccurs)\" class=\"form-add-section\">\r\n &nbsp;\r\n <button *ngIf=\"index < 1\" mat-icon-button (click)=\"addNewControl($event, node,parentNode,parentFormElement)\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <button *ngIf=\"index > 0\" mat-icon-button (click)=\"removeNewControl($event,parentNode,parentFormElement,index)\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n </div>\r\n <ngx-iso-control [formControl]=\"formElement\" [control]=\"node\"></ngx-iso-control>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n <ng-container *ngFor=\"let model of getFormModel; let i = index\">\r\n <ng-container *ngIf=\"isArray(model);then formArray else formObject\">\r\n </ng-container>\r\n <ng-template #formArray>\r\n <ng-template *ngFor=\"let key of model;let i = index\" [ngTemplateOutlet]=\"nodeTemplateRef\"\r\n [ngTemplateOutletContext]=\"{\r\n node: key,\r\n formElement: getElement(_form,key),\r\n parentFormElement: _form,\r\n index:i\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n <ng-template #formObject>\r\n <ng-template [ngTemplateOutlet]=\"nodeTemplateRef\" [ngTemplateOutletContext]=\"{\r\n node: model,\r\n formElement: getElement(_form,model),\r\n parentFormElement: _form,\r\n index: i,\r\n }\">\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n</form>","import { NgModule } from '@angular/core';\r\n\r\nimport { BrowserAnimationsModule } from \"@angular/platform-browser/animations\"\r\nimport { BrowserModule } from '@angular/platform-browser';\r\n\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { DateAdapter, MAT_DATE_FORMATS, MatNativeDateModule } from '@angular/material/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatSelectModule } from '@angular/material/select';\r\n\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nimport {\r\n NgxIsoControlComponent,\r\n IsoBaseControlComponent,\r\n IsoMatInput,\r\n IsoMatDate,\r\n IsoMatTextarea,\r\n IsoMatSelect,\r\n IsoMatCheckbox,\r\n IsoMatDateTime,\r\n IsoMatCurrency,\r\n} from './components';\r\n\r\nimport { NgxIsoFormComponent } from './ngx-iso-form.component';\r\n\r\nimport { ComponentDirective } from './shared/directives/component-content.directive';\r\nimport { NgxDynamicComponent } from './shared/components/dynamic/ngx-dynamic.component';\r\nimport { IsoTranslatePipe } from './shared/pipe/translate.pipe';\r\nimport { IsoErrorPipe } from './shared/pipe/error.pipe';\r\nimport { IsoGeneralPipe } from './shared/pipe/general.pipe';\r\nimport { CUSTOM_DATE_FORMATS, CustomDateAdapter } from './shared/services/custom-date-adapter';\r\n\r\n@NgModule({\r\n declarations: [\r\n NgxIsoFormComponent,\r\n NgxIsoControlComponent,\r\n NgxDynamicComponent,\r\n IsoBaseControlComponent,\r\n IsoMatInput,\r\n IsoMatTextarea,\r\n IsoMatDate,\r\n IsoMatDateTime,\r\n IsoMatSelect,\r\n IsoMatCheckbox,\r\n IsoMatCurrency,\r\n ComponentDirective,\r\n IsoTranslatePipe,\r\n IsoErrorPipe,\r\n IsoGeneralPipe\r\n ],\r\n imports: [\r\n BrowserModule,\r\n BrowserAnimationsModule,\r\n TranslateModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatNativeDateModule,\r\n MatDatepickerModule,\r\n MatButtonModule,\r\n MatSelectModule,\r\n MatIconModule,\r\n ],\r\n providers: [\r\n { provide: DateAdapter, useClass: CustomDateAdapter },\r\n { provide: MAT_DATE_FORMATS, useValue: CUSTOM_DATE_FORMATS }\r\n ],\r\n exports: [\r\n NgxIsoFormComponent\r\n ]\r\n})\r\nexport class NgxIsoFormModule { }\r\n","import { ComponentRef, Injectable, ViewContainerRef } from \"@angular/core\";\r\nimport { ComponentModel } from \"../models/component.model\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n })\r\nexport class ComponentService{\r\n public getComponent<T>(viewContainerRef: ViewContainerRef,dynamicModel: ComponentModel): ComponentRef<T> {\r\n const componentRef = viewContainerRef.createComponent<T>(dynamicModel.component);\r\n if(dynamicModel.prop){\r\n (componentRef.instance as any).prop = dynamicModel.prop;\r\n }\r\n return componentRef;\r\n }\r\n}\r\n\r\n","import { SchemaElement } from './Schema';\r\n\r\nexport class IsoForm {\r\n private _model: any;\r\n private _namespace: any = {};\r\n constructor(model: any, xmlMessage: string = '') {\r\n if (xmlMessage) {\r\n model = this.parseXML(\r\n new DOMParser().parseFromString(xmlMessage, 'text/xml').childNodes[0]\r\n );\r\n }\r\n this._model = model;\r\n }\r\n public get isoFormModel(): any {\r\n return this._model;\r\n }\r\n\r\n /**\r\n * @deprecated This method is deprecated use `#isoForm.getFormModel` instead\r\n */\r\n public getFormModel = (): any => {};\r\n\r\n private parseXML(node: any) {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const obj: Record<string, any> = {};\r\n obj[node.nodeName] = {};\r\n\r\n if (node.hasChildNodes()) {\r\n for (let childNode of Array.from(node.childNodes) as any) {\r\n const childObj = this.parseXML(childNode);\r\n if (\r\n typeof childObj === 'object' &&\r\n childNode.nodeType !== Node.TEXT_NODE &&\r\n Object.keys(childObj).length > 0\r\n ) {\r\n if (obj[node.nodeName][childNode.nodeName]) {\r\n obj[node.nodeName][childNode.nodeName] = [\r\n structuredClone(obj[node.nodeName][childNode.nodeName]),\r\n ];\r\n obj[node.nodeName][childNode.nodeName].push(\r\n childObj[childNode.nodeName]\r\n );\r\n } else {\r\n obj[node.nodeName][childNode.nodeName] = {};\r\n obj[node.nodeName][childNode.nodeName] =\r\n childObj[childNode.nodeName];\r\n }\r\n } else if (childObj && Object.keys(childObj).length > 0) {\r\n obj[node.nodeName] = childObj;\r\n }\r\n }\r\n }\r\n\r\n if (node.attributes && node.attributes.length > 0) {\r\n for (const attribute of Array.from(node.attributes) as any) {\r\n if (attribute.nodeName === 'xmlns') {\r\n this._namespace[node.nodeName] = attribute.nodeValue;\r\n } else {\r\n if (attribute.nodeName === 'Ccy') {\r\n obj[node.nodeName] = {\r\n Amt: node.textContent,\r\n Ccy: attribute.nodeValue,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n return obj;\r\n } else if (\r\n node.nodeType === Node.TEXT_NODE ||\r\n node.nodeType === Node.CDATA_SECTION_NODE\r\n ) {\r\n return node.nodeValue.trim();\r\n }\r\n\r\n return {};\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-iso-form\r\n */\r\n\r\nexport * from './lib/ngx-iso-form.module';\r\nexport * from './lib/ngx-iso-form.component';\r\nexport * from './lib/shared/services';\r\n\r\nexport { SchemaElement } from './lib/Models/Schema'\r\nexport * from './lib/Models/Control