import { Component, Input, OnInit, SimpleChanges } from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; import { DescriptionTemplateFieldType } from '@app/core/common/enum/description-template-field-type'; import { DescriptionTemplate, DescriptionTemplateBaseFieldData, DescriptionTemplateDefinition, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplateMultiplicity, DescriptionTemplatePage, DescriptionTemplateReferenceTypeData, DescriptionTemplateRule, DescriptionTemplateSection } from '@app/core/model/description-template/description-template'; import { DescriptionTemplateBaseFieldDataPersist, DescriptionTemplateDefinitionPersist, DescriptionTemplateFieldPersist, DescriptionTemplateFieldSetPersist, DescriptionTemplateMultiplicityPersist, DescriptionTemplatePagePersist, DescriptionTemplatePersist, DescriptionTemplateReferenceTypeFieldPersist, DescriptionTemplateRulePersist, DescriptionTemplateSectionPersist } from '@app/core/model/description-template/description-template-persist'; import { Description } from '@app/core/model/description/description'; import { DescriptionEditorModel } from '@app/ui/description/editor/description-editor.model'; import { VisibilityRulesService } from '@app/ui/description/editor/description-form/visibility-rules/visibility-rules.service'; @Component({ selector: 'app-final-preview-component', templateUrl: './final-preview.component.html', styleUrls: ['./final-preview.component.scss'], providers: [VisibilityRulesService] }) export class FinalPreviewComponent implements OnInit { @Input() descriptionTemplatePersist: DescriptionTemplatePersist; descriptionTemplate: DescriptionTemplate; previewPropertiesFormGroup: UntypedFormGroup; constructor(public visibilityRulesService: VisibilityRulesService) { } ngOnInit(): void { this.generatePreviewForm(); } ngOnChanges(changes: SimpleChanges) { if(changes['descriptionTemplatePersist']) this.generatePreviewForm(); } private generatePreviewForm() { if(this.descriptionTemplatePersist){ this.descriptionTemplate = this.buildDescriptionTemplate(this.descriptionTemplatePersist); const mockDescription: Description = { descriptionTemplate: this.descriptionTemplate } const descriptionEditorModel = new DescriptionEditorModel().fromModel(mockDescription, mockDescription.descriptionTemplate); this.previewPropertiesFormGroup = descriptionEditorModel.properties.buildForm() as UntypedFormGroup; this.visibilityRulesService.setContext(this.descriptionTemplate.definition, this.previewPropertiesFormGroup); } } private buildDescriptionTemplate(persist: DescriptionTemplatePersist) : DescriptionTemplate{ if (persist == null) return null; return { id: persist.id, label: persist.label, description: persist.description, groupId: undefined, version: undefined, language: persist.language, type: undefined, status: persist.status, definition: this.buildDescriptionTemplateDefinition(persist.definition), users: persist.users } } private buildDescriptionTemplateDefinition(persist: DescriptionTemplateDefinitionPersist) : DescriptionTemplateDefinition{ if (persist == null) return null; return { pages: persist.pages.map(x => this.buildDescriptionTemplatePage(x)) } } private buildDescriptionTemplatePage(persist: DescriptionTemplatePagePersist) : DescriptionTemplatePage{ if (persist == null) return null; return { id: persist.id, ordinal: persist.ordinal, title: persist.title, sections: persist.sections.map(x => this.buildDescriptionTemplateSection(x)), } } private buildDescriptionTemplateSection(persist: DescriptionTemplateSectionPersist) : DescriptionTemplateSection{ if (persist == null) return null; return { id: persist.id, ordinal: persist.ordinal, defaultVisibility: persist.defaultVisibility, multiplicity: persist.multiplicity, title: persist.title, description: persist.description, sections: persist.sections.map(x => this.buildDescriptionTemplateSection(x)), fieldSets: persist.fieldSets.map(x => this.buildDescriptionTemplateFieldSet(x)), } } private buildDescriptionTemplateFieldSet(persist: DescriptionTemplateFieldSetPersist) : DescriptionTemplateFieldSet{ if (persist == null) return null; return { id: persist.id, ordinal: persist.ordinal, numbering: '', title: persist.title, description: persist.description, extendedDescription: persist.extendedDescription, additionalInformation: persist.additionalInformation, multiplicity: { max: persist.multiplicity.max, min: persist.multiplicity.min, placeholder: persist.multiplicity.placeholder, tableView: persist.multiplicity.tableView }, hasCommentField: persist.hasCommentField, fields: persist.fields.map(x => this.buildDescriptionTemplateField(x)), } } private buildDescriptionTemplateField (persist: DescriptionTemplateFieldPersist) : DescriptionTemplateField{ if (persist == null) return null; let convertedField: DescriptionTemplateField ={ id: persist.id, ordinal: persist.ordinal, schematics: persist.schematics, defaultValue: persist.defaultValue, visibilityRules: persist.visibilityRules, validations: persist.validations, includeInExport: persist.includeInExport, data: persist.data, } if (persist.data.fieldType === DescriptionTemplateFieldType.REFERENCE_TYPES) { convertedField.data = persist.data; (convertedField.data as DescriptionTemplateReferenceTypeData).referenceType = { id: (persist.data as DescriptionTemplateReferenceTypeFieldPersist).referenceTypeId }; } else { convertedField.data = persist.data; } return convertedField; } }