From c00212f79e736bef7ba5cdf2fa8ad547e7c419b7 Mon Sep 17 00:00:00 2001 From: kdeterme Date: Mon, 28 Sep 2026 16:26:44 +0200 Subject: [PATCH] fix(interventions): translate modal status and apply assigned color on interventions list and map --- .../interventions/add/linked_interventions.js | 14 ++++++- .../calendar/interventions_calendar.js | 38 +++++++++++++++++-- .../interventions/interventions_index.js | 17 ++++++++- .../static/interventions/status_colors.js | 2 + .../_interventions_list_mobile.html | 2 +- .../interventions_index_mobile.html | 10 +++-- loko/interventions/views/calendar.py | 3 +- loko/interventions/views/mobile.py | 1 + 8 files changed, 76 insertions(+), 11 deletions(-) diff --git a/loko/interventions/static/interventions/add/linked_interventions.js b/loko/interventions/static/interventions/add/linked_interventions.js index 4fd94fa..4620f7c 100644 --- a/loko/interventions/static/interventions/add/linked_interventions.js +++ b/loko/interventions/static/interventions/add/linked_interventions.js @@ -378,7 +378,19 @@ function statusFormatter(value, row) { const entry = icons[value]; if (!entry) return value; - return `${entry.label}`; + const isAssignedToBeProcessed = (value === 'to_be_processed') && Boolean( + row && ( + row.is_assigned || + row.assigned_team_id || + row.assigned_member_id || + (row.team && row.team !== '-') || + (row.member && row.member !== '-') + ) + ); + const statusClass = isAssignedToBeProcessed ? 'status-to_be_processed_assigned' : `status-${value}`; + const badgeStyle = isAssignedToBeProcessed ? 'style="background-color: #d81b60 !important; color: #ffffff !important;"' : ''; + + return `${entry.label}`; } diff --git a/loko/interventions/static/interventions/calendar/interventions_calendar.js b/loko/interventions/static/interventions/calendar/interventions_calendar.js index a05dcd2..a284863 100644 --- a/loko/interventions/static/interventions/calendar/interventions_calendar.js +++ b/loko/interventions/static/interventions/calendar/interventions_calendar.js @@ -4805,13 +4805,43 @@ document.addEventListener('DOMContentLoaded', function () { modalInterventionPriority.className = priorityClasses[priorityCode] || 'badge text-bg-light border text-dark'; } - const status = record.status || record.extendedProps?.status || ''; - const statusCode = record.status_code || record.extendedProps?.status_code || ''; - const isAssigned = Boolean(record.is_assigned || record.extendedProps?.is_assigned || record.member_name || record.extendedProps?.member_name || record.team_name || record.extendedProps?.team_name); + const STATUS_LABELS = { + 'in_preparation': gettext('En prépa'), + 'to_be_approved': gettext('À approuver'), + 'to_be_planned': gettext('À planifier'), + 'to_be_processed': gettext('À traiter'), + 'assigned': gettext('Pris en charge'), + 'in_progress': gettext('Démarré'), + 'on_pause': gettext('En pause'), + 'finished': gettext('Terminé'), + 'processed': gettext('Traité'), + 'to_be_corrected': gettext('À corriger'), + 'corrected': gettext('Corrigé'), + 'validated': gettext('Validé'), + 'invoiced': gettext('Comptabilisé'), + 'closed': gettext('Finalisé'), + 'canceled': gettext('Annulé'), + }; + + const rawStatus = record.status || record.extendedProps?.status || ''; + const statusCode = record.status_code || record.extendedProps?.status_code || (STATUS_LABELS[rawStatus] ? rawStatus : '') || rawStatus; + const statusDisplay = record.status_display || record.extendedProps?.status_display || STATUS_LABELS[statusCode] || STATUS_LABELS[rawStatus] || rawStatus; + const isAssigned = Boolean( + record.is_assigned || + record.extendedProps?.is_assigned || + record.assigned_team_id || + record.assigned_member_id || + record.extendedProps?.assigned_team_id || + record.extendedProps?.assigned_member_id || + (record.member_name && record.member_name !== gettext('Non assigné')) || + (record.extendedProps?.member_name && record.extendedProps?.member_name !== gettext('Non assigné')) || + (record.team_name && record.team_name !== gettext('Non assignée')) || + (record.extendedProps?.team_name && record.extendedProps?.team_name !== gettext('Non assignée')) + ); const color = getInterventionColor(statusCode, isAssigned); const textColor = idealTextColor(color); - modalInterventionStatus.textContent = status; + modalInterventionStatus.textContent = statusDisplay; modalInterventionStatus.style.backgroundColor = color; modalInterventionStatus.style.color = textColor; diff --git a/loko/interventions/static/interventions/interventions_index.js b/loko/interventions/static/interventions/interventions_index.js index eed40b7..8f8c25c 100644 --- a/loko/interventions/static/interventions/interventions_index.js +++ b/loko/interventions/static/interventions/interventions_index.js @@ -400,6 +400,9 @@ function loadDataIntoInterventionsTable(features) { contract_provider: feature.properties.contract_provider || '', origin_type: feature.properties.origin_type || '', source_category: feature.properties.source_category || '', + is_assigned: Boolean(feature.properties.is_assigned), + team: feature.properties.team || '', + member: feature.properties.member || '', lon: feature.geometry && feature.geometry.coordinates ? feature.geometry.coordinates[0] : null, // Longitude lat: feature.geometry && feature.geometry.coordinates ? feature.geometry.coordinates[1] : null // Latitude }; @@ -488,7 +491,19 @@ function statusFormatter(value, row) { const entry = icons[value]; if (!entry) return value; - let html = `${entry.label}`; + const isAssignedToBeProcessed = (value === 'to_be_processed') && Boolean( + row && ( + row.is_assigned || + row.assigned_team_id || + row.assigned_member_id || + (row.team && row.team !== '-') || + (row.member && row.member !== '-') + ) + ); + const statusClass = isAssignedToBeProcessed ? 'status-to_be_processed_assigned' : `status-${value}`; + const badgeStyle = isAssignedToBeProcessed ? 'style="background-color: #d81b60 !important; color: #ffffff !important;"' : ''; + + let html = `${entry.label}`; // Add preparation state indicator if present if (row && row.prep_state && row.prep_state !== 'none' && prepStateIcons[row.prep_state]) { diff --git a/loko/interventions/static/interventions/status_colors.js b/loko/interventions/static/interventions/status_colors.js index b558faf..40f5552 100644 --- a/loko/interventions/static/interventions/status_colors.js +++ b/loko/interventions/static/interventions/status_colors.js @@ -51,6 +51,8 @@ const INTERVENTION_STATUS_COLOR_EXPR = (() => { ['==', ['get', 'status'], 'to_be_processed'], [ 'any', + ['==', ['get', 'is_assigned'], true], + ['==', ['get', 'is_assigned'], 1], ['boolean', ['get', 'is_assigned'], false], ['!=', ['coalesce', ['get', 'team'], ''], ''], ['!=', ['coalesce', ['get', 'member'], ''], ''] diff --git a/loko/interventions/templates/interventions/_interventions_list_mobile.html b/loko/interventions/templates/interventions/_interventions_list_mobile.html index bbc49ac..d0f53ce 100644 --- a/loko/interventions/templates/interventions/_interventions_list_mobile.html +++ b/loko/interventions/templates/interventions/_interventions_list_mobile.html @@ -51,7 +51,7 @@ > {{ intervention.code }} {{ intervention.title }} - {{ intervention.get_status_display }} + {{ intervention.get_status_display }} {% if intervention.show_contract_blocked_warning %} {% translate "Marché bloqué" %} diff --git a/loko/interventions/templates/interventions/interventions_index_mobile.html b/loko/interventions/templates/interventions/interventions_index_mobile.html index 8d4841a..64a8277 100644 --- a/loko/interventions/templates/interventions/interventions_index_mobile.html +++ b/loko/interventions/templates/interventions/interventions_index_mobile.html @@ -589,7 +589,10 @@ const SOURCE_ID = 'interventions-points'; const LAYER_ID = 'interventions-circles'; - function hexColor(status, bsColor) { + function hexColor(status, bsColor, isAssigned) { + if (status === 'to_be_processed' && isAssigned) { + return INTERVENTION_STATUS_COLORS.to_be_processed_assigned || '#d81b60'; + } if (status && INTERVENTION_STATUS_COLORS[status]) { return INTERVENTION_STATUS_COLORS[status]; } @@ -626,9 +629,10 @@ status_label: m.status_label, status_color: m.status_color, status: m.status, + is_assigned: m.is_assigned, maintain_type: m.maintain_type, url: m.url, - fill: hexColor(m.status, m.status_color), + fill: hexColor(m.status, m.status_color, m.is_assigned), }, })), }; @@ -638,7 +642,7 @@ function buildPopupHtml(features) { return features.map((f, idx) => { const p = f.properties; - const fill = hexColor(p.status, p.status_color); + const fill = hexColor(p.status, p.status_color, p.is_assigned); const txtCol = isTextDark(p.status, p.status_color) ? '#000' : '#fff'; const sep = idx > 0 ? '
' : ''; const coords = f.geometry && f.geometry.coordinates ? f.geometry.coordinates : null; diff --git a/loko/interventions/views/calendar.py b/loko/interventions/views/calendar.py index 0223ef0..ca62e43 100644 --- a/loko/interventions/views/calendar.py +++ b/loko/interventions/views/calendar.py @@ -1491,9 +1491,10 @@ def intervention_planning_data_ajax(request, intervention_id): 'id': intervention.id, 'code': intervention.code, 'title': intervention.title, - 'status': intervention.status, + 'status': intervention.get_status_display(), 'status_code': intervention.status, 'status_display': intervention.get_status_display(), + 'is_assigned': intervention.is_assigned, 'prep_state': intervention.get_preparation_orders_status(), 'priority': intervention.get_priority_display(), 'type': intervention.get_type_display(), diff --git a/loko/interventions/views/mobile.py b/loko/interventions/views/mobile.py index a69fe35..9c52dad 100644 --- a/loko/interventions/views/mobile.py +++ b/loko/interventions/views/mobile.py @@ -389,6 +389,7 @@ def interventions_index_mobile(request): 'status_label': i.get_status_display(), 'status': i.status, 'status_color': i.get_status_color(), + 'is_assigned': i.is_assigned, 'maintain_type': i.maintain_type, 'lat': i.lat, 'lon': i.lon,