diff --git a/loko/contracts/templates/contracts/teams_index.html b/loko/contracts/templates/contracts/teams_index.html index fcf9e1e..8b36a02 100644 --- a/loko/contracts/templates/contracts/teams_index.html +++ b/loko/contracts/templates/contracts/teams_index.html @@ -1107,6 +1107,99 @@ + +
{% endblock content %} @@ -1118,6 +1211,7 @@ {% endblock script %} diff --git a/loko/contracts/test_planning.py b/loko/contracts/test_planning.py index 0a99be5..13f064e 100644 --- a/loko/contracts/test_planning.py +++ b/loko/contracts/test_planning.py @@ -483,3 +483,13 @@ class TeamPlanningAjaxViewsTests(TestCase): self.assertEqual(self.member_alice.teams.count(), 1) self.assertEqual(self.member_alice.teams.first(), self.team_b) + def test_can_view_member_history_in_teams_views(self): + resp = self.client.get(reverse('contracts:teams_index')) + self.assertEqual(resp.status_code, 200) + self.assertTrue(resp.context['can_view_member_history']) + + data_resp = self.client.get(reverse('contracts:team_planning_data_ajax')) + self.assertEqual(data_resp.status_code, 200) + self.assertTrue(data_resp.json()['can_view_member_history']) + + diff --git a/loko/contracts/views_teams.py b/loko/contracts/views_teams.py index a0bbfce..14349cb 100644 --- a/loko/contracts/views_teams.py +++ b/loko/contracts/views_teams.py @@ -97,12 +97,17 @@ def teams_index(request): unassigned_qs = unassigned_qs.filter(user__config__company=user_company) unassigned_members = unassigned_qs.order_by("name") + user_config = getattr(request.user, 'config', None) + user_roles = set(user_config.roles.values_list('name', flat=True)) if user_config else set() + can_view_member_history = bool(user_roles & {'admin', 'manager', 'external_manager'}) or request.user.is_superuser + return render( request, "contracts/teams_index.html", { "teams": teams, "can_edit": can_edit, + "can_view_member_history": can_view_member_history, "available_users": available_users, "unassigned_members": unassigned_members, "user_company": user_company, @@ -564,6 +569,10 @@ def team_planning_data_ajax(request): companies_list = [{'id': cid, 'name': cname} for cid, cname in sorted(companies_dict.items(), key=lambda x: x[1])] + user_config = getattr(request.user, 'config', None) + user_roles = set(user_config.roles.values_list('name', flat=True)) if user_config else set() + can_view_member_history = bool(user_roles & {'admin', 'manager', 'external_manager'}) or request.user.is_superuser + return JsonResponse({ 'days': days_list, 'teams': teams_data, @@ -574,6 +583,7 @@ def team_planning_data_ajax(request): 'anchor_date': anchor_date.isoformat(), 'view_mode': view_mode, 'can_edit': user_can_edit_teams(request.user), + 'can_view_member_history': can_view_member_history, }) diff --git a/loko/interventions/static/interventions/calendar/interventions_calendar.css b/loko/interventions/static/interventions/calendar/interventions_calendar.css index f2c89fc..4f9ec51 100644 --- a/loko/interventions/static/interventions/calendar/interventions_calendar.css +++ b/loko/interventions/static/interventions/calendar/interventions_calendar.css @@ -929,6 +929,13 @@ line-height: 1.35; border-left: 3px solid #cbd5e1; box-shadow: 0 1px 2px rgba(0,0,0,0.03); + cursor: pointer; + transition: background-color 0.15s ease, box-shadow 0.15s ease; +} + +.team-members-list:hover { + background: #f1f5f9; + box-shadow: 0 2px 5px rgba(0,0,0,0.08); } /* Stack of interventions */ diff --git a/loko/interventions/static/interventions/calendar/interventions_calendar.js b/loko/interventions/static/interventions/calendar/interventions_calendar.js index 6b5a008..33f06e6 100644 --- a/loko/interventions/static/interventions/calendar/interventions_calendar.js +++ b/loko/interventions/static/interventions/calendar/interventions_calendar.js @@ -525,8 +525,11 @@ document.addEventListener('DOMContentLoaded', function () { const dayData = team.days[day.date] || { members: [], interventions: [] }; let membersHTML = ''; - const isFutureDay = day.date > todayStr; + const isPastDay = day.date < todayStr; const isMemberHistoryAllowed = typeof canViewMemberHistory !== 'undefined' ? Boolean(canViewMemberHistory) : false; + const canEditThisTeam = (typeof canEditTeams !== 'undefined' && Boolean(canEditTeams)) && (team.can_edit !== false); + const titleTooltip = canEditThisTeam && !isPastDay ? gettext('Modifier la composition de l’équipe pour ce jour') : gettext('Composition de l’équipe'); + if (dayData.members && dayData.members.length > 0) { const formattedMembers = dayData.members.map(m => { const name = typeof m === 'object' && m ? m.name : m; @@ -537,9 +540,6 @@ document.addEventListener('DOMContentLoaded', function () { const otherTeams = typeof m === 'object' && m && m.other_teams ? m.other_teams : []; let memberNameHtml = escapeHtml(name); - if (isMemberHistoryAllowed && id) { - 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'); @@ -550,11 +550,11 @@ document.addEventListener('DOMContentLoaded', function () { } return memberNameHtml; }).join(', '); - membersHTML = `