import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import frappeAPI from '../api/frappeClient'; import type { FrappeDocType } from '../api/frappeClient'; const UsersList: React.FC = () => { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const navigate = useNavigate(); useEffect(() => { loadUsers(); }, []); const loadUsers = async () => { try { setLoading(true); const response = await frappeAPI.getDocTypeRecords( 'User', {}, ['name', 'full_name', 'email', 'enabled', 'creation', 'modified'] ); setUsers(response.message || []); } catch (err: any) { setError(err.response?.data?.message || 'Failed to load users'); } finally { setLoading(false); } }; const filteredUsers = users.filter(user => user.full_name?.toLowerCase().includes(searchTerm.toLowerCase()) || user.email?.toLowerCase().includes(searchTerm.toLowerCase()) || user.name?.toLowerCase().includes(searchTerm.toLowerCase()) ); const handleUserClick = (user: FrappeDocType) => { navigate(`/users/${user.name}`); }; if (loading) { return (
); } return (
{/* Header */}

Users

{/* Main Content */}
{error && (
{error}
)} {/* Search and Actions */}
setSearchTerm(e.target.value)} className="block w-full pl-10 pr-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md leading-5 bg-white dark:bg-gray-700 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-white focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" />
{/* Users Table */}

Users ({filteredUsers.length})

Manage user accounts and permissions

{filteredUsers.length === 0 ? (

No users found

{searchTerm ? 'Try adjusting your search terms.' : 'No users available.'}

) : (
    {filteredUsers.map((user) => (
  • handleUserClick(user)} >
    {user.full_name?.charAt(0) || user.name.charAt(0)}
    {user.full_name || user.name}
    {user.email || 'No email'}
    {user.enabled ? 'Active' : 'Inactive'}
    Created: {new Date(user.creation).toLocaleDateString()}
  • ))}
)}
); }; export default UsersList;