import Card from '@/components/ui/Card'; import StatusBadge from '@/components/ui/StatusBadge'; 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="w-full pl-9 pr-3 py-2 bg-deep-graphite border border-charcoal-outline rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-primary-blue transition-colors" />
{/* Users Table */} {loading ? (
Loading users...
) : !viewData.users || viewData.users.length === 0 ? (
No users found
) : (
{viewData.users.map((user, index: number) => ( ))}
User Email Roles Status Last Login Actions
{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}
)}
); }