Add nonzero balance filter to users page, link from dashboard card
This commit is contained in:
@@ -170,7 +170,7 @@ export default async function AdminDashboard() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="card-aubade p-5">
|
||||
<Link href="/admin/users?balance=nonzero" className="card-aubade p-5 block">
|
||||
<p className="text-xs font-bold uppercase tracking-widest mb-3" style={{ color: "var(--muted-foreground)" }}>
|
||||
На балансах
|
||||
</p>
|
||||
@@ -178,7 +178,7 @@ export default async function AdminDashboard() {
|
||||
{totalBalance.toLocaleString("ru-RU", { minimumFractionDigits: 2, maximumFractionDigits: 2 })} ₽
|
||||
</p>
|
||||
<p className="text-xs mt-0.5" style={{ color: "var(--muted-foreground)" }}>сумма по всем пользователям</p>
|
||||
</div>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -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} />
|
||||
|
||||
Reference in New Issue
Block a user