diff --git a/apps/app/components.d.ts b/apps/app/components.d.ts index 410c4aa8..75cbc381 100644 --- a/apps/app/components.d.ts +++ b/apps/app/components.d.ts @@ -77,7 +77,6 @@ declare module 'vue' { RegistrationFieldCard: typeof import('./src/components/event/RegistrationFieldCard.vue')['default'] RegistrationFieldFormDialog: typeof import('./src/components/event/RegistrationFieldFormDialog.vue')['default'] RegistrationFieldTemplatesTab: typeof import('./src/components/organisation/RegistrationFieldTemplatesTab.vue')['default'] - RegistrationLinkCard: typeof import('./src/components/events/RegistrationLinkCard.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] ScrollToTop: typeof import('./src/@core/components/ScrollToTop.vue')['default'] diff --git a/apps/app/src/components/events/EventTabsNav.vue b/apps/app/src/components/events/EventTabsNav.vue index 74b41627..13a21554 100644 --- a/apps/app/src/components/events/EventTabsNav.vue +++ b/apps/app/src/components/events/EventTabsNav.vue @@ -7,7 +7,6 @@ import { useAuthStore } from '@/stores/useAuthStore' import { useNotificationStore } from '@/stores/useNotificationStore' import { useOrganisationStore } from '@/stores/useOrganisationStore' import EditEventDialog from '@/components/events/EditEventDialog.vue' -import RegistrationLinkCard from '@/components/events/RegistrationLinkCard.vue' import type { EventStatus } from '@/types/event' const route = useRoute() @@ -39,10 +38,6 @@ function transitionButtonColor(current: EventStatus, target: EventStatus): strin return 'primary' } -function transitionButtonVariant(current: EventStatus, target: EventStatus): 'flat' | 'outlined' { - return transitionVisualKind(current, target) === 'backward' ? 'outlined' : 'flat' -} - function openTransitionConfirm(target: EventStatus) { pendingTransitionStatus.value = target confirmTransitionOpen.value = true @@ -96,9 +91,23 @@ watch(eventId, (id) => { }, { immediate: true }) const isEditDialogOpen = ref(false) +const statusMenuOpen = ref(false) +const shareDialogOpen = ref(false) +const linkCopied = ref(false) -const statusColor: Record = { - draft: 'default', +const portalBaseUrl = import.meta.env.VITE_PORTAL_URL || 'https://portal.crewli.app' + +const registrationUrl = computed(() => + event.value ? `${portalBaseUrl}/register/${event.value.slug}` : '', +) + +const isRegistrationOpen = computed(() => event.value?.status === 'registration_open') + +const showVolunteerShare = computed(() => Boolean(event.value && !event.value.parent_event_id)) + +/** Kleuren voor statusknop / icoon (VBtn; concept = secondary i.p.v. chip-default). */ +const statusActionColor: Record = { + draft: 'secondary', published: 'info', registration_open: 'cyan', buildup: 'warning', @@ -122,6 +131,21 @@ function formatDate(iso: string) { return dateFormatter.format(new Date(iso)) } +function onSelectTransition(target: EventStatus) { + statusMenuOpen.value = false + openTransitionConfirm(target) +} + +async function copyRegistrationLink() { + if (!registrationUrl.value) + return + await navigator.clipboard.writeText(registrationUrl.value) + linkCopied.value = true + setTimeout(() => { + linkCopied.value = false + }, 2000) +} + const baseTabs = [ { label: 'Overzicht', icon: 'tabler-layout-dashboard', route: 'events-id' }, { label: 'Personen', icon: 'tabler-users', route: 'events-id-persons' }, @@ -204,65 +228,106 @@ const backRoute = computed(() => {