From 98ec51fcbd3f2189b60518af262668725e63caec Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Tue, 5 May 2026 19:04:49 +0200 Subject: [PATCH] refactor(portal): move components to shared/public-form and portal/{event,*} MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - public-form/** (18 files + 7 component tests) → shared/public-form/** This is the runtime form-renderer; goes into shared/ because it will be reused by the organizer-app Form Builder preview (S3b). - event/{Claimen,Informatie,Overzicht,Rooster}Tab.vue → portal/event/** - portal/{StatusCard,EventCard,UserAvatarMenu}.vue → portal/** (no path change — both apps had a portal/ subfolder). - AppLoadingIndicator.vue, auth/{PasswordRequirements,MfaChallengeCard}.vue, settings/Mfa{Disable,Email,Totp}SetupDialog.vue: portal copies deleted as duplicates of pre-existing apps/app components (diffs were trivial formatting only). Inside the moved files: rewrote @form-schema/* → @/composables/forms/* and @/components/{public-form,event/[Tab]} → new sub-zone paths. Updated apps/app/tsconfig.json to drop the @form-schema path alias and the packages/form-schema include path. Updated formSchema.ts to import from @/composables/forms/types/formBuilder. Carried the crypto polyfill from apps/portal/tests/setup.ts into apps/app/tests/setup.ts (needed by useFormDraft tests landing in C.4). NOTE: Some moved tests still fail because they reference portal composables (usePublicFormSections, useFormDraft) that move in C.4. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/app/src/components/portal/.gitkeep | 0 .../src/components/portal/EventCard.vue | 0 .../src/components/portal/StatusCard.vue | 0 .../src/components/portal/UserAvatarMenu.vue | 0 .../components/portal}/event/ClaimenTab.vue | 0 .../portal}/event/InformatieTab.vue | 0 .../components/portal}/event/OverzichtTab.vue | 0 .../components/portal}/event/RoosterTab.vue | 0 apps/app/src/components/shared/.gitkeep | 0 .../public-form/DuplicateSubmissionHint.vue | 2 +- .../public-form/FieldAvailabilityPicker.vue | 4 +- .../shared}/public-form/FieldBoolean.vue | 2 +- .../shared}/public-form/FieldCheckboxList.vue | 6 +- .../shared}/public-form/FieldDate.vue | 4 +- .../shared}/public-form/FieldEmail.vue | 4 +- .../shared}/public-form/FieldHeading.vue | 2 +- .../shared}/public-form/FieldMultiselect.vue | 6 +- .../shared}/public-form/FieldNumber.vue | 4 +- .../shared}/public-form/FieldParagraph.vue | 2 +- .../shared}/public-form/FieldPhone.vue | 4 +- .../shared}/public-form/FieldRadio.vue | 6 +- .../shared}/public-form/FieldRenderer.vue | 6 +- .../public-form/FieldSectionPriority.vue | 4 +- .../shared}/public-form/FieldSelect.vue | 6 +- .../shared}/public-form/FieldTagPicker.vue | 4 +- .../shared}/public-form/FieldText.vue | 4 +- .../shared}/public-form/FieldTextarea.vue | 4 +- .../shared}/public-form/FieldUrl.vue | 4 +- .../shared}/public-form/FormConfirmation.vue | 8 +- .../shared}/public-form/FormErrorState.vue | 2 +- .../shared}/public-form/FormStepper.vue | 2 +- .../public-form/IdentityMatchBanner.vue | 0 .../shared}/public-form/SubmitterDetails.vue | 0 .../DuplicateSubmissionHint.spec.ts | 4 +- .../FieldAvailabilityPicker.spec.ts | 6 +- .../__tests__}/FieldOptionsLocale.spec.ts | 12 +- .../__tests__}/FieldRenderer.test.ts | 6 +- .../__tests__}/FieldSectionPriority.spec.ts | 6 +- .../__tests__}/FieldTagPicker.spec.ts | 6 +- .../__tests__}/IdentityMatchBanner.spec.ts | 2 +- apps/app/src/types/formSchema.ts | 10 +- apps/app/tests/setup.ts | 12 + apps/app/tsconfig.json | 6 +- .../src/components/AppLoadingIndicator.vue | 63 ---- .../src/components/auth/MfaChallengeCard.vue | 283 ----------------- .../components/auth/PasswordRequirements.vue | 31 -- .../components/settings/MfaDisableDialog.vue | 115 ------- .../settings/MfaEmailSetupDialog.vue | 276 ----------------- .../settings/MfaTotpSetupDialog.vue | 291 ------------------ apps/portal/tests/setup.ts | 18 -- 50 files changed, 84 insertions(+), 1153 deletions(-) delete mode 100644 apps/app/src/components/portal/.gitkeep rename apps/{portal => app}/src/components/portal/EventCard.vue (100%) rename apps/{portal => app}/src/components/portal/StatusCard.vue (100%) rename apps/{portal => app}/src/components/portal/UserAvatarMenu.vue (100%) rename apps/{portal/src/components => app/src/components/portal}/event/ClaimenTab.vue (100%) rename apps/{portal/src/components => app/src/components/portal}/event/InformatieTab.vue (100%) rename apps/{portal/src/components => app/src/components/portal}/event/OverzichtTab.vue (100%) rename apps/{portal/src/components => app/src/components/portal}/event/RoosterTab.vue (100%) delete mode 100644 apps/app/src/components/shared/.gitkeep rename apps/{portal/src/components => app/src/components/shared}/public-form/DuplicateSubmissionHint.vue (95%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldAvailabilityPicker.vue (96%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldBoolean.vue (91%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldCheckboxList.vue (89%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldDate.vue (83%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldEmail.vue (83%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldHeading.vue (82%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldMultiselect.vue (83%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldNumber.vue (88%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldParagraph.vue (70%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldPhone.vue (83%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldRadio.vue (85%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldRenderer.vue (96%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldSectionPriority.vue (98%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldSelect.vue (83%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldTagPicker.vue (94%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldText.vue (82%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldTextarea.vue (83%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FieldUrl.vue (83%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FormConfirmation.vue (93%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FormErrorState.vue (97%) rename apps/{portal/src/components => app/src/components/shared}/public-form/FormStepper.vue (92%) rename apps/{portal/src/components => app/src/components/shared}/public-form/IdentityMatchBanner.vue (100%) rename apps/{portal/src/components => app/src/components/shared}/public-form/SubmitterDetails.vue (100%) rename apps/{portal/tests/unit => app/src/components/shared/public-form/__tests__}/DuplicateSubmissionHint.spec.ts (92%) rename apps/{portal/tests/components/public-form => app/src/components/shared/public-form/__tests__}/FieldAvailabilityPicker.spec.ts (95%) rename apps/{portal/tests/components/public-form => app/src/components/shared/public-form/__tests__}/FieldOptionsLocale.spec.ts (91%) rename apps/{portal/tests/components/public-form => app/src/components/shared/public-form/__tests__}/FieldRenderer.test.ts (95%) rename apps/{portal/tests/components/public-form => app/src/components/shared/public-form/__tests__}/FieldSectionPriority.spec.ts (97%) rename apps/{portal/tests/components/public-form => app/src/components/shared/public-form/__tests__}/FieldTagPicker.spec.ts (95%) rename apps/{portal/tests/components/public-form => app/src/components/shared/public-form/__tests__}/IdentityMatchBanner.spec.ts (95%) delete mode 100644 apps/portal/src/components/AppLoadingIndicator.vue delete mode 100644 apps/portal/src/components/auth/MfaChallengeCard.vue delete mode 100644 apps/portal/src/components/auth/PasswordRequirements.vue delete mode 100644 apps/portal/src/components/settings/MfaDisableDialog.vue delete mode 100644 apps/portal/src/components/settings/MfaEmailSetupDialog.vue delete mode 100644 apps/portal/src/components/settings/MfaTotpSetupDialog.vue delete mode 100644 apps/portal/tests/setup.ts diff --git a/apps/app/src/components/portal/.gitkeep b/apps/app/src/components/portal/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/portal/src/components/portal/EventCard.vue b/apps/app/src/components/portal/EventCard.vue similarity index 100% rename from apps/portal/src/components/portal/EventCard.vue rename to apps/app/src/components/portal/EventCard.vue diff --git a/apps/portal/src/components/portal/StatusCard.vue b/apps/app/src/components/portal/StatusCard.vue similarity index 100% rename from apps/portal/src/components/portal/StatusCard.vue rename to apps/app/src/components/portal/StatusCard.vue diff --git a/apps/portal/src/components/portal/UserAvatarMenu.vue b/apps/app/src/components/portal/UserAvatarMenu.vue similarity index 100% rename from apps/portal/src/components/portal/UserAvatarMenu.vue rename to apps/app/src/components/portal/UserAvatarMenu.vue diff --git a/apps/portal/src/components/event/ClaimenTab.vue b/apps/app/src/components/portal/event/ClaimenTab.vue similarity index 100% rename from apps/portal/src/components/event/ClaimenTab.vue rename to apps/app/src/components/portal/event/ClaimenTab.vue diff --git a/apps/portal/src/components/event/InformatieTab.vue b/apps/app/src/components/portal/event/InformatieTab.vue similarity index 100% rename from apps/portal/src/components/event/InformatieTab.vue rename to apps/app/src/components/portal/event/InformatieTab.vue diff --git a/apps/portal/src/components/event/OverzichtTab.vue b/apps/app/src/components/portal/event/OverzichtTab.vue similarity index 100% rename from apps/portal/src/components/event/OverzichtTab.vue rename to apps/app/src/components/portal/event/OverzichtTab.vue diff --git a/apps/portal/src/components/event/RoosterTab.vue b/apps/app/src/components/portal/event/RoosterTab.vue similarity index 100% rename from apps/portal/src/components/event/RoosterTab.vue rename to apps/app/src/components/portal/event/RoosterTab.vue diff --git a/apps/app/src/components/shared/.gitkeep b/apps/app/src/components/shared/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/portal/src/components/public-form/DuplicateSubmissionHint.vue b/apps/app/src/components/shared/public-form/DuplicateSubmissionHint.vue similarity index 95% rename from apps/portal/src/components/public-form/DuplicateSubmissionHint.vue rename to apps/app/src/components/shared/public-form/DuplicateSubmissionHint.vue index ffc41624..8f2a8021 100644 --- a/apps/portal/src/components/public-form/DuplicateSubmissionHint.vue +++ b/apps/app/src/components/shared/public-form/DuplicateSubmissionHint.vue @@ -1,5 +1,5 @@ - - diff --git a/apps/portal/src/components/auth/MfaChallengeCard.vue b/apps/portal/src/components/auth/MfaChallengeCard.vue deleted file mode 100644 index 7345e59f..00000000 --- a/apps/portal/src/components/auth/MfaChallengeCard.vue +++ /dev/null @@ -1,283 +0,0 @@ - - - - - diff --git a/apps/portal/src/components/auth/PasswordRequirements.vue b/apps/portal/src/components/auth/PasswordRequirements.vue deleted file mode 100644 index 7aeb1e16..00000000 --- a/apps/portal/src/components/auth/PasswordRequirements.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/apps/portal/src/components/settings/MfaDisableDialog.vue b/apps/portal/src/components/settings/MfaDisableDialog.vue deleted file mode 100644 index 4b3ab61b..00000000 --- a/apps/portal/src/components/settings/MfaDisableDialog.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - diff --git a/apps/portal/src/components/settings/MfaEmailSetupDialog.vue b/apps/portal/src/components/settings/MfaEmailSetupDialog.vue deleted file mode 100644 index c76c481a..00000000 --- a/apps/portal/src/components/settings/MfaEmailSetupDialog.vue +++ /dev/null @@ -1,276 +0,0 @@ - - - - - diff --git a/apps/portal/src/components/settings/MfaTotpSetupDialog.vue b/apps/portal/src/components/settings/MfaTotpSetupDialog.vue deleted file mode 100644 index 26462c00..00000000 --- a/apps/portal/src/components/settings/MfaTotpSetupDialog.vue +++ /dev/null @@ -1,291 +0,0 @@ - - - - - diff --git a/apps/portal/tests/setup.ts b/apps/portal/tests/setup.ts deleted file mode 100644 index 3e0c6611..00000000 --- a/apps/portal/tests/setup.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { vi } from 'vitest' - -// Deterministic idempotency-key generation for useFormDraft tests. -if (!globalThis.crypto) { - ;(globalThis as { crypto: Crypto }).crypto = { - randomUUID: () => '00000000-0000-4000-8000-000000000000', - getRandomValues: (buf: Uint8Array) => { - for (let i = 0; i < buf.length; i++) buf[i] = 0 - return buf - }, - } as unknown as Crypto -} - -// Suppress Vue-router usage in isolated composable tests. -vi.mock('vue-router', () => ({ - useRoute: () => ({ params: {}, query: {} }), - useRouter: () => ({ push: vi.fn(), replace: vi.fn() }), -}))