feat: remove MKT and Experiments tabs and all related code

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Christian Vidal Wolf
2026-06-12 08:29:47 +02:00
co-authored by Claude Sonnet 4.6
parent 9f9c0c2975
commit 76d901fcde
25 changed files with 11 additions and 4985 deletions
+5 -91
View File
@@ -1,10 +1,8 @@
import React from 'react';
import { WeeklyPivotRow } from '../services/dataProcessor';
import { ActiveExperiment } from '../types';
import { Top50Badge } from './Top50Badge';
import { StockBadge } from './StockBadge';
import { BuyBoxWarningBadge } from './BuyBoxWarningBadge';
import { ExperimentBadge } from './ExperimentBadge';
import { VendorStockBadge } from './VendorStockBadge';
import { MetricDetailTooltip } from './MetricDetailTooltip';
@@ -26,61 +24,12 @@ interface WeeklyRowProps {
velocityMap?: Map<string, number>;
buyBoxLostMap?: Map<string, { countries: string[]; reasons: Record<string, string> }>;
primaryMetric: 'units' | 'revenue';
experimentMap?: Map<string, ActiveExperiment[]>;
onOpenExperiment?: (experimentId: string) => void;
}
// Helper to get 4-week baseline prior to the start date
const getBaselineMetrics = (row: WeeklyPivotRow, weeks: string[], expStartDate: string) => {
const startDate = new Date(expStartDate);
const jan1 = new Date(startDate.getFullYear(), 0, 1);
const dayOfYear = Math.floor((startDate.getTime() - jan1.getTime()) / 86400000) + 1;
const weekNum = Math.ceil((dayOfYear + jan1.getDay()) / 7);
const startWeekStr = `${startDate.getFullYear()}-${String(weekNum).padStart(2, '0')}`;
const startIdx = weeks.indexOf(startWeekStr);
if (startIdx === -1) return null;
let u = 0, r = 0, g = 0, weeksCount = 0;
for (let i = 1; i <= 4; i++) {
const w = weeks[startIdx + i];
if (w) {
u += (row.unitsByWeek[w] || 0);
r += (row.revenueByWeek[w] || 0);
g += (row.gvByWeek?.[w] || 0);
weeksCount++;
}
}
if (weeksCount === 0) return null;
return {
units: u / weeksCount,
revenue: r / weeksCount,
gv: g / weeksCount,
cvr: g > 0 ? (u / g) * 100 : 0
};
};
// Helper to check if a week overlaps with an experiment's date range
const isWeekInExperiment = (weekKey: string, exp: ActiveExperiment): boolean => {
if (!weekKey || !weekKey.includes('-')) return false;
const [yearStr, weekStr] = weekKey.split('-');
const year = parseInt(yearStr);
const week = parseInt(weekStr);
const weekStart = new Date(year, 0, 1 + (week - 1) * 7);
const weekEnd = new Date(weekStart.getTime() + 6 * 86400000);
const expStart = new Date(exp.start_date);
const expEnd = exp.end_date ? new Date(exp.end_date) : new Date();
return weekStart <= expEnd && weekEnd >= expStart;
};
export const WeeklyRow: React.FC<WeeklyRowProps> = React.memo(({
row, weeks, onDrillDown, stockMap, top50Ranking, top50Mode, sortConfig,
renderGrowth, customerFilters, vendorStockMap, velocityMap, buyBoxLostMap,
primaryMetric, experimentMap, onOpenExperiment
export const WeeklyRow: React.FC<WeeklyRowProps> = React.memo(({
row, weeks, onDrillDown, stockMap, top50Ranking, top50Mode, sortConfig,
renderGrowth, customerFilters, vendorStockMap, velocityMap, buyBoxLostMap,
primaryMetric
}) => {
const ranks: { rank: number; label: string; theme: 'amber' | 'blue' | 'indigo' }[] = [];
const asin = row.asin.trim().toUpperCase();
@@ -126,12 +75,6 @@ export const WeeklyRow: React.FC<WeeklyRowProps> = React.memo(({
internalStock={stockMap?.get(row.sku?.replace(/(DE|EN)$/i, ''))}
/>
<BuyBoxWarningBadge asin={asin} buyBoxLostMap={buyBoxLostMap} />
{experimentMap && (
<ExperimentBadge
experiments={experimentMap.get(asin) || []}
onClick={onOpenExperiment}
/>
)}
</div>
<span className="text-[9px] text-fuchsia-400/80 font-bold uppercase tracking-widest">{row.line}</span>
</div>
@@ -158,33 +101,8 @@ export const WeeklyRow: React.FC<WeeklyRowProps> = React.memo(({
const cvr = gv > 0 ? (val / gv) * 100 : 0;
const prevCvr = prevGv > 0 ? (prevVal / prevGv) * 100 : 0;
const experimentsInWeek = experimentMap?.get(asin)?.filter(exp => isWeekInExperiment(week, exp)) || [];
const hasActiveExperiment = experimentsInWeek.length > 0;
let highlightClass = '';
let experimentDelta: number | null = null;
let baselineValue: number | null = null;
if (hasActiveExperiment) {
const primaryExp = experimentsInWeek[0];
if (primaryExp.type === 'pricing') highlightClass = 'bg-amber-500/10 border-t border-amber-500/20';
else if (primaryExp.type === 'advertising') highlightClass = 'bg-rose-500/10 border-t border-rose-500/20';
else if (primaryExp.type === 'content') highlightClass = 'bg-emerald-500/10 border-t border-emerald-500/20';
else highlightClass = 'bg-indigo-500/10 border-t border-indigo-500/20';
const baseline = getBaselineMetrics(row, weeks, primaryExp.start_date);
if (baseline) {
const myMetric = primaryMetric === 'units' ? val : revenue;
const baseMetric = primaryMetric === 'units' ? baseline.units : baseline.revenue;
if (baseMetric > 0) {
experimentDelta = ((myMetric - baseMetric) / baseMetric) * 100;
baselineValue = baseMetric;
}
}
}
return (
<td key={week} className={`p-3 py-2 text-center border-r border-white/5 align-middle ${sortConfig?.key === week ? 'bg-white/[0.01]' : ''} ${highlightClass}`}>
<td key={week} className={`p-3 py-2 text-center border-r border-white/5 align-middle ${sortConfig?.key === week ? 'bg-white/[0.01]' : ''}`}>
{primaryMetric === 'units' ? (
<MetricDetailTooltip
currentValue={val}
@@ -195,8 +113,6 @@ export const WeeklyRow: React.FC<WeeklyRowProps> = React.memo(({
yoyWeekLabel={`Week ${weekNum} (${parseInt(year) - 1})`}
metricName="Units"
metricColor="text-white"
experimentDelta={experimentDelta}
baselineValue={baselineValue}
>
<div className="flex items-center gap-1">
<span className={`text-sm font-bold ${val > 0 ? (sortConfig?.key === week && sortConfig.metric === 'units' ? 'text-indigo-400' : 'text-white') : 'text-slate-700'}`}>
@@ -216,8 +132,6 @@ export const WeeklyRow: React.FC<WeeklyRowProps> = React.memo(({
metricName="Revenue"
metricColor="text-white"
formatValue={(v) => `${v.toLocaleString('de-DE', { minimumFractionDigits: 0, maximumFractionDigits: 0 })}`}
experimentDelta={experimentDelta}
baselineValue={baselineValue}
>
<div className="flex items-center gap-1">
<span className={`text-sm font-bold ${revenue > 0 ? (sortConfig?.key === week && sortConfig.metric === 'revenue' ? 'text-amber-400' : 'text-white') : 'text-slate-700'}`}>