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;
};