2024-03-27 16:09:10 +01:00
import { Injectable } from '@angular/core' ;
import { AbstractControl } from '@angular/forms' ;
2023-12-20 08:20:38 +01:00
import { Observable , Subject } from 'rxjs' ;
2024-03-27 16:09:10 +01:00
import { DescriptionTemplateDefinition , DescriptionTemplateField , DescriptionTemplateFieldSet , DescriptionTemplatePage , DescriptionTemplateSection } from '@app/core/model/description-template/description-template' ;
import { RuleWithTarget } from './models/rule' ;
import { FormService } from '@common/forms/form-service' ;
import { DescriptionFieldPersist , DescriptionPropertyDefinitionFieldSetPersist , DescriptionPropertyDefinitionPersist } from '@app/core/model/description/description' ;
import { DescriptionTemplateFieldType } from '@app/core/common/enum/description-template-field-type' ;
2023-12-20 08:20:38 +01:00
@Injectable ( )
export class VisibilityRulesService {
private form : AbstractControl ;
2024-03-27 16:09:10 +01:00
private definition : DescriptionTemplateDefinition ;
private rulesBySources : Map < String , RuleWithTarget [ ] > ;
public isVisibleMap : { [ key : string ] : boolean } = null ;
2024-03-27 17:20:49 +01:00
private _isVisibleMap : { [ key : string ] : boolean } = null ;
2023-12-20 08:20:38 +01:00
constructor (
2024-03-27 16:09:10 +01:00
protected formService : FormService
2023-12-20 08:20:38 +01:00
) {
2024-03-27 16:09:10 +01:00
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
public setContext ( definition : DescriptionTemplateDefinition , form : AbstractControl ) {
this . definition = definition ;
this . form = form ;
this . rulesBySources = null ;
2024-03-27 17:20:49 +01:00
this . _isVisibleMap = null ;
2024-03-27 16:09:10 +01:00
this . calculateVisibility ( ) ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
public buildVisibilityKey ( id : string , ordinal : number | null ) : string {
if ( ordinal == null ) return id ;
else return id + "_" + ordinal ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
public isVisible ( id : string , ordinal : number | null ) : boolean {
this . calculateVisibility ( ) ;
const fieldKey = this . buildVisibilityKey ( id , ordinal ) ;
return this . isVisibleMap [ fieldKey ] ? ? false ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
public getVisibilityStates ( ) : { [ key : string ] : boolean } {
this . calculateVisibility ( ) ;
return this . isVisibleMap ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
public updateVisibilityForSource ( id : string ) {
const visibilityRules = this . rulesBySources . has ( id ) ? this . rulesBySources . get ( id ) : null ;
if ( visibilityRules && visibilityRules . length > 0 ) {
this . reloadVisibility ( ) ;
2023-12-20 08:20:38 +01:00
}
}
2024-03-27 16:09:10 +01:00
public reloadVisibility() {
this . rulesBySources = null ;
2024-03-27 17:20:49 +01:00
this . _isVisibleMap = null ;
2024-03-27 16:09:10 +01:00
this . calculateVisibility ( ) ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private calculateVisibility ( ) {
2024-03-27 17:20:49 +01:00
if ( this . _isVisibleMap != null ) return ;
2024-03-27 16:09:10 +01:00
if ( this . definition == null || this . form == null ) return ;
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
this . initRules ( ) ;
this . buildTargetVisibility ( ) ;
this . expandVisibilityToChildren ( ) ;
this . setDefaultVisibilityForNotCaclucted ( ) ;
this . hideParentIfAllChildrenAreHidden ( ) ;
this . ensureFieldSetVisibility ( ) ;
2024-03-27 17:20:49 +01:00
this . isVisibleMap = this . _isVisibleMap ;
2024-03-27 16:09:10 +01:00
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private initRules ( ) {
if ( this . definition == null || this . form == null ) return ;
if ( this . rulesBySources != null ) return ;
this . rulesBySources = new Map ( ) ;
const fields : DescriptionTemplateField [ ] = this . getAllDescriptionTemplateDefinitionFields ( this . definition ) ;
for ( let i = 0 ; i < fields . length ; i ++ ) {
const fieldEntity = fields [ i ] ;
if ( fieldEntity . visibilityRules != null && fieldEntity . visibilityRules . length > 0 ) {
for ( let j = 0 ; j < fieldEntity . visibilityRules . length ; j ++ ) {
const rule = fieldEntity . visibilityRules [ j ] ;
if ( ! this . rulesBySources . has ( fieldEntity . id ) ) this . rulesBySources . set ( fieldEntity . id , [ ] ) ;
const ruleWithTarget : RuleWithTarget = new RuleWithTarget ( fieldEntity . id , rule , fieldEntity ) ;
this . rulesBySources . get ( fieldEntity . id ) . push ( ruleWithTarget ) ;
}
}
}
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getDescriptionTemplateDefinitionFieldById ( definition : DescriptionTemplateDefinition , fieldId : string ) : DescriptionTemplateField [ ] {
const fields : DescriptionTemplateField [ ] = this . getAllDescriptionTemplateDefinitionFields ( definition ) ;
return fields . filter ( x = > x . id == fieldId ) ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getAllDescriptionTemplateDefinitionFields ( definition : DescriptionTemplateDefinition ) : DescriptionTemplateField [ ] {
let fields : DescriptionTemplateField [ ] = [ ] ;
if ( definition . pages == null ) return fields ;
for ( let i = 0 ; i < definition . pages . length ; i ++ ) {
const item = definition . pages [ i ] ;
fields = [ . . . fields , . . . this . getAllDescriptionTemplatePageFields ( item ) ] ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
return fields ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getAllDescriptionTemplatePageFields ( definition : DescriptionTemplatePage ) : DescriptionTemplateField [ ] {
let fields : DescriptionTemplateField [ ] = [ ] ;
if ( definition . sections == null ) return fields ;
for ( let i = 0 ; i < definition . sections . length ; i ++ ) {
const item = definition . sections [ i ] ;
fields = [ . . . fields , . . . this . getAllDescriptionTemplateSectionFields ( item ) ] ;
}
return fields ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getAllDescriptionTemplateSectionFields ( definition : DescriptionTemplateSection ) : DescriptionTemplateField [ ] {
let fields : DescriptionTemplateField [ ] = [ ] ;
if ( definition . sections != null ) {
for ( let i = 0 ; i < definition . sections . length ; i ++ ) {
const item = definition . sections [ i ] ;
fields = [ . . . fields , . . . this . getAllDescriptionTemplateSectionFields ( item ) ] ;
}
}
if ( definition . fieldSets != null ) {
for ( let i = 0 ; i < definition . fieldSets . length ; i ++ ) {
const item = definition . fieldSets [ i ] ;
fields = [ . . . fields , . . . this . getAllDescriptionTemplateFieldSetFields ( item ) ] ;
}
}
return fields ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getAllDescriptionTemplateFieldSetFields ( definition : DescriptionTemplateFieldSet ) : DescriptionTemplateField [ ] {
return definition . fields == null ? [ ] : definition . fields ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getDescriptionTemplateDefinitionFieldSetById ( definition : DescriptionTemplateDefinition , fieldSetId : string ) : DescriptionTemplateFieldSet [ ] {
const fieldSets : DescriptionTemplateFieldSet [ ] = this . getAllDescriptionTemplateDefinitionFieldSets ( definition ) ;
return fieldSets . filter ( x = > x . id == fieldSetId ) ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getAllDescriptionTemplateDefinitionFieldSets ( definition : DescriptionTemplateDefinition ) : DescriptionTemplateFieldSet [ ] {
let fieldSets : DescriptionTemplateFieldSet [ ] = [ ] ;
if ( definition . pages == null ) return fieldSets ;
for ( let i = 0 ; i < definition . pages . length ; i ++ ) {
const item = definition . pages [ i ] ;
fieldSets = [ . . . fieldSets , . . . this . getAllDescriptionTemplatePageFieldSets ( item ) ] ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
return fieldSets ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getAllDescriptionTemplatePageFieldSets ( definition : DescriptionTemplatePage ) : DescriptionTemplateFieldSet [ ] {
let fieldSets : DescriptionTemplateFieldSet [ ] = [ ] ;
if ( definition . sections == null ) return fieldSets ;
for ( let i = 0 ; i < definition . sections . length ; i ++ ) {
const item = definition . sections [ i ] ;
fieldSets = [ . . . fieldSets , . . . this . getAllDescriptionTemplateSectionFieldSets ( item ) ] ;
}
return fieldSets ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
private getAllDescriptionTemplateSectionFieldSets ( definition : DescriptionTemplateSection ) : DescriptionTemplateFieldSet [ ] {
let fieldSets : DescriptionTemplateFieldSet [ ] = [ ] ;
if ( definition . sections != null ) {
for ( let i = 0 ; i < definition . sections . length ; i ++ ) {
const item = definition . sections [ i ] ;
fieldSets = [ . . . fieldSets , . . . this . getAllDescriptionTemplateSectionFieldSets ( item ) ] ;
}
}
if ( definition . fieldSets != null ) {
for ( let i = 0 ; i < definition . fieldSets . length ; i ++ ) {
const item = definition . fieldSets [ i ] ;
fieldSets = [ . . . fieldSets , . . . definition . fieldSets ] ;
}
}
return fieldSets ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private buildTargetVisibility ( ) {
2024-03-27 17:20:49 +01:00
this . _isVisibleMap = { } ;
const propertyDefinition : DescriptionPropertyDefinitionPersist = this . formService . getValue ( this . form . getRawValue ( ) ) as DescriptionPropertyDefinitionPersist ;
2024-03-27 16:09:10 +01:00
this . rulesBySources . forEach ( ( ruleForSource : RuleWithTarget [ ] , ruleForSourceKey : string ) = > {
for ( let i = 0 ; i < ruleForSource . length ; i ++ ) {
const rule = ruleForSource [ i ] ;
if ( propertyDefinition . fieldSets != null ) {
new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . forEach ( ( propertyDefinitionFieldSet : DescriptionPropertyDefinitionFieldSetPersist , propertyDefinitionFieldSetKey : string ) = > {
if ( propertyDefinitionFieldSet . items != null && propertyDefinitionFieldSet . items . length > 0 ) {
for ( let j = 0 ; j < propertyDefinitionFieldSet . items . length ; j ++ ) {
const definitionFieldSetItem = propertyDefinitionFieldSet . items [ j ] ;
if ( definitionFieldSetItem ? . fields != null ) {
new Map ( Object . entries ( definitionFieldSetItem . fields ) ) . forEach ( ( field : DescriptionFieldPersist , key : string ) = > {
if ( rule . source == key ) {
if ( new Map ( Object . entries ( definitionFieldSetItem . fields ) ) . has ( rule . target ) ) { //Rule applies only for current multiple item
const fieldKey = this . buildVisibilityKey ( rule . target , definitionFieldSetItem . ordinal ) ;
2024-03-27 17:20:49 +01:00
const currentState = this . _isVisibleMap [ fieldKey ] ? ? false ;
this . _isVisibleMap [ fieldKey ] = currentState || this . ruleIsTrue ( rule , field ) ;
//console.log(fieldKey + " " + this._isVisibleMap[fieldKey] + " " + field.textListValue);
2024-03-27 16:09:10 +01:00
} else if ( this . getDescriptionTemplateDefinitionFieldById ( this . definition , rule . target ) . length > 0 || this . getDescriptionTemplateDefinitionFieldSetById ( this . definition , rule . target ) . length > 0 ) { //Rule applies to different fieldset, so we apply for all multiple items
const ordinals : number [ ] = this . getKeyOrdinals ( rule . target , propertyDefinition ) ;
for ( let k = 0 ; k < ordinals . length ; k ++ ) {
const ordinal = ordinals [ j ] ;
const fieldKey = this . buildVisibilityKey ( rule . target , ordinal ) ;
2024-03-27 17:20:49 +01:00
const currentState = this . _isVisibleMap [ fieldKey ] ? ? false ;
this . _isVisibleMap [ fieldKey ] = currentState || this . ruleIsTrue ( rule , field ) ;
2024-03-27 16:09:10 +01:00
}
} else {
const fieldKey = this . buildVisibilityKey ( rule . target , null ) ; //Ordinal is null if target not on field
2024-03-27 17:20:49 +01:00
const currentState = this . _isVisibleMap [ fieldKey ] ? ? false ;
this . _isVisibleMap [ fieldKey ] = currentState || this . ruleIsTrue ( rule , field ) ;
2024-03-27 16:09:10 +01:00
}
}
} ) ;
}
}
}
} ) ;
}
}
} ) ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private getKeyOrdinals ( key : string , propertyDefinition : DescriptionPropertyDefinitionPersist ) : number [ ] {
let ordinals = [ ] ;
if ( propertyDefinition . fieldSets != null ) {
new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . forEach ( ( propertyDefinitionFieldSet : DescriptionPropertyDefinitionFieldSetPersist , propertyDefinitionFieldSetKey : string ) = > {
if ( propertyDefinitionFieldSetKey == key ) {
ordinals = propertyDefinitionFieldSet . items ? . map ( x = > x . ordinal ) ? ? [ ] ;
return ordinals ;
}
if ( propertyDefinitionFieldSet . items != null && propertyDefinitionFieldSet . items . length > 0 ) {
for ( let i = 0 ; i < propertyDefinitionFieldSet . items . length ; i ++ ) {
const definitionFieldSetItem = propertyDefinitionFieldSet . items [ i ] ;
if ( definitionFieldSetItem ? . fields != null ) {
new Map ( Object . entries ( definitionFieldSetItem . fields ) ) . forEach ( ( field : DescriptionFieldPersist , fieldKey : string ) = > {
if ( fieldKey == key ) ordinals = propertyDefinitionFieldSet . items ? . map ( x = > x . ordinal ) ? ? [ ] ;
} ) ;
if ( ordinals != null && ordinals . length > 0 ) return ordinals ;
}
}
}
} ) ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
return ordinals ;
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private ruleIsTrue ( rule : RuleWithTarget , field : DescriptionFieldPersist ) : boolean {
if ( field != null ) {
const fieldType : DescriptionTemplateFieldType = rule . field != null && rule . field . data != null ? rule.field.data.fieldType : DescriptionTemplateFieldType.FREE_TEXT ;
if ( [ DescriptionTemplateFieldType . FREE_TEXT , DescriptionTemplateFieldType . CHECK_BOX , DescriptionTemplateFieldType . TEXT_AREA ,
DescriptionTemplateFieldType . RICH_TEXT_AREA , DescriptionTemplateFieldType . UPLOAD , DescriptionTemplateFieldType . BOOLEAN_DECISION ,
DescriptionTemplateFieldType . RADIO_BOX , DescriptionTemplateFieldType . CURRENCY , DescriptionTemplateFieldType . SELECT ] . includes ( fieldType ) && field . textValue != null && field . textValue . length > 0 ) {
if ( DescriptionTemplateFieldType . UPLOAD == fieldType ) {
return false ; //not apply visibility logic
2023-12-20 08:20:38 +01:00
} else {
2024-03-27 16:09:10 +01:00
return field . textValue == rule . textValue ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
}
else if ( [ DescriptionTemplateFieldType . SELECT , DescriptionTemplateFieldType . TAGS , DescriptionTemplateFieldType . INTERNAL_ENTRIES_DMPS ,
DescriptionTemplateFieldType . INTERNAL_ENTRIES_DESCRIPTIONS ] . includes ( fieldType ) && field . textListValue != null && field . textListValue . length > 0 ) {
return rule . textListValue != null &&
rule . textListValue . every ( x = > field . textListValue . includes ( x ) ) ;
}
else if ( DescriptionTemplateFieldType . REFERENCE_TYPES == fieldType ) {
return false ; //not implemented visibility logic
}
else if ( DescriptionTemplateFieldType . DATE_PICKER == fieldType && field . dateValue != null ) return field . dateValue == rule . dateValue ;
else if ( [ DescriptionTemplateFieldType . VALIDATION , DescriptionTemplateFieldType . DATASET_IDENTIFIER ] . includes ( fieldType ) && field . externalIdentifier != null ) {
return false ; //not implemented visibility logic
}
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
return false ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
private expandVisibilityToChildren ( ) {
if ( this . definition ? . pages == null ) return ;
for ( let i = 0 ; i < this . definition ? . pages . length ; i ++ ) {
const pageEntity = this . definition ? . pages [ i ] ;
const fieldKey = this . buildVisibilityKey ( pageEntity . id , null ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
this . expandPageVisibility ( pageEntity , currentValue ) ;
}
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private expandPageVisibility ( pageEntity : DescriptionTemplatePage , parentVisibility : boolean | null ) {
if ( pageEntity . sections == null ) return ;
for ( let i = 0 ; i < pageEntity . sections . length ; i ++ ) {
const sectionEntity = pageEntity . sections [ i ] ;
const fieldKey = this . buildVisibilityKey ( sectionEntity . id , null ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
if ( currentValue != null ) {
if ( parentVisibility != null && ! parentVisibility ) { //Parent is hidden so all childs should be hidden
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = false ;
2024-03-27 16:09:10 +01:00
this . expandSectionVisibility ( sectionEntity , currentValue ) ;
} else {
this . expandSectionVisibility ( sectionEntity , currentValue ) ;
}
} else {
2024-03-27 17:20:49 +01:00
if ( parentVisibility != null ) this . _isVisibleMap [ fieldKey ] = parentVisibility ;
2024-03-27 16:09:10 +01:00
this . expandSectionVisibility ( sectionEntity , parentVisibility ) ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
}
}
private expandSectionVisibility ( sectionEntity : DescriptionTemplateSection , parentVisibility : boolean | null ) {
if ( sectionEntity . sections != null ) {
for ( let i = 0 ; i < sectionEntity . sections . length ; i ++ ) {
const subSectionEntity = sectionEntity . sections [ i ] ;
const fieldKey = this . buildVisibilityKey ( subSectionEntity . id , null ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
if ( currentValue != null ) {
if ( parentVisibility != null && ! parentVisibility ) { //Parent is hidden so all childs should be hidden
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = false ;
2024-03-27 16:09:10 +01:00
this . expandSectionVisibility ( subSectionEntity , currentValue ) ;
} else {
this . expandSectionVisibility ( subSectionEntity , currentValue ) ;
}
} else {
2024-03-27 17:20:49 +01:00
if ( parentVisibility != null ) this . _isVisibleMap [ fieldKey ] = parentVisibility ;
2024-03-27 16:09:10 +01:00
this . expandSectionVisibility ( subSectionEntity , parentVisibility ) ;
}
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
}
if ( sectionEntity . fieldSets != null ) {
2024-03-27 17:20:49 +01:00
const propertyDefinition = this . formService . getValue ( this . form . getRawValue ( ) ) as DescriptionPropertyDefinitionPersist ;
2024-03-27 16:09:10 +01:00
for ( let i = 0 ; i < sectionEntity . fieldSets . length ; i ++ ) {
const fieldSetEntity = sectionEntity . fieldSets [ i ] ;
if ( propertyDefinition . fieldSets != null && new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . has ( fieldSetEntity . id ) ) {
const propertyDefinitionFieldSet = new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . get ( fieldSetEntity . id )
if ( propertyDefinitionFieldSet . items != null && propertyDefinitionFieldSet . items . length > 0 ) {
for ( let j = 0 ; j < propertyDefinitionFieldSet . items . length ; j ++ ) {
const definitionFieldSetItem = propertyDefinitionFieldSet . items [ j ] ;
const fieldKey = this . buildVisibilityKey ( fieldSetEntity . id , definitionFieldSetItem . ordinal ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
if ( currentValue != null ) {
if ( parentVisibility != null && ! parentVisibility ) { //Parent is hidden so all childs should be hidden
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = false ;
2024-03-27 16:09:10 +01:00
this . expandFieldSetVisibility ( fieldSetEntity , currentValue , definitionFieldSetItem . ordinal ) ;
} else {
this . expandFieldSetVisibility ( fieldSetEntity , currentValue , definitionFieldSetItem . ordinal ) ;
}
} else {
2024-03-27 17:20:49 +01:00
if ( parentVisibility != null ) this . _isVisibleMap [ fieldKey ] = parentVisibility ;
2024-03-27 16:09:10 +01:00
this . expandFieldSetVisibility ( fieldSetEntity , parentVisibility , definitionFieldSetItem . ordinal ) ;
}
}
2023-12-20 08:20:38 +01:00
}
}
}
}
}
2024-03-27 16:09:10 +01:00
private expandFieldSetVisibility ( fieldSetEntity : DescriptionTemplateFieldSet , parentVisibility : boolean | null , ordinal : number ) {
if ( fieldSetEntity . fields != null ) {
for ( let i = 0 ; i < fieldSetEntity . fields . length ; i ++ ) {
const fieldEntity = fieldSetEntity . fields [ i ] ;
const fieldKey = this . buildVisibilityKey ( fieldEntity . id , ordinal ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
if ( currentValue != null ) {
if ( parentVisibility != null && ! parentVisibility ) { //Parent is hidden so all childs should be hidden
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = false ;
2024-03-27 16:09:10 +01:00
}
} else if ( parentVisibility != null ) {
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = parentVisibility ;
2024-03-27 16:09:10 +01:00
}
}
}
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private setDefaultVisibilityForNotCaclucted() {
if ( this . definition ? . pages == null ) return ;
for ( let i = 0 ; i < this . definition ? . pages . length ; i ++ ) {
const pageEntity = this . definition ? . pages [ i ] ;
const fieldKey = this . buildVisibilityKey ( pageEntity . id , null ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
if ( currentValue == null ) this . _isVisibleMap [ fieldKey ] = true ;
2024-03-27 16:09:10 +01:00
this . setDefaultPageVisibility ( pageEntity ) ;
2023-12-20 08:20:38 +01:00
}
}
2024-03-27 16:09:10 +01:00
private setDefaultPageVisibility ( pageEntity : DescriptionTemplatePage ) {
if ( pageEntity . sections == null ) return ;
for ( let i = 0 ; i < pageEntity . sections . length ; i ++ ) {
const sectionEntity = pageEntity . sections [ i ] ;
const fieldKey = this . buildVisibilityKey ( sectionEntity . id , null ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
if ( currentValue == null ) {
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = true ;
2024-03-27 16:09:10 +01:00
this . setDefaultSectionVisibility ( sectionEntity ) ;
2023-12-20 08:20:38 +01:00
}
}
}
2024-03-27 16:09:10 +01:00
private setDefaultSectionVisibility ( sectionEntity : DescriptionTemplateSection ) {
if ( sectionEntity . sections != null ) {
for ( let i = 0 ; i < sectionEntity . sections . length ; i ++ ) {
const subSectionEntity = sectionEntity . sections [ i ] ;
const fieldKey = this . buildVisibilityKey ( subSectionEntity . id , null ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
if ( currentValue == null ) {
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = true ;
2024-03-27 16:09:10 +01:00
this . setDefaultSectionVisibility ( subSectionEntity ) ;
}
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
}
if ( sectionEntity . fieldSets != null ) {
2024-03-27 17:20:49 +01:00
const propertyDefinition = this . formService . getValue ( this . form . getRawValue ( ) ) as DescriptionPropertyDefinitionPersist ;
2024-03-27 16:09:10 +01:00
for ( let i = 0 ; i < sectionEntity . fieldSets . length ; i ++ ) {
const fieldSetEntity = sectionEntity . fieldSets [ i ] ;
if ( propertyDefinition . fieldSets != null && new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . has ( fieldSetEntity . id ) ) {
const propertyDefinitionFieldSet = new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . get ( fieldSetEntity . id )
if ( propertyDefinitionFieldSet . items != null && propertyDefinitionFieldSet . items . length > 0 ) {
for ( let j = 0 ; j < propertyDefinitionFieldSet . items . length ; j ++ ) {
const definitionFieldSetItem = propertyDefinitionFieldSet . items [ j ] ;
const fieldKey = this . buildVisibilityKey ( fieldSetEntity . id , definitionFieldSetItem . ordinal ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
if ( currentValue == null ) {
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = true ;
2024-03-27 16:09:10 +01:00
this . setDefaultFieldSetVisibility ( fieldSetEntity , definitionFieldSetItem . ordinal ) ;
}
}
}
}
}
}
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
private setDefaultFieldSetVisibility ( fieldSetEntity : DescriptionTemplateFieldSet , ordinal : number ) {
if ( fieldSetEntity . fields != null ) {
for ( let i = 0 ; i < fieldSetEntity . fields . length ; i ++ ) {
const fieldEntity = fieldSetEntity . fields [ i ] ;
const fieldKey = this . buildVisibilityKey ( fieldEntity . id , ordinal ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = this . _isVisibleMap [ fieldKey ] ? ? null ;
2024-03-27 16:09:10 +01:00
if ( currentValue == null ) {
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ fieldKey ] = true ;
2024-03-27 16:09:10 +01:00
}
}
}
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
private hideParentIfAllChildrenAreHidden() {
if ( this . definition ? . pages == null ) return ;
for ( let i = 0 ; i < this . definition ? . pages . length ; i ++ ) {
const pageEntity = this . definition ? . pages [ i ] ;
const fieldKey = this . buildVisibilityKey ( pageEntity . id , null ) ;
const isCurrentHidden = this . isHiddenPageVisibilityIfAllChildrenIsHidden ( pageEntity ) ;
2023-12-20 08:20:38 +01:00
2024-03-27 17:20:49 +01:00
if ( isCurrentHidden && ( this . _isVisibleMap [ fieldKey ] ? ? true ) ) {
this . _isVisibleMap [ fieldKey ] = false ;
2023-12-20 08:20:38 +01:00
}
}
2024-03-27 16:09:10 +01:00
}
2023-12-20 08:20:38 +01:00
2024-03-27 16:09:10 +01:00
private isHiddenPageVisibilityIfAllChildrenIsHidden ( pageEntity : DescriptionTemplatePage ) : boolean {
let isHidden = true ;
if ( pageEntity ? . sections == null ) return ;
for ( let i = 0 ; i < pageEntity . sections . length ; i ++ ) {
const sectionEntity = pageEntity . sections [ i ] ;
const fieldKey = this . buildVisibilityKey ( sectionEntity . id , null ) ;
const isCurrentHidden = this . isHiddenSectionIfAllChildrenIsHidden ( sectionEntity ) ;
2024-03-27 17:20:49 +01:00
if ( isCurrentHidden && ( this . _isVisibleMap [ fieldKey ] ? ? true ) ) {
this . _isVisibleMap [ fieldKey ] = false ;
2024-03-27 16:09:10 +01:00
}
isHidden = isHidden && isCurrentHidden ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
return isHidden ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
private isHiddenSectionIfAllChildrenIsHidden ( sectionEntity : DescriptionTemplateSection ) : boolean {
let isHidden = true ;
if ( sectionEntity . sections != null ) {
for ( let i = 0 ; i < sectionEntity . sections . length ; i ++ ) {
const subSectionEntity = sectionEntity . sections [ i ] ;
const fieldKey = this . buildVisibilityKey ( subSectionEntity . id , null ) ;
const isCurrentHidden = this . isHiddenSectionIfAllChildrenIsHidden ( subSectionEntity ) ;
2024-03-27 17:20:49 +01:00
if ( isCurrentHidden && ( this . _isVisibleMap [ fieldKey ] ? ? true ) ) {
this . _isVisibleMap [ fieldKey ] = false ;
2024-03-27 16:09:10 +01:00
}
isHidden = isHidden && isCurrentHidden ;
}
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
if ( sectionEntity . fieldSets != null ) {
2024-03-27 17:20:49 +01:00
const propertyDefinition = this . formService . getValue ( this . form . getRawValue ( ) ) as DescriptionPropertyDefinitionPersist ;
2024-03-27 16:09:10 +01:00
for ( let i = 0 ; i < sectionEntity . fieldSets . length ; i ++ ) {
const fieldSetEntity = sectionEntity . fieldSets [ i ] ;
if ( propertyDefinition . fieldSets != null && new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . has ( fieldSetEntity . id ) ) {
const propertyDefinitionFieldSet = new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . get ( fieldSetEntity . id )
if ( propertyDefinitionFieldSet . items != null && propertyDefinitionFieldSet . items . length > 0 ) {
for ( let j = 0 ; j < propertyDefinitionFieldSet . items . length ; j ++ ) {
const definitionFieldSetItem = propertyDefinitionFieldSet . items [ j ] ;
const fieldKey = this . buildVisibilityKey ( fieldSetEntity . id , definitionFieldSetItem . ordinal ) ;
const isCurrentHidden = this . isHiddenFieldSetIfAllChildrenIsHidden ( fieldSetEntity , definitionFieldSetItem . ordinal ) ;
2024-03-27 17:20:49 +01:00
if ( isCurrentHidden && ( this . _isVisibleMap [ fieldKey ] ? ? true ) ) {
this . _isVisibleMap [ fieldKey ] = false ;
2024-03-27 16:09:10 +01:00
}
isHidden = isHidden && isCurrentHidden ;
}
}
}
}
}
return isHidden ;
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
private isHiddenFieldSetIfAllChildrenIsHidden ( fieldSetEntity : DescriptionTemplateFieldSet , ordinal : number ) : boolean {
let isHidden = true ;
if ( fieldSetEntity . fields != null ) {
for ( let i = 0 ; i < fieldSetEntity . fields . length ; i ++ ) {
const fieldEntity = fieldSetEntity . fields [ i ] ;
const fieldKey = this . buildVisibilityKey ( fieldEntity . id , ordinal ) ;
2024-03-27 17:20:49 +01:00
const currentValue : boolean | null = ( this . _isVisibleMap [ fieldKey ] ? ? true ) ;
2024-03-27 16:09:10 +01:00
isHidden = isHidden && ! currentValue ;
}
return isHidden ;
2023-12-20 08:20:38 +01:00
}
return true ;
}
2024-03-27 16:09:10 +01:00
private ensureFieldSetVisibility() {
if ( this . definition ? . pages == null ) return ;
for ( let i = 0 ; i < this . definition ? . pages . length ; i ++ ) {
const pageEntity = this . definition ? . pages [ i ] ;
this . ensurePageFieldSetVisibility ( pageEntity ) ;
}
2023-12-20 08:20:38 +01:00
}
2024-03-27 16:09:10 +01:00
private ensurePageFieldSetVisibility ( pageEntity : DescriptionTemplatePage ) {
if ( pageEntity ? . sections == null ) return ;
for ( let i = 0 ; i < pageEntity . sections . length ; i ++ ) {
const sectionEntity = pageEntity . sections [ i ] ;
this . ensureSectionFieldSetVisibility ( sectionEntity ) ;
2023-12-20 08:20:38 +01:00
}
}
2024-03-27 16:09:10 +01:00
private ensureSectionFieldSetVisibility ( sectionEntity : DescriptionTemplateSection ) {
if ( sectionEntity . sections != null ) {
for ( let i = 0 ; i < sectionEntity . sections . length ; i ++ ) {
const subSectionEntity = sectionEntity . sections [ i ] ;
this . ensureSectionFieldSetVisibility ( subSectionEntity ) ;
}
}
if ( sectionEntity . fieldSets != null ) {
2024-03-27 17:20:49 +01:00
const propertyDefinition = this . formService . getValue ( this . form . getRawValue ( ) ) as DescriptionPropertyDefinitionPersist ;
2024-03-27 16:09:10 +01:00
for ( let i = 0 ; i < sectionEntity . fieldSets . length ; i ++ ) {
const fieldSetEntity = sectionEntity . fieldSets [ i ] ;
let isHidden = true ;
if ( propertyDefinition . fieldSets != null && new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . has ( fieldSetEntity . id ) ) {
const propertyDefinitionFieldSet = new Map ( Object . entries ( propertyDefinition . fieldSets ) ) . get ( fieldSetEntity . id )
if ( propertyDefinitionFieldSet . items != null && propertyDefinitionFieldSet . items . length > 0 ) {
for ( let j = 0 ; j < propertyDefinitionFieldSet . items . length ; j ++ ) {
const definitionFieldSetItem = propertyDefinitionFieldSet . items [ j ] ;
const fieldKey = this . buildVisibilityKey ( fieldSetEntity . id , definitionFieldSetItem . ordinal ) ;
2024-03-27 17:20:49 +01:00
const isCurrentHidden = ! this . _isVisibleMap [ fieldKey ] ? ? false ;
2024-03-27 16:09:10 +01:00
isHidden = isHidden && isCurrentHidden ;
}
}
}
const globalFieldSetKey = this . buildVisibilityKey ( fieldSetEntity . id , null ) ;
2024-03-27 17:20:49 +01:00
this . _isVisibleMap [ globalFieldSetKey ] = ! isHidden ;
2024-03-27 16:09:10 +01:00
}
}
}
}