import { useTransition } from 'react'; import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Archive, Building2, Loader, TrendingUp, Users } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import type { OrganisationDetailedInsights } from '@documenso/lib/server-only/admin/get-organisation-detailed-insights'; import { Button } from '@documenso/ui/primitives/button'; import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; import { DateRangeFilter } from '~/components/filters/date-range-filter'; type OrganisationInsightsTableProps = { insights: OrganisationDetailedInsights; page: number; perPage: number; dateRange: string; view: 'teams' | 'users' | 'documents'; }; export const OrganisationInsightsTable = ({ insights, page, perPage, dateRange, view, }: OrganisationInsightsTableProps) => { const { _, i18n } = useLingui(); const [isPending, startTransition] = useTransition(); const updateSearchParams = useUpdateSearchParams(); const onPaginationChange = (newPage: number, newPerPage: number) => { startTransition(() => { updateSearchParams({ page: newPage, perPage: newPerPage, }); }); }; const handleViewChange = (newView: 'teams' | 'users' | 'documents') => { startTransition(() => { updateSearchParams({ view: newView, page: 1, }); }); }; const teamsColumns = [ { header: _(msg`Team Name`), accessorKey: 'name', cell: ({ row }) => row.getValue('name'), }, { header: _(msg`Members`), accessorKey: 'memberCount', cell: ({ row }) => row.getValue('memberCount'), }, { header: _(msg`Documents`), accessorKey: 'documentCount', cell: ({ row }) => row.getValue('documentCount'), }, { header: _(msg`Created`), accessorKey: 'createdAt', cell: ({ row }) => i18n.date(row.getValue('createdAt')), }, ] satisfies DataTableColumnDef<(typeof insights.teams)[number]>[]; const usersColumns = [ { header: _(msg`Name`), accessorKey: 'name', cell: ({ row }) => row.getValue('name') || row.getValue('email'), }, { header: _(msg`Email`), accessorKey: 'email', cell: ({ row }) => row.getValue('email'), }, { header: _(msg`Documents Created`), accessorKey: 'documentCount', cell: ({ row }) => row.getValue('documentCount'), }, { header: _(msg`Documents Signed`), accessorKey: 'signedDocumentCount', cell: ({ row }) => row.getValue('signedDocumentCount'), }, { header: _(msg`Joined`), accessorKey: 'createdAt', cell: ({ row }) => i18n.date(row.getValue('createdAt')), }, ] satisfies DataTableColumnDef<(typeof insights.users)[number]>[]; const documentsColumns = [ { header: _(msg`Title`), accessorKey: 'title', cell: ({ row }) => row.getValue('title'), }, { header: _(msg`Status`), accessorKey: 'status', cell: ({ row }) => row.getValue('status'), }, { header: _(msg`Team`), accessorKey: 'teamName', cell: ({ row }) => row.getValue('teamName'), }, { header: _(msg`Created`), accessorKey: 'createdAt', cell: ({ row }) => i18n.date(row.getValue('createdAt')), }, { header: _(msg`Completed`), accessorKey: 'completedAt', cell: ({ row }) => { const completedAt = row.getValue('completedAt') as Date | null; return completedAt ? i18n.date(completedAt) : '-'; }, }, ] satisfies DataTableColumnDef<(typeof insights.documents)[number]>[]; const getCurrentData = (): unknown[] => { switch (view) { case 'teams': return insights.teams; case 'users': return insights.users; case 'documents': return insights.documents; default: return []; } }; const getCurrentColumns = (): DataTableColumnDef[] => { switch (view) { case 'teams': return teamsColumns as unknown as DataTableColumnDef[]; case 'users': return usersColumns as unknown as DataTableColumnDef[]; case 'documents': return documentsColumns as unknown as DataTableColumnDef[]; default: return []; } }; const SummaryCard = ({ icon: Icon, title, value, subtitle, }: { icon: React.ComponentType<{ className?: string }>; title: string; value: number; subtitle?: string; }) => (

{title}

{value}

{subtitle &&

{subtitle}

}
); return (
{insights.summary && (
)}
columns={getCurrentColumns()} data={getCurrentData()} perPage={perPage} currentPage={page} totalPages={insights.totalPages} onPaginationChange={onPaginationChange} > {(table) => } {isPending && (
)}
); };