mirror of
https://github.com/documenso/documenso.git
synced 2025-11-20 11:41:44 +10:00
chore: review
This commit is contained in:
@ -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(() => {
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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'])
|
||||||
|
|||||||
Reference in New Issue
Block a user