From 0e9b9b4e17373fa292bdc2a59b5b418bb00f9da5 Mon Sep 17 00:00:00 2001 From: Gustavo Roger Creutzberg Date: Wed, 22 Nov 2023 10:05:55 -0300 Subject: [PATCH] Fix to avoid error when clear cascading field --- src/common/cascading.service.ts | 47 ++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/common/cascading.service.ts b/src/common/cascading.service.ts index e53c602..25e3c17 100644 --- a/src/common/cascading.service.ts +++ b/src/common/cascading.service.ts @@ -72,6 +72,18 @@ class CascadingFieldsService { } } + public async resetCascade(field: string): Promise { + const index = Object.keys(this.cascadeMap).findIndex(item => item == field); + const fields = Object.values(this.cascadeMap)[index].alters; + const fieldsToReset = new Set(fields); + return Promise.all( + Array.from(fieldsToReset).map(async fieldName => { + const values = await this.workItemService.getAllowedFieldValues(fieldName); + await (this.workItemService as any).filterAllowedFieldValues(fieldName, values); + }) + ); + } + public async resetAllCascades(): Promise { const fields = flatten(Object.values(this.cascadeMap).map(value => value.alters)); const fieldsToReset = new Set(fields); @@ -123,20 +135,29 @@ class CascadingFieldsService { } public async performCascading(changedFieldReferenceName: string): Promise { - const changedFieldValue = (await this.workItemService.getFieldValue( - changedFieldReferenceName - )) as string; - if (!this.cascadeMap.hasOwnProperty(changedFieldReferenceName)) { - return; + try { + const changedFieldValue = (await this.workItemService.getFieldValue( + changedFieldReferenceName + )) as string; + if (!this.cascadeMap.hasOwnProperty(changedFieldReferenceName)) { + return; + } + + if (!changedFieldValue) { + this.resetCascade(changedFieldReferenceName); + return; + } + + const affectedFields = this.getAffectedFields(changedFieldReferenceName, changedFieldValue); + const fieldValues = await this.prepareCascadeOptions(affectedFields); + + Object.entries(fieldValues).map(async ([fieldName, fieldValues]) => { + await (this.workItemService as any).filterAllowedFieldValues(fieldName, fieldValues); + await this.validateFilterOrClean(fieldName); + }); + } catch { + this.cascadeAll(); } - - const affectedFields = this.getAffectedFields(changedFieldReferenceName, changedFieldValue); - const fieldValues = await this.prepareCascadeOptions(affectedFields); - - Object.entries(fieldValues).map(async ([fieldName, fieldValues]) => { - await (this.workItemService as any).filterAllowedFieldValues(fieldName, fieldValues); - await this.validateFilterOrClean(fieldName); - }); } }