owltide/components/CardEventSlot.vue
Hornwitser 52973ffa9a
All checks were successful
/ build (push) Successful in 1m31s
/ deploy (push) Has been skipped
Show host on event slot cards
2025-07-16 20:36:28 +02:00

71 lines
1.6 KiB
Vue

<!--
SPDX-FileCopyrightText: © 2025 Hornwitser <code@hornwitser.no>
SPDX-License-Identifier: AGPL-3.0-or-later
-->
<template>
<section class="eventSlot">
<hgroup>
<h3>{{ event?.name }}</h3>
<p>
{{ formatTime(slot.start) }} - {{ formatTime(slot.end) }}
</p>
</hgroup>
<p v-if=event?.host>
Host: {{ event.host }}
</p>
<p>{{ event?.description ?? "No description provided" }}</p>
<p v-if="locations.length">
At {{ locations.map(location => location?.name ?? "unknown").join(" + ") }}
</p>
<p v-if="event?.interested">
{{ event?.interested }}
<template v-if="slot.interested">
+ {{ slot.interested }}
</template>
interested
</p>
<p v-if="slot.assigned.size">
Crew:
{{ [...slot.assigned].map(id => usersStore.users.get(id)?.name).join(", ") }}
</p>
</section>
</template>
<script lang="ts" setup>
import { DateTime } from '~/shared/utils/luxon';
const props = defineProps<{
event?: ClientScheduleEvent,
slot: ClientScheduleEventSlot,
}>()
const scheduleStore = useSchedulesStore();
const schedule = scheduleStore.activeSchedule;
const usersStore = useUsersStore();
const locations = computed(() => [...props.slot.locationIds].map(id => schedule.value.locations.get(id)));
function formatTime(time: DateTime) {
return time.toFormat("yyyy-LL-dd HH:mm");
}
</script>
<style scoped>
.eventSlot {
background: color-mix(in oklab, var(--background), grey 20%);
padding: 0.5rem;
border-radius: 0.5rem;
}
.eventSlot h3 {
margin: 0;
}
.eventSlot + .eventSlot {
margin-block-start: 0.5rem;
}
button {
padding-inline: 0.2em;
}
button.active {
color: color-mix(in oklab, var(--foreground), green 50%);
}
</style>