From 8388cbe1a86cbed7082a27d9eca1032253ab991e Mon Sep 17 00:00:00 2001 From: Denis Lugowski Date: Sun, 2 Mar 2025 08:44:12 +0100 Subject: [PATCH] feat(frontend): Add RadioGroup, calculate highest compliance status --- legalconsenthub/components/FormEngine.vue | 1 + .../components/formelements/TheInput.vue | 25 +++++++++++--- .../components/formelements/TheRadioGroup.vue | 33 +++++++++++++++++++ .../useApplicationFormValidator.ts | 31 ++++++++++++----- legalconsenthub/pages/create.vue | 10 +++--- 5 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 legalconsenthub/components/formelements/TheRadioGroup.vue diff --git a/legalconsenthub/components/FormEngine.vue b/legalconsenthub/components/FormEngine.vue index e56ae05..2ef190c 100644 --- a/legalconsenthub/components/FormEngine.vue +++ b/legalconsenthub/components/FormEngine.vue @@ -26,6 +26,7 @@ function getResolvedComponent(formElement: FormElementDto) { case 'CHECKBOX': case 'DROPDOWN': case 'RADIOBUTTON': + return resolveComponent('TheRadioGroup') case 'SWITCH': return resolveComponent('TheSwitch') case 'TEXTFIELD': diff --git a/legalconsenthub/components/formelements/TheInput.vue b/legalconsenthub/components/formelements/TheInput.vue index 132db2f..e08650c 100644 --- a/legalconsenthub/components/formelements/TheInput.vue +++ b/legalconsenthub/components/formelements/TheInput.vue @@ -1,14 +1,29 @@ diff --git a/legalconsenthub/components/formelements/TheRadioGroup.vue b/legalconsenthub/components/formelements/TheRadioGroup.vue new file mode 100644 index 0000000..7c4a3ef --- /dev/null +++ b/legalconsenthub/components/formelements/TheRadioGroup.vue @@ -0,0 +1,33 @@ + + + diff --git a/legalconsenthub/composables/useApplicationFormValidator.ts b/legalconsenthub/composables/useApplicationFormValidator.ts index 155b71d..7543733 100644 --- a/legalconsenthub/composables/useApplicationFormValidator.ts +++ b/legalconsenthub/composables/useApplicationFormValidator.ts @@ -2,9 +2,19 @@ import { ComplianceStatus, type FormElementDto } from '~/.api-client' import { complianceCheckableElementTypes, complianceMap } from './complianceMap' import type { FormElementId } from '~/types/FormElement' +const formElementComplianceMap = ref(new Map()) + export function useApplicationFormValidator() { + function getHighestComplianceStatus(): ComplianceStatus { + const complianceStatusValues = Array.from(formElementComplianceMap.value.values()) + const highestComplianceNumber = Math.max( + ...complianceStatusValues.map((complianceStatus) => Object.values(ComplianceStatus).indexOf(complianceStatus)) + ) + return Object.values(ComplianceStatus)[highestComplianceNumber] + } + function validateFormElements(formElements: FormElementDto[]): Map { - const formElementComplianceMap = new Map() + formElementComplianceMap.value.clear() formElements.forEach((formElement) => { if (!complianceCheckableElementTypes.includes(formElement.type)) return @@ -12,7 +22,7 @@ export function useApplicationFormValidator() { // Reset any previously set compliance status when all options are false const hasAtLeastOneOptionSet = formElement.options.some((option) => option.value && option.value !== 'false') if (!hasAtLeastOneOptionSet) { - formElementComplianceMap.delete(formElement.id) + // No value set, continue with next form element return } @@ -22,26 +32,31 @@ export function useApplicationFormValidator() { return } + // Value not set to true, continue with next option + if (option.value === 'false') { + return + } + const currentHighestComplianceStatus = complianceMap?.get(option.processingPurpose)?.get(option.employeeDataCategory) ?? ComplianceStatus.NonCritical const currentHighestComplianceStatusPos = Object.values(ComplianceStatus).indexOf(currentHighestComplianceStatus) - if (formElementComplianceMap.has(formElement.id)) { - const newComplianceStatus = formElementComplianceMap.get(formElement.id)! + if (formElementComplianceMap.value.has(formElement.id)) { + const newComplianceStatus = formElementComplianceMap.value.get(formElement.id)! const newComplianceStatusPos = Object.values(ComplianceStatus).indexOf(newComplianceStatus) if (newComplianceStatusPos > currentHighestComplianceStatusPos) { - formElementComplianceMap.set(formElement.id, newComplianceStatus) + formElementComplianceMap.value.set(formElement.id, newComplianceStatus) } } else { - formElementComplianceMap.set(formElement.id, currentHighestComplianceStatus) + formElementComplianceMap.value.set(formElement.id, currentHighestComplianceStatus) } }) }) - return formElementComplianceMap + return formElementComplianceMap.value } - return { validateFormElements } + return { getHighestComplianceStatus, validateFormElements } } diff --git a/legalconsenthub/pages/create.vue b/legalconsenthub/pages/create.vue index 0de4bcd..a81159d 100644 --- a/legalconsenthub/pages/create.vue +++ b/legalconsenthub/pages/create.vue @@ -33,12 +33,12 @@