diff --git a/web/src/components/pagination.tsx b/web/src/components/pagination.tsx index 668e2ae..644830e 100644 --- a/web/src/components/pagination.tsx +++ b/web/src/components/pagination.tsx @@ -24,7 +24,7 @@ import { DoubleArrowRightIcon, } from '@radix-ui/react-icons' import { Button } from '@/components/ui/button' -import { Input } from "@/components/ui/input"; +import { Input } from "@/components/ui/input" import { Select, SelectContent, @@ -34,15 +34,15 @@ import { } from '@/components/ui/select' import { useTranslation } from 'react-i18next' import { showNumbers } from '@/lib/utils' -import { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react' interface PaginationProps { totalItems: number - pageIndex: number, - pageSize: number, - hasNextPage: () => boolean, - setPageIndex: (pageIndex: number) => void, - setPageSize: (pageSize: number) => void, + pageIndex: number + pageSize: number + hasNextPage: () => boolean + setPageIndex: (pageIndex: number) => void + setPageSize: (pageSize: number) => void } export function EnvelopeListPagination({ @@ -54,7 +54,7 @@ export function EnvelopeListPagination({ setPageSize, }: PaginationProps) { const { t } = useTranslation() - const [pageInput, setPageInput] = useState(pageIndex + 1); + const [pageInput, setPageInput] = useState(pageIndex + 1) const pageCount = Math.ceil(totalItems / pageSize) useEffect(() => { @@ -76,7 +76,7 @@ export function EnvelopeListPagination({ setPageIndex(newPageIndex) } - const currentPage = pageIndex + 1; + const currentPage = pageIndex + 1 const pageNumbers = showNumbers(currentPage, pageCount) return ( @@ -106,9 +106,9 @@ export function EnvelopeListPagination({
{t("table.page")} { - if (Number.isNaN(pageInput)) return; - if (pageInput > 0) setPageIndex(pageInput - 1); - else setPageIndex(0); + if (Number.isNaN(pageInput)) return + if (pageInput > 0) setPageIndex(pageInput - 1) + else setPageIndex(0) }} onChange={(e) => setPageInput(Number(e.target.value))} className='mx-2 w-20' @@ -170,4 +170,4 @@ export function EnvelopeListPagination({
) -} \ No newline at end of file +} diff --git a/web/src/features/search/columns-dialog.tsx b/web/src/features/search/columns-dialog.tsx index 077700d..3545576 100755 --- a/web/src/features/search/columns-dialog.tsx +++ b/web/src/features/search/columns-dialog.tsx @@ -17,13 +17,13 @@ // along with this program. If not, see . import { useTranslation } from 'react-i18next' -import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { SquarePen } from 'lucide-react' import { Button } from '@/components/button' import { Checkbox } from '@/components/ui/checkbox' import { useState } from 'react' -import { useSearchContext } from './context'; -import { Label } from '@/components/ui/label'; +import { useSearchContext } from './context' +import { Label } from '@/components/ui/label' interface Props { open: boolean @@ -71,19 +71,19 @@ export function ColumnsDialog({ open, onOpenChange }: Props) { const columns = defaultColumns(t) const [selected, setSelected] = useState(() => { - const _columns = localStorage.getItem("searchTableColumns") + const _columns = localStorage.getItem("searchTableColumns") ? JSON.parse(localStorage.getItem("searchTableColumns") as string) as Record - : undefined; + : undefined - if (_columns) return new Map(Object.entries(_columns).map(([key, value]) => [key, value])); + if (_columns) return new Map(Object.entries(_columns).map(([key, value]) => [key, value])) return new Map(columns.map((col) => [col.value, true])) }) const handleSave = () => { - const _selected = Object.fromEntries(selected); + const _selected = Object.fromEntries(selected) setColumnVisibility(_selected) - localStorage.setItem("searchTableColumns", JSON.stringify(_selected)); - onOpenChange(false); + localStorage.setItem("searchTableColumns", JSON.stringify(_selected)) + onOpenChange(false) } const toggleSelected = (column: string) => { @@ -96,49 +96,48 @@ export function ColumnsDialog({ open, onOpenChange }: Props) { value.set(column, true) } - return value; - }); + return value + }) } - return ( - - - - - - {t('common.columns')} - - + return ( + + + + + + {t('common.columns')} + + -
-
- {columns.map(col => ( -
- toggleSelected(col.value)} - /> - -
- ))} -
-
+
+
+ {columns.map(col => ( +
+ toggleSelected(col.value)} + /> + +
+ ))} +
+
-
-   -
- - -
-
-
-
- ); +
+
+ + +
+
+
+
+ ) } diff --git a/web/src/features/search/mail-list-table.tsx b/web/src/features/search/mail-list-table.tsx index 5bfbcfc..c8dbb74 100755 --- a/web/src/features/search/mail-list-table.tsx +++ b/web/src/features/search/mail-list-table.tsx @@ -32,7 +32,7 @@ import LongText from "@/components/long-text" import { DataTableColumnHeader } from "./table/data-table-column-header" import { SearchTable } from "./table/table" import { DataTableRowActions } from "./table/data-table-row-actions" -import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' interface MailListProps { items: EmailEnvelope[] @@ -51,7 +51,7 @@ export function MailListTable({ }: MailListProps) { const { t, i18n } = useTranslation() - const locale = dateFnsLocaleMap[i18n.language.toLowerCase()] ?? enUS; + const locale = dateFnsLocaleMap[i18n.language.toLowerCase()] ?? enUS const { selected, setSelected } = useSearchContext() const columns: ColumnDef[] = [ @@ -141,8 +141,8 @@ export function MailListTable({ ), cell: ({ row }) => { - const date = new Date(row.original.date); - const title = format(date, 'yyyy-MM-dd HH:mm:ss'); + const date = new Date(row.original.date) + const title = format(date, 'yyyy-MM-dd HH:mm:ss') return ( @@ -167,46 +167,43 @@ export function MailListTable({ ] const handleToggleAll = () => { - const total = Array.from(selected.values()) - .reduce((sum, set) => sum + set.size, 0); + const total = Array.from(selected.values()).reduce((sum, set) => sum + set.size, 0) - if (total === items.length && items.length > 0) { - setSelected(new Map()); - } else { - setSelected(prev => { - const next = new Map(prev); - for (const item of items) { - const set = new Set(next.get(item.account_id) || []); - set.add(item.id); - next.set(item.account_id, set); - } - return next; - }); - } + if (total === items.length && items.length > 0) { + setSelected(new Map()) + } else { + setSelected(prev => { + const next = new Map(prev) + for (const item of items) { + const set = new Set(next.get(item.account_id) || []) + set.add(item.id) + next.set(item.account_id, set) + } + return next + }) + } } const toggleSelected = (accountId: number, mailId: number) => { - setSelected(prev => { - const next = new Map(prev); - const set = new Set(next.get(accountId) || []); + setSelected(prev => { + const next = new Map(prev) + const set = new Set(next.get(accountId) || []) - if (set.has(mailId)) { - set.delete(mailId); - if (set.size === 0) next.delete(accountId); - else next.set(accountId, set); - } else { - set.add(mailId); - next.set(accountId, set); - } - - return next; - }); + if (set.has(mailId)) { + set.delete(mailId) + if (set.size === 0) next.delete(accountId) + else next.set(accountId, set) + } else { + set.add(mailId) + next.set(accountId, set) + } + return next + }) } - const totalSelected = Array.from(selected.values()) - .reduce((sum, set) => sum + set.size, 0); + const totalSelected = Array.from(selected.values()).reduce((sum, set) => sum + set.size, 0) - const hasSelected = (accountId: number, mailId: number) => selected.get(accountId)?.has(mailId) ?? false; + const hasSelected = (accountId: number, mailId: number) => selected.get(accountId)?.has(mailId) ?? false if (isLoading) { return ( diff --git a/web/src/features/search/table/data-table-row-actions.tsx b/web/src/features/search/table/data-table-row-actions.tsx index f4c1531..728a95f 100755 --- a/web/src/features/search/table/data-table-row-actions.tsx +++ b/web/src/features/search/table/data-table-row-actions.tsx @@ -42,24 +42,23 @@ export function DataTableRowActions({ row }: DataTableRowActionsProps) { const toggleToDelete = (accountId: number, mailId: number) => { setToDelete(prev => { - const next = new Map(prev); - const set = new Set(next.get(accountId) || []); + const next = new Map(prev) + const set = new Set(next.get(accountId) || []) if (set.has(mailId)) { - set.delete(mailId); - if (set.size === 0) next.delete(accountId); - else next.set(accountId, set); + set.delete(mailId) + if (set.size === 0) next.delete(accountId) + else next.set(accountId, set) } else { - set.add(mailId); - next.set(accountId, set); + set.add(mailId) + next.set(accountId, set) } - - return next; - }); - }; + return next + }) + } const handleDelete = (envelope: EmailEnvelope) => { - setToDelete(new Map()); + setToDelete(new Map()) toggleToDelete(envelope.account_id, envelope.id) setOpen("delete") } @@ -79,9 +78,9 @@ export function DataTableRowActions({ row }: DataTableRowActionsProps) { { - e.stopPropagation(); - setCurrentEnvelope(row.original); - setOpen("edit-tags"); + e.stopPropagation() + setCurrentEnvelope(row.original) + setOpen("edit-tags") }} > {t('search.editTag')} @@ -92,9 +91,9 @@ export function DataTableRowActions({ row }: DataTableRowActionsProps) { { - e.stopPropagation(); - setCurrentEnvelope(row.original); - setOpen("restore"); + e.stopPropagation() + setCurrentEnvelope(row.original) + setOpen("restore") }} > {t('restore_message.restore_to_imap', 'Restore Mail')} @@ -105,10 +104,8 @@ export function DataTableRowActions({ row }: DataTableRowActionsProps) { { - e.stopPropagation(); - handleDelete(row.original); - //setCurrentRow(row.original) - //setOpen('delete') + e.stopPropagation() + handleDelete(row.original) }} className='!text-red-500' > diff --git a/web/src/features/search/table/table.tsx b/web/src/features/search/table/table.tsx index 945ecf1..c10b26f 100755 --- a/web/src/features/search/table/table.tsx +++ b/web/src/features/search/table/table.tsx @@ -54,7 +54,7 @@ declare module '@tanstack/react-table' { interface DataTableProps { columns: ColumnDef[] data: EmailEnvelope[] - onRowClick: (e: ReactMouseEvent, row: Row) => void; + onRowClick: (e: ReactMouseEvent, row: Row) => void setSortBy: (sortBy: "DATE" | "SIZE") => void setSortOrder: (value: "desc" | "asc") => void } @@ -66,9 +66,9 @@ export function SearchTable({ columns, data, onRowClick, setSortBy, setSortOrder const [columnFilters, setColumnFilters] = useState([]) useEffect(() => { - const [value] = sorting; - setSortBy(value.id.toUpperCase() as "DATE" | "SIZE"); - setSortOrder(value.desc ? "desc" : "asc"); + const [value] = sorting + setSortBy(value.id.toUpperCase() as "DATE" | "SIZE") + setSortOrder(value.desc ? "desc" : "asc") }, [sorting]) const table = useReactTable({