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"