import { apiGet, apiPostForm } from '../api.js'; import { saveDraft, loadDraft, clearDraft } from '../drafts.js'; export async function renderTreatment(root, { incidentId }) { if (!incidentId) { root.innerHTML = '
Incident invalide.
'; return; } root.innerHTML = `
Traitement
Retour
Équipe

Diagnostic

Intervention

OTDR & pièces

Statut

Matériels (1 ligne)

Photos

`; const meta = root.querySelector('#meta'); const draftInfo = root.querySelector('#draftInfo'); const okBox = root.querySelector('#okBox'); const errBox = root.querySelector('#errBox'); const form = root.querySelector('#treatForm'); function showOk(msg) { okBox.textContent = msg; okBox.style.display = 'block'; errBox.style.display = 'none'; } function showErr(msg) { errBox.textContent = msg; errBox.style.display = 'block'; okBox.style.display = 'none'; } function fillFromObject(obj) { if (!obj) return; const entries = Object.entries(obj); for (const [k, v] of entries) { const el = form.querySelector(`[name="${cssEscape(k)}"]`); if (!el) continue; if (el.type === 'checkbox') { el.checked = Boolean(v); } else if (el.type === 'select-one') { el.value = String(v ?? ''); } else { el.value = String(v ?? ''); } } } const d = loadDraft(incidentId); if (d?.payload) { draftInfo.style.display = 'block'; draftInfo.textContent = `Brouillon local détecté (sauvé le ${d.savedAt}).`; fillFromObject(d.payload); } try { const res = await apiGet(`/api/mobile/treatment?id=${incidentId}`); if (res?.ok && res.incident) { const ticket = res.incident.ticket_id || `INC-${incidentId}`; meta.textContent = `${ticket} — ${res.incident.title || ''}`.trim(); if (res.report) { fillFromObject({ team_name: res.report.team_name, team_contact: res.report.team_contact, type_of_incident: res.report.type_of_incident, detection_mode: res.report.detection_mode, cut_distance_km: res.report.cut_distance_km, gps_lat: res.report.gps_lat, gps_lng: res.report.gps_lng, fault_nature: res.report.fault_nature, takeover_at: toLocal(res.report.takeover_at), intervention_start: toLocal(res.report.intervention_start), intervention_end: toLocal(res.report.intervention_end), repair_type: res.report.repair_type, work_comments: res.report.work_comments, otdr_result: res.report.otdr_result, resolution_status: res.report.resolution_status, need_additional: res.report.need_additional }); } } } catch { meta.textContent = `INC-${incidentId}`; } function captureDraftPayload() { const payload = {}; const fd = new FormData(form); for (const [k, v] of fd.entries()) { if (v instanceof File) continue; payload[k] = v; } return payload; } root.querySelector('#btnSaveDraft').addEventListener('click', () => { const payload = captureDraftPayload(); saveDraft(incidentId, payload); showOk('Brouillon sauvegardé localement.'); }); async function sync(action) { okBox.style.display = 'none'; errBox.style.display = 'none'; const fd = new FormData(form); fd.set('action_type', action); if (!navigator.onLine) { const payload = captureDraftPayload(); saveDraft(incidentId, payload); showOk('Hors-ligne: brouillon sauvegardé localement.'); return; } try { const res = await apiPostForm('/api/mobile/treatment/save', fd); if (res?.ok) { if (action === 'submit') { clearDraft(incidentId); showOk('Traitement soumis.'); } else { saveDraft(incidentId, captureDraftPayload()); showOk('Traitement sauvegardé (draft).'); } return; } showErr('Erreur lors de la sauvegarde.'); } catch (e) { showErr('Erreur réseau ou serveur.'); } } root.querySelector('#btnSyncDraft').addEventListener('click', () => sync('draft')); root.querySelector('#btnSubmit').addEventListener('click', () => sync('submit')); } function toLocal(sqlDateTime) { if (!sqlDateTime) return ''; const s = String(sqlDateTime).replace(' ', 'T'); return s.slice(0, 16); } function cssEscape(s) { return String(s).replaceAll('"', '\\"'); }