// Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 import React from "react"; import { createColumnHelper, flexRender, getCoreRowModel, useReactTable, Table } from "@tanstack/react-table"; import { FileInfo } from "@/bindings/fileservice"; import "./directorytable.less"; interface DirectoryTableProps { data: FileInfo[]; } const columnHelper = createColumnHelper(); const defaultColumns = [ columnHelper.accessor("path", { cell: (info) => info.getValue(), header: () => Name, }), columnHelper.accessor("size", { cell: (info) => info.getValue(), header: () => Size, }), columnHelper.accessor("mimetype", { cell: (info) => info.getValue(), header: () => Mimetype, }), ]; function DirectoryTable({ data }: DirectoryTableProps) { const [columns] = React.useState(() => [...defaultColumns]); const table = useReactTable({ data, columns, columnResizeMode: "onChange", getCoreRowModel: getCoreRowModel(), }); const columnSizeVars = React.useMemo(() => { const headers = table.getFlatHeaders(); const colSizes: { [key: string]: number } = {}; for (let i = 0; i < headers.length; i++) { const header = headers[i]!; colSizes[`--header-${header.id}-size`] = header.getSize(); colSizes[`--col-${header.column.id}-size`] = header.column.getSize(); } return colSizes; }, [table.getState().columnSizingInfo]); return (
{table.getHeaderGroups().map((headerGroup) => (
{headerGroup.headers.map((header) => (
{header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}
))}
))}
{table.getState().columnSizingInfo.isResizingColumn ? ( ) : ( )}
); } function TableBody({ table }: { table: Table }) { return (
{table.getRowModel().rows.map((row) => (
{row.getVisibleCells().map((cell) => (
{cell.renderValue()}
))}
))}
); } const MemoizedTableBody = React.memo( TableBody, (prev, next) => prev.table.options.data == next.table.options.data ) as typeof TableBody; export { DirectoryTable };