fix(admin): make users page responsive on mobile
Search input (w-64) + two status/role selects (w-36) sat in one unwrappable row, and each user row's shrink-0 action-button cluster (up to 6 buttons) never yielded width to the info block — both squeezed everything together below md:. Filter bar now stacks (search full-width, filters side by side below it), and user rows stack info above actions on mobile, row layout from sm: up.
This commit is contained in:
1 parent
f7049569e1
commit
8b74ca5763
1 file changed
+30
-28
@@ -169,37 +169,39 @@ export default function AdminUsersPage() {
|
||||
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
<div className="flex flex-wrap items-center justify-between gap-3">
|
||||
<div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
|
||||
<h1 className="text-2xl font-bold text-zinc-100">Users</h1>
|
||||
<div className="flex flex-wrap items-center gap-2">
|
||||
<div className="flex flex-col gap-2 sm:flex-row sm:flex-wrap sm:items-center">
|
||||
<Input
|
||||
placeholder="Search name or email…"
|
||||
value={search}
|
||||
onChange={(e) => setSearch(e.target.value)}
|
||||
className="w-64 bg-zinc-900 border-zinc-700 text-zinc-100 placeholder:text-zinc-500"
|
||||
className="w-full bg-zinc-900 border-zinc-700 text-zinc-100 placeholder:text-zinc-500 sm:w-64"
|
||||
/>
|
||||
<Select value={banStatus} onValueChange={(v) => setBanStatus(v as BanStatusFilter)}>
|
||||
<SelectTrigger className="w-36 bg-zinc-900 border-zinc-700 text-zinc-100">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="bg-zinc-800 border-zinc-700">
|
||||
<SelectItem value="all">All statuses</SelectItem>
|
||||
<SelectItem value="banned">Banned</SelectItem>
|
||||
<SelectItem value="active">Active</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<Select value={role} onValueChange={(v) => setRole(v as RoleFilter)}>
|
||||
<SelectTrigger className="w-36 bg-zinc-900 border-zinc-700 text-zinc-100">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="bg-zinc-800 border-zinc-700">
|
||||
<SelectItem value="all">All roles</SelectItem>
|
||||
<SelectItem value="none">No role</SelectItem>
|
||||
<SelectItem value={AdminRoleType.SUPPORT}>Support</SelectItem>
|
||||
<SelectItem value={AdminRoleType.MODERATOR}>Moderator</SelectItem>
|
||||
<SelectItem value={AdminRoleType.SUPER_ADMIN}>Super Admin</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<div className="flex gap-2">
|
||||
<Select value={banStatus} onValueChange={(v) => setBanStatus(v as BanStatusFilter)}>
|
||||
<SelectTrigger className="flex-1 bg-zinc-900 border-zinc-700 text-zinc-100 sm:w-36 sm:flex-none">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="bg-zinc-800 border-zinc-700">
|
||||
<SelectItem value="all">All statuses</SelectItem>
|
||||
<SelectItem value="banned">Banned</SelectItem>
|
||||
<SelectItem value="active">Active</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<Select value={role} onValueChange={(v) => setRole(v as RoleFilter)}>
|
||||
<SelectTrigger className="flex-1 bg-zinc-900 border-zinc-700 text-zinc-100 sm:w-36 sm:flex-none">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent className="bg-zinc-800 border-zinc-700">
|
||||
<SelectItem value="all">All roles</SelectItem>
|
||||
<SelectItem value="none">No role</SelectItem>
|
||||
<SelectItem value={AdminRoleType.SUPPORT}>Support</SelectItem>
|
||||
<SelectItem value={AdminRoleType.MODERATOR}>Moderator</SelectItem>
|
||||
<SelectItem value={AdminRoleType.SUPER_ADMIN}>Super Admin</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -212,9 +214,9 @@ export default function AdminUsersPage() {
|
||||
{users.map((user) => (
|
||||
<div
|
||||
key={user.id}
|
||||
className="flex items-center gap-4 rounded-xl border border-zinc-800 bg-zinc-900 px-4 py-3"
|
||||
className="flex flex-col gap-3 rounded-xl border border-zinc-800 bg-zinc-900 px-4 py-3 sm:flex-row sm:items-center sm:gap-4"
|
||||
>
|
||||
<div className="flex-1 min-w-0">
|
||||
<div className="min-w-0 flex-1">
|
||||
<div className="flex items-center gap-2">
|
||||
<p className="text-sm text-zinc-100 font-mono truncate">{user.id}</p>
|
||||
{isActiveSponsor({
|
||||
@@ -290,7 +292,7 @@ export default function AdminUsersPage() {
|
||||
<p className="text-xs text-violet-400 mt-0.5">Shadowban: {user.shadowban.reason}</p>
|
||||
)}
|
||||
</div>
|
||||
<div className="shrink-0 flex flex-wrap items-center justify-end gap-2 max-w-md">
|
||||
<div className="flex flex-wrap items-center gap-2 sm:max-w-md sm:shrink-0 sm:justify-end">
|
||||
{user.pets[0] && (
|
||||
<Button
|
||||
size="sm"
|
||||
|
||||
Reference in new issue
Block a user