diff --git a/src/pages/MyTickets.vue b/src/pages/MyTickets.vue index 1d7aa3e..73192ce 100644 --- a/src/pages/MyTickets.vue +++ b/src/pages/MyTickets.vue @@ -9,7 +9,7 @@ import { ScrollArea } from '@/components/ui/scroll-area' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { format } from 'date-fns' -import { Ticket, User, Calendar, CreditCard, CheckCircle, Clock, AlertCircle, QrCode } from 'lucide-vue-next' +import { Ticket, User, Calendar, CreditCard, CheckCircle, Clock, AlertCircle, QrCode, ChevronLeft, ChevronRight } from 'lucide-vue-next' const { isAuthenticated, userDisplay } = useAuth() const { @@ -28,6 +28,9 @@ const { const qrCodes = ref>({}) const showQRCode = ref>({}) +// Ticket cycling state +const currentTicketIndex = ref>({}) + function formatDate(dateStr: string) { return format(new Date(dateStr), 'PPP') } @@ -71,6 +74,30 @@ function toggleQRCode(ticketId: string) { } } +// Ticket cycling functions +function getCurrentTicketIndex(eventId: string) { + return currentTicketIndex.value[eventId] || 0 +} + +function setCurrentTicketIndex(eventId: string, index: number) { + currentTicketIndex.value[eventId] = index +} + +function nextTicket(eventId: string, totalTickets: number) { + const current = getCurrentTicketIndex(eventId) + setCurrentTicketIndex(eventId, (current + 1) % totalTickets) +} + +function prevTicket(eventId: string, totalTickets: number) { + const current = getCurrentTicketIndex(eventId) + setCurrentTicketIndex(eventId, current === 0 ? totalTickets - 1 : current - 1) +} + +function getCurrentTicket(tickets: any[], eventId: string) { + const index = getCurrentTicketIndex(eventId) + return tickets[index] || tickets[0] +} + onMounted(async () => { if (isAuthenticated.value) { await refresh() @@ -132,75 +159,92 @@ onMounted(async () => { -
-
- -
+
+ +
-
-

Event: {{ group.eventId }}

-

- {{ group.tickets.length }} ticket{{ group.tickets.length !== 1 ? 's' : '' }} • - {{ group.paidCount }} paid • - {{ group.pendingCount }} pending • - {{ group.registeredCount }} registered -

-
- - {{ group.tickets.length }} total + Event: {{ group.eventId }} + + {{ group.tickets.length }} ticket{{ group.tickets.length !== 1 ? 's' : '' }}
-
+ + {{ group.paidCount }} paid • {{ group.pendingCount }} pending • {{ group.registeredCount }} registered + + + +
+ +
+ + + {{ getCurrentTicketIndex(group.eventId) + 1 }} of {{ group.tickets.length }} + + +
- -
- - + +
- Ticket #{{ ticket.id.slice(0, 8) }} + + Ticket #{{ getCurrentTicket(group.tickets, group.eventId).id.slice(0, 8) }} +
- - {{ getTicketStatus(ticket).label }} + + {{ getTicketStatus(getCurrentTicket(group.tickets, group.eventId)).label }}
- - +
Status:
- - {{ getTicketStatus(ticket).label }} + + {{ getTicketStatus(getCurrentTicket(group.tickets, group.eventId)).label }}
Purchased: - {{ formatDate(ticket.time) }} + {{ formatDate(getCurrentTicket(group.tickets, group.eventId).time) }}
Time: - {{ formatTime(ticket.time) }} + {{ formatTime(getCurrentTicket(group.tickets, group.eventId).time) }}
-
+
Registered: - {{ formatDate(ticket.reg_timestamp) }} + {{ formatDate(getCurrentTicket(group.tickets, group.eventId).reg_timestamp) }}
-
+
Ticket QR Code @@ -210,88 +254,108 @@ onMounted(async () => {

Ticket ID

-

{{ ticket.id }}

+

{{ getCurrentTicket(group.tickets, group.eventId).id }}

- - -
-
+
+
+ +
-
-
- -
+
+ +
-
-

Event: {{ group.eventId }}

-

- {{ group.paidCount }} paid ticket{{ group.paidCount !== 1 ? 's' : '' }} -

-
- + Event: {{ group.eventId }} + {{ group.paidCount }} paid
-
+ + {{ group.paidCount }} paid ticket{{ group.paidCount !== 1 ? 's' : '' }} + + + +
+ +
+ + + {{ getCurrentTicketIndex(group.eventId) + 1 }} of {{ group.tickets.filter(t => t.paid).length }} + + +
- -
- - + +
- Ticket #{{ ticket.id.slice(0, 8) }} + + Ticket #{{ getCurrentTicket(group.tickets.filter(t => t.paid), group.eventId).id.slice(0, 8) }} +
- {{ getTicketStatus(ticket).label }} + {{ getTicketStatus(getCurrentTicket(group.tickets.filter(t => t.paid), group.eventId)).label }}
- - +
Status:
- - {{ getTicketStatus(ticket).label }} + + {{ getTicketStatus(getCurrentTicket(group.tickets.filter(t => t.paid), group.eventId)).label }}
Purchased: - {{ formatDate(ticket.time) }} + {{ formatDate(getCurrentTicket(group.tickets.filter(t => t.paid), group.eventId).time) }}
Time: - {{ formatTime(ticket.time) }} + {{ formatTime(getCurrentTicket(group.tickets.filter(t => t.paid), group.eventId).time) }}
-
+
Registered: - {{ formatDate(ticket.reg_timestamp) }} + {{ formatDate(getCurrentTicket(group.tickets.filter(t => t.paid), group.eventId).reg_timestamp) }}
-
+
Ticket QR Code @@ -301,84 +365,104 @@ onMounted(async () => {

Ticket ID

-

{{ ticket.id }}

+

{{ getCurrentTicket(group.tickets.filter(t => t.paid), group.eventId).id }}

- - -
-
+
+
+ +
-
-
- -
+
+ +
-
-

Event: {{ group.eventId }}

-

- {{ group.pendingCount }} pending ticket{{ group.pendingCount !== 1 ? 's' : '' }} -

-
- + Event: {{ group.eventId }} + {{ group.pendingCount }} pending
-
+ + {{ group.pendingCount }} pending ticket{{ group.pendingCount !== 1 ? 's' : '' }} + + + +
+ +
+ + + {{ getCurrentTicketIndex(group.eventId) + 1 }} of {{ group.tickets.filter(t => !t.paid).length }} + + +
- -
- - + +
- Ticket #{{ ticket.id.slice(0, 8) }} + + Ticket #{{ getCurrentTicket(group.tickets.filter(t => !t.paid), group.eventId).id.slice(0, 8) }} +
- {{ getTicketStatus(ticket).label }} + {{ getTicketStatus(getCurrentTicket(group.tickets.filter(t => !t.paid), group.eventId)).label }}
- - +
Status:
- - {{ getTicketStatus(ticket).label }} + + {{ getTicketStatus(getCurrentTicket(group.tickets.filter(t => !t.paid), group.eventId)).label }}
Created: - {{ formatDate(ticket.time) }} + {{ formatDate(getCurrentTicket(group.tickets.filter(t => !t.paid), group.eventId).time) }}
Time: - {{ formatTime(ticket.time) }} + {{ formatTime(getCurrentTicket(group.tickets.filter(t => !t.paid), group.eventId).time) }}
-
+
Ticket QR Code @@ -388,88 +472,108 @@ onMounted(async () => {

Ticket ID

-

{{ ticket.id }}

+

{{ getCurrentTicket(group.tickets.filter(t => !t.paid), group.eventId).id }}

- - -
-
+
+
+
+
-
-
- -
+
+ +
-
-

Event: {{ group.eventId }}

-

- {{ group.registeredCount }} registered ticket{{ group.registeredCount !== 1 ? 's' : '' }} -

-
- + Event: {{ group.eventId }} + {{ group.registeredCount }} registered
-
+ + {{ group.registeredCount }} registered ticket{{ group.registeredCount !== 1 ? 's' : '' }} + + + +
+ +
+ + + {{ getCurrentTicketIndex(group.eventId) + 1 }} of {{ group.tickets.filter(t => t.registered).length }} + + +
- -
- - + +
- Ticket #{{ ticket.id.slice(0, 8) }} + + Ticket #{{ getCurrentTicket(group.tickets.filter(t => t.registered), group.eventId).id.slice(0, 8) }} +
- {{ getTicketStatus(ticket).label }} + {{ getTicketStatus(getCurrentTicket(group.tickets.filter(t => t.registered), group.eventId)).label }}
- - +
Status:
- - {{ getTicketStatus(ticket).label }} + + {{ getTicketStatus(getCurrentTicket(group.tickets.filter(t => t.registered), group.eventId)).label }}
Purchased: - {{ formatDate(ticket.time) }} + {{ formatDate(getCurrentTicket(group.tickets.filter(t => t.registered), group.eventId).time) }}
Time: - {{ formatTime(ticket.time) }} + {{ formatTime(getCurrentTicket(group.tickets.filter(t => t.registered), group.eventId).time) }}
-
+
Registered: - {{ formatDate(ticket.reg_timestamp) }} + {{ formatDate(getCurrentTicket(group.tickets.filter(t => t.registered), group.eventId).reg_timestamp) }}
-
+
Ticket QR Code @@ -479,16 +583,16 @@ onMounted(async () => {

Ticket ID

-

{{ ticket.id }}

+

{{ getCurrentTicket(group.tickets.filter(t => t.registered), group.eventId).id }}

- - -
-
+
+
+ +