From dde3f8504aab7d53a3ede47aea612ebbf5af3b91 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Thu, 19 Dec 2024 16:16:45 +0100 Subject: [PATCH 1/9] Fixed updating modal not closing as well --- components/calendar/dialog/UpdateEvent.vue | 10 +++------- components/calendar/form/UpdateEvent.vue | 4 ++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/components/calendar/dialog/UpdateEvent.vue b/components/calendar/dialog/UpdateEvent.vue index 46003e6..279613f 100644 --- a/components/calendar/dialog/UpdateEvent.vue +++ b/components/calendar/dialog/UpdateEvent.vue @@ -1,8 +1,6 @@ @@ -43,7 +39,7 @@ function handleClosing(e: Event) { - + diff --git a/components/calendar/form/UpdateEvent.vue b/components/calendar/form/UpdateEvent.vue index 716cf4c..b0a019c 100644 --- a/components/calendar/form/UpdateEvent.vue +++ b/components/calendar/form/UpdateEvent.vue @@ -3,6 +3,8 @@ import { PhAlarm, PhCircleNotch, PhEye, PhEyeClosed, PhMapPinArea, PhPencilSimpl import { useToast } from "~/components/ui/toast"; import type { APIError } from "~/models/Errors"; +const emit = defineEmits(["event-updated"]) + const { resetSkeleton, updateEventFromSkeleton, cancelLatestRequest } = useCalendar() const { eventSkeleton, lastActiveEvent } = storeToRefs(useCalendar()) @@ -22,6 +24,8 @@ async function handleAction() { try { await updateEventFromSkeleton() + + emit("event-updated") } catch (err) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const apiError = (err as any).data as APIError From df8af541c1d7c3de6c47a1ce253dfda528a112a7 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Thu, 19 Dec 2024 16:28:38 +0100 Subject: [PATCH 2/9] Added updated toast --- components/calendar/form/UpdateEvent.vue | 6 ++++++ i18n.config.ts | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/components/calendar/form/UpdateEvent.vue b/components/calendar/form/UpdateEvent.vue index b0a019c..4ade519 100644 --- a/components/calendar/form/UpdateEvent.vue +++ b/components/calendar/form/UpdateEvent.vue @@ -26,6 +26,12 @@ async function handleAction() { await updateEventFromSkeleton() emit("event-updated") + + toast({ + title: t("entity.calendar.event.updatedToast.title", { event: eventSkeleton.value.title }), + variant: "success", + duration: 3000 + }) } catch (err) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const apiError = (err as any).data as APIError diff --git a/i18n.config.ts b/i18n.config.ts index 9fda9f1..48dbc11 100644 --- a/i18n.config.ts +++ b/i18n.config.ts @@ -149,6 +149,9 @@ export default defineI18nConfig(() => ({ title: "Edit event", subtitle: "Update event data", }, + updatedToast: { + title: "Event \"{event}\" has been successfuly updated.", + }, editErrors: { toastTitle: "Event wasn't updated.", title_too_big: "Title should be less than 120 characters long.", @@ -372,6 +375,9 @@ export default defineI18nConfig(() => ({ title: "Modifier l'évènement", subtitle: "Mettre à jour les données de l'évènement", }, + updatedToast: { + title: "L'évènement \"{event}\" a été modifié avec succès.", + }, editErrors: { toastTitle: "L'évènement n'a pas été modifié", title_too_big: "Le titre doit être inférieur à 120 caractères.", From 199cfb6634153898b30ff40cabd50d2b84f70286 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Thu, 19 Dec 2024 16:46:22 +0100 Subject: [PATCH 3/9] Added not found page for calendars --- i18n.config.ts | 4 ++++ pages/calendars/[id].vue | 20 +++++++++++++++++++- pages/calendars/index.vue | 11 +++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 pages/calendars/index.vue diff --git a/i18n.config.ts b/i18n.config.ts index 48dbc11..df869df 100644 --- a/i18n.config.ts +++ b/i18n.config.ts @@ -95,6 +95,8 @@ export default defineI18nConfig(() => ({ nameSingular: "Calendar", namePlural: "Calendars", addSingle: "Add a calendar", + notFound: "Calendar not found", + notFoundDescription: "The link is not valid or the calendar has been deleted / archived.", notFoundForWorld: "No calendar for this world… yet !", isLoading: "Calendar is loading…", date: { @@ -321,6 +323,8 @@ export default defineI18nConfig(() => ({ nameSingular: "Calendriers", namePlural: "Calendrier", addSingle: "Ajouter un calendrier", + notFound: "Aucun calendrier trouvé", + notFoundDescription: "Le lien n'est pas valide ou le calendrier a été supprimé / archivé.", notFoundForWorld: "Aucun calendrier pour ce monde… pour l'instant !", isLoading: "Chargement du calendrier…", date: { diff --git a/pages/calendars/[id].vue b/pages/calendars/[id].vue index 9a38b86..cfd6377 100644 --- a/pages/calendars/[id].vue +++ b/pages/calendars/[id].vue @@ -1,5 +1,5 @@ + + From bf8257e60f0e87b4e2f04a7f443e3ccb2116a3ed Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Thu, 19 Dec 2024 19:38:57 +0100 Subject: [PATCH 4/9] Added explorer page --- components/global/sidebar/Sidebar.vue | 12 ++++---- components/global/user/CTA.vue | 6 ++-- i18n.config.ts | 18 +++++++++++ nuxt.config.ts | 3 +- pages/explore.vue | 44 +++++++++++++++++++++++++++ 5 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 pages/explore.vue diff --git a/components/global/sidebar/Sidebar.vue b/components/global/sidebar/Sidebar.vue index b5fce00..ad29aa5 100644 --- a/components/global/sidebar/Sidebar.vue +++ b/components/global/sidebar/Sidebar.vue @@ -1,11 +1,11 @@ + + From bc6cbd839ff213ac49ad821650adee100b400e64 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Thu, 19 Dec 2024 20:18:41 +0100 Subject: [PATCH 5/9] Added event count for calendars --- i18n.config.ts | 2 ++ models/CalendarConfig.ts | 1 + pages/explore.vue | 4 +++- server/api/calendars/query.get.ts | 4 +++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/i18n.config.ts b/i18n.config.ts index 56f6938..1237cd9 100644 --- a/i18n.config.ts +++ b/i18n.config.ts @@ -102,6 +102,7 @@ export default defineI18nConfig(() => ({ notFoundDescription: "The link is not valid or the calendar has been deleted / archived.", notFoundForWorld: "No calendar for this world… yet !", isLoading: "Calendar is loading…", + hasXEvents: "This calendar has {count} public events", date: { start: "Start date", end: "End date", @@ -339,6 +340,7 @@ export default defineI18nConfig(() => ({ notFoundDescription: "Le lien n'est pas valide ou le calendrier a été supprimé / archivé.", notFoundForWorld: "Aucun calendrier pour ce monde… pour l'instant !", isLoading: "Chargement du calendrier…", + hasXEvents: "Ce calendrier contient {count} évènements publiques", date: { start: "Date de début", end: "Date de fin", diff --git a/models/CalendarConfig.ts b/models/CalendarConfig.ts index a3fa150..cd5f348 100644 --- a/models/CalendarConfig.ts +++ b/models/CalendarConfig.ts @@ -16,6 +16,7 @@ export interface Calendar extends CalendarConfig { shortId?: string name: string events: CalendarEvent[] + eventNb?: Array<{ count: number }> state: CalendarState color?: string world?: World diff --git a/pages/explore.vue b/pages/explore.vue index 57efd2f..32d3587 100644 --- a/pages/explore.vue +++ b/pages/explore.vue @@ -33,7 +33,9 @@ const availableCalendars = data.value?.data as Calendar[] -

Description future (ou alors des informations sur le nb d'évènements)

+

+ {{ $t("entity.calendar.hasXEvents", { count: calendar.eventNb?.[0].count }) }} +

diff --git a/server/api/calendars/query.get.ts b/server/api/calendars/query.get.ts index a0efcf3..c7d7e23 100644 --- a/server/api/calendars/query.get.ts +++ b/server/api/calendars/query.get.ts @@ -20,7 +20,8 @@ export default defineEventHandler(async (event) => { name, today, months:calendar_months (*), - state + state, + eventNb:calendar_events(count) ` const fullFields = ` @@ -42,6 +43,7 @@ export default defineEventHandler(async (event) => { category:calendar_event_categories!calendar_events_category_fkey (*), secondaryCategories:calendar_event_categories!calendar_event_categories_links (*) ), + eventNb:calendar_events(count), world:worlds ( id, gmId:gm_id From eedbf1decb9c3d97a5b927c8d3816112172ce4cb Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Fri, 20 Dec 2024 11:16:41 +0100 Subject: [PATCH 6/9] Removed user watcher for now --- stores/CalendarStore.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/stores/CalendarStore.ts b/stores/CalendarStore.ts index 6f07e1d..b76ebcd 100644 --- a/stores/CalendarStore.ts +++ b/stores/CalendarStore.ts @@ -55,13 +55,6 @@ export const useCalendar = defineStore("calendar", () => { isReadOnly.value = (!user) || (gmId !== user.value?.id) } - // Watch for user changes - watch(user, () => { - if (activeCalendar.value) { - setReadStatus(activeCalendar.value.gmId!) - } - }) - /** * Month list (queried from API) */ @@ -80,9 +73,7 @@ export const useCalendar = defineStore("calendar", () => { setDefaultDate(activeCalendar.value.today) selectDate(activeCalendar.value.today) - if (calendarData.world) { - setReadStatus(activeCalendar.value.gmId!) - } + setReadStatus(activeCalendar.value.gmId!) if (!params.day) { params.day = defaultDate.value.day.toString() From 9f6d318a159556afcdc232cd447674b2a15e0bf0 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Fri, 20 Dec 2024 11:29:13 +0100 Subject: [PATCH 7/9] Removed duplicate closing calls for create event popover --- components/calendar/dialog/CreateEvent.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/calendar/dialog/CreateEvent.vue b/components/calendar/dialog/CreateEvent.vue index 14e999d..056c35f 100644 --- a/components/calendar/dialog/CreateEvent.vue +++ b/components/calendar/dialog/CreateEvent.vue @@ -36,8 +36,10 @@ function openEventCreatePopover() { * @param e The closing event (can be keydown or click) */ function handleClosing(e: Event) { - popoverOpen.value = false e.preventDefault() + popoverOpen.value = false + + console.log(e) } @@ -54,8 +56,6 @@ function handleClosing(e: Event) { :trap-focus="true" class="pl-3 w-[30rem] max-w-full border-indigo-200 dark:bg-slate-950 dark:border-indigo-950" @escape-key-down="handleClosing" - @focus-outside="handleClosing" - @interact-outside="handleClosing" @pointer-down-outside="handleClosing" > From 3db16546825239b58369387ee4eb2ed622eb8fbe Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Fri, 20 Dec 2024 11:31:40 +0100 Subject: [PATCH 8/9] Removed console log --- components/calendar/dialog/CreateEvent.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/calendar/dialog/CreateEvent.vue b/components/calendar/dialog/CreateEvent.vue index 056c35f..e53174f 100644 --- a/components/calendar/dialog/CreateEvent.vue +++ b/components/calendar/dialog/CreateEvent.vue @@ -38,8 +38,6 @@ function openEventCreatePopover() { function handleClosing(e: Event) { e.preventDefault() popoverOpen.value = false - - console.log(e) } From 91048d1b8e0381cb210aa61169dccd3daea88a96 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Fri, 20 Dec 2024 11:41:17 +0100 Subject: [PATCH 9/9] Watched for user change in the page instead --- pages/calendars/[id].vue | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pages/calendars/[id].vue b/pages/calendars/[id].vue index cfd6377..04e72da 100644 --- a/pages/calendars/[id].vue +++ b/pages/calendars/[id].vue @@ -6,11 +6,18 @@ import type { Category } from "~/models/Category"; const route = useRoute() const shortId = route.params.id -const { data: calendarData, pending: calPending } = await useLazyFetch("/api/calendars/query", { key: `calendar-${shortId}`, query: { shortId, full: true } }) -const { data: catData, pending: catPending } = await useLazyFetch("/api/calendars/categories/query", { key: `categories-${shortId}` }) +const user = useSupabaseUser() + +const { data: calendarData, pending: calPending, refresh: calRefresh } = await useLazyFetch("/api/calendars/query", { key: `calendar-${shortId}`, query: { shortId, full: true } }) +const { data: catData, pending: catPending, refresh: catRefresh } = await useLazyFetch("/api/calendars/categories/query", { key: `categories-${shortId}` }) const cal = computed(() => calendarData?.value?.data as Calendar) const categories = computed(() => catData?.value?.data as Category[]) + +watch(user, () => { + calRefresh() + catRefresh() +})