import React, { useEffect, useMemo, useState } 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 ExternalEmployeesImport = () => { const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); const [employees, setEmployees] = useState([]); const [siteFilter, setSiteFilter] = useState(EventsService.site || 3); const [keyword, setKeyword] = useState(""); const [showPermissionModal, setShowPermissionModal] = useState(false); const [selectedEmployee, setSelectedEmployee] = useState(undefined); const [selectedPermissions, setSelectedPermissions] = useState([SYSTEM_ACCESS_PERMISSION]); const [selectedAllowSite, setSelectedAllowSite] = useState(EventsService.site || 3); useEffect(() => { if (!AuthService.canAddOrEditEmployees()) { 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"); return; } loadExternalEmployees(); }, []); const loadExternalEmployees = () => { setLoading(true); EmployeeService.getExternalEmployeesList() .then((response) => { setEmployees(Array.isArray(response?.data) ? response.data : []); }) .catch((error) => { window.alert(error?.response?.data?.message || "Failed to load employees from HR system."); }) .finally(() => { setLoading(false); }); }; const filteredEmployees = useMemo(() => { return (employees || []) .filter((item) => siteFilter === 'all' || Number(item?.site) === Number(siteFilter)) .filter((item) => { if (!keyword) return true; const key = keyword.toLowerCase(); return ( (item?.username || "").toLowerCase().includes(key) || (item?.name || "").toLowerCase().includes(key) || (item?.title || "").toLowerCase().includes(key) ); }); }, [employees, siteFilter, keyword]); const openPermissionModal = (employee) => { const allowSite = siteFilter === 'all' ? (Number(employee?.site) || EventsService.site || 3) : Number(siteFilter); setSelectedEmployee(employee); setSelectedAllowSite(allowSite); setSelectedPermissions([SYSTEM_ACCESS_PERMISSION]); setShowPermissionModal(true); EmployeeService.getExternalUserPermission(employee?.employee_id, allowSite) .then((response) => { const existingPermissions = Array.isArray(response?.data?.permissions) ? response.data.permissions : []; const nextPermissions = Array.from(new Set([SYSTEM_ACCESS_PERMISSION, ...existingPermissions])); setSelectedPermissions(nextPermissions); }) .catch(() => { setSelectedPermissions([SYSTEM_ACCESS_PERMISSION]); }); }; const closePermissionModal = () => { if (saving) return; setShowPermissionModal(false); setSelectedEmployee(undefined); setSelectedPermissions([SYSTEM_ACCESS_PERMISSION]); setSelectedAllowSite(EventsService.site || 3); }; const togglePermission = (permissionKey) => { if (permissionKey === SYSTEM_ACCESS_PERMISSION) return; setSelectedPermissions((prev) => { if (prev.includes(permissionKey)) { return prev.filter((item) => item !== permissionKey); } return [...prev, permissionKey]; }); }; const savePermissions = () => { if (!selectedEmployee?.employee_id) return; setSaving(true); EmployeeService.saveExternalUserPermission({ external_user_id: selectedEmployee.employee_id, username: selectedEmployee.username || "", name: selectedEmployee.name || "", email: selectedEmployee.email || "", allow_site: Number(selectedAllowSite), permissions: selectedPermissions }) .then(() => { closePermissionModal(); }) .catch((error) => { window.alert(error?.response?.data?.message || "Failed to save external user permissions."); }) .finally(() => { setSaving(false); }); }; return ( <>
Add New Employee From HR System
{loading ? (
Loading employees...
) : ( {filteredEmployees.map((item) => ( ))} {filteredEmployees.length === 0 && ( )}
Username Name Title Site
{item?.username} {item?.name} {item?.title} {item?.site}
No active employees found for selected site.
)}
Set Permissions - {selectedEmployee?.username}
Allow Site: {selectedAllowSite}
{Object.entries(EMPLOYEE_PERMISSION_GROUPS).map(([groupName, permissionItems]) => (
{groupName}
{permissionItems.map((permissionKey) => ( ))}
))}
); }; export default ExternalEmployeesImport;