You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
argos/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts

137 lines
4.9 KiB
TypeScript

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<number>;
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<Section[], number>[] = this.datasetProfileDefinitionModel.pages.map(page => new Pair<Section[], number>(page.sections, page.ordinal)).filter(x => x);
const compositeFields: Pair<CompositeField[], number>[] = sections.map(section => new Pair<CompositeField[], number>(section.left.flatMap(sec => sec.compositeFields), section.right)).filter(x => x);
const nestedSections: Pair<Section[], number>[] = sections.map(section => new Pair<Section[], number>(section.left.flatMap(x => x.sections), section.right)).filter(x => x);
const nestedCompositeFields: Pair<CompositeField[], number>[] = nestedSections.map(section => new Pair<CompositeField[], number>(section.left.flatMap(x => x.compositeFields), section.right)).filter(x => x);
const compositeFieldsUnion: Pair<CompositeField[], number>[] = 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;
}
}