Merge branch 'code/cleanup' into dev

This commit is contained in:
Alexis
2025-03-14 17:45:15 +01:00
11 changed files with 104 additions and 70 deletions

View File

@@ -87,123 +87,123 @@
/* Colors */
.event-red:not(.is-hidden) {
@apply text-slate-900 bg-red-500 hover:bg-red-600
@apply text-slate-900 bg-red-500 hover:bg-red-600 focus-visible:bg-red-600
}
.event-orange:not(.is-hidden) {
@apply text-slate-900 bg-orange-500 hover:bg-orange-600
@apply text-slate-900 bg-orange-500 hover:bg-orange-600 focus-visible:bg-orange-600
}
.event-amber:not(.is-hidden) {
@apply text-slate-900 bg-amber-500 hover:bg-amber-600
@apply text-slate-900 bg-amber-500 hover:bg-amber-600 focus-visible:bg-amber-600
}
.event-yellow:not(.is-hidden) {
@apply text-slate-900 bg-yellow-600 hover:bg-yellow-700
@apply text-slate-900 bg-yellow-600 hover:bg-yellow-700 focus-visible:bg-yellow-700
}
.event-lime:not(.is-hidden) {
@apply text-slate-900 bg-lime-500 hover:bg-lime-600
@apply text-slate-900 bg-lime-500 hover:bg-lime-600 focus-visible:bg-lime-600
}
.event-green:not(.is-hidden) {
@apply text-white bg-green-600 hover:bg-green-700
@apply text-white bg-green-600 hover:bg-green-700 focus-visible:bg-green-700
}
.event-emerald:not(.is-hidden) {
@apply text-white bg-emerald-600 hover:bg-emerald-700
@apply text-white bg-emerald-600 hover:bg-emerald-700 focus-visible:bg-emerald-700
}
.event-teal:not(.is-hidden) {
@apply text-white bg-teal-600 hover:bg-teal-700
@apply text-white bg-teal-600 hover:bg-teal-700 focus-visible:bg-teal-700
}
.event-cyan:not(.is-hidden) {
@apply text-white bg-cyan-600 hover:bg-cyan-700
@apply text-white bg-cyan-600 hover:bg-cyan-700 focus-visible:bg-cyan-700
}
.event-sky:not(.is-hidden) {
@apply text-white bg-sky-600 hover:bg-sky-700
@apply text-white bg-sky-600 hover:bg-sky-700 focus-visible:bg-sky-700
}
.event-blue:not(.is-hidden) {
@apply text-white bg-blue-600 hover:bg-blue-700
@apply text-white bg-blue-600 hover:bg-blue-700 focus-visible:bg-blue-700
}
.event-indigo:not(.is-hidden) {
@apply text-white bg-indigo-600 hover:bg-indigo-700
@apply text-white bg-indigo-600 hover:bg-indigo-700 focus-visible:bg-indigo-700
}
.event-violet:not(.is-hidden) {
@apply text-white bg-violet-600 hover:bg-violet-700
@apply text-white bg-violet-600 hover:bg-violet-700 focus-visible:bg-violet-700
}
.event-purple:not(.is-hidden) {
@apply text-white bg-purple-600 hover:bg-purple-700
@apply text-white bg-purple-600 hover:bg-purple-700 focus-visible:bg-purple-700
}
.event-fuchsia:not(.is-hidden) {
@apply text-white bg-fuchsia-600 hover:bg-fuchsia-700
@apply text-white bg-fuchsia-600 hover:bg-fuchsia-700 focus-visible:bg-fuchsia-700
}
.event-pink:not(.is-hidden) {
@apply text-white bg-pink-700 hover:bg-pink-800
@apply text-white bg-pink-700 hover:bg-pink-800 focus-visible:bg-pink-800
}
.event-rose:not(.is-hidden) {
@apply text-white bg-rose-700 hover:bg-rose-800
@apply text-white bg-rose-700 hover:bg-rose-800 focus-visible:bg-rose-800
}
.event-black:not(.is-hidden) {
@apply text-white bg-stone-500 hover:bg-stone-700
@apply text-white bg-stone-500 hover:bg-stone-700 focus-visible:bg-stone-700
}
.event-white:not(.is-hidden) {
@apply text-slate-900 bg-white hover:bg-yellow-200 border-[1px] border-slate-300
@apply text-slate-900 bg-white hover:bg-yellow-200 focus-visible:bg-yellow-200 border-[1px] border-slate-300
}
.event.is-hidden {
border: 1px solid transparent;
border: 1px dashed transparent;
}
.event-red.is-hidden {
@apply text-red-500 hover:text-white dark:hover:text-slate-900 border-red-500 hover:bg-red-600 dark:text-white
@apply text-red-600 border-red-600 hover:bg-red-100 focus-visible:bg-red-100 dark:text-white dark:hover:bg-red-950 dark:focus-visible:bg-red-950
}
.event-orange.is-hidden {
@apply text-orange-500 hover:text-white dark:hover:text-slate-900 border-orange-500 hover:bg-orange-600 dark:text-white
@apply text-orange-600 border-orange-600 hover:bg-orange-100 focus-visible:bg-orange-100 dark:text-white dark:hover:bg-orange-950 dark:focus-visible:bg-orange-950
}
.event-amber.is-hidden {
@apply text-amber-500 hover:text-white dark:hover:text-slate-900 border-amber-500 hover:bg-amber-600 dark:text-white
@apply text-red-600 border-red-600 hover:bg-red-100 focus-visible:bg-red-100 dark:text-white dark:hover:bg-red-950 dark:focus-visible:bg-red-950
}
.event-yellow.is-hidden {
@apply text-yellow-600 hover:text-white dark:hover:text-slate-900 border-yellow-600 hover:bg-yellow-700 dark:text-white
@apply text-yellow-600 border-yellow-600 hover:bg-yellow-100 focus-visible:bg-yellow-100 dark:text-white dark:hover:bg-yellow-950 dark:focus-visible:bg-yellow-950
}
.event-lime.is-hidden {
@apply text-lime-500 hover:text-white dark:hover:text-slate-900 border-lime-500 hover:bg-lime-600 dark:text-white
@apply text-lime-600 border-lime-600 hover:bg-lime-100 focus-visible:bg-lime-100 dark:text-white dark:hover:bg-lime-950 dark:focus-visible:bg-lime-950
}
.event-green.is-hidden {
@apply text-green-600 hover:text-white border-green-600 hover:bg-green-700 dark:text-white
@apply text-green-600 border-green-600 hover:bg-green-700 focus-visible:bg-green-700 dark:text-white dark:hover:bg-green-950 dark:focus-visible:bg-green-950
}
.event-emerald.is-hidden {
@apply text-emerald-600 hover:text-white border-emerald-600 hover:bg-emerald-700 dark:text-white
@apply text-emerald-600 border-emerald-600 hover:bg-emerald-700 focus-visible:bg-emerald-700 dark:text-white dark:hover:bg-emerald-950 dark:focus-visible:bg-emerald-950
}
.event-teal.is-hidden {
@apply text-teal-700 hover:text-white border-teal-600 hover:bg-teal-700 dark:text-white
@apply text-teal-700 border-teal-600 hover:bg-teal-700 focus-visible:bg-teal-700 dark:text-white dark:hover:bg-teal-950 dark:focus-visible:bg-teal-950
}
.event-cyan.is-hidden {
@apply text-cyan-600 hover:text-white border-cyan-600 hover:bg-cyan-700 dark:text-white
@apply text-cyan-600 border-cyan-600 hover:bg-cyan-100 focus-visible:bg-cyan-100 dark:text-white dark:hover:bg-cyan-950 dark:focus-visible:bg-cyan-950
}
.event-sky.is-hidden {
@apply text-sky-600 hover:text-white border-sky-600 hover:bg-sky-700 dark:text-white
@apply text-sky-600 border-sky-600 hover:bg-sky-100 focus-visible:bg-sky-100 dark:text-white dark:hover:bg-sky-950 dark:focus-visible:bg-sky-950
}
.event-blue.is-hidden {
@apply text-blue-600 hover:text-white border-blue-600 hover:bg-blue-700 dark:text-white
@apply text-blue-600 border-blue-600 hover:bg-blue-100 focus-visible:bg-blue-100 dark:text-white dark:hover:bg-blue-950 dark:focus-visible:bg-blue-950
}
.event-indigo.is-hidden {
@apply text-indigo-600 hover:text-white border-indigo-600 hover:bg-indigo-700 dark:text-white
@apply text-indigo-600 border-indigo-600 hover:bg-indigo-100 focus-visible:bg-indigo-100 dark:text-white dark:hover:bg-indigo-950 dark:focus-visible:bg-indigo-950
}
.event-violet.is-hidden {
@apply text-violet-600 hover:text-white border-violet-600 hover:bg-violet-700 dark:text-white
@apply text-violet-600 border-violet-600 hover:bg-violet-100 focus-visible:bg-violet-100 dark:text-white dark:hover:bg-violet-950 dark:focus-visible:bg-violet-950
}
.event-purple.is-hidden {
@apply text-purple-600 hover:text-white border-purple-600 hover:bg-purple-700 dark:text-white
@apply text-purple-600 border-purple-600 hover:bg-purple-100 focus-visible:bg-purple-100 dark:text-white dark:hover:bg-purple-950 dark:focus-visible:bg-purple-950
}
.event-fuchsia.is-hidden {
@apply text-fuchsia-600 hover:text-white border-fuchsia-600 hover:bg-fuchsia-700 dark:text-white
@apply text-fuchsia-600 border-fuchsia-600 hover:bg-fuchsia-100 focus-visible:bg-fuchsia-100 dark:text-white dark:hover:bg-fuchsia-950 dark:focus-visible:bg-fuchsia-950
}
.event-pink.is-hidden {
@apply text-pink-700 hover:text-white border-pink-700 hover:bg-pink-800 dark:text-white
@apply text-pink-700 border-pink-700 hover:bg-pink-100 focus-visible:bg-pink-100 dark:text-white dark:hover:bg-pink-950 dark:focus-visible:bg-pink-950
}
.event-rose.is-hidden {
@apply text-rose-700 hover:text-white border-rose-700 hover:bg-rose-800 dark:text-white
@apply text-rose-700 border-rose-700 hover:bg-rose-100 focus-visible:bg-rose-100 dark:text-white dark:hover:bg-rose-950 dark:focus-visible:bg-rose-950
}
.event-black.is-hidden {
@apply text-stone-700 hover:text-white border-stone-500 hover:bg-stone-700 dark:text-white
@apply text-stone-700 border-stone-500 hover:bg-stone-100 focus-visible:bg-stone-100 dark:text-white dark:hover:bg-stone-950 dark:focus-visible:bg-stone-950
}
.event-white.is-hidden {
@apply text-slate-900 border-neutral-400 hover:bg-yellow-200 dark:bg-neutral-800 dark:text-white dark:hover:bg-neutral-300 dark:hover:text-slate-900
@apply text-slate-900 border-neutral-400 hover:bg-yellow-200 focus-visible:bg-yellow-200 dark:bg-neutral-900 dark:text-white dark:hover:bg-neutral-700 dark:focus-visible:bg-neutral-300
}
.dark .event-details-red {

View File

@@ -51,9 +51,9 @@ onMounted(() => {
<component :is="currentViewComponent" />
<CalendarSearch />
<CalendarDialogUpdateEvent v-if="!isReadOnly" />
<CalendarDialogDeleteEvent v-if="!isReadOnly" />
<LazyCalendarSearch />
<LazyCalendarDialogUpdateEvent v-if="!isReadOnly" />
<LazyCalendarDialogDeleteEvent v-if="!isReadOnly" />
</div>
</div>
</template>

View File

@@ -55,7 +55,7 @@ onMounted(() => {
<UiPopover v-model:open="isPopoverDetailsOpen">
<UiPopoverTrigger as-child>
<button
class="event text-xs px-2 py-1 block w-full text-left rounded-sm focus-visible:bg-red-200 transition-colors"
class="event text-xs px-2 py-1 block w-full text-left rounded-sm transition-colors outline-offset-1"
:class="
cn(
event.category ? `event-${event.category.color}` : '',

View File

@@ -2,12 +2,20 @@
import type { RPGDate } from "~/models/Date";
import { PhAlarm, PhCircleNotch, PhEye, PhEyeClosed, PhMapPinArea, PhTag } from "@phosphor-icons/vue"
const { t } = useI18n()
const emit = defineEmits(["event-created"])
const props = defineProps<{
date?: RPGDate
btnClass?: string
}>()
const { eventSkeleton } = storeToRefs(useCalendar())
const { submitSkeleton, cancelLatestRequest } = useCalendar()
const { t } = useI18n()
const newEventTitle = shallowRef<HTMLInputElement>()
useFocus(newEventTitle, { initialValue: true })
const isLoading = ref(false)
@@ -15,11 +23,6 @@ const formErrors = reactive<{ message: string | null }>({
message: null
})
const props = defineProps<{
date?: RPGDate
btnClass?: string
}>()
async function handleSubmit() {
// Prevent form submission if already loading
if (isLoading.value) return
@@ -56,6 +59,7 @@ function handleCancel() {
<div class="col-span-2 pl-8">
<input
id="new-event-title"
ref="newEventTitle"
v-model="eventSkeleton.title"
type="text"
name="new-event-title"

View File

@@ -29,6 +29,9 @@ import type { Category } from "~/models/Category"
const { isAdvancedSearchOpen, allEvents } = storeToRefs(useCalendar())
const { characters } = storeToRefs(useCharacters())
const searchInput = shallowRef<HTMLInputElement>()
useFocus(searchInput, { initialValue: true })
const searchQuery = ref<string>("")
// const searchEnough = computed<boolean>(() => searchQuery.value.length >= 2)
@@ -281,6 +284,7 @@ function handleCategoryUnselect(e: Category) {
<div class="relative w-full h-fit">
<UiInput
id="search"
ref="searchInput"
v-model:model-value="searchQuery"
type="text"
:placeholder="$t('entity.advancedSearch.ctaPlaceholder')"
@@ -321,7 +325,7 @@ function handleCategoryUnselect(e: Category) {
<ComboboxRoot
v-model="selectedCategories"
v-model:open="categoryFilterOpened"
v-model:searchTerm="searchCategory"
v-model:search-term="searchCategory"
class="grow flex items-center gap-y-1 pr-2"
>
<ComboboxAnchor as-child>

View File

@@ -21,7 +21,7 @@ const dateDuration = computed<string | null>(() => props.event.endDate ? getRela
<template>
<button
class="event relative block w-full text-left py-3 px-4 rounded-sm transition-colors"
class="event group relative block w-full text-left py-3 px-4 rounded-sm transition-colors"
:class="cn(
event.category ? `event-${event.category.color}` : '',
{
@@ -30,7 +30,7 @@ const dateDuration = computed<string | null>(() => props.event.endDate ? getRela
@click="$emit('query:date-jump', event.startDate)"
>
<div class="flex gap-2 items-center mb-1">
<h2 class="font-bold text-lg">
<h2 class="font-bold text-lg underline-offset-4 group-hover:underline">
{{ event.title }}
</h2>
<div v-if="event.wiki">

View File

@@ -0,0 +1,21 @@
<script lang="ts" setup>
const { lineNb = 3 } = defineProps<{
lineNb?: number
}>()
</script>
<template>
<UiCard class="w-full h-full flex flex-col">
<UiCardHeader>
<UiCardTitle>
<UiSkeleton class="w-2/3 max-w-full h-8" />
</UiCardTitle>
</UiCardHeader>
<UiCardContent class="grow grid gap-2">
<UiSkeleton class="w-full max-w-full h-6" />
<template v-for="(l, i) in lineNb" :key="i">
<UiSkeleton class="max-w-full h-6" :style="`width: ${Math.floor(Math.random() * 100) + 1}%`" />
</template>
</UiCardContent>
</UiCard>
</template>

View File

@@ -52,7 +52,7 @@ watch(user, () => {
</div>
</div>
<div v-else-if="calendar?.data && categories?.data" class="h-full w-full">
<div v-else-if="calendar?.data && categories?.data" class="h-full w-full pt-8">
<Head>
<Title>{{ calendar.data.name }}</Title>
</Head>
@@ -68,21 +68,21 @@ watch(user, () => {
<div class="grid justify-items-center opacity-80">
<PhCalendarX size="75" class="opacity-60" />
<Heading level="h1">
<LazyHeading level="h1">
{{ $t("entity.calendar.notFound") }}
</Heading>
</LazyHeading>
<p>
{{ $t('entity.calendar.notFoundDescription') }}
</p>
<UiButton variant="default" class="mt-4 gap-2" as-child>
<LazyUiButton variant="default" class="mt-4 gap-2" as-child>
<RouterLink to="/explore">
<PhArrowBendDoubleUpLeft size="24" />
{{ $t('entity.calendar.backToList') }}
</RouterLink>
</UiButton>
</LazyUiButton>
</div>
</div>
</template>

View File

@@ -5,7 +5,9 @@ definePageMeta({
middleware: ["reset-menu"]
})
const { data: availableCalendars } = await useLazyFetch<{ data: Calendar[] }>("/api/calendars/query", { key: "explore-calendars", query: { full: true } })
const { data: availableCalendars, status: calendarStatus } = await useLazyFetch<{ data: Calendar[] }>("/api/calendars/query", { key: "explore-calendars", query: { full: true } })
const isLoading = computed(() => calendarStatus.value === "pending")
</script>
<template>
@@ -24,11 +26,14 @@ const { data: availableCalendars } = await useLazyFetch<{ data: Calendar[] }>("/
{{ $t("entity.calendar.namePublicPlural") }}
</Heading>
<ul v-if="availableCalendars?.data" class="grid md:grid-cols-3 gap-2">
<li v-for="calendar in availableCalendars.data" :key="calendar.shortId">
<CalendarPreviewCard :calendar="calendar" :gm-id="calendar.world?.gmId" />
</li>
</ul>
<div v-if="isLoading" class="grid md:grid-cols-3 gap-2">
<LoadingCard />
</div>
<ul v-else-if="availableCalendars?.data" class="grid md:grid-cols-3 gap-2">
<li v-for="calendar in availableCalendars.data" :key="calendar.shortId">
<CalendarPreviewCard :calendar="calendar" :gm-id="calendar.world?.gmId" />
</li>
</ul>
</Spacing>
</Spacing>
</main>

View File

@@ -153,8 +153,8 @@ function hideEditModal() {
</Spacing>
</section>
<WorldDialogCreate :modal-state="isCreateWorldModalOpen" @on-close="hideCreateDialog" />
<WorldDialogEdit :world="markedWorld" :modal-state="isEditWorldModalOpen" @on-close="hideEditModal" />
<WorldDialogDelete :world="markedWorld" :modal-state="isDeleteWorldModalOpen" @on-close="hideDeleteModal" />
<LazyWorldDialogCreate :modal-state="isCreateWorldModalOpen" @on-close="hideCreateDialog" />
<LazyWorldDialogEdit :world="markedWorld" :modal-state="isEditWorldModalOpen" @on-close="hideEditModal" />
<LazyWorldDialogDelete :world="markedWorld" :modal-state="isDeleteWorldModalOpen" @on-close="hideDeleteModal" />
</main>
</template>

View File

@@ -251,10 +251,10 @@ function hideEditModal() {
</Spacing>
</section>
<WorldDialogEdit :world="world.data" :modal-state="isEditWorldModalOpen" @on-close="hideEditModal" />
<CalendarDialogCreate :world="world.data" :modal-state="isCreateCalendarModalOpen" @on-close="hideCreateDialog" />
<CalendarDialogUpdate v-if="markedCalendar?.id" :world="world.data" :calendar="markedCalendar" :modal-state="isUpdateCalendarModalOpen" @on-close="hideUpdateDialog" />
<CalendarDialogDelete :calendar="markedCalendar" :modal-state="isDeleteCalendarModalOpen" @on-close="hideDeleteCalendarModal"/>
<LazyWorldDialogEdit :world="world.data" :modal-state="isEditWorldModalOpen" @on-close="hideEditModal" />
<LazyCalendarDialogCreate :world="world.data" :modal-state="isCreateCalendarModalOpen" @on-close="hideCreateDialog" />
<LazyCalendarDialogUpdate v-if="markedCalendar?.id" :world="world.data" :calendar="markedCalendar" :modal-state="isUpdateCalendarModalOpen" @on-close="hideUpdateDialog" />
<LazyCalendarDialogDelete :calendar="markedCalendar" :modal-state="isDeleteCalendarModalOpen" @on-close="hideDeleteCalendarModal"/>
</template>
<template v-else>
<div class="h-full w-full grid place-items-center">