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