import { Table, TableBody, TableCell, TableHead, TableRow, } from '@affine/component'; import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { ArrowDownBigIcon, ArrowUpBigIcon } from '@blocksuite/icons'; import { useMediaQuery, useTheme } from '@mui/material'; import type { CSSProperties } from 'react'; import { AllPagesBody } from './all-pages-body'; import { NewPageButton } from './components/new-page-buttton'; import { TitleCell } from './components/title-cell'; import { AllPageListMobileView, TrashListMobileView } from './mobile'; import { TrashOperationCell } from './operation-cell'; import { StyledTableContainer, StyledTableRow } from './styles'; import type { ListData } from './type'; import { useSorter } from './use-sorter'; export type PageListProps = { isPublicWorkspace?: boolean; list: ListData[]; onCreateNewPage: () => void; onCreateNewEdgeless: () => void; }; const AllPagesHead = ({ isPublicWorkspace, sorter, createNewPage, createNewEdgeless, }: { isPublicWorkspace: boolean; sorter: ReturnType>; createNewPage: () => void; createNewEdgeless: () => void; }) => { const t = useAFFiNEI18N(); const titleList = [ { key: 'title', content: t['Title'](), proportion: 0.5, }, { key: 'createDate', content: t['Created'](), proportion: 0.2, }, { key: 'updatedDate', content: t['Updated'](), proportion: 0.2, }, { key: 'unsortable_action', content: ( ), showWhen: () => !isPublicWorkspace, sortable: false, styles: { justifyContent: 'flex-end', } satisfies CSSProperties, }, ]; return ( {titleList .filter(({ showWhen = () => true }) => showWhen()) .map(({ key, content, proportion, sortable = true, styles }) => ( sorter.shiftOrder(key as keyof ListData) : undefined } >
{content} {sorter.key === key && (sorter.order === 'asc' ? ( ) : ( ))}
))}
); }; export const PageList = ({ isPublicWorkspace = false, list, onCreateNewPage, onCreateNewEdgeless, }: PageListProps) => { const sorter = useSorter({ data: list, key: 'updatedDate', order: 'desc', }); const theme = useTheme(); const isSmallDevices = useMediaQuery(theme.breakpoints.down('sm')); if (isSmallDevices) { return ( ); } return (
); }; const TrashListHead = () => { const t = useAFFiNEI18N(); return ( {t['Title']()} {t['Created']()} {t['Moved to Trash']()} ); }; export type TrashListData = { pageId: string; icon: JSX.Element; title: string; createDate: string; updatedDate?: string; trashDate?: string; // isPublic: boolean; onClickPage: () => void; onRestorePage: () => void; onPermanentlyDeletePage: () => void; }; export const PageListTrashView: React.FC<{ list: TrashListData[]; }> = ({ list }) => { const t = useAFFiNEI18N(); const theme = useTheme(); const isSmallDevices = useMediaQuery(theme.breakpoints.down('sm')); if (isSmallDevices) { const mobileList = list.map(({ pageId, icon, title, onClickPage }) => ({ title, icon, pageId, onClickPage, })); return ; } const ListItems = list.map( ( { pageId, title, icon, createDate, trashDate, onClickPage, onPermanentlyDeletePage, onRestorePage, }, index ) => { return ( {createDate} {trashDate} ); } ); return ( {ListItems}
); };