import { VisibilityRule } from './models/VisibilityRule'; import { VisibilityRulesContext } from './models/VisibilityRulesContext'; import { FormGroup } from '@angular/forms'; import { Injectable } from '@angular/core'; import { Rule } from '../models/Rule' @Injectable() export class VisibilityRulesService { public formGroup: FormGroup; public visibilityRuleContext: VisibilityRulesContext; public fieldsPathMemory: any = {}; private elementVisibilityMap = new Map(); public isElementVisible(pathKey: string, id: string) { if (!this.fieldsPathMemory[id] && pathKey) this.fieldsPathMemory[id] = pathKey; if (this.checkElementVisibility(id)) { return true } else { this.clearValues(pathKey) return false; } } public checkElementVisibility(id: string): boolean { if (!this.elementVisibilityMap.has(id) || this.elementVisibilityMap.get(id)) return true; else return false; } public buildVisibilityRules(item: Array) { this.visibilityRuleContext = new VisibilityRulesContext(); this.visibilityRuleContext.buildVisibilityRuleContext(item); this.visibilityRuleContext.rules.forEach(item => this.evaluateVisibility(item)) } public updateValueAndVisibility(id: string) { let visibilityRules = this.visibilityRuleContext.rules.filter(item => item.sourceVisibilityRules.filter(source => source.sourceControlId === id).length > 0); visibilityRules.forEach(item => this.evaluateVisibility(item)) } private evaluateVisibility(visibilityRule: VisibilityRule) { for (let i = 0; i < visibilityRule.sourceVisibilityRules.length; i++) { let pathKey = this.fieldsPathMemory[visibilityRule.sourceVisibilityRules[i].sourceControlId]; if (this.formGroup.get(pathKey + '.value') && (!this.formGroup.get(pathKey + '.value').value || ""+this.formGroup.get(pathKey + '.value').value != ""+visibilityRule.sourceVisibilityRules[i].sourceControlValue)) { this.elementVisibilityMap.set(visibilityRule.targetControlId, false) return; } this.elementVisibilityMap.set(visibilityRule.targetControlId, true) } } private getParentPath(parentId: string): string { return ''; } private clearValues(pathKey) { if (pathKey && this.formGroup.get(pathKey + '.value')) this.formGroup.get(pathKey + '.value').patchValue(null) if (pathKey && this.formGroup.get(pathKey)["controls"].fields) { for (var i = 0; i < this.formGroup.get(pathKey)["controls"].fields.length; i++) this.clearValues(pathKey + '.fields.' + i); } } }