Add search, filters, pagination to admin users table

- Add emailVerified filter (true/false/any) to UsersSearch component
- Wire emailVerified param through page searchParams, where clause, and pageUrl helper
- Preserve emailVerified in pagination links alongside existing search/role/balance params
- Update pagination label to "Страница X из Y · Всего: N"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 14:25:53 +05:00
parent e5ba94cb33
commit 4f5b5c535a
2 changed files with 27 additions and 9 deletions
+7 -4
View File
@@ -8,11 +8,11 @@ import { UsersSearch } from "@/components/admin/users-search";
const PAGE_SIZE = 20;
interface Props {
searchParams: Promise<{ search?: string; role?: string; page?: string; balance?: string }>;
searchParams: Promise<{ search?: string; role?: string; page?: string; balance?: string; emailVerified?: string }>;
}
export default async function UsersPage({ searchParams }: Props) {
const { search = "", role = "", page = "1", balance = "" } = await searchParams;
const { search = "", role = "", page = "1", balance = "", emailVerified = "" } = await searchParams;
const currentPage = Math.max(1, parseInt(page) || 1);
const skip = (currentPage - 1) * PAGE_SIZE;
@@ -37,6 +37,8 @@ export default async function UsersPage({ searchParams }: Props) {
}
: {}),
...(role ? { role } : {}),
...(emailVerified === "true" ? { emailVerified: true } : {}),
...(emailVerified === "false" ? { emailVerified: false } : {}),
...(balanceUserIds !== null ? { id: { in: balanceUserIds } } : {}),
};
@@ -78,6 +80,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 (emailVerified) params.set("emailVerified", emailVerified);
if (balance) params.set("balance", balance);
params.set("page", String(p));
return `/admin/users?${params.toString()}`;
@@ -101,7 +104,7 @@ export default async function UsersPage({ searchParams }: Props) {
{/* Filters */}
<Suspense>
<UsersSearch initialSearch={search} initialRole={role} initialBalance={balance} />
<UsersSearch initialSearch={search} initialRole={role} initialEmailVerified={emailVerified} initialBalance={balance} />
</Suspense>
<UsersTable users={tableUsers} />
@@ -132,7 +135,7 @@ export default async function UsersPage({ searchParams }: Props) {
{currentPage < totalPages && (
<Link href={pageUrl(currentPage + 1)} className="btn-aubade px-3 py-1 text-xs"></Link>
)}
<span className="ml-2 text-xs" style={{ color: "var(--muted-foreground)" }}>стр. {currentPage} из {totalPages}</span>
<span className="ml-2 text-xs" style={{ color: "var(--muted-foreground)" }}>Страница {currentPage} из {totalPages} · Всего: {total}</span>
</div>
)}
</div>