From 2a1af0b9f57af38c12f5fedef0a702f755118efc Mon Sep 17 00:00:00 2001 From: Camille Moussu Date: Mon, 7 Jul 2025 17:31:31 +0200 Subject: [PATCH 1/2] [#] added alert when importing events with error --- src/components/Calendar/Calendar.tsx | 5 ++- src/components/Calendar/CalendarSelection.tsx | 1 - src/features/Calendars/CalendarSlice.ts | 2 +- src/features/Events/EventsTypes.ts | 3 +- src/features/Events/ImportAlert.tsx | 40 +++++++++++++++++++ src/features/Events/eventUtils.ts | 9 ++++- 6 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 src/features/Events/ImportAlert.tsx diff --git a/src/components/Calendar/Calendar.tsx b/src/components/Calendar/Calendar.tsx index 1dde554..dafaf0b 100644 --- a/src/components/Calendar/Calendar.tsx +++ b/src/components/Calendar/Calendar.tsx @@ -13,6 +13,8 @@ import CalendarPopover from "../../features/Calendars/CalendarModal"; import { CalendarEvent } from "../../features/Events/EventsTypes"; import CalendarSelection from "./CalendarSelection"; import { getCalendarDetailAsync } from "../../features/Calendars/CalendarSlice"; +import ImportAlert from "../../features/Events/ImportAlert"; +import { Alert, Button, Collapse } from "@mui/material"; export default function CalendarApp() { const calendarRef = useRef(null); @@ -22,10 +24,10 @@ export default function CalendarApp() { const calendars = useAppSelector((state) => state.calendars.list); const pending = useAppSelector((state) => state.calendars.pending); const userId = useAppSelector((state) => state.user.userData.openpaasId); + const [selectedCalendars, setSelectedCalendars] = useState( Object.keys(calendars).filter((id) => id.split("/")[0] === userId) ); - const fetchedIdsRef = useRef>(new Set()); let filteredEvents: CalendarEvent[] = []; @@ -131,6 +133,7 @@ export default function CalendarApp() {
+ { if (ref) { diff --git a/src/components/Calendar/CalendarSelection.tsx b/src/components/Calendar/CalendarSelection.tsx index 1c7945b..0c98fcc 100644 --- a/src/components/Calendar/CalendarSelection.tsx +++ b/src/components/Calendar/CalendarSelection.tsx @@ -13,7 +13,6 @@ export default function CalendarSelection({ const calendars = useAppSelector((state) => state.calendars.list); const handleCalendarToggle = (name: string) => { - setSelectedCalendars((prev: string[]) => prev.includes(name) ? prev.filter((n) => n !== name) : [...prev, name] ); diff --git a/src/features/Calendars/CalendarSlice.ts b/src/features/Calendars/CalendarSlice.ts index 482f673..3a79bd4 100644 --- a/src/features/Calendars/CalendarSlice.ts +++ b/src/features/Calendars/CalendarSlice.ts @@ -39,7 +39,7 @@ export const getCalendarDetailAsync = createAsyncThunk< const events: CalendarEvent[] = calendar._embedded["dav:item"].map( (eventdata: any) => { const datas = eventdata.data[2][0][1]; - return parseCalendarEvent(datas, color); + return parseCalendarEvent(datas, color, calId); } ); diff --git a/src/features/Events/EventsTypes.ts b/src/features/Events/EventsTypes.ts index 5bea959..c27d337 100644 --- a/src/features/Events/EventsTypes.ts +++ b/src/features/Events/EventsTypes.ts @@ -15,5 +15,6 @@ export interface CalendarEvent { stamp?: Date; sequence?: Number; color?: string; - allday?:Boolean + allday?: Boolean; + error?: string; } diff --git a/src/features/Events/ImportAlert.tsx b/src/features/Events/ImportAlert.tsx new file mode 100644 index 0000000..0f3a292 --- /dev/null +++ b/src/features/Events/ImportAlert.tsx @@ -0,0 +1,40 @@ +import { Alert, Collapse } from "@mui/material"; +import { useState } from "react"; +import { useAppSelector } from "../../app/hooks"; + +export default function ImportAlert() { + const [visibleAlerts, setVisibleAlerts] = useState>( + {} + ); + const calendars = useAppSelector((state) => state.calendars.list); + + const toggleEventAlert = (eventId: string) => { + setVisibleAlerts((prev) => ({ + ...prev, + [eventId]: false, + })); + }; + + return ( + <> + {Object.keys(calendars).map((calendarId) => + calendars[calendarId].events + .filter((event) => event.error) + .map((event) => { + const isVisible = visibleAlerts[event.uid] ?? true; // default to visible + + return ( + + toggleEventAlert(event.uid)} + > + {event.error} + + + ); + }) + )} + + ); +} diff --git a/src/features/Events/eventUtils.ts b/src/features/Events/eventUtils.ts index a810089..6d238ea 100644 --- a/src/features/Events/eventUtils.ts +++ b/src/features/Events/eventUtils.ts @@ -5,7 +5,8 @@ type RawEntry = [string, Record, string, any]; export function parseCalendarEvent( data: RawEntry[], - color: string + color: string, + calendarid: string ): CalendarEvent { const event: Partial = { color, attendee: [] }; @@ -64,7 +65,11 @@ export function parseCalendarEvent( } if (!event.uid || !event.start) { - throw new Error(`Missing required event fields`); + console.error( + `missing crucial event param in calendar ${calendarid} `, + data + ); + event.error = `missing crucial event param in calendar ${calendarid} `; } return event as CalendarEvent; From f144a3726ca5ac2ed4bed897372e164cee6d3a05 Mon Sep 17 00:00:00 2001 From: Camille Moussu Date: Wed, 9 Jul 2025 10:06:36 +0200 Subject: [PATCH 2/2] [chores] removed unused import --- src/components/Calendar/Calendar.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Calendar/Calendar.tsx b/src/components/Calendar/Calendar.tsx index dafaf0b..32eed06 100644 --- a/src/components/Calendar/Calendar.tsx +++ b/src/components/Calendar/Calendar.tsx @@ -14,7 +14,6 @@ import { CalendarEvent } from "../../features/Events/EventsTypes"; import CalendarSelection from "./CalendarSelection"; import { getCalendarDetailAsync } from "../../features/Calendars/CalendarSlice"; import ImportAlert from "../../features/Events/ImportAlert"; -import { Alert, Button, Collapse } from "@mui/material"; export default function CalendarApp() { const calendarRef = useRef(null);