From 7ee33671ccea05b0ca6c96d3894b458b6c4712f5 Mon Sep 17 00:00:00 2001 From: Christian Vidal Wolf Date: Sat, 21 Feb 2026 23:05:10 +0100 Subject: [PATCH] feat: add explicit period date ranges and absolute metric differences to experiment summary --- components/ExperimentDetail.tsx | 94 ++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 30 deletions(-) diff --git a/components/ExperimentDetail.tsx b/components/ExperimentDetail.tsx index 3a61b15..33f2b19 100644 --- a/components/ExperimentDetail.tsx +++ b/components/ExperimentDetail.tsx @@ -254,28 +254,56 @@ const ExperimentDetail: React.FC = ({ experimentId, onClo
{/* Performance Cards */} {(experiment.experiment_units != null) && ( -
- - - - - + <> +
+
+ Período Baseline (Referencia) + + {(() => { + const sd = new Date(experiment.start_date); + const ed = experiment.end_date ? new Date(experiment.end_date) : new Date(); + const durationMs = ed.getTime() - sd.getTime(); + const bd = new Date(sd.getTime() - durationMs); + return `${bd.toLocaleDateString('es-ES', { day: '2-digit', month: 'short', year: 'numeric' })} — ${sd.toLocaleDateString('es-ES', { day: '2-digit', month: 'short', year: 'numeric' })}`; + })()} + +
+
VS
+
+ Período del Experimento + + {(() => { + const sd = new Date(experiment.start_date); + const ed = experiment.end_date ? new Date(experiment.end_date) : new Date(); + return `${sd.toLocaleDateString('es-ES', { day: '2-digit', month: 'short', year: 'numeric' })} — ${ed.toLocaleDateString('es-ES', { day: '2-digit', month: 'short', year: 'numeric' })}`; + })()} + +
+
- = 0 ? '+' : ''}${experiment.actual_lift_percent}%` - : '—'} - color={experiment.actual_lift_percent != null && experiment.actual_lift_percent >= 0 ? 'emerald' : 'red'} - /> - -
+
+ + + + + + + = 0 ? '+' : ''}${experiment.actual_lift_percent.toFixed(1)}%` + : '—'} + color={experiment.actual_lift_percent != null && experiment.actual_lift_percent >= 0 ? 'emerald' : 'red'} + /> + +
+ )} {/* Calculate Results Button */} @@ -640,29 +668,35 @@ const MetricDeltaCard: React.FC<{ }> = ({ title, baseline, experimentVal, format = 'number', invertColors = false }) => { if (baseline == null || experimentVal == null) return null; const delta = baseline > 0 ? ((experimentVal - baseline) / baseline) * 100 : 0; + const absDiff = experimentVal - baseline; const isPositive = invertColors ? delta <= 0 : delta >= 0; const colorClass = isPositive ? 'text-emerald-400' : 'text-red-400'; const bgClass = isPositive ? 'bg-emerald-500/10 border-emerald-500/30' : 'bg-red-500/10 border-red-500/30'; const formatter = (val: number) => { - if (format === 'percent') return `${val}%`; - if (format === 'currency') return `€${val.toLocaleString('de-DE', { minimumFractionDigits: 0, maximumFractionDigits: 0 })}`; - return val.toLocaleString('de-DE'); + if (format === 'percent') return `${val.toFixed(2)}%`; + if (format === 'currency') return `€${Math.round(val).toLocaleString('de-DE')}`; + return Math.round(val).toLocaleString('de-DE'); }; + const formattedAbsDiff = `${absDiff >= 0 ? '+' : ''}${formatter(absDiff)}`; + return ( -
-
{title}
-
-
-
{formatter(experimentVal)}
+
+
{title}
+
+
{formatter(experimentVal)}
+
{delta > 0 ? '+' : ''}{delta.toFixed(1)}%
+
+ {formattedAbsDiff} +
-
vs {formatter(baseline)} baseline avg
+
vs {formatter(baseline)} (Baseline)
); };