import { AfterViewInit, Component, Input, OnInit, ViewChild } 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 { Pair } from '../../../common/types/pair'; import { BaseComponent } from '../../../core/common/base/base.component'; import { CompositeField } from '../../../core/model/dataset-profile-definition/composite-field'; import { DatasetProfileDefinitionModel } from '../../../core/model/dataset-profile-definition/dataset-profile-definition'; import { Rule } from '../../../core/model/dataset-profile-definition/rule'; import { Section } from '../../../core/model/dataset-profile-definition/section'; import { DatasetDescriptionFormEditorModel } from './dataset-description-form.model'; import { FormFocusService } from './form-focus/form-focus.service'; import { VisibilityRulesService } from './visibility-rules/visibility-rules.service'; @Component({ selector: 'app-dataset-description-form', templateUrl: './dataset-description-form.component.html', styleUrls: ['./dataset-description-form.component.scss'] }) export class DatasetDescriptionFormComponent extends BaseComponent implements OnInit, AfterViewInit { pathName: string; pages: Array; activeStepperIndex = 1; visibleSidebar = false; datasetProfileDefinitionModel: DatasetDescriptionFormEditorModel; private currentPageIndex = 0; @ViewChild('stepper') stepper: MatStepper; @Input() dataModel: DatasetProfileDefinitionModel; @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[] = this.dataModel.rules; this.visibilityRulesService.formGroup = this.form; this.visibilityRulesService.buildVisibilityRules(rules); this.datasetProfileDefinitionModel = new DatasetDescriptionFormEditorModel().fromModel(this.dataModel); this.visibilityRulesService.setModel(this.datasetProfileDefinitionModel); this.createPagination(); 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; } }