mirror of
https://github.com/documenso/documenso.git
synced 2025-11-17 02:01:33 +10:00
chore: minor fixes
This commit is contained in:
@ -37,7 +37,7 @@ export const LeaderboardTable = ({
|
|||||||
sortBy,
|
sortBy,
|
||||||
sortOrder,
|
sortOrder,
|
||||||
}: LeaderboardTableProps) => {
|
}: LeaderboardTableProps) => {
|
||||||
const { _ } = useLingui();
|
const { _, i18n } = useLingui();
|
||||||
|
|
||||||
const [isPending, startTransition] = useTransition();
|
const [isPending, startTransition] = useTransition();
|
||||||
const updateSearchParams = useUpdateSearchParams();
|
const updateSearchParams = useUpdateSearchParams();
|
||||||
@ -50,13 +50,13 @@ export const LeaderboardTable = ({
|
|||||||
header: 'ID',
|
header: 'ID',
|
||||||
accessorKey: 'id',
|
accessorKey: 'id',
|
||||||
cell: ({ row }) => <div>{row.original.id}</div>,
|
cell: ({ row }) => <div>{row.original.id}</div>,
|
||||||
size: 10,
|
size: 60,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
header: () => (
|
header: () => (
|
||||||
<div
|
<div
|
||||||
className="flex cursor-pointer items-center"
|
className="flex cursor-pointer items-center"
|
||||||
onClick={() => handleColumnSort('name', sortOrder)}
|
onClick={() => handleColumnSort('name')}
|
||||||
>
|
>
|
||||||
{_(msg`Name`)}
|
{_(msg`Name`)}
|
||||||
<CaretSortIcon className="ml-2 h-4 w-4" />
|
<CaretSortIcon className="ml-2 h-4 w-4" />
|
||||||
@ -70,7 +70,7 @@ export const LeaderboardTable = ({
|
|||||||
header: () => (
|
header: () => (
|
||||||
<div
|
<div
|
||||||
className="flex cursor-pointer items-center"
|
className="flex cursor-pointer items-center"
|
||||||
onClick={() => handleColumnSort('signingVolume', sortOrder)}
|
onClick={() => handleColumnSort('signingVolume')}
|
||||||
>
|
>
|
||||||
{_(msg`Signing Volume`)}
|
{_(msg`Signing Volume`)}
|
||||||
<CaretSortIcon className="ml-2 h-4 w-4" />
|
<CaretSortIcon className="ml-2 h-4 w-4" />
|
||||||
@ -84,7 +84,7 @@ export const LeaderboardTable = ({
|
|||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="flex cursor-pointer items-center"
|
className="flex cursor-pointer items-center"
|
||||||
onClick={() => handleColumnSort('createdAt', sortOrder)}
|
onClick={() => handleColumnSort('createdAt')}
|
||||||
>
|
>
|
||||||
{_(msg`Created`)}
|
{_(msg`Created`)}
|
||||||
<CaretSortIcon className="ml-2 h-4 w-4" />
|
<CaretSortIcon className="ml-2 h-4 w-4" />
|
||||||
@ -92,7 +92,7 @@ export const LeaderboardTable = ({
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
accessorKey: 'createdAt',
|
accessorKey: 'createdAt',
|
||||||
cell: ({ row }) => <div>{row.original.createdAt.toLocaleDateString()}</div>,
|
cell: ({ row }) => i18n.date(row.original.createdAt),
|
||||||
},
|
},
|
||||||
] satisfies DataTableColumnDef<SigningVolume>[];
|
] satisfies DataTableColumnDef<SigningVolume>[];
|
||||||
}, [sortOrder]);
|
}, [sortOrder]);
|
||||||
@ -103,6 +103,8 @@ export const LeaderboardTable = ({
|
|||||||
search: debouncedSearchString,
|
search: debouncedSearchString,
|
||||||
page: 1,
|
page: 1,
|
||||||
perPage,
|
perPage,
|
||||||
|
sortBy,
|
||||||
|
sortOrder,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
@ -121,13 +123,10 @@ export const LeaderboardTable = ({
|
|||||||
setSearchString(e.target.value);
|
setSearchString(e.target.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleColumnSort = (
|
const handleColumnSort = (column: 'name' | 'createdAt' | 'signingVolume') => {
|
||||||
column: 'name' | 'createdAt' | 'signingVolume',
|
|
||||||
sortOrder: 'asc' | 'desc',
|
|
||||||
) => {
|
|
||||||
startTransition(() => {
|
startTransition(() => {
|
||||||
updateSearchParams({
|
updateSearchParams({
|
||||||
sortBy: sortBy === column,
|
sortBy: column,
|
||||||
sortOrder: sortOrder === 'asc' ? 'desc' : 'asc',
|
sortOrder: sortOrder === 'asc' ? 'desc' : 'asc',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -2594,7 +2594,7 @@ msgstr ""
|
|||||||
msgid "Search by document title"
|
msgid "Search by document title"
|
||||||
msgstr ""
|
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
|
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144
|
||||||
msgid "Search by name or email"
|
msgid "Search by name or email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@ -2612,7 +2612,7 @@ msgstr "Search"
|
|||||||
msgid "Search by document title"
|
msgid "Search by document title"
|
||||||
msgstr "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
|
#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144
|
||||||
msgid "Search by name or email"
|
msgid "Search by name or email"
|
||||||
msgstr "Search by name or email"
|
msgstr "Search by name or email"
|
||||||
|
|||||||
@ -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();
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user