import { Card } from '@/ui/Card'; import StatusBadge from '@/components/ui/StatusBadge'; import { Input } from '@/ui/Input'; import { Select } from '@/ui/Select'; import { Table, TableHead, TableBody, TableRow, TableHeader, TableCell } from '@/ui/Table'; import { Button } from '@/ui/Button'; import { Text } from '@/ui/Text'; import { Search, Filter, RefreshCw, Users, Shield, Trash2, AlertTriangle } from 'lucide-react'; import { AdminUsersViewData } from '@/lib/view-data/AdminUsersViewData'; /** * AdminUsersTemplate * * Pure template for admin users page. * Accepts ViewData only, no business logic. */ export function AdminUsersTemplate(props: { adminUsersViewData: AdminUsersViewData; onRefresh: () => void; onSearch: (search: string) => void; onFilterRole: (role: string) => void; onFilterStatus: (status: string) => void; onClearFilters: () => void; onUpdateStatus: (userId: string, status: string) => void; onDeleteUser: (userId: string) => void; search: string; roleFilter: string; statusFilter: string; loading: boolean; error: string | null; deletingUser: string | null; }) { const { adminUsersViewData: viewData, onRefresh, onSearch, onFilterRole, onFilterStatus, onClearFilters, onUpdateStatus, onDeleteUser, search, roleFilter, statusFilter, loading, error, deletingUser } = props; const toStatusBadgeProps = ( status: string, ): { status: 'success' | 'warning' | 'error' | 'neutral'; label: string } => { switch (status) { case 'active': return { status: 'success', label: 'Active' }; case 'suspended': return { status: 'warning', label: 'Suspended' }; case 'deleted': return { status: 'error', label: 'Deleted' }; default: return { status: 'neutral', label: status }; } }; const getRoleBadgeClass = (role: string) => { switch (role) { case 'owner': return 'bg-purple-500/20 text-purple-300 border border-purple-500/30'; case 'admin': return 'bg-blue-500/20 text-blue-300 border border-blue-500/30'; default: return 'bg-gray-500/20 text-gray-300 border border-gray-500/30'; } }; const getRoleBadgeLabel = (role: string) => { switch (role) { case 'owner': return 'Owner'; case 'admin': return 'Admin'; case 'user': return 'User'; default: return role; } }; return (
{/* Header */}
User Management Manage and monitor all system users
{/* Error Banner */} {error && (
Error {error}
)} {/* Filters Card */}
Filters
{(search || roleFilter || statusFilter) && ( )}
onSearch(e.target.value)} className="pl-9" />
onFilterStatus(e.target.value)} options={[ { value: '', label: 'All Status' }, { value: 'active', label: 'Active' }, { value: 'suspended', label: 'Suspended' }, { value: 'deleted', label: 'Deleted' }, ]} />
{/* Users Table */} {loading ? (
Loading users...
) : !viewData.users || viewData.users.length === 0 ? (
No users found
) : ( User Email Roles Status Last Login Actions {viewData.users.map((user, index: number) => (
{user.displayName}
ID: {user.id}
{user.primaryDriverId && (
Driver: {user.primaryDriverId}
)}
{user.email}
{user.roles.map((role: string, idx: number) => ( {getRoleBadgeLabel(role)} ))}
{(() => { const badge = toStatusBadgeProps(user.status); return ; })()}
{user.lastLoginAt ? new Date(user.lastLoginAt).toLocaleDateString() : 'Never'}
{user.status === 'active' && ( )} {user.status === 'suspended' && ( )} {user.status !== 'deleted' && ( )}
))}
)}
{/* Stats Summary */} {viewData.users.length > 0 && (
Total Users {viewData.total}
Active {viewData.activeUserCount}
Admins {viewData.adminCount}
)}
); }