import { IconDotsVertical, IconEdit, IconLock, IconPower, IconShield, IconTrash } from "@tabler/icons-react"; import { createColumnHelper, getCoreRowModel, useReactTable } from "@tanstack/react-table"; import { useMemo } from "react"; import type { User } from "src/api/backend"; import { EmailFormatter, EnabledFormatter, GravatarFormatter, RolesFormatter, ValueWithDateFormatter, } from "src/components"; import { TableLayout } from "src/components/Table/TableLayout"; import { intl } from "src/locale"; import Empty from "./Empty"; interface Props { data: User[]; isFiltered?: boolean; isFetching?: boolean; currentUserId?: number; onEditUser?: (id: number) => void; onEditPermissions?: (id: number) => void; onSetPassword?: (id: number) => void; onDeleteUser?: (id: number) => void; onDisableToggle?: (id: number, enabled: boolean) => void; onNewUser?: () => void; } export default function Table({ data, isFiltered, isFetching, currentUserId, onEditUser, onEditPermissions, onSetPassword, onDeleteUser, onDisableToggle, onNewUser, }: Props) { const columnHelper = createColumnHelper(); const columns = useMemo( () => [ columnHelper.accessor((row: any) => row, { id: "avatar", cell: (info: any) => { const value = info.getValue(); return ; }, meta: { className: "w-1", }, }), columnHelper.accessor((row: any) => row, { id: "name", header: intl.formatMessage({ id: "column.name" }), cell: (info: any) => { const value = info.getValue(); // Hack to reuse domains formatter return ( ); }, }), columnHelper.accessor((row: any) => row.email, { id: "email", header: intl.formatMessage({ id: "column.email" }), cell: (info: any) => { return ; }, }), columnHelper.accessor((row: any) => row.roles, { id: "roles", header: intl.formatMessage({ id: "column.roles" }), cell: (info: any) => { return ; }, }), columnHelper.accessor((row: any) => row.isDisabled, { id: "isDisabled", header: intl.formatMessage({ id: "column.status" }), cell: (info: any) => { return ; }, }), columnHelper.display({ id: "id", // todo: not needed for a display? cell: (info: any) => { return (
{intl.formatMessage( { id: "users.actions-title", }, { id: info.row.original.id }, )} { e.preventDefault(); onEditUser?.(info.row.original.id); }} > {intl.formatMessage({ id: "user.edit" })} {currentUserId !== info.row.original.id ? ( <> { e.preventDefault(); onEditPermissions?.(info.row.original.id); }} > {intl.formatMessage({ id: "action.permissions" })} { e.preventDefault(); onSetPassword?.(info.row.original.id); }} > {intl.formatMessage({ id: "user.set-password" })} { e.preventDefault(); onDisableToggle?.(info.row.original.id, info.row.original.isDisabled); }} > {intl.formatMessage({ id: info.row.original.isDisabled ? "action.enable" : "action.disable", })} ); }, meta: { className: "text-end w-1", }, }), ], [columnHelper, currentUserId, onEditUser, onDisableToggle, onDeleteUser, onEditPermissions, onSetPassword], ); const tableInstance = useReactTable({ columns, data, getCoreRowModel: getCoreRowModel(), rowCount: data.length, meta: { isFetching, }, enableSortingRemoval: false, }); return ( } /> ); }