feat: Clear form element values when hidden

This commit is contained in:
2025-12-27 08:29:49 +01:00
parent 63c373c7f6
commit 6fe20d3746
5 changed files with 84 additions and 8 deletions

View File

@@ -0,0 +1,59 @@
import type { FormElementDto, FormElementSectionDto } from '~~/.api-client'
export function useFormElementValueClearing() {
function clearHiddenFormElementValues(
sections: FormElementSectionDto[],
previousVisibilityMap: Map<string, boolean>,
currentVisibilityMap: Map<string, boolean>
): FormElementSectionDto[] {
const elementsToClean = findNewlyHiddenFormElements(previousVisibilityMap, currentVisibilityMap)
if (elementsToClean.size === 0) {
return sections
}
return sections.map((section) => ({
...section,
formElementSubSections: section.formElementSubSections.map((subsection) => ({
...subsection,
formElements: subsection.formElements.map((element) => {
const key = element.id || element.reference
if (key && elementsToClean.has(key)) {
return clearFormElementValue(element)
}
return element
})
}))
}))
}
function findNewlyHiddenFormElements(
previousMap: Map<string, boolean>,
currentMap: Map<string, boolean>
): Set<string> {
const newlyHidden = new Set<string>()
currentMap.forEach((isVisible, key) => {
const wasVisible = previousMap.get(key) !== false
if (wasVisible && !isVisible) {
newlyHidden.add(key)
}
})
return newlyHidden
}
function clearFormElementValue(element: FormElementDto): FormElementDto {
if (['RADIOBUTTON', 'SELECT', 'CHECKBOX'].includes(element.type)) {
return {
...element,
options: element.options.map((opt) => ({ ...opt, value: 'false' }))
}
}
return {
...element,
options: element.options.map((opt, i) => (i === 0 ? { ...opt, value: '' } : opt))
}
}
return {
clearHiddenFormElementValues
}
}

View File

@@ -2,7 +2,7 @@ import type { FormElementDto, VisibilityConditionOperator } from '~~/.api-client
import { VisibilityConditionOperator as VCOperator, VisibilityConditionType as VCType } from '~~/.api-client'
export function useFormElementVisibility() {
function evaluateVisibility(allFormElements: FormElementDto[]): Map<string, boolean> {
function evaluateFormElementVisibility(allFormElements: FormElementDto[]): Map<string, boolean> {
const formElementsByRef = buildFormElementsMap(allFormElements)
const visibilityMap = new Map<string, boolean>()
@@ -81,6 +81,6 @@ export function useFormElementVisibility() {
}
return {
evaluateVisibility
evaluateFormElementVisibility
}
}