import { MODES, PK_MODELS, CLINICAL_THRESHOLDS, generateSimulationData } from '/pkCore.js'; import { adjustChartYScale } from './chartManager.js'; import { initCalculatorUI } from './calculator.js'; import { generatePDFReport } from './pdfExport.js'; import { initI18n, getCurrentLang, t } from './i18n.js'; let currentMode = MODES.ESKETAMINE; let pkChart = null; const timelineInputs = Array.from({ length: 61 }, (_, i) => ({ time: i * 5, bolusMg: 0, perfRateMgKgH: 0 })); document.addEventListener('DOMContentLoaded', async () => { await initI18n(); const selectLang = document.getElementById('selectLang'); if (selectLang) { selectLang.value = getCurrentLang(); selectLang.addEventListener('change', async (e) => { await initI18n(e.target.value); renderTimelineGrid(); updateSimulation(); }); } initChart(); renderTimelineGrid(); initCalculatorUI(); setupEventListeners(); updateSimulation(); }); function initChart() { const ctx = document.getElementById('pkChart').getContext('2d'); pkChart = new Chart(ctx, { type: 'line', data: { labels: timelineInputs.map(d => `${d.time}'`), datasets: [] }, options: { responsive: true, maintainAspectRatio: false, scales: { y: { beginAtZero: true, max: CLINICAL_THRESHOLDS[currentMode].maxScale, title: { display: true, text: 'Cp (ng/mL)', color: '#94a3b8' }, grid: { color: 'rgba(51, 65, 85, 0.4)' } }, x: { title: { display: true, text: 'Temps (minutes)', color: '#94a3b8' }, grid: { color: 'rgba(51, 65, 85, 0.4)' } } }, plugins: { legend: { labels: { color: '#f8fafc' } }, annotation: { annotations: {} } } } }); } function updateSimulation() { const weight = parseFloat(document.getElementById('inputWeight').value) || 70; const datasets = []; if (document.getElementById('chkDomino').checked) { datasets.push({ label: PK_MODELS.DOMINO.name, data: generateSimulationData({ model: PK_MODELS.DOMINO, weightKg: weight, timelineInputs }), borderColor: PK_MODELS.DOMINO.color, borderWidth: 3, tension: 0.2 }); } if (document.getElementById('chkClements').checked) { datasets.push({ label: PK_MODELS.CLEMENTS.name, data: generateSimulationData({ model: PK_MODELS.CLEMENTS, weightKg: weight, timelineInputs }), borderColor: PK_MODELS.CLEMENTS.color, borderWidth: 3, tension: 0.2 }); } if (document.getElementById('chkKamp').checked) { datasets.push({ label: PK_MODELS.KAMP.name, data: generateSimulationData({ model: PK_MODELS.KAMP, weightKg: weight, timelineInputs }), borderColor: PK_MODELS.KAMP.color, borderWidth: 3, tension: 0.2 }); } pkChart.data.datasets = datasets; adjustChartYScale(pkChart, currentMode, datasets); pkChart.update(); } function renderTimelineGrid() { const container = document.getElementById('timelineGrid'); container.innerHTML = ''; timelineInputs.forEach((item, idx) => { const col = document.createElement('div'); col.className = 'flex-1 bg-slate-900 border border-slate-700/60 rounded-xl p-2 text-center text-xs flex flex-col gap-1.5 min-w-[85px]'; col.innerHTML = `