feat(portal): shift claiming and my-shifts for volunteer portal

Backend: PortalShiftController with 4 endpoints (available-shifts,
my-shifts, claim, cancel) delegating to ShiftAssignmentService.
24 PHPUnit tests covering happy paths, auth, conflicts, and edge cases.

Frontend: claim-shifts and my-shifts pages with TanStack Query
composable, conflict detection, confirmation dialogs, and cancel flow.
Navigation and dashboard cards wired up for approved volunteers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-13 08:47:12 +02:00
parent 0d5523dbfe
commit 5173f7297f
10 changed files with 1790 additions and 9 deletions

View File

@@ -94,12 +94,12 @@ const registeredLabel = computed(() => {
sm="4"
>
<VCard
:to="{ name: 'portal-shifts' }"
:to="{ name: 'portal-my-shifts' }"
variant="outlined"
class="pa-4 h-100 text-decoration-none"
>
<div class="text-subtitle-2 text-medium-emphasis mb-1">
Mijn Shifts
Mijn Diensten
</div>
<div class="text-body-2">
Rooster bekijken
@@ -111,14 +111,15 @@ const registeredLabel = computed(() => {
sm="4"
>
<VCard
:to="{ name: 'portal-claim-shifts' }"
variant="outlined"
class="pa-4 h-100 text-medium-emphasis"
class="pa-4 h-100 text-decoration-none"
>
<div class="text-subtitle-2 mb-1">
Shifts claimen
<div class="text-subtitle-2 text-medium-emphasis mb-1">
Diensten claimen
</div>
<div class="text-body-2">
Binnenkort beschikbaar
Schrijf je in voor diensten
</div>
</VCard>
</VCol>