import React, { useMemo, useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { Button, Modal, Spinner } from "react-bootstrap"; import { AuthService, EmployeeService, EventsService } from "../../services"; import { EMPLOYEE_PERMISSION_GROUPS } from "../../shared"; const SYSTEM_ACCESS_PERMISSION = "System Access"; const EmployeeList = () => { const navigate = useNavigate(); const currentSite = EventsService.site || 3; const [employees, setEmployees] = useState([]); const [keyword, setKeyword] = useState(''); const [showInactive, setShowInactive] = useState(false); const [isHrLoading, setIsHrLoading] = useState(false); const [isSavingHrPermission, setIsSavingHrPermission] = useState(false); const [hrKeyword, setHrKeyword] = useState(''); const [hrPermissionMap, setHrPermissionMap] = useState({}); const [hrPermissionRecords, setHrPermissionRecords] = useState([]); const [editingHrUser, setEditingHrUser] = useState(undefined); const [showHrPermissionModal, setShowHrPermissionModal] = useState(false); const [selectedHrPermissions, setSelectedHrPermissions] = useState([SYSTEM_ACCESS_PERMISSION]); useEffect(() => { if (!AuthService.canViewEmployees()) { window.alert('You haven\'t login yet OR this user does not have access to this page. Please change an admin account to login.') AuthService.logout(); navigate(`/login`); } EmployeeService.getAllEmployees().then((data) => setEmployees(data.data) ); loadHrPermissionsBySite(currentSite); }, []); const loadHrPermissionsBySite = (site) => { setIsHrLoading(true); EmployeeService.getExternalUserPermissionsList(site) .then((response) => { const records = Array.isArray(response?.data) ? response.data : []; const nextMap = {}; records.forEach((item) => { const key = item?.external_user_id; if (!key) return; nextMap[key] = Array.isArray(item?.permissions) ? item.permissions : []; }); setHrPermissionMap(nextMap); setHrPermissionRecords(records); }) .catch(() => { setHrPermissionMap({}); setHrPermissionRecords([]); }) .finally(() => { setIsHrLoading(false); }); }; const redirectToAdmin = () => { navigate(`/admin/customer-report`) } const goToEdit = (id) => { navigate(`/employees/edit/${id}`) } const goToView = (id) => { navigate(`/employees/${id}`) } const goToCreate = () => { navigate(`/employees`) } const goToExternalImport = () => { navigate(`/employees/external-import`); } const getExternalUserId = (item) => item?.external_user_id || item?.employee_id || ''; const filteredHrUsers = useMemo(() => { return (hrPermissionRecords || []) .filter((item) => Number(item?.allow_site) === Number(currentSite)) .filter((item) => { if (!hrKeyword) return true; const key = hrKeyword.toLowerCase(); return ( (item?.username || '').toLowerCase().includes(key) || (item?.name || '').toLowerCase().includes(key) ); }); }, [hrPermissionRecords, hrKeyword, currentSite]); const openHrPermissionModal = (hrUser) => { setEditingHrUser(hrUser); const externalUserId = getExternalUserId(hrUser); const existingPermissions = hrPermissionMap?.[externalUserId] || []; setSelectedHrPermissions(Array.from(new Set([SYSTEM_ACCESS_PERMISSION, ...existingPermissions]))); setShowHrPermissionModal(true); }; const closeHrPermissionModal = () => { if (isSavingHrPermission) return; setShowHrPermissionModal(false); setEditingHrUser(undefined); setSelectedHrPermissions([SYSTEM_ACCESS_PERMISSION]); }; const toggleHrPermission = (permissionKey) => { if (permissionKey === SYSTEM_ACCESS_PERMISSION) return; setSelectedHrPermissions((prev) => { if (prev.includes(permissionKey)) { return prev.filter((item) => item !== permissionKey); } return [...prev, permissionKey]; }); }; const isHrPermissionGroupFullySelected = (permissionItems = []) => { return permissionItems.length > 0 && permissionItems.every((permissionKey) => selectedHrPermissions.includes(permissionKey)); }; const toggleHrPermissionGroup = (permissionItems = [], checked) => { if (!Array.isArray(permissionItems) || permissionItems.length === 0) return; setSelectedHrPermissions((prev) => { const nextSet = new Set(prev); permissionItems.forEach((permissionKey) => { if (permissionKey === SYSTEM_ACCESS_PERMISSION) { nextSet.add(SYSTEM_ACCESS_PERMISSION); return; } if (checked) { nextSet.add(permissionKey); } else { nextSet.delete(permissionKey); } }); return Array.from(nextSet); }); }; const saveHrPermissions = () => { const externalUserId = getExternalUserId(editingHrUser); if (!externalUserId) return; setIsSavingHrPermission(true); EmployeeService.saveExternalUserPermission({ external_user_id: externalUserId, username: editingHrUser.username || '', name: editingHrUser.name || '', email: editingHrUser.email || '', allow_site: Number(currentSite), permissions: selectedHrPermissions }) .then(() => { setHrPermissionMap((prev) => ({ ...prev, [externalUserId]: Array.from(new Set([SYSTEM_ACCESS_PERMISSION, ...selectedHrPermissions])) })); loadHrPermissionsBySite(currentSite); closeHrPermissionModal(); }) .catch((error) => { window.alert(error?.response?.data?.message || 'Failed to save HR user permissions.'); }) .finally(() => { setIsSavingHrPermission(false); }); }; const revokeHrPermissions = (hrUser) => { const externalUserId = getExternalUserId(hrUser); if (!externalUserId) return; if (!window.confirm(`Revoke all permissions for ${hrUser?.username || 'this HR user'} on Site ${currentSite}?`)) { return; } EmployeeService.revokeExternalUserPermission(externalUserId, Number(currentSite)) .then(() => { setHrPermissionMap((prev) => { const next = { ...prev }; delete next[externalUserId]; return next; }); loadHrPermissionsBySite(currentSite); }) .catch((error) => { window.alert(error?.response?.data?.message || 'Failed to revoke HR user permissions.'); }); }; return ( <>
All Employees {AuthService.canAddOrEditEmployees() && ( )} {AuthService.canAddOrEditEmployees() && ( )}
HR System Users
{isHrLoading && ( )} {!isHrLoading && filteredHrUsers.map((hrUser) => { const externalUserId = getExternalUserId(hrUser); const configuredPermissions = hrPermissionMap?.[externalUserId] || hrUser?.permissions || []; return ( ); })} {!isHrLoading && filteredHrUsers.length === 0 && ( )}
Username Name Title Site Configured Permissions
Loading HR users...
{hrUser?.username} {hrUser?.name} {hrUser?.title || '-'} {hrUser?.allow_site || currentSite} {configuredPermissions.length > 0 ? configuredPermissions.join(', ') : '-'}
No HR users found for selected site.
Internal Employees
Filter By Name: setKeyword(e.currentTarget.value)}/>
setShowInactive(!showInactive)} /> Show Inactive Employees { employees && employees.filter(item => showInactive ? item : item.status === 'active').filter((item)=> item?.name.toLowerCase().includes(keyword.toLowerCase())).map(employee => ) }
Name Preferred Name Username Status Permissions
{employee?.name} {employee?.name_cn} {employee?.username} {employee?.status} {employee?.permissions?.join(', ') || '-'} {AuthService.canAddOrEditEmployees() && } {AuthService.canViewEmployees() && }
Edit HR User Permissions - {editingHrUser?.username}
Allow Site: {currentSite}
{Object.entries(EMPLOYEE_PERMISSION_GROUPS).map(([groupName, permissionItems]) => (
{groupName}
{permissionItems.map((permissionKey) => ( ))}
))}
) }; export default EmployeeList;