argos/dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts

72 lines
3.2 KiB
TypeScript

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<String, boolean>();
public isElementVisible(pathKey: string, id: string) {
if (!this.fieldsPathMemory[id] && pathKey) this.fieldsPathMemory[id] = pathKey;
if (pathKey && this.visibilityRuleContext.getRulesFromKey(id)) this.evaluateVisibility(this.visibilityRuleContext.getRulesFromKey(id))
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<Rule>) {
this.visibilityRuleContext = new VisibilityRulesContext();
this.visibilityRuleContext.buildVisibilityRuleContext(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 == null || this.formGroup.get(pathKey + '.value').value == undefined) || "" + this.formGroup.get(pathKey + '.value').value != "" + visibilityRule.sourceVisibilityRules[i].sourceControlValue)) {
if (this.formGroup.get(pathKey).parent.get("id")) {
if (!this.checkElementVisibility(this.formGroup.get(pathKey).parent.get("id").value)) {
this.elementVisibilityMap.set(visibilityRule.targetControlId, false)
return;
}
}
else {
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);
}
}
}