diff --git a/ui/src/hooks/tablos.ts b/ui/src/hooks/tablos.ts index 79a94ef..53ce751 100644 --- a/ui/src/hooks/tablos.ts +++ b/ui/src/hooks/tablos.ts @@ -237,3 +237,18 @@ export const useDeleteTablo = () => { }, }); }; + +export const useGetAllTabloAccess = () => { + const user = useUser(); + const { data, isLoading, error } = useQuery({ + queryKey: ["tablo-access", user.id], + queryFn: async () => { + const { data } = await supabase + .from("tablo_access") + .select("*") + .eq("user_id", user.id); + return data; + }, + }); + return { data, isLoading, error }; +}; diff --git a/ui/src/pages/planning.tsx b/ui/src/pages/planning.tsx index 6588391..55c3123 100644 --- a/ui/src/pages/planning.tsx +++ b/ui/src/pages/planning.tsx @@ -1,5 +1,5 @@ import { useState, useEffect } from "react"; -import { useTablosList } from "@ui/hooks/tablos"; +import { useGetAllTabloAccess, useTablosList } from "@ui/hooks/tablos"; import { useEventsByTablo, useDeleteEvent } from "@ui/hooks/events"; import { Select, @@ -13,6 +13,7 @@ import { generateICSFromEvents, downloadICSFile } from "@ui/utils/helpers"; import { ImportICSModal } from "@ui/components/ImportICSModal"; import { WebcalModal } from "@ui/components/WebcalModal"; import { FolderInputIcon, PlusIcon } from "lucide-react"; +import { EventAndTablo } from "@ui/types/events.types"; type ViewType = "month" | "week" | "day"; @@ -34,9 +35,23 @@ export const PlanningPage = () => { // Fetch events for selected tablo or all tablos const { data: tabloEvents = [], isLoading: tabloEventsLoading } = useEventsByTablo(selectedTabloId !== "all" ? selectedTabloId : null); + // Fetch all tablo accesses + const { data: tabloAccess } = useGetAllTabloAccess(); const deleteEvent = useDeleteEvent(); + // Check if an event can be deleted (e.g., based on permissions, event status, etc.) + const canDeleteEvent = (event: EventAndTablo) => { + if ( + tabloAccess?.find( + (access) => access.tablo_id === event.tablo_id && access.is_admin + ) + ) { + return true; + } + return false; + }; + // Keyboard shortcuts for view switching useEffect(() => { const handleKeyPress = (event: KeyboardEvent) => { @@ -251,12 +266,13 @@ export const PlanningPage = () => { } ${startOfWeek.getFullYear()}`; } } else { - return currentDate.toLocaleDateString("fr-FR", { + const dateString = currentDate.toLocaleDateString("fr-FR", { weekday: "long", year: "numeric", month: "long", day: "numeric", }); + return dateString.charAt(0).toUpperCase() + dateString.slice(1); } }; @@ -359,11 +375,12 @@ export const PlanningPage = () => {
{getEventsForDate(day) + .sort((a, b) => a.start_time.localeCompare(b.start_time)) .slice(0, 3) .map((event) => (
{ )}
- + {canDeleteEvent(event) && ( + + )}
))} {getEventsForDate(day).length > 3 && ( @@ -499,11 +518,18 @@ export const PlanningPage = () => { height: `${eventHeight}px`, minHeight: "30px", }} + title={`${formatTime(event.start_time)} - ${formatTime( + event.end_time + )} ${event.title}${ + selectedTabloId === "all" && event.tablo_name + ? ` - ${event.tablo_name}` + : "" + }`} onClick={(e) => { e.stopPropagation(); }} > -
+
{event.title} {selectedTabloId === "all" && event.tablo_name && ( @@ -517,16 +543,18 @@ export const PlanningPage = () => { {formatTime(event.end_time)}
)} - + {canDeleteEvent(event) && ( + + )}
); })} @@ -601,6 +629,13 @@ export const PlanningPage = () => { height: `${eventHeight}px`, minHeight: "30px", }} + title={`${formatTime(event.start_time)} - ${formatTime( + event.end_time + )} ${event.title}${ + selectedTabloId === "all" && event.tablo_name + ? ` - ${event.tablo_name}` + : "" + }`} onClick={(e) => { e.stopPropagation(); }} @@ -624,16 +659,18 @@ export const PlanningPage = () => { {event.description} )} - + {canDeleteEvent(event) && ( + + )} ); })} @@ -800,9 +837,9 @@ export const PlanningPage = () => { -

+

{getViewTitle()} -

+
diff --git a/ui/src/providers/UserStoreProvider.tsx b/ui/src/providers/UserStoreProvider.tsx index c7da51b..6f9f79a 100644 --- a/ui/src/providers/UserStoreProvider.tsx +++ b/ui/src/providers/UserStoreProvider.tsx @@ -6,7 +6,7 @@ import { useSession } from "@ui/contexts/SessionContext"; import { api } from "@ui/lib/api"; import { LoadingSpinner } from "@ui/components/LoadingSpinner"; -type User = Tables<"profiles"> & { +export type User = Tables<"profiles"> & { streamToken: string | null; };