handleColumnSort('signingVolume', sortOrder)}
+ onClick={() => handleColumnSort('signingVolume')}
>
{_(msg`Signing Volume`)}
@@ -84,7 +84,7 @@ export const LeaderboardTable = ({
return (
handleColumnSort('createdAt', sortOrder)}
+ onClick={() => handleColumnSort('createdAt')}
>
{_(msg`Created`)}
@@ -92,7 +92,7 @@ export const LeaderboardTable = ({
);
},
accessorKey: 'createdAt',
- cell: ({ row }) =>
{row.original.createdAt.toLocaleDateString()}
,
+ cell: ({ row }) => i18n.date(row.original.createdAt),
},
] satisfies DataTableColumnDef
[];
}, [sortOrder]);
@@ -103,6 +103,8 @@ export const LeaderboardTable = ({
search: debouncedSearchString,
page: 1,
perPage,
+ sortBy,
+ sortOrder,
});
});
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -121,13 +123,10 @@ export const LeaderboardTable = ({
setSearchString(e.target.value);
};
- const handleColumnSort = (
- column: 'name' | 'createdAt' | 'signingVolume',
- sortOrder: 'asc' | 'desc',
- ) => {
+ const handleColumnSort = (column: 'name' | 'createdAt' | 'signingVolume') => {
startTransition(() => {
updateSearchParams({
- sortBy: sortBy === column,
+ sortBy: column,
sortOrder: sortOrder === 'asc' ? 'desc' : 'asc',
});
});
diff --git a/packages/lib/translations/de/web.po b/packages/lib/translations/de/web.po
index 8da616ec6..f97a5bb3f 100644
--- a/packages/lib/translations/de/web.po
+++ b/packages/lib/translations/de/web.po
@@ -2594,7 +2594,7 @@ msgstr ""
msgid "Search by document title"
msgstr ""
-#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:141
+#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:140
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144
msgid "Search by name or email"
msgstr ""
diff --git a/packages/lib/translations/en/web.po b/packages/lib/translations/en/web.po
index 8e7ea3364..576f2b9f3 100644
--- a/packages/lib/translations/en/web.po
+++ b/packages/lib/translations/en/web.po
@@ -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:141
+#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:140
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144
msgid "Search by name or email"
msgstr "Search by name or email"
diff --git a/packages/prisma/seed-signing-volume.ts b/packages/prisma/seed-signing-volume.ts
deleted file mode 100644
index 92d8e12a5..000000000
--- a/packages/prisma/seed-signing-volume.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-import type { Subscription, Team, User } from '@prisma/client';
-import { DocumentDataType, PrismaClient } from '@prisma/client';
-import fs from 'node:fs';
-import path from 'node:path';
-
-import { hashSync } from '@documenso/lib/server-only/auth/hash';
-
-const prisma = new PrismaClient();
-
-const examplePdf = fs
- .readFileSync(path.join(__dirname, '../../assets/example.pdf'))
- .toString('base64');
-
-async function seedLeaderboardData(numUsers: number, numTeams: number) {
- const users: User[] = [];
- const teams: Team[] = [];
- const subscriptions: Subscription[] = [];
-
- // Create users with subscriptions
- for (let i = 0; i < numUsers; i++) {
- const user = await prisma.user.create({
- data: {
- name: `User ${i + 1}`,
- email: `user${i + 1}@documenso.com`,
- password: hashSync('password'),
- emailVerified: new Date(),
- },
- });
- users.push(user);
-
- const subscription = await prisma.subscription.create({
- data: {
- userId: user.id,
- status: 'ACTIVE',
- planId: `plan_${Date.now().toString()}`,
- priceId: `price_${Date.now().toString()}`,
- },
- });
- subscriptions.push(subscription);
- }
-
- // Create teams
- for (let i = 0; i < numTeams; i++) {
- const ownerUser = users[Math.floor(Math.random() * users.length)];
- const team = await prisma.team.create({
- data: {
- name: `Team ${i + 1}`,
- url: `team-${Date.now().toString()}`,
- ownerUserId: ownerUser.id,
- },
- });
- teams.push(team);
-
- // Add random users to the team
- const teamMembers = users.filter((u) => u.id !== ownerUser.id).slice(0, 3);
- for (const member of teamMembers) {
- await prisma.teamMember.create({
- data: {
- teamId: team.id,
- userId: member.id,
- role: 'MEMBER',
- },
- });
- }
- }
-
- // Create documents for each user
- for (const user of users) {
- const numDocuments = Math.floor(Math.random() * 10) + 1; // 1 to 5 documents per user
- for (let i = 0; i < numDocuments; i++) {
- const documentData = await prisma.documentData.create({
- data: {
- type: DocumentDataType.BYTES_64,
- data: examplePdf,
- initialData: examplePdf,
- },
- });
-
- await prisma.document.create({
- data: {
- title: `Personal Document ${i + 1} for User ${user.id}`,
- userId: user.id,
- status: 'COMPLETED',
- documentDataId: documentData.id,
- source: 'DOCUMENT',
- },
- });
- }
- }
-
- // Create documents for each team
- for (const team of teams) {
- const numDocuments = Math.floor(Math.random() * 10) + 1; // 1 to 10 documents per team
- for (let i = 0; i < numDocuments; i++) {
- const documentData = await prisma.documentData.create({
- data: {
- type: DocumentDataType.BYTES_64,
- data: 'base64encodeddata', // Replace with actual data if needed
- initialData: 'base64encodeddata', // Replace with actual data if needed
- },
- });
-
- await prisma.document.create({
- data: {
- title: `Team Document ${i + 1} for Team ${team.id}`,
- userId: team.ownerUserId, // Assign to team owner
- teamId: team.id,
- status: 'COMPLETED',
- documentDataId: documentData.id,
- source: 'DOCUMENT',
- },
- });
- }
- }
-
- console.log(`Seeded ${users.length} users, ${teams.length} teams, and their documents.`);
-}
-
-// Usage
-seedLeaderboardData(50, 10)
- .catch((e) => console.error(e))
- .finally(() => {
- void prisma.$disconnect();
- });