import { useMemo } from 'react'; import { useLingui } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro'; import { CreditCardIcon, ExternalLinkIcon, MoreHorizontalIcon, SettingsIcon, UserIcon, } from 'lucide-react'; import { Link, useSearchParams } from 'react-router'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import { SUBSCRIPTION_STATUS_MAP } from '@documenso/lib/constants/billing'; import { ZUrlSearchParamsSchema } from '@documenso/lib/types/search-params'; import { trpc } from '@documenso/trpc/react'; import { Badge } from '@documenso/ui/primitives/badge'; 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 { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@documenso/ui/primitives/dropdown-menu'; import { Skeleton } from '@documenso/ui/primitives/skeleton'; import { TableCell } from '@documenso/ui/primitives/table'; type AdminOrganisationsTableOptions = { ownerUserId?: number; memberUserId?: number; showOwnerColumn?: boolean; hidePaginationUntilOverflow?: boolean; }; export const AdminOrganisationsTable = ({ ownerUserId, memberUserId, showOwnerColumn = true, hidePaginationUntilOverflow, }: AdminOrganisationsTableOptions) => { const { t, i18n } = useLingui(); const [searchParams] = useSearchParams(); const updateSearchParams = useUpdateSearchParams(); const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); const { data, isLoading, isLoadingError } = trpc.admin.organisation.find.useQuery({ query: parsedSearchParams.query, page: parsedSearchParams.page, perPage: parsedSearchParams.perPage, ownerUserId, memberUserId, }); const onPaginationChange = (page: number, perPage: number) => { updateSearchParams({ page, perPage, }); }; const results = data ?? { data: [], perPage: 10, currentPage: 1, totalPages: 1, }; const columns = useMemo(() => { return [ { header: t`Organisation`, accessorKey: 'name', cell: ({ row }) => ( {row.original.name} ), }, { header: t`Created At`, accessorKey: 'createdAt', cell: ({ row }) => i18n.date(row.original.createdAt), }, { header: t`Owner`, accessorKey: 'owner', cell: ({ row }) => ( {row.original.owner.name} ), }, { id: 'role', header: t`Role`, cell: ({ row }) => ( {row.original.owner.id === memberUserId ? t`Owner` : t`Member`} ), }, { id: 'billingStatus', header: t`Status`, cell: ({ row }) => { const subscription = row.original.subscription; const isPaid = subscription && subscription.status === 'ACTIVE'; return (
{isPaid ? t`Paid` : t`Free`}
); }, }, { header: t`Subscription`, cell: ({ row }) => row.original.subscription ? ( {SUBSCRIPTION_STATUS_MAP[row.original.subscription.status]} ) : ( 'None' ), }, { id: 'actions', cell: ({ row }) => ( Actions Manage View owner Stripe {!row.original.customerId &&  (N/A)} ), }, ] satisfies DataTableColumnDef<(typeof results)['data'][number]>[]; }, []); return (
), }} > {(table) => !hidePaginationUntilOverflow || 1 > table.getPageCount() ? ( ) : null }
); };