diff --git a/loko/interventions/static/interventions/calendar/interventions_calendar.js b/loko/interventions/static/interventions/calendar/interventions_calendar.js
index 3a517e0..05c417b 100644
--- a/loko/interventions/static/interventions/calendar/interventions_calendar.js
+++ b/loko/interventions/static/interventions/calendar/interventions_calendar.js
@@ -4998,11 +4998,14 @@ document.addEventListener('DOMContentLoaded', function () {
const viewMode = filterViewModeSelect?.value || 'timeline';
const targetDate = customDate || (viewMode === 'teams_daily' ? formatDateISO(teamsDailyActiveDate) : null);
- if (targetDate) {
- const urlObj = new URL(url, window.location.origin);
- urlObj.searchParams.set('date', targetDate);
- url = urlObj.pathname + urlObj.search;
+ const urlObj = new URL(url, window.location.origin);
+ if (viewMode) {
+ urlObj.searchParams.set('view_mode', viewMode);
}
+ if (targetDate) {
+ urlObj.searchParams.set('date', targetDate);
+ }
+ url = urlObj.pathname + urlObj.search;
return fetch(url, { cache: 'no-store' })
.then(r => r.json())
@@ -5028,6 +5031,9 @@ document.addEventListener('DOMContentLoaded', function () {
});
}
+ window.loadCalendarData = loadCalendarData;
+ window.getTeamColor = getTeamColor;
+
// Reset filters handler
const resetFiltersBtn = document.getElementById('reset-filters');
if (resetFiltersBtn) {
@@ -5314,6 +5320,63 @@ function openTeamDailyMembersModal(teamId, dateStr, teamName) {
loadTeamDailyMembersModalData(teamId, dateStr);
}
+function updateTeamsDailyGridCell(teamId, dateStr, currentMembers, teamObj) {
+ if (!teamId || !dateStr) return;
+ const cell = document.querySelector(`.teams-daily-grid-cell[data-team-id="${teamId}"][data-date="${dateStr}"]`);
+ if (!cell) return;
+
+ let membersContainer = cell.querySelector('.team-members-list');
+ const teamColor = typeof getTeamColor === 'function' ? getTeamColor(teamId) : (window.getTeamColor ? window.getTeamColor(teamId) : '#0d6efd');
+ const canEditThisTeam = (typeof canEditTeams !== 'undefined' && Boolean(canEditTeams)) && (!teamObj || teamObj.can_edit !== false);
+ const todayStr = new Date().toISOString().split('T')[0];
+ const isPastDay = dateStr < todayStr;
+ const titleTooltip = canEditThisTeam && !isPastDay ? gettext('Modifier la composition de l’équipe pour ce jour') : gettext('Composition de l’équipe');
+ const teamName = teamObj && teamObj.name ? teamObj.name : '';
+
+ if (!membersContainer) {
+ membersContainer = document.createElement('div');
+ cell.prepend(membersContainer);
+ }
+
+ membersContainer.setAttribute('data-team-id', teamId);
+ membersContainer.setAttribute('data-date', dateStr);
+ if (teamName) {
+ membersContainer.setAttribute('data-team-name', teamName);
+ }
+ membersContainer.setAttribute('title', titleTooltip);
+
+ if (currentMembers && currentMembers.length > 0) {
+ const formattedMembers = currentMembers.map(m => {
+ const name = typeof m === 'object' && m ? m.name : m;
+ const isAbsent = typeof m === 'object' && m ? Boolean(m.is_absent) : false;
+ const absenceReason = typeof m === 'object' && m ? (m.absence_reason || '') : '';
+ const isMultiTeam = typeof m === 'object' && m ? Boolean(m.is_multi_team) : false;
+ const otherTeams = typeof m === 'object' && m && m.other_teams ? m.other_teams : [];
+
+ let memberNameHtml = escapeHtml(name);
+ if (isMultiTeam) {
+ const otherNames = otherTeams.map(t => t.name).join(', ');
+ const tooltip = otherNames ? `${gettext('Planifié aussi dans')} : ${otherNames}` : gettext('Planifié dans plusieurs équipes ce jour');
+ memberNameHtml += ` `;
+ }
+ if (isAbsent) {
+ return `${memberNameHtml} ${escapeHtml(absenceReason || gettext('Absent'))}`;
+ }
+ return memberNameHtml;
+ }).join(', ');
+
+ membersContainer.className = 'team-members-list clickable-team-members text-muted small fst-italic mb-2';
+ membersContainer.style.borderLeft = `3px solid ${teamColor}`;
+ membersContainer.style.cursor = 'pointer';
+ membersContainer.innerHTML = `${formattedMembers}`;
+ } else {
+ membersContainer.className = 'team-members-list clickable-team-members text-muted small fst-italic mb-2 text-opacity-50';
+ membersContainer.style.borderLeft = '3px solid #cbd5e1';
+ membersContainer.style.cursor = 'pointer';
+ membersContainer.innerHTML = `(${gettext('Aucun membre')})`;
+ }
+}
+
function loadTeamDailyMembersModalData(teamId, dateStr) {
const spinner = document.getElementById('team-daily-modal-spinner');
const content = document.getElementById('team-daily-modal-content');
@@ -5367,6 +5430,11 @@ function loadTeamDailyMembersModalData(teamId, dateStr) {
else readonlyAlert.classList.add('d-none');
}
+ // Update calendar cell immediately if present in the teams daily grid
+ if (data.current_members) {
+ updateTeamsDailyGridCell(teamId, dateStr, data.current_members, data.team);
+ }
+
// Render current members
const members = data.current_members || [];
if (membersCountEl) membersCountEl.textContent = members.length;
@@ -5497,8 +5565,10 @@ function assignMemberToDailyTeam(memberId, teamId, dateStr, action) {
setTimeout(() => { if (succAlert) succAlert.classList.add('d-none'); }, 3000);
}
loadTeamDailyMembersModalData(teamId, dateStr);
- if (typeof loadCalendarData === 'function') {
- loadCalendarData();
+ if (typeof window.loadCalendarData === 'function') {
+ window.loadCalendarData(dateStr);
+ } else if (typeof loadCalendarData === 'function') {
+ loadCalendarData(dateStr);
}
})
.catch(err => {
@@ -5560,3 +5630,13 @@ if (_memberHistoryModalEl) {
});
}
+const _teamDailyMembersModalEl = document.getElementById('teamDailyMembersModal');
+if (_teamDailyMembersModalEl) {
+ _teamDailyMembersModalEl.addEventListener('hidden.bs.modal', function () {
+ if (typeof window.loadCalendarData === 'function') {
+ window.loadCalendarData();
+ }
+ });
+}
+
+