import { useState } from 'react'; import { IoAdd, IoDocumentOutline, IoDownloadOutline, IoDuplicateOutline, IoEllipsisHorizontal, IoPencilOutline, IoTrash, } from 'react-icons/io5'; import { useDisclosure } from '@mantine/hooks'; import { downloadAsExcel } from '../../../../common/api/excel'; import { maybeAxiosError } from '../../../../common/api/utils'; import Button from '../../../../common/components/buttons/Button'; import IconButton from '../../../../common/components/buttons/IconButton'; import Dialog from '../../../../common/components/dialog/Dialog'; import { DropdownMenu } from '../../../../common/components/dropdown-menu/DropdownMenu'; import Tag from '../../../../common/components/tag/Tag'; import { useMutateProjectRundowns, useProjectRundowns } from '../../../../common/hooks-query/useProjectRundowns'; import { cx } from '../../../../common/utils/styleUtils'; import * as Panel from '../../panel-utils/PanelUtils'; import RundownRenameForm from './composite/RundownRenameForm'; import { ManageRundownForm } from './ManageRundownForm'; import style from './ManagePanel.module.scss'; export default function ManageRundowns() { const { data } = useProjectRundowns(); const { duplicate, remove, load, rename } = useMutateProjectRundowns(); const [isOpenDelete, deleteHandlers] = useDisclosure(); const [isOpenLoad, loadHandlers] = useDisclosure(); const [isNewLoad, newHandlers] = useDisclosure(); const [targetRundown, setTargetRundown] = useState(''); const [renamingRundown, setRenamingRundown] = useState(null); const [actionError, setActionError] = useState(null); const openLoad = (id: string) => { setActionError(null); setTargetRundown(id); loadHandlers.open(); }; const openDelete = (id: string) => { setActionError(null); setTargetRundown(id); deleteHandlers.open(); }; const openRename = (id: string) => { setActionError(null); setRenamingRundown(id); }; const submitRundownLoad = async () => { try { await load(targetRundown); } catch (error) { setActionError(`Failed to load rundown. ${maybeAxiosError(error)}`); } finally { loadHandlers.close(); } }; const submitRundownDuplicate = async (id: string) => { setActionError(null); setRenamingRundown(null); setTargetRundown(''); try { await duplicate(id); } catch (error) { setActionError(`Failed to duplicate rundown. ${maybeAxiosError(error)}`); } }; const submitRundownRename = async (id: string, newTitle: string) => { try { await rename([id, newTitle]); setRenamingRundown(null); } catch (error) { setActionError(`Failed to rename rundown. ${maybeAxiosError(error)}`); } }; const submitRundownDelete = async () => { try { await remove(targetRundown); } catch (error) { setActionError(`Failed to delete rundown. ${maybeAxiosError(error)}`); } finally { deleteHandlers.close(); } }; const handleDownloadXlsx = async (rundownId: string, title: string) => { await downloadAsExcel(rundownId, title); }; return ( <> Manage project rundowns {isNewLoad && } {actionError && {actionError}} # Entries Title {data?.rundowns?.map(({ id, numEntries, title }) => { const isLoaded = data.loaded === id; const isRenaming = renamingRundown === id; if (isRenaming) { return ( setRenamingRundown(null)} onSubmit={(newTitle: string) => submitRundownRename(id, newTitle)} initialTitle={title} /> ); } return ( {numEntries} {title} {isLoaded && Loaded} } items={[ { type: 'item', icon: IoPencilOutline, label: 'Rename', onClick: () => openRename(id), }, { type: 'item', icon: IoDownloadOutline, label: 'Load', onClick: () => openLoad(id), disabled: isLoaded, }, { type: 'item', icon: IoDocumentOutline, label: 'Download .xlsx', onClick: () => handleDownloadXlsx(id, title), }, { type: 'item', icon: IoDuplicateOutline, label: 'Duplicate', onClick: () => submitRundownDuplicate(id), }, { type: 'divider' }, { type: 'destructive', icon: IoTrash, label: 'Delete', onClick: () => openDelete(id), disabled: isLoaded, }, ]} > ); })} You will lose all data in your rundown.
Are you sure? } footerElements={ <> } /> The current playback will be stopped.
Are you sure? } footerElements={ <> } /> ); }