This commit is contained in:
@@ -12,11 +12,11 @@ const EmployeeList = () => {
|
|||||||
const [employees, setEmployees] = useState([]);
|
const [employees, setEmployees] = useState([]);
|
||||||
const [keyword, setKeyword] = useState('');
|
const [keyword, setKeyword] = useState('');
|
||||||
const [showInactive, setShowInactive] = useState(false);
|
const [showInactive, setShowInactive] = useState(false);
|
||||||
const [hrUsers, setHrUsers] = useState([]);
|
|
||||||
const [isHrLoading, setIsHrLoading] = useState(false);
|
const [isHrLoading, setIsHrLoading] = useState(false);
|
||||||
const [isSavingHrPermission, setIsSavingHrPermission] = useState(false);
|
const [isSavingHrPermission, setIsSavingHrPermission] = useState(false);
|
||||||
const [hrKeyword, setHrKeyword] = useState('');
|
const [hrKeyword, setHrKeyword] = useState('');
|
||||||
const [hrPermissionMap, setHrPermissionMap] = useState({});
|
const [hrPermissionMap, setHrPermissionMap] = useState({});
|
||||||
|
const [hrPermissionRecords, setHrPermissionRecords] = useState([]);
|
||||||
const [editingHrUser, setEditingHrUser] = useState(undefined);
|
const [editingHrUser, setEditingHrUser] = useState(undefined);
|
||||||
const [showHrPermissionModal, setShowHrPermissionModal] = useState(false);
|
const [showHrPermissionModal, setShowHrPermissionModal] = useState(false);
|
||||||
const [selectedHrPermissions, setSelectedHrPermissions] = useState([SYSTEM_ACCESS_PERMISSION]);
|
const [selectedHrPermissions, setSelectedHrPermissions] = useState([SYSTEM_ACCESS_PERMISSION]);
|
||||||
@@ -30,37 +30,29 @@ const EmployeeList = () => {
|
|||||||
EmployeeService.getAllEmployees().then((data) =>
|
EmployeeService.getAllEmployees().then((data) =>
|
||||||
setEmployees(data.data)
|
setEmployees(data.data)
|
||||||
);
|
);
|
||||||
loadHrUsers();
|
|
||||||
loadHrPermissionsBySite(currentSite);
|
loadHrPermissionsBySite(currentSite);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const loadHrUsers = () => {
|
|
||||||
setIsHrLoading(true);
|
|
||||||
EmployeeService.getExternalEmployeesList()
|
|
||||||
.then((response) => {
|
|
||||||
setHrUsers(Array.isArray(response?.data) ? response.data : []);
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
window.alert(error?.response?.data?.message || 'Failed to load HR users.');
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
setIsHrLoading(false);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const loadHrPermissionsBySite = (site) => {
|
const loadHrPermissionsBySite = (site) => {
|
||||||
|
setIsHrLoading(true);
|
||||||
EmployeeService.getExternalUserPermissionsList(site)
|
EmployeeService.getExternalUserPermissionsList(site)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
|
const records = Array.isArray(response?.data) ? response.data : [];
|
||||||
const nextMap = {};
|
const nextMap = {};
|
||||||
(Array.isArray(response?.data) ? response.data : []).forEach((item) => {
|
records.forEach((item) => {
|
||||||
const key = item?.external_user_id;
|
const key = item?.external_user_id;
|
||||||
if (!key) return;
|
if (!key) return;
|
||||||
nextMap[key] = Array.isArray(item?.permissions) ? item.permissions : [];
|
nextMap[key] = Array.isArray(item?.permissions) ? item.permissions : [];
|
||||||
});
|
});
|
||||||
setHrPermissionMap(nextMap);
|
setHrPermissionMap(nextMap);
|
||||||
|
setHrPermissionRecords(records);
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
setHrPermissionMap({});
|
setHrPermissionMap({});
|
||||||
|
setHrPermissionRecords([]);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setIsHrLoading(false);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -85,27 +77,25 @@ const EmployeeList = () => {
|
|||||||
navigate(`/employees/external-import`);
|
navigate(`/employees/external-import`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getExternalUserId = (item) => item?.external_user_id || item?.employee_id || '';
|
||||||
|
|
||||||
const filteredHrUsers = useMemo(() => {
|
const filteredHrUsers = useMemo(() => {
|
||||||
return (hrUsers || [])
|
return (hrPermissionRecords || [])
|
||||||
.filter((item) => Number(item?.site) === Number(currentSite))
|
.filter((item) => Number(item?.allow_site) === Number(currentSite))
|
||||||
.filter((item) => {
|
|
||||||
const configuredPermissions = hrPermissionMap?.[item?.employee_id] || [];
|
|
||||||
return configuredPermissions.length > 0;
|
|
||||||
})
|
|
||||||
.filter((item) => {
|
.filter((item) => {
|
||||||
if (!hrKeyword) return true;
|
if (!hrKeyword) return true;
|
||||||
const key = hrKeyword.toLowerCase();
|
const key = hrKeyword.toLowerCase();
|
||||||
return (
|
return (
|
||||||
(item?.username || '').toLowerCase().includes(key) ||
|
(item?.username || '').toLowerCase().includes(key) ||
|
||||||
(item?.name || '').toLowerCase().includes(key) ||
|
(item?.name || '').toLowerCase().includes(key)
|
||||||
(item?.title || '').toLowerCase().includes(key)
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}, [hrUsers, hrKeyword, hrPermissionMap, currentSite]);
|
}, [hrPermissionRecords, hrKeyword, currentSite]);
|
||||||
|
|
||||||
const openHrPermissionModal = (hrUser) => {
|
const openHrPermissionModal = (hrUser) => {
|
||||||
setEditingHrUser(hrUser);
|
setEditingHrUser(hrUser);
|
||||||
const existingPermissions = hrPermissionMap?.[hrUser?.employee_id] || [];
|
const externalUserId = getExternalUserId(hrUser);
|
||||||
|
const existingPermissions = hrPermissionMap?.[externalUserId] || [];
|
||||||
setSelectedHrPermissions(Array.from(new Set([SYSTEM_ACCESS_PERMISSION, ...existingPermissions])));
|
setSelectedHrPermissions(Array.from(new Set([SYSTEM_ACCESS_PERMISSION, ...existingPermissions])));
|
||||||
setShowHrPermissionModal(true);
|
setShowHrPermissionModal(true);
|
||||||
};
|
};
|
||||||
@@ -151,10 +141,11 @@ const EmployeeList = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const saveHrPermissions = () => {
|
const saveHrPermissions = () => {
|
||||||
if (!editingHrUser?.employee_id) return;
|
const externalUserId = getExternalUserId(editingHrUser);
|
||||||
|
if (!externalUserId) return;
|
||||||
setIsSavingHrPermission(true);
|
setIsSavingHrPermission(true);
|
||||||
EmployeeService.saveExternalUserPermission({
|
EmployeeService.saveExternalUserPermission({
|
||||||
external_user_id: editingHrUser.employee_id,
|
external_user_id: externalUserId,
|
||||||
username: editingHrUser.username || '',
|
username: editingHrUser.username || '',
|
||||||
name: editingHrUser.name || '',
|
name: editingHrUser.name || '',
|
||||||
email: editingHrUser.email || '',
|
email: editingHrUser.email || '',
|
||||||
@@ -164,8 +155,9 @@ const EmployeeList = () => {
|
|||||||
.then(() => {
|
.then(() => {
|
||||||
setHrPermissionMap((prev) => ({
|
setHrPermissionMap((prev) => ({
|
||||||
...prev,
|
...prev,
|
||||||
[editingHrUser.employee_id]: Array.from(new Set([SYSTEM_ACCESS_PERMISSION, ...selectedHrPermissions]))
|
[externalUserId]: Array.from(new Set([SYSTEM_ACCESS_PERMISSION, ...selectedHrPermissions]))
|
||||||
}));
|
}));
|
||||||
|
loadHrPermissionsBySite(currentSite);
|
||||||
closeHrPermissionModal();
|
closeHrPermissionModal();
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
@@ -177,17 +169,19 @@ const EmployeeList = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const revokeHrPermissions = (hrUser) => {
|
const revokeHrPermissions = (hrUser) => {
|
||||||
if (!hrUser?.employee_id) return;
|
const externalUserId = getExternalUserId(hrUser);
|
||||||
|
if (!externalUserId) return;
|
||||||
if (!window.confirm(`Revoke all permissions for ${hrUser?.username || 'this HR user'} on Site ${currentSite}?`)) {
|
if (!window.confirm(`Revoke all permissions for ${hrUser?.username || 'this HR user'} on Site ${currentSite}?`)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
EmployeeService.revokeExternalUserPermission(hrUser.employee_id, Number(currentSite))
|
EmployeeService.revokeExternalUserPermission(externalUserId, Number(currentSite))
|
||||||
.then(() => {
|
.then(() => {
|
||||||
setHrPermissionMap((prev) => {
|
setHrPermissionMap((prev) => {
|
||||||
const next = { ...prev };
|
const next = { ...prev };
|
||||||
delete next[hrUser.employee_id];
|
delete next[externalUserId];
|
||||||
return next;
|
return next;
|
||||||
});
|
});
|
||||||
|
loadHrPermissionsBySite(currentSite);
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
window.alert(error?.response?.data?.message || 'Failed to revoke HR user permissions.');
|
window.alert(error?.response?.data?.message || 'Failed to revoke HR user permissions.');
|
||||||
@@ -225,7 +219,7 @@ const EmployeeList = () => {
|
|||||||
Filter:
|
Filter:
|
||||||
<input className="ms-2" type="text" value={hrKeyword} onChange={(e) => setHrKeyword(e.currentTarget.value)} />
|
<input className="ms-2" type="text" value={hrKeyword} onChange={(e) => setHrKeyword(e.currentTarget.value)} />
|
||||||
</label>
|
</label>
|
||||||
<button className="btn btn-primary btn-sm" onClick={() => {loadHrUsers(); loadHrPermissionsBySite(currentSite);}} disabled={isHrLoading}>
|
<button className="btn btn-primary btn-sm" onClick={() => loadHrPermissionsBySite(currentSite)} disabled={isHrLoading}>
|
||||||
{isHrLoading ? 'Loading...' : 'Refresh HR Users'}
|
{isHrLoading ? 'Loading...' : 'Refresh HR Users'}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -247,13 +241,14 @@ const EmployeeList = () => {
|
|||||||
</tr>
|
</tr>
|
||||||
)}
|
)}
|
||||||
{!isHrLoading && filteredHrUsers.map((hrUser) => {
|
{!isHrLoading && filteredHrUsers.map((hrUser) => {
|
||||||
const configuredPermissions = hrPermissionMap?.[hrUser?.employee_id] || [];
|
const externalUserId = getExternalUserId(hrUser);
|
||||||
|
const configuredPermissions = hrPermissionMap?.[externalUserId] || hrUser?.permissions || [];
|
||||||
return (
|
return (
|
||||||
<tr key={`${hrUser?.employee_id}-${hrUser?.site}`}>
|
<tr key={`${externalUserId}-${hrUser?.allow_site}`}>
|
||||||
<td>{hrUser?.username}</td>
|
<td>{hrUser?.username}</td>
|
||||||
<td>{hrUser?.name}</td>
|
<td>{hrUser?.name}</td>
|
||||||
<td>{hrUser?.title}</td>
|
<td>{hrUser?.title || '-'}</td>
|
||||||
<td>{hrUser?.site}</td>
|
<td>{hrUser?.allow_site || currentSite}</td>
|
||||||
<td>{configuredPermissions.length > 0 ? configuredPermissions.join(', ') : '-'}</td>
|
<td>{configuredPermissions.length > 0 ? configuredPermissions.join(', ') : '-'}</td>
|
||||||
<td>
|
<td>
|
||||||
<button className="btn btn-primary btn-sm me-2" onClick={() => openHrPermissionModal(hrUser)}>Edit</button>
|
<button className="btn btn-primary btn-sm me-2" onClick={() => openHrPermissionModal(hrUser)}>Edit</button>
|
||||||
|
|||||||
Reference in New Issue
Block a user