New GET /events/{token}/attendees endpoint returns attendee names when
a valid organizer token is provided (403 otherwise). The frontend
conditionally renders the list below the attendee count for organizers,
silently degrading for visitors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
60 lines
1.2 KiB
Vue
60 lines
1.2 KiB
Vue
<template>
|
|
<section class="attendee-list">
|
|
<h3 class="attendee-list__heading">
|
|
{{ attendees.length === 1 ? '1 Attendee' : `${attendees.length} Attendees` }}
|
|
</h3>
|
|
<ul v-if="attendees.length > 0" class="attendee-list__items">
|
|
<li v-for="(name, index) in attendees" :key="index" class="attendee-list__item">
|
|
{{ name }}
|
|
</li>
|
|
</ul>
|
|
<p v-else class="attendee-list__empty">No attendees yet.</p>
|
|
</section>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
defineProps<{
|
|
attendees: string[]
|
|
}>()
|
|
</script>
|
|
|
|
<style scoped>
|
|
.attendee-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-sm);
|
|
}
|
|
|
|
.attendee-list__heading {
|
|
font-size: 0.75rem;
|
|
font-weight: 700;
|
|
color: rgba(255, 255, 255, 0.5);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.08em;
|
|
}
|
|
|
|
.attendee-list__items {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-xs);
|
|
}
|
|
|
|
.attendee-list__item {
|
|
font-size: 0.95rem;
|
|
color: rgba(255, 255, 255, 0.85);
|
|
line-height: 1.4;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.attendee-list__empty {
|
|
font-size: 0.9rem;
|
|
color: rgba(255, 255, 255, 0.5);
|
|
font-style: italic;
|
|
}
|
|
</style>
|