diff --git a/legalconsenthub-backend/api/legalconsenthub.yml b/legalconsenthub-backend/api/legalconsenthub.yml index a8d048a..30518ca 100644 --- a/legalconsenthub-backend/api/legalconsenthub.yml +++ b/legalconsenthub-backend/api/legalconsenthub.yml @@ -796,6 +796,13 @@ components: - SENSITIVE - NONE + ComplianceStatus: + type: string + enum: + - NON_CRITICAL + - WARNING + - CRITICAL + ####### Supporting components ####### Page: type: object diff --git a/legalconsenthub/components/FormEngine.vue b/legalconsenthub/components/FormEngine.vue index e4d46e5..b455ca3 100644 --- a/legalconsenthub/components/FormEngine.vue +++ b/legalconsenthub/components/FormEngine.vue @@ -1,15 +1,23 @@ diff --git a/legalconsenthub/components/formelements/TheSwitch.vue b/legalconsenthub/components/formelements/TheSwitch.vue new file mode 100644 index 0000000..256fe56 --- /dev/null +++ b/legalconsenthub/components/formelements/TheSwitch.vue @@ -0,0 +1,27 @@ + + + diff --git a/legalconsenthub/composables/complianceMap.ts b/legalconsenthub/composables/complianceMap.ts new file mode 100644 index 0000000..2a34fe6 --- /dev/null +++ b/legalconsenthub/composables/complianceMap.ts @@ -0,0 +1,46 @@ +import { ComplianceStatus, EmployeeDataCategory, FormElementType, ProcessingPurpose } from '~/.api-client' + +export const complianceMap = new Map>([ + [ + ProcessingPurpose.SystemOperation, + new Map([ + [EmployeeDataCategory.None, ComplianceStatus.NonCritical], + [EmployeeDataCategory.NonCritical, ComplianceStatus.NonCritical], + [EmployeeDataCategory.ReviewRequired, ComplianceStatus.NonCritical], + [EmployeeDataCategory.Sensitive, ComplianceStatus.NonCritical] + ]) + ], + [ + ProcessingPurpose.BusinessProcess, + new Map([ + [EmployeeDataCategory.None, ComplianceStatus.NonCritical], + [EmployeeDataCategory.NonCritical, ComplianceStatus.NonCritical], + [EmployeeDataCategory.ReviewRequired, ComplianceStatus.Warning], + [EmployeeDataCategory.Sensitive, ComplianceStatus.Critical] + ]) + ], + [ + ProcessingPurpose.DataAnalysis, + new Map([ + [EmployeeDataCategory.None, ComplianceStatus.NonCritical], + [EmployeeDataCategory.NonCritical, ComplianceStatus.Warning], + [EmployeeDataCategory.ReviewRequired, ComplianceStatus.Warning], + [EmployeeDataCategory.Sensitive, ComplianceStatus.Critical] + ]) + ], + [ + ProcessingPurpose.None, + new Map([ + [EmployeeDataCategory.None, ComplianceStatus.NonCritical], + [EmployeeDataCategory.NonCritical, ComplianceStatus.NonCritical], + [EmployeeDataCategory.ReviewRequired, ComplianceStatus.NonCritical], + [EmployeeDataCategory.Sensitive, ComplianceStatus.NonCritical] + ]) + ] +]) + +export const complianceCheckableElementTypes: FormElementType[] = [ + FormElementType.Switch, + FormElementType.Checkbox, + FormElementType.Radiobutton +] diff --git a/legalconsenthub/composables/useApplicationFormValidator.ts b/legalconsenthub/composables/useApplicationFormValidator.ts new file mode 100644 index 0000000..155b71d --- /dev/null +++ b/legalconsenthub/composables/useApplicationFormValidator.ts @@ -0,0 +1,47 @@ +import { ComplianceStatus, type FormElementDto } from '~/.api-client' +import { complianceCheckableElementTypes, complianceMap } from './complianceMap' +import type { FormElementId } from '~/types/FormElement' + +export function useApplicationFormValidator() { + function validateFormElements(formElements: FormElementDto[]): Map { + const formElementComplianceMap = new Map() + + formElements.forEach((formElement) => { + if (!complianceCheckableElementTypes.includes(formElement.type)) return + + // 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) + return + } + + formElement.options.forEach((option) => { + if (!option.value) { + console.log(`Value missing for ${formElement.type}`) + 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)! + const newComplianceStatusPos = Object.values(ComplianceStatus).indexOf(newComplianceStatus) + + if (newComplianceStatusPos > currentHighestComplianceStatusPos) { + formElementComplianceMap.set(formElement.id, newComplianceStatus) + } + } else { + formElementComplianceMap.set(formElement.id, currentHighestComplianceStatus) + } + }) + }) + + return formElementComplianceMap + } + + return { validateFormElements } +} diff --git a/legalconsenthub/pages/create.vue b/legalconsenthub/pages/create.vue index cab957f..0de4bcd 100644 --- a/legalconsenthub/pages/create.vue +++ b/legalconsenthub/pages/create.vue @@ -23,8 +23,9 @@ @@ -32,14 +33,35 @@