import { AfterViewInit, Component, Input, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { MatStepper } from '@angular/material'; import { ActivatedRoute, Router } from '@angular/router'; import 'rxjs/add/operator/switchMap'; import { takeUntil } from 'rxjs/operators'; import { BaseComponent } from '../../core/common/base/base.component'; import { CompositeField } from '../../models/CompositeField'; import { DatasetProfileDefinitionModel } from '../../models/DatasetProfileDefinitionModel'; import { DatasetWizardModel } from '../../models/datasets/DatasetWizardModel'; import { Pair } from '../../models/helpers/Pair'; import { Rule } from '../../models/Rule'; import { Section } from '../../models/Section'; import '../../utilities/enhancers/flatJoinOn'; import { FormFocusService } from '../../utilities/form-focus-service/form-focus.service'; import { JsonSerializer } from '../../utilities/JsonSerializer'; import { VisibilityRulesService } from '../../utilities/visibility-rules/visibility-rules.service'; @Component({ selector: 'app-dynamic-form', templateUrl: './dynamic-form.component.html', styleUrls: [ './dynamic-form.component.scss' ], providers: [ FormFocusService ], encapsulation: ViewEncapsulation.None, }) export class DynamicFormComponent extends BaseComponent implements OnInit, AfterViewInit { pathName: string; pages: Array; activeStepperIndex = 1; visibleSidebar = false; datasetProfileDefinitionModel: DatasetProfileDefinitionModel; private progressbar = false; private currentPageIndex = 0; @ViewChild('stepper') stepper: MatStepper; @Input() dataModel: DatasetWizardModel = new DatasetWizardModel(); @Input() path: string; @Input() form: FormGroup; id: string; trackByFn = (index, item) => item ? item['id'] : null; pageTrackByFn = (index, item) => item['id']; // @Input() datasetId: string; constructor( private router: Router, private route: ActivatedRoute, private visibilityRulesService: VisibilityRulesService, private formFocusService: FormFocusService ) { super(); //this.datasetId = route.snapshot.params['id']; } getSubForm(subformName) { return this.form.controls[subformName]; } ngOnInit() { const rules: Rule[] = JsonSerializer.fromJSONArray(this.dataModel.datasetProfileDefinition.rules, Rule); this.visibilityRulesService.formGroup = this.form; this.visibilityRulesService.buildVisibilityRules(rules); this.datasetProfileDefinitionModel = this.dataModel.datasetProfileDefinition; this.visibilityRulesService.setModel(this.datasetProfileDefinitionModel); this.createPagination(); this.progressbar = true; const sections: Pair[] = this.datasetProfileDefinitionModel.pages.map(page => new Pair(page.sections, page.ordinal)).filter(x => x); const compositeFields: Pair[] = sections.map(section => new Pair(section.left.flatMap(sec => sec.compositeFields), section.right)).filter(x => x); const nestedSections: Pair[] = sections.map(section => new Pair(section.left.flatMap(x => x.sections), section.right)).filter(x => x); const nestedCompositeFields: Pair[] = nestedSections.map(section => new Pair(section.left.flatMap(x => x.compositeFields), section.right)).filter(x => x); const compositeFieldsUnion: Pair[] = compositeFields.concat(nestedCompositeFields); //const fields = compositeFieldsUnion.flatJoinOn(x => x.right); this.formFocusService.setFields(compositeFieldsUnion); this.route.fragment .pipe(takeUntil(this._destroyed)) .subscribe((fragment: string) => { const self = this; setTimeout(function () { self.scrollTo(fragment); }); }); } ngAfterViewInit() { this.visibilityRulesService.triggerVisibilityEvaluation(); this.route.queryParams .pipe(takeUntil(this._destroyed)) .subscribe((params) => { if (params && 'page' in params) { this.changeCurrentPage(params['page']); } }); } toggleSidebar() { this.visibleSidebar = !this.visibleSidebar; } shouldDisplaySection(section: Section): Boolean { return (section.page) === this.currentPageIndex; } createPagination() { } changePageIndex(index: any) { this.router.navigate([this.route.snapshot.url[0] + '/' + this.route.snapshot.url[1]], { queryParams: { page: this.pages[index - 1] } }); } scrollTo(sectionID: string) { if (!sectionID) { return; } const element = document.querySelector('#' + sectionID); if (!element) { return; } element.scrollIntoView(); this.visibleSidebar = true; } changeCurrentPage(pageString: string) { //if (!pageString) { return; } const page = parseInt(pageString); /*if (isNaN(page)) { return; } const pageIndex = this.pages.indexOf(page); if (pageIndex === -1) { return; }*/ this.stepper.selectedIndex = page; } }