diff --git a/ui/src/components/EventDetailsModal.tsx b/ui/src/components/EventDetailsModal.tsx index 28da6d3..b736aeb 100644 --- a/ui/src/components/EventDetailsModal.tsx +++ b/ui/src/components/EventDetailsModal.tsx @@ -11,12 +11,15 @@ interface EventDetailsModalProps { isOpen: boolean; onClose: () => void; onEdit?: () => void; + canEdit?: boolean; } export const EventDetailsModal = ({ event, isOpen, onClose, + onEdit, + canEdit = false, }: EventDetailsModalProps) => { if (!event) return null; @@ -139,6 +142,7 @@ export const EventDetailsModal = ({ + {canEdit && onEdit && } ); diff --git a/ui/src/pages/bookings.tsx b/ui/src/pages/bookings.tsx index acab950..1729bdf 100644 --- a/ui/src/pages/bookings.tsx +++ b/ui/src/pages/bookings.tsx @@ -16,7 +16,7 @@ import { SearchIcon } from "lucide-react"; import { CalendarIcon } from "@ui/ui-library/icons/outline/calendar"; import { ChevronLeft, ChevronRight } from "lucide-react"; import { useEventsByTablo } from "@ui/hooks/events"; -import { useTablosList } from "@ui/hooks/tablos"; +import { useTablosList, useGetAllTabloAccess } from "@ui/hooks/tablos"; import { EventAndTablo } from "@ui/types/events.types"; import { LoadingSpinner } from "@ui/components/LoadingSpinner"; import { EventDetailsModal } from "@ui/components/EventDetailsModal"; @@ -57,6 +57,8 @@ export const BookingsPage = () => { const { data: events = [], isLoading: eventsLoading } = useEventsByTablo( selectedTabloId !== "all" ? selectedTabloId : null ); + // Fetch all tablo accesses for permissions + const { data: tabloAccess } = useGetAllTabloAccess(); // Filter and search events const filteredEvents = useMemo(() => { @@ -184,8 +186,17 @@ export const BookingsPage = () => { navigate(`/planning/create?date=${dateParam}${tabloParam}`); }; + // Check if an event can be edited (admin access required) + const canEditEvent = (event: EventAndTablo) => { + return tabloAccess?.find( + (access) => access.tablo_id === event.tablo_id && access.is_admin + ) + ? true + : false; + }; + const handleEditEvent = (event: EventAndTablo) => { - if (event.event_id && event.tablo_id) { + if (event.event_id && event.tablo_id && canEditEvent(event)) { navigate(`/planning/${event.tablo_id}/events/${event.event_id}/edit`); } }; @@ -529,6 +540,7 @@ export const BookingsPage = () => { setSelectedEvent(null); }} onEdit={() => selectedEvent && handleEditEvent(selectedEvent)} + canEdit={selectedEvent ? canEditEvent(selectedEvent) : false} /> diff --git a/ui/src/pages/planning.tsx b/ui/src/pages/planning.tsx index 55c3123..28ee1cb 100644 --- a/ui/src/pages/planning.tsx +++ b/ui/src/pages/planning.tsx @@ -52,6 +52,11 @@ export const PlanningPage = () => { return false; }; + // Check if an event can be edited (same logic as delete - admin access required) + const canEditEvent = (event: EventAndTablo) => { + return canDeleteEvent(event); + }; + // Keyboard shortcuts for view switching useEffect(() => { const handleKeyPress = (event: KeyboardEvent) => { @@ -380,21 +385,29 @@ export const PlanningPage = () => { .map((event) => (
{ e.stopPropagation(); - navigate({ - pathname: "/planning/create", - search: - selectedTabloId === "all" - ? `?date=${day.toISOString()}` - : `?date=${day.toISOString()}&tablo_id=${selectedTabloId}`, - }); + if (canEditEvent(event)) { + navigate({ + pathname: "/planning/create", + search: + selectedTabloId === "all" + ? `?date=${day.toISOString()}` + : `?date=${day.toISOString()}&tablo_id=${selectedTabloId}`, + }); + } }} >
@@ -512,7 +525,13 @@ export const PlanningPage = () => { return (
{ selectedTabloId === "all" && event.tablo_name ? ` - ${event.tablo_name}` : "" - }`} + }${!canEditEvent(event) ? " (Lecture seule)" : ""}`} onClick={(e) => { e.stopPropagation(); + // Read-only events are not clickable }} >
@@ -623,7 +643,13 @@ export const PlanningPage = () => { return (
{ selectedTabloId === "all" && event.tablo_name ? ` - ${event.tablo_name}` : "" - }`} + }${!canEditEvent(event) ? " (Lecture seule)" : ""}`} onClick={(e) => { e.stopPropagation(); + // Read-only events are not clickable }} >