import { Injectable } from '@angular/core'; import { CompositeField } from '../../models/CompositeField'; import { Router, ActivatedRoute } from '@angular/router'; import { Pair } from '../../models/helpers/Pair'; import '../../utilities/enhancers/groupBy'; import { VisibilityRulesService } from '../visibility-rules/visibility-rules.service'; @Injectable() export class FormFocusService { private compositeFields: Pair[] = []; constructor( public router: Router, public route: ActivatedRoute, public visibilityService: VisibilityRulesService ) { } setFields(compositeFields: Pair[]) { this.compositeFields = compositeFields; } focusNext(field: CompositeField) { const flattenedCompositeFields = this.compositeFields.groupBy(x => x.right) .map(x => x.reduce((first: Pair, second: Pair) => (new Pair(first.left.concat(second.left), first.right)))); const page = flattenedCompositeFields.filter(x => x['left'].map(y => y.id).indexOf(field.id) !== -1)[0]; let pageIndex = page['right']; const currentFields = page['left'].filter(x => this.visibilityService.checkElementVisibility(x.id)).map(x => x.id); const fieldIndex = currentFields.indexOf(field.id); if (fieldIndex === currentFields.length - 1) { pageIndex = pageIndex + 1; } this.router.navigate(['datasets/' + this.route.snapshot.url[0] + '/' + this.route.snapshot.url[1]], { fragment: page['left'].filter(x => this.visibilityService.checkElementVisibility(x.id))[fieldIndex].id, queryParams: { page: pageIndex } }); } }