This commit is contained in:
Louis Mazin 2026-09-19 23:18:36 +02:00
parent 87b608f7b9
commit 6f3217f28b

View File

@ -349,10 +349,6 @@ const TimeClockPage = () => {
try {
const apiUsers = await timeApi.getUsers();
// Django REST Framework renvoie souvent les listes paginées
// sous la forme { count, next, previous, results: [...] }.
// On accepte aussi les formats { data: [...] } / { users: [...] }
// pour éviter de perdre une partie des utilisateurs.
if (Array.isArray(apiUsers)) {
availableUsers = apiUsers;
} else if (Array.isArray(apiUsers?.results)) {
@ -361,21 +357,14 @@ const TimeClockPage = () => {
availableUsers = apiUsers.data;
} else if (Array.isArray(apiUsers?.users)) {
availableUsers = apiUsers.users;
} else {
availableUsers = [];
}
} catch (usersError) {
console.warn(
'Impossible de charger la liste des utilisateurs. Fallback sur les pointages.',
usersError,
);
console.warn('Impossible de charger les utilisateurs.', usersError);
}
}
// Les pointages contiennent eux aussi l'utilisateur associé.
// On les fusionne toujours avec la liste de l'API : l'endpoint
// utilisateurs peut être limité au profil courant ou être paginé.
// Cela évite d'avoir uniquement l'admin dans la combolist.
// Sécurité : on ajoute les utilisateurs trouvés dans les pointages
// qui ne seraient pas présents dans /users/.
const usersById = new Map(
availableUsers
.map((user) => [getUserId(user), user])
@ -402,37 +391,21 @@ const TimeClockPage = () => {
usersById.set(id, entryUser);
});
availableUsers = [...usersById.values()];
const currentUserId = getCurrentUserId();
if (
currentUserId &&
!availableUsers.some(
(availableUser) => getUserId(availableUser) === currentUserId,
)
) {
const loggedInUser = authUser || currentUser;
if (loggedInUser) {
availableUsers.unshift(loggedInUser);
}
}
availableUsers = availableUsers
.filter((availableUser) => getUserId(availableUser))
.sort((first, second) =>
getUserLabel(first).localeCompare(getUserLabel(second), 'fr'),
availableUsers = [...usersById.values()]
.filter((user) => getUserId(user))
.sort((a, b) =>
getUserLabel(a).localeCompare(getUserLabel(b), 'fr'),
);
setUsers(availableUsers);
const currentUserId = getCurrentUserId();
setSelectedUserId((currentSelectedId) => {
if (
currentSelectedId &&
availableUsers.some(
(availableUser) =>
getUserId(availableUser) === String(currentSelectedId),
(user) => getUserId(user) === String(currentSelectedId),
)
) {
return currentSelectedId;
@ -451,7 +424,6 @@ const TimeClockPage = () => {
setLoading(false);
}
};
useEffect(() => {
loadTimeEntries();
}, []);