import Accordion from "@mui/material/Accordion"; import AccordionDetails from "@mui/material/AccordionDetails"; import AccordionSummary from "@mui/material/AccordionSummary"; import Typography from "@mui/material/Typography"; import { useAppDispatch, useAppSelector } from "../../app/hooks"; import AddIcon from "@mui/icons-material/Add"; import { useState, useMemo, useEffect } from "react"; import CalendarPopover from "./CalendarModal"; import { Calendars } from "../../features/Calendars/CalendarTypes"; import MoreVertIcon from "@mui/icons-material/MoreVert"; import IconButton from "@mui/material/IconButton"; import Checkbox from "@mui/material/Checkbox"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import CalendarSearch from "./CalendarSearch"; import { Divider, ListItem, Menu, MenuItem } from "@mui/material"; import { removeCalendarAsync } from "../../features/Calendars/CalendarSlice"; import { DeleteCalendarDialog } from "./DeleteCalendarDialog"; import { trimLongTextWithoutSpace } from "../../utils/textUtils"; function CalendarAccordion({ title, calendars, selectedCalendars, handleToggle, showAddButton = false, onAddClick, defaultExpanded = false, setOpen, }: { title: string; calendars: string[]; selectedCalendars: string[]; handleToggle: (id: string) => void; showAddButton?: boolean; onAddClick?: Function; defaultExpanded?: boolean; setOpen: Function; }) { const allCalendars = useAppSelector((state) => state.calendars.list); const [expended, setExpended] = useState(defaultExpanded); if (calendars.length === 0 && !showAddButton) return null; useEffect(() => setExpended(defaultExpanded), [defaultExpanded]); return ( } aria-controls={`${title}-content`} id={`${title}-header`} className="calendarListHeader" onClick={() => setExpended(!expended)} sx={{ "& .MuiAccordionSummary-content": { display: "flex", alignItems: "center", justifyContent: "space-between", }, }} > {title} {showAddButton && ( { expended && e.stopPropagation(); onAddClick && onAddClick(); }} > )} {calendars.map((id) => ( setOpen(id)} /> ))} ); } export default function CalendarSelection({ selectedCalendars, setSelectedCalendars, }: { selectedCalendars: string[]; setSelectedCalendars: Function; }) { const userId = useAppSelector((state) => state.user.userData?.openpaasId) ?? ""; const calendars = useAppSelector((state) => state.calendars.list); const personnalCalendars = Object.keys(calendars).filter( (id) => id.split("/")[0] === userId ); const delegatedCalendars = Object.keys(calendars).filter( (id) => id.split("/")[0] !== userId && calendars[id].delegated ); const sharedCalendars = Object.keys(calendars).filter( (id) => id.split("/")[0] !== userId && !calendars[id].delegated ); const handleCalendarToggle = (name: string) => { setSelectedCalendars((prev: string[]) => prev.includes(name) ? prev.filter((n) => n !== name) : [...prev, name] ); }; const [selectedCalId, setSelectedCalId] = useState(""); const [anchorElCal, setAnchorElCal] = useState(null); const [anchorElCalOthers, setAnchorElCalOthers] = useState(null); return ( <>
setAnchorElCal(document.body)} setOpen={(id: string) => { setAnchorElCal(document.body); setSelectedCalId(id); }} defaultExpanded /> { setAnchorElCal(document.body); setSelectedCalId(id); }} defaultExpanded={selectedCalendars.some((id) => delegatedCalendars.includes(id) )} /> { setAnchorElCalOthers(document.body); }} handleToggle={handleCalendarToggle} setOpen={(id: string) => { setAnchorElCal(document.body); setSelectedCalId(id); }} defaultExpanded={selectedCalendars.some((id) => sharedCalendars.includes(id) )} />
{ setSelectedCalId(""); setAnchorElCal(null); }} /> { setAnchorElCalOthers(null); if (newCalIds?.length) { newCalIds.forEach((id) => handleCalendarToggle(id)); } }} /> ); } function CalendarSelector({ calendars, id, isPersonnal, selectedCalendars, handleCalendarToggle, setOpen, }: { calendars: Record; id: string; isPersonnal: boolean; selectedCalendars: string[]; handleCalendarToggle: (name: string) => void; setOpen: Function; }) { const dispatch = useAppDispatch(); const calLink = useAppSelector((state) => state.calendars.list[id].link) ?? ""; const [anchorEl, setAnchorEl] = useState(null); const open = Boolean(anchorEl); const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }; const handleClose = () => { setAnchorEl(null); }; const [userId, calId] = id.split("/"); const isDefault = isPersonnal && userId === calId; const [deletePopupOpen, setDeletePopupOpen] = useState(false); const handleDeleteConfirm = () => { dispatch(removeCalendarAsync({ calId: id, calLink })); setDeletePopupOpen(false); handleClose(); }; const trimmedName = useMemo( () => trimLongTextWithoutSpace(calendars[id].name), [calendars, id] ); return ( <> { setOpen(); handleClose(); }} > Modify {!isDefault && } {!isDefault && ( setDeletePopupOpen(!deletePopupOpen)}> {isPersonnal ? "Delete" : "Remove"} )} ); }