import { useState, useEffect } from 'react'; import { adminService } from '../../services/admin.service'; import { masterService } from '../../services/master.service'; import { Card, CardContent } from '../ui/card'; import { Badge } from '../ui/badge'; import { Button } from '../ui/button'; import { Input } from '../ui/input'; import { Label } from '../ui/label'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; import { Switch } from '../ui/switch'; import { Users, UserPlus, Search, Edit2, Trash2, Shield, Mail, Phone, Filter, RefreshCw, CheckCircle, XCircle } from 'lucide-react'; import { toast } from 'sonner'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from '../ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; export function UserManagementPage() { const getParentIdByType = (location: any, parentType: string): string => { if (!location?.parents || !Array.isArray(location.parents)) return ''; const match = location.parents.find((p: any) => p?.type === parentType); return match?.id || ''; }; const normalizeList = (res: any, preferredKey: string): any[] => { if (!res) return []; if (Array.isArray(res[preferredKey])) return res[preferredKey]; if (Array.isArray(res.data)) return res.data; return []; }; const [users, setUsers] = useState([]); const [roles, setRoles] = useState([]); const [zones, setZones] = useState([]); const [regions, setRegions] = useState([]); const [states, setStates] = useState([]); const [districts, setDistricts] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [roleFilter, setRoleFilter] = useState('all'); const [statusFilter, setStatusFilter] = useState('all'); // Edit/Add Modal State const [showUserModal, setShowUserModal] = useState(false); const [editingUser, setEditingUser] = useState(null); const [formData, setFormData] = useState({ fullName: '', email: '', roleCode: '', status: 'active', isActive: true, mobileNumber: '', department: '', designation: '', employeeId: '', zoneId: '', regionId: '', stateId: '', districtId: '' }); useEffect(() => { fetchData(); }, []); const fetchData = async () => { setLoading(true); try { const [usersRes, rolesRes, zonesRes, regionsRes] = await Promise.all([ adminService.getAllUsers(), masterService.getRoles(), masterService.getZones(), masterService.getRegions() ]) as any[]; if (usersRes.success) setUsers(usersRes.data); if (rolesRes.success) setRoles(rolesRes.data); if (zonesRes.success) setZones(zonesRes.data); if (regionsRes.success) setRegions(regionsRes.data); } catch (error) { toast.error('Failed to load user management data'); } finally { setLoading(false); } }; // Load states when zone changes (or on edit) useEffect(() => { if (formData.zoneId) { masterService.getStates(formData.zoneId).then((res: any) => { if (res && res.success) setStates(normalizeList(res, 'states')); }); } else { setStates([]); } }, [formData.zoneId]); // Load districts when state changes useEffect(() => { if (formData.stateId) { masterService.getDistricts(formData.stateId).then((res: any) => { if (res && res.success) setDistricts(normalizeList(res, 'districts')); }); } else { setDistricts([]); } }, [formData.stateId]); // Load areas when district changes (Disabled) useEffect(() => { // Area selection removed as per user request }, [formData.districtId]); const handleEditUser = (user: any) => { const userLocation = user.location; const userLocationType = userLocation?.type; const zoneId = user.zoneId || (userLocationType === 'zone' ? userLocation?.id : getParentIdByType(userLocation, 'zone')); const regionId = user.regionId || (userLocationType === 'region' ? userLocation?.id : getParentIdByType(userLocation, 'region')); const stateId = user.stateId || (userLocationType === 'state' ? userLocation?.id : getParentIdByType(userLocation, 'state')); const districtId = user.districtId || (userLocationType === 'district' ? userLocation?.id : getParentIdByType(userLocation, 'district')); setEditingUser(user); setFormData({ fullName: user.fullName || '', email: user.email || '', roleCode: user.roleCode || '', status: user.status || 'active', isActive: user.isActive ?? true, mobileNumber: user.mobileNumber || '', department: user.department || '', designation: user.designation || '', employeeId: user.employeeId || '', zoneId: zoneId || '', regionId: regionId || '', stateId: stateId || '', districtId: districtId || '' }); setShowUserModal(true); }; const handleSubmit = async () => { if (!formData.fullName || !formData.email || !formData.roleCode) { toast.error('Please fill in all required fields'); return; } try { const userLocationId = formData.districtId || formData.stateId || formData.regionId || formData.zoneId || null; const submitData = { ...formData, locationId: userLocationId }; if (editingUser) { const res = await adminService.updateUser(editingUser.id, submitData); if (res.success) { setShowUserModal(false); fetchData(); } } else { const res = await adminService.createUser(submitData); if (res.success) { toast.success('User created successfully'); setFormData({ fullName: '', email: '', roleCode: '', status: 'active', isActive: true, mobileNumber: '', department: '', designation: '', employeeId: '', zoneId: '', regionId: '', stateId: '', districtId: '' }); setShowUserModal(false); fetchData(); } else { toast.error(res.message || 'Failed to create user'); } } } catch (error) { const message = (error as any)?.response?.data?.message || (error as any)?.message || 'Operation failed'; toast.error(message); } }; const toggleUserStatus = async (user: any) => { const newStatus = user.status === 'active' ? 'inactive' : 'active'; const newActive = !user.isActive; const res = await adminService.updateUserStatus(user.id, newStatus, newActive); if (res.success) { fetchData(); } }; const filteredUsers = users.filter(user => { const matchesSearch = user.fullName?.toLowerCase().includes(searchQuery.toLowerCase()) || user.email?.toLowerCase().includes(searchQuery.toLowerCase()) || user.employeeId?.toLowerCase().includes(searchQuery.toLowerCase()); const matchesRole = roleFilter === 'all' || user.roleCode === roleFilter; const matchesStatus = statusFilter === 'all' || user.status === statusFilter; return matchesSearch && matchesRole && matchesStatus; }); return (
{/* Header section */}

User Management

Manage system users, roles, and access permissions.

{/* Filters section */}
setSearchQuery(e.target.value)} />
{/* Users Table */} User Information Geographical Mapping Account Details Role & Department Status Actions {loading ? (

Loading users...

) : filteredUsers.length === 0 ? ( No users found matching your criteria. ) : ( filteredUsers.map((user) => (
{user.fullName?.charAt(0) || user.email?.charAt(0)}
{user.fullName}
{user.email}
Location: {user.location?.name || 'N/A'}
Type: {user.location?.type ? user.location.type.toUpperCase() : 'N/A'}
ID: {user.employeeId || 'N/A'}
{user.mobileNumber || 'No phone'}
{user.roleCode}
{user.department || 'No department'}
{user.status === 'active' ? ( ) : ( )} {user.status}
toggleUserStatus(user)} />
)) )}
{/* User Edit/Add Modal */} {editingUser ? 'Edit User' : 'Add New User'} Modify user profiles and system access settings.
setFormData({ ...formData, fullName: e.target.value })} />
setFormData({ ...formData, email: e.target.value })} />
setFormData({ ...formData, employeeId: e.target.value })} />
setFormData({ ...formData, department: e.target.value })} />
setFormData({ ...formData, designation: e.target.value })} />
setFormData({ ...formData, mobileNumber: e.target.value })} />
{/* Geographical Assignments */}

Geographical Assignments

Optional: you can create users without territory mapping and assign later.

); }