Add nonzero balance filter to users page, link from dashboard card

This commit is contained in:
2026-05-08 14:24:31 +05:00
parent 2dfc42821c
commit 5547b427bb
3 changed files with 46 additions and 10 deletions
+16 -3
View File
@@ -8,14 +8,25 @@ import { UsersSearch } from "@/components/admin/users-search";
const PAGE_SIZE = 20;
interface Props {
searchParams: Promise<{ search?: string; role?: string; page?: string }>;
searchParams: Promise<{ search?: string; role?: string; page?: string; balance?: string }>;
}
export default async function UsersPage({ searchParams }: Props) {
const { search = "", role = "", page = "1" } = await searchParams;
const { search = "", role = "", page = "1", balance = "" } = await searchParams;
const currentPage = Math.max(1, parseInt(page) || 1);
const skip = (currentPage - 1) * PAGE_SIZE;
// Collect userIds with non-zero balance if filter is active
let balanceUserIds: string[] | null = null;
if (balance === "nonzero") {
const groups = await prisma.balanceTransaction.groupBy({
by: ["userId"],
_sum: { amount: true },
having: { amount: { _sum: { not: { equals: 0 } } } },
});
balanceUserIds = groups.map((g) => g.userId);
}
const where = {
...(search
? {
@@ -26,6 +37,7 @@ export default async function UsersPage({ searchParams }: Props) {
}
: {}),
...(role ? { role } : {}),
...(balanceUserIds !== null ? { id: { in: balanceUserIds } } : {}),
};
const [users, total] = await Promise.all([
@@ -66,6 +78,7 @@ export default async function UsersPage({ searchParams }: Props) {
const params = new URLSearchParams();
if (search) params.set("search", search);
if (role) params.set("role", role);
if (balance) params.set("balance", balance);
params.set("page", String(p));
return `/admin/users?${params.toString()}`;
}
@@ -88,7 +101,7 @@ export default async function UsersPage({ searchParams }: Props) {
{/* Filters */}
<Suspense>
<UsersSearch initialSearch={search} initialRole={role} />
<UsersSearch initialSearch={search} initialRole={role} initialBalance={balance} />
</Suspense>
<UsersTable users={tableUsers} />