chore: review

This commit is contained in:
Ephraim Atta-Duncan
2025-08-20 16:22:15 +00:00
parent 2de0452839
commit 152bce5a21
4 changed files with 11 additions and 8 deletions

View File

@ -3,10 +3,11 @@ import { useEffect, useMemo, useState, useTransition } from 'react';
import { msg } from '@lingui/core/macro'; import { msg } from '@lingui/core/macro';
import { useLingui } from '@lingui/react'; import { useLingui } from '@lingui/react';
import { ChevronDownIcon, ChevronUpIcon, ChevronsUpDown, Loader } from 'lucide-react'; import { ChevronDownIcon, ChevronUpIcon, ChevronsUpDown, Loader } from 'lucide-react';
import { Link, useSearchParams } from 'react-router'; import { Link } from 'react-router';
import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value'; import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value';
import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params';
import type { DateRange } from '@documenso/lib/types/search-params';
import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table'; import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table';
import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTable } from '@documenso/ui/primitives/data-table';
import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination';
@ -31,6 +32,7 @@ type OrganisationOverviewTableProps = {
page: number; page: number;
sortBy: 'name' | 'createdAt' | 'signingVolume'; sortBy: 'name' | 'createdAt' | 'signingVolume';
sortOrder: 'asc' | 'desc'; sortOrder: 'asc' | 'desc';
dateRange: DateRange;
}; };
export const AdminOrganisationOverviewTable = ({ export const AdminOrganisationOverviewTable = ({
@ -40,11 +42,11 @@ export const AdminOrganisationOverviewTable = ({
page, page,
sortBy, sortBy,
sortOrder, sortOrder,
dateRange,
}: OrganisationOverviewTableProps) => { }: OrganisationOverviewTableProps) => {
const { _, i18n } = useLingui(); const { _, i18n } = useLingui();
const [isPending, startTransition] = useTransition(); const [isPending, startTransition] = useTransition();
const [searchParams] = useSearchParams();
const updateSearchParams = useUpdateSearchParams(); const updateSearchParams = useUpdateSearchParams();
const [searchString, setSearchString] = useState(''); const [searchString, setSearchString] = useState('');
const debouncedSearchString = useDebouncedValue(searchString, 1000); const debouncedSearchString = useDebouncedValue(searchString, 1000);
@ -75,7 +77,7 @@ export const AdminOrganisationOverviewTable = ({
<div> <div>
<Link <Link
className="text-primary underline" className="text-primary underline"
to={`/admin/organisation-insights/${row.original.id}?dateRange=${searchParams.get('dateRange') || 'last30days'}`} to={`/admin/organisation-insights/${row.original.id}?dateRange=${dateRange}`}
> >
{row.getValue('name')} {row.getValue('name')}
</Link> </Link>
@ -147,7 +149,7 @@ export const AdminOrganisationOverviewTable = ({
size: 120, size: 120,
}, },
] satisfies DataTableColumnDef<OrganisationOverview>[]; ] satisfies DataTableColumnDef<OrganisationOverview>[];
}, [sortOrder, sortBy]); }, [sortOrder, sortBy, dateRange]);
useEffect(() => { useEffect(() => {
startTransition(() => { startTransition(() => {

View File

@ -108,7 +108,7 @@ export const OrganisationInsightsTable = ({
size: 180, size: 180,
}, },
{ {
header: () => <span className="whitespace-nowrap">{_(msg`Documents Signed`)}</span>, header: () => <span className="whitespace-nowrap">{_(msg`Documents Completed`)}</span>,
accessorKey: 'signedDocumentCount', accessorKey: 'signedDocumentCount',
cell: ({ row }) => Number(row.getValue('signedDocumentCount')), cell: ({ row }) => Number(row.getValue('signedDocumentCount')),
size: 180, size: 180,
@ -223,7 +223,7 @@ export const OrganisationInsightsTable = ({
<SummaryCard icon={Users} title={_(msg`Members`)} value={insights.summary.totalMembers} /> <SummaryCard icon={Users} title={_(msg`Members`)} value={insights.summary.totalMembers} />
<SummaryCard <SummaryCard
icon={TrendingUp} icon={TrendingUp}
title={_(msg`Completed Documents`)} title={_(msg`Documents Completed`)}
value={insights.summary.volumeThisPeriod} value={insights.summary.volumeThisPeriod}
/> />
</div> </div>

View File

@ -83,6 +83,7 @@ export default function Organisations({ loaderData }: Route.ComponentProps) {
perPage={perPage} perPage={perPage}
sortBy={sortBy} sortBy={sortBy}
sortOrder={sortOrder} sortOrder={sortOrder}
dateRange={dateRange}
/> />
</div> </div>
</div> </div>

View File

@ -191,8 +191,8 @@ async function getUserInsights(
: sql<number>`COUNT(DISTINCT CASE WHEN td.id IS NOT NULL THEN d.id END)` : sql<number>`COUNT(DISTINCT CASE WHEN td.id IS NOT NULL THEN d.id END)`
).as('documentCount'), ).as('documentCount'),
(createdAtFrom (createdAtFrom
? sql<number>`COUNT(DISTINCT CASE WHEN r.id IS NOT NULL AND ts.id IS NOT NULL AND r."signedAt" >= ${createdAtFrom} AND r.role = 'SIGNER'::"RecipientRole" THEN r.id END)` ? sql<number>`COUNT(DISTINCT CASE WHEN d.id IS NOT NULL AND td.id IS NOT NULL AND d.status = 'COMPLETED' AND d."createdAt" >= ${createdAtFrom} THEN d.id END)`
: sql<number>`COUNT(DISTINCT CASE WHEN ts.id IS NOT NULL AND r.role = 'SIGNER'::"RecipientRole" THEN r.id END)` : sql<number>`COUNT(DISTINCT CASE WHEN d.id IS NOT NULL AND td.id IS NOT NULL AND d.status = 'COMPLETED' THEN d.id END)`
).as('signedDocumentCount'), ).as('signedDocumentCount'),
]) ])
.groupBy(['u.id', 'u.name', 'u.email', 'u.createdAt']) .groupBy(['u.id', 'u.name', 'u.email', 'u.createdAt'])