feat(frontend): Add ComplianceStatus and first validation

This commit is contained in:
2025-03-01 08:45:12 +01:00
parent 12ba5da7be
commit c07e03d593
7 changed files with 172 additions and 7 deletions

View File

@@ -0,0 +1,46 @@
import { ComplianceStatus, EmployeeDataCategory, FormElementType, ProcessingPurpose } from '~/.api-client'
export const complianceMap = new Map<ProcessingPurpose, Map<EmployeeDataCategory, ComplianceStatus>>([
[
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
]

View File

@@ -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<FormElementId, ComplianceStatus> {
const formElementComplianceMap = new Map<FormElementId, ComplianceStatus>()
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 }
}