2017-11-23 11:40:02 +01:00
|
|
|
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;
|
2017-11-23 12:26:22 +01:00
|
|
|
public fieldsPathMemory: any = {};
|
2018-01-24 15:11:09 +01:00
|
|
|
private elementVisibilityMap = new Map<String, boolean>();
|
2017-12-06 13:42:28 +01:00
|
|
|
|
2017-11-23 12:26:22 +01:00
|
|
|
public isElementVisible(pathKey: string, id: string) {
|
2017-12-06 13:42:28 +01:00
|
|
|
if (!this.fieldsPathMemory[id] && pathKey) this.fieldsPathMemory[id] = pathKey;
|
2018-01-24 15:11:09 +01:00
|
|
|
if (this.checkElementVisibility(id)) {
|
2017-12-06 17:45:54 +01:00
|
|
|
return true
|
|
|
|
} else {
|
2018-01-11 12:15:15 +01:00
|
|
|
this.clearValues(pathKey)
|
2017-12-06 17:45:54 +01:00
|
|
|
return false;
|
|
|
|
}
|
2017-11-23 11:40:02 +01:00
|
|
|
}
|
|
|
|
|
2018-01-24 15:11:09 +01:00
|
|
|
public checkElementVisibility(id: string): boolean {
|
|
|
|
if (!this.elementVisibilityMap.has(id) || this.elementVisibilityMap.get(id)) return true;
|
|
|
|
else return false;
|
2017-11-23 11:40:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public buildVisibilityRules(item: Array<Rule>) {
|
|
|
|
this.visibilityRuleContext = new VisibilityRulesContext();
|
|
|
|
this.visibilityRuleContext.buildVisibilityRuleContext(item);
|
2018-01-24 15:11:09 +01:00
|
|
|
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];
|
2018-03-05 17:18:45 +01:00
|
|
|
if (this.formGroup.get(pathKey + '.value') && (!this.formGroup.get(pathKey + '.value').value || ""+this.formGroup.get(pathKey + '.value').value != ""+visibilityRule.sourceVisibilityRules[i].sourceControlValue)) {
|
2018-01-24 15:11:09 +01:00
|
|
|
this.elementVisibilityMap.set(visibilityRule.targetControlId, false)
|
2018-03-05 17:18:45 +01:00
|
|
|
return;
|
2018-01-24 15:11:09 +01:00
|
|
|
}
|
2018-03-05 17:18:45 +01:00
|
|
|
this.elementVisibilityMap.set(visibilityRule.targetControlId, true)
|
2018-01-24 15:11:09 +01:00
|
|
|
}
|
2017-11-23 11:40:02 +01:00
|
|
|
}
|
|
|
|
|
2017-11-23 12:26:22 +01:00
|
|
|
private getParentPath(parentId: string): string {
|
2017-11-23 11:40:02 +01:00
|
|
|
return '';
|
|
|
|
}
|
2018-01-11 12:15:15 +01:00
|
|
|
|
|
|
|
private clearValues(pathKey) {
|
|
|
|
if (pathKey && this.formGroup.get(pathKey + '.value')) this.formGroup.get(pathKey + '.value').patchValue(null)
|
2018-01-24 15:11:09 +01:00
|
|
|
if (pathKey && this.formGroup.get(pathKey)["controls"].fields) {
|
2018-01-11 12:15:15 +01:00
|
|
|
for (var i = 0; i < this.formGroup.get(pathKey)["controls"].fields.length; i++)
|
2018-01-24 15:11:09 +01:00
|
|
|
this.clearValues(pathKey + '.fields.' + i);
|
|
|
|
}
|
|
|
|
|
2018-01-11 12:15:15 +01:00
|
|
|
}
|
2017-11-23 11:40:02 +01:00
|
|
|
}
|