+
+ {total === 0
+ ? "No tickets"
+ : `Showing ${pagination.pageIndex * pagination.pageSize + 1}–${Math.min((pagination.pageIndex + 1) * pagination.pageSize, total)} of ${total} tickets`}
+
+
+
+
+
+ Page {pagination.pageIndex + 1} of {pageCount || 1}
+
+
+
+
+
+ )}
+
);
}
diff --git a/core/schemas/tickets.ts b/core/schemas/tickets.ts
index d384062..12cebd7 100644
--- a/core/schemas/tickets.ts
+++ b/core/schemas/tickets.ts
@@ -28,4 +28,6 @@ export const ticketListQuerySchema = z.object({
status: z.enum(ticketStatuses).optional(),
category: z.enum(ticketCategories).optional(),
search: z.string().optional(),
+ page: z.coerce.number().int().min(1).default(1),
+ pageSize: z.coerce.number().int().min(1).max(100).default(10),
});
diff --git a/server/src/routes/tickets.ts b/server/src/routes/tickets.ts
index c52cd31..0356b74 100644
--- a/server/src/routes/tickets.ts
+++ b/server/src/routes/tickets.ts
@@ -29,20 +29,26 @@ router.get("/", requireAuth, async (req, res) => {
];
}
- const tickets = await prisma.ticket.findMany({
- select: {
- id: true,
- subject: true,
- status: true,
- category: true,
- senderName: true,
- senderEmail: true,
- createdAt: true,
- },
- where,
- orderBy: { [query.sortBy]: query.sortOrder },
- });
- res.json({ tickets });
+ const [tickets, total] = await Promise.all([
+ prisma.ticket.findMany({
+ select: {
+ id: true,
+ subject: true,
+ status: true,
+ category: true,
+ senderName: true,
+ senderEmail: true,
+ createdAt: true,
+ },
+ where,
+ orderBy: { [query.sortBy]: query.sortOrder },
+ skip: (query.page - 1) * query.pageSize,
+ take: query.pageSize,
+ }),
+ prisma.ticket.count({ where }),
+ ]);
+
+ res.json({ tickets, total, page: query.page, pageSize: query.pageSize });
});
export default router;