diff --git a/apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx b/apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx index 7e1a30651..978f6a7b9 100644 --- a/apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx +++ b/apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx @@ -25,6 +25,8 @@ type LeaderboardTableProps = { totalPages: number; perPage: number; page: number; + sortBy: 'name' | 'createdAt' | 'signingVolume'; + sortOrder: 'asc' | 'desc'; }; export const LeaderboardTable = ({ @@ -32,6 +34,8 @@ export const LeaderboardTable = ({ totalPages, perPage, page, + sortBy, + sortOrder, }: LeaderboardTableProps) => { const { _ } = useLingui(); @@ -49,10 +53,10 @@ export const LeaderboardTable = ({ size: 10, }, { - header: ({ column }) => ( + header: () => (
column.toggleSorting(column.getIsSorted() === 'asc')} + onClick={() => handleColumnSort('name', sortOrder)} > {_(msg`Name`)} @@ -63,10 +67,10 @@ export const LeaderboardTable = ({ size: 250, }, { - header: ({ column }) => ( + header: () => (
column.toggleSorting(column.getIsSorted() === 'asc')} + onClick={() => handleColumnSort('signingVolume', sortOrder)} > {_(msg`Signing Volume`)} @@ -76,11 +80,11 @@ export const LeaderboardTable = ({ cell: ({ row }) =>
{Number(row.getValue('signingVolume'))}
, }, { - header: ({ column }) => { + header: () => { return (
column.toggleSorting(column.getIsSorted() === 'asc')} + onClick={() => handleColumnSort('createdAt', sortOrder)} > {_(msg`Created`)} @@ -91,7 +95,7 @@ export const LeaderboardTable = ({ cell: ({ row }) =>
{row.original.createdAt.toLocaleDateString()}
, }, ] satisfies DataTableColumnDef[]; - }, []); + }, [sortOrder]); useEffect(() => { startTransition(() => { @@ -117,6 +121,18 @@ export const LeaderboardTable = ({ setSearchString(e.target.value); }; + const handleColumnSort = ( + column: 'name' | 'createdAt' | 'signingVolume', + sortOrder: 'asc' | 'desc', + ) => { + startTransition(() => { + updateSearchParams({ + sortBy: sortBy === column, + sortOrder: sortOrder === 'asc' ? 'desc' : 'asc', + }); + }); + }; + return (
@@ -42,6 +51,8 @@ export default async function Leaderboard({ searchParams = {} }: AdminLeaderboar totalPages={totalPages} page={page} perPage={perPage} + sortBy={sortBy} + sortOrder={sortOrder} />
diff --git a/packages/lib/server-only/admin/get-signing-volume.ts b/packages/lib/server-only/admin/get-signing-volume.ts index f1d5dcd8e..0892075cd 100644 --- a/packages/lib/server-only/admin/get-signing-volume.ts +++ b/packages/lib/server-only/admin/get-signing-volume.ts @@ -12,12 +12,16 @@ export type GetSigningVolumeOptions = { search?: string; page?: number; perPage?: number; + sortBy?: 'name' | 'createdAt' | 'signingVolume'; + sortOrder?: 'asc' | 'desc'; }; export async function getSigningVolume({ search = '', page = 1, perPage = 10, + sortBy = 'signingVolume', + sortOrder = 'desc', }: GetSigningVolumeOptions) { const whereClause = Prisma.validator()({ status: 'ACTIVE', @@ -38,6 +42,8 @@ export async function getSigningVolume({ ], }); + const orderBy = getOrderByClause({ sortBy, sortOrder }); + const [subscriptions, totalCount] = await Promise.all([ prisma.subscription.findMany({ where: whereClause, @@ -76,15 +82,7 @@ export async function getSigningVolume({ }, }, }, - orderBy: [ - { - User: { - Document: { - _count: 'desc', - }, - }, - }, - ], + orderBy, skip: Math.max(page - 1, 0) * perPage, take: perPage, }), @@ -112,3 +110,34 @@ export async function getSigningVolume({ totalPages: Math.ceil(totalCount / perPage), }; } + +type GetOrderByClauseOptions = { + sortBy: string; + sortOrder: 'asc' | 'desc'; +}; + +const getOrderByClause = ({ sortBy, sortOrder }: GetOrderByClauseOptions) => { + switch (sortBy) { + case 'name': + return [{ User: { name: sortOrder } }, { team: { name: sortOrder } }]; + case 'createdAt': + return { createdAt: sortOrder }; + default: + return [ + { + User: { + Document: { + _count: sortOrder, + }, + }, + }, + { + team: { + document: { + _count: sortOrder, + }, + }, + }, + ]; + } +}; diff --git a/packages/lib/translations/de/web.po b/packages/lib/translations/de/web.po index c5f58b996..8da616ec6 100644 --- a/packages/lib/translations/de/web.po +++ b/packages/lib/translations/de/web.po @@ -961,7 +961,7 @@ msgid "Create your account and start using state-of-the-art document signing. Op msgstr "" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:85 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:89 #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:54 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:65 @@ -1989,7 +1989,7 @@ msgid "My templates" msgstr "" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:148 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:57 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:61 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:99 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144 @@ -2594,7 +2594,7 @@ msgstr "" msgid "Search by document title" msgstr "" -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:125 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:141 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144 msgid "Search by name or email" msgstr "" @@ -2816,8 +2816,8 @@ msgstr "" msgid "Signing up..." msgstr "" -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:71 -#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:37 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:75 +#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46 msgid "Signing Volume" msgstr "" diff --git a/packages/lib/translations/en/web.po b/packages/lib/translations/en/web.po index 0b5d5b07c..8e7ea3364 100644 --- a/packages/lib/translations/en/web.po +++ b/packages/lib/translations/en/web.po @@ -956,7 +956,7 @@ msgid "Create your account and start using state-of-the-art document signing. Op msgstr "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:85 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:89 #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:54 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:65 @@ -2007,7 +2007,7 @@ msgid "My templates" msgstr "My templates" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:148 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:57 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:61 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:99 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144 @@ -2612,7 +2612,7 @@ msgstr "Search" msgid "Search by document title" msgstr "Search by document title" -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:125 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:141 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144 msgid "Search by name or email" msgstr "Search by name or email" @@ -2838,8 +2838,8 @@ msgstr "Signing in..." msgid "Signing up..." msgstr "Signing up..." -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:71 -#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:37 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:75 +#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46 msgid "Signing Volume" msgstr "Signing Volume"