fix(interventions): translate modal status and apply assigned color on interventions list and map

This commit is contained in:
kdeterme 2026-09-28 16:26:44 +02:00
parent 37c1016b57
commit c00212f79e
8 changed files with 76 additions and 11 deletions

View file

@ -378,7 +378,19 @@ function statusFormatter(value, row) {
const entry = icons[value];
if (!entry) return value;
return `<span class="badge text-bg-${entry.color}"><i class="bi ${entry.icon} me-2"></i>${entry.label}</span>`;
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 `<span class="badge text-bg-${entry.color} ${statusClass}" ${badgeStyle}><i class="bi ${entry.icon} me-2"></i>${entry.label}</span>`;
}

View file

@ -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;

View file

@ -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 = `<span class="badge text-bg-${entry.color} status-${value}"><i class="bi ${entry.icon} me-2"></i>${entry.label}</span>`;
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 = `<span class="badge text-bg-${entry.color} ${statusClass}" ${badgeStyle}><i class="bi ${entry.icon} me-2"></i>${entry.label}</span>`;
// Add preparation state indicator if present
if (row && row.prep_state && row.prep_state !== 'none' && prepStateIcons[row.prep_state]) {

View file

@ -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'], ''], '']

View file

@ -51,7 +51,7 @@
></i>
<a href="{% url 'mobile:intervention_detail_mobile' intervention.id %}" class="me-2">{{ intervention.code }}</a> {{ intervention.title }}
</h6>
<span class="badge bg-{{ intervention.get_status_color }} status-{{ intervention.status }}">{{ intervention.get_status_display }}</span>
<span class="badge bg-{{ intervention.get_status_color }} status-{{ intervention.status }}{% if intervention.status == 'to_be_processed' and intervention.is_assigned %} status-to_be_processed_assigned{% endif %}">{{ intervention.get_status_display }}</span>
{% if intervention.show_contract_blocked_warning %}
<span class="badge bg-danger" title="{% translate 'Marché temporairement bloqué' %}">
<i class="bi bi-slash-circle"></i> {% translate "Marché bloqué" %}

View file

@ -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 ? '<hr style="margin:5px 0">' : '';
const coords = f.geometry && f.geometry.coordinates ? f.geometry.coordinates : null;

View file

@ -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(),

View file

@ -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,