From 0ca7c0f20f05e13009e1bdb8018adddca621b469 Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Thu, 16 Apr 2026 22:30:42 +0200 Subject: [PATCH] refactor(members): consolidate Platform Admin + Org members into shared useMembers - useMembers.ts gains a scope param ('organisation' | 'platform') on list, invite, update-role, and remove; endpoints branch accordingly. - Platform Admin's [id].vue now consumes useMembers via scope='platform'; deleted the duplicated useInviteOrganisationMember / useRemoveOrganisationMember / useUpdateOrganisationMemberRole helpers from useAdmin.ts. - Deduplicated InviteMemberPayload / UpdateMemberRolePayload / AdminOrganisationMember from types/admin.ts; Member is now the canonical type. - SettingsMembers.vue and EditMemberRoleDialog.vue removed (no remaining imports). - InviteMemberDialog accepts an optional scope prop and is restricted to the two organisation-level roles matching the /members UX. --- apps/app/components.d.ts | 2 + .../members/EditMemberRoleDialog.vue | 144 ------ .../components/members/InviteMemberDialog.vue | 14 +- .../organisation/settings/SettingsMembers.vue | 484 ------------------ .../components/persons/PersonDetailPanel.vue | 4 +- apps/app/src/composables/api/useAdmin.ts | 52 -- apps/app/src/composables/api/useMembers.ts | 76 ++- .../src/pages/platform/organisations/[id].vue | 40 +- apps/app/src/types/admin.ts | 21 +- apps/app/src/types/member.ts | 2 + 10 files changed, 92 insertions(+), 747 deletions(-) delete mode 100644 apps/app/src/components/members/EditMemberRoleDialog.vue delete mode 100644 apps/app/src/components/organisation/settings/SettingsMembers.vue diff --git a/apps/app/components.d.ts b/apps/app/components.d.ts index 55be0420..3d1047a5 100644 --- a/apps/app/components.d.ts +++ b/apps/app/components.d.ts @@ -67,6 +67,7 @@ declare module 'vue' { EventMetricCards: typeof import('./src/components/events/EventMetricCards.vue')['default'] EventTabsNav: typeof import('./src/components/events/EventTabsNav.vue')['default'] I18n: typeof import('./src/@core/components/I18n.vue')['default'] + ImageUploadField: typeof import('./src/components/common/ImageUploadField.vue')['default'] ImpersonateDialog: typeof import('./src/components/platform/ImpersonateDialog.vue')['default'] ImpersonationBanner: typeof import('./src/components/platform/ImpersonationBanner.vue')['default'] ImportFromEventDialog: typeof import('./src/components/event/ImportFromEventDialog.vue')['default'] @@ -80,6 +81,7 @@ declare module 'vue' { Notifications: typeof import('./src/@core/components/Notifications.vue')['default'] NotificationsTab: typeof import('./src/components/account-settings/NotificationsTab.vue')['default'] OrganisationSwitcher: typeof import('./src/components/layout/OrganisationSwitcher.vue')['default'] + PasswordRequirements: typeof import('./src/components/auth/PasswordRequirements.vue')['default'] PaymentProvidersDialog: typeof import('./src/components/dialogs/PaymentProvidersDialog.vue')['default'] PersonDetailPanel: typeof import('./src/components/persons/PersonDetailPanel.vue')['default'] PersonTagsTab: typeof import('./src/components/organisation/PersonTagsTab.vue')['default'] diff --git a/apps/app/src/components/members/EditMemberRoleDialog.vue b/apps/app/src/components/members/EditMemberRoleDialog.vue deleted file mode 100644 index 850181f4..00000000 --- a/apps/app/src/components/members/EditMemberRoleDialog.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - diff --git a/apps/app/src/components/members/InviteMemberDialog.vue b/apps/app/src/components/members/InviteMemberDialog.vue index 1d4f2a1e..e3ed6f7c 100644 --- a/apps/app/src/components/members/InviteMemberDialog.vue +++ b/apps/app/src/components/members/InviteMemberDialog.vue @@ -2,13 +2,16 @@ import { VForm } from 'vuetify/components/VForm' import { useInviteMember } from '@/composables/api/useMembers' import { emailValidator, requiredValidator } from '@core/utils/validators' -import type { OrganisationRole } from '@/types/member' +import type { MemberScope, OrganisationRole } from '@/types/member' import type { AxiosError } from 'axios' import type { ApiErrorResponse } from '@/types/auth' -const props = defineProps<{ +const props = withDefaults(defineProps<{ orgId: string -}>() + scope?: MemberScope +}>(), { + scope: 'organisation', +}) const modelValue = defineModel({ required: true }) @@ -24,12 +27,9 @@ const successEmail = ref('') const roleOptions: Array<{ title: string; value: OrganisationRole }> = [ { title: 'Organisatie Beheerder', value: 'org_admin' }, { title: 'Organisatie Lid', value: 'org_member' }, - { title: 'Evenement Manager', value: 'event_manager' }, - { title: 'Staf Coördinator', value: 'staff_coordinator' }, - { title: 'Vrijwilliger Coördinator', value: 'volunteer_coordinator' }, ] -const { mutate: inviteMember, isPending } = useInviteMember(orgIdRef) +const { mutate: inviteMember, isPending } = useInviteMember(props.scope, orgIdRef) function resetForm() { email.value = '' diff --git a/apps/app/src/components/organisation/settings/SettingsMembers.vue b/apps/app/src/components/organisation/settings/SettingsMembers.vue deleted file mode 100644 index 460689c7..00000000 --- a/apps/app/src/components/organisation/settings/SettingsMembers.vue +++ /dev/null @@ -1,484 +0,0 @@ - - - diff --git a/apps/app/src/components/persons/PersonDetailPanel.vue b/apps/app/src/components/persons/PersonDetailPanel.vue index 35c8ddb6..0f0be4c6 100644 --- a/apps/app/src/components/persons/PersonDetailPanel.vue +++ b/apps/app/src/components/persons/PersonDetailPanel.vue @@ -1,7 +1,7 @@