- Calculate static Top 50 ranking based on 2025 Sell Out (independent of filters)
- Display trophy badge with position number for Top 50 ASINs
- Badge shows 🏆 followed by rank (1-50)
- Ranking stays static regardless of date/country filters applied
- Pre-computed ranking based on cumulative 2025 data
- Use React.lazy for DataGrid, WeeklyGrid, and TopMovers
- Add Suspense with LoadingSpinner fallback for smooth transitions
- Enables code splitting for faster initial page load
- Combined with previous O(n²) fix, should significantly improve performance
- The ads-only metadata lookup was doing a nested forEach (O(ads × sales))
- Now pre-builds asinMetadata map during sales aggregation for O(1) lookups
- This reduces complexity from O(n²) to O(n) for large datasets
- Should dramatically improve loading time for Weekly Sales tab
- Limit visible weeks to 8 (configurable MAX_VISIBLE_WEEKS)
- Add debounced search (300ms delay) to reduce re-renders
- Calculate weekTotals in single pass O(rows) instead of O(weeks × rows)
- Memoize callbacks with useCallback (handleSort, renderGrowth, handleExportExcel)
- Export still includes ALL weeks for complete data
- Refactored mergeSalesAndAdsData to aggregate by ASIN+Customer+Year+Week
- Each ASIN/Week now produces exactly one output record
- Updated pivotWeeklySalesData to use ASIN as primary key
- Fixed double-counting when same ASIN had multiple SKUs
- Added support for ads-only records (ASINs with spend but no sales)
- Changed App.tsx to use filtered ads data for accurate totals
1. Changed weekTotals to use 'rows' instead of 'filteredRows' so totals
always show complete sums regardless of search/growth filters
2. Added second pass in mergeSalesAndAdsData to include ads records for
ASINs that have ad spend but no corresponding sales data
- Added Export Excel button to download filtered data as .xlsx
- Increased table container height to maximize visible rows
- Headers remain sticky at viewport top during scroll
- Added Gaining/Dropping/Stable filter modes with configurable threshold
- Filter compares unit volume between active week and previous week
- Updated toolbar UI with growth filter dropdown and threshold input
- Removed global Units/Spend toggle.
- Added separate clickable 'Units' and 'Spend' buttons in each week header.
- Updated handleSort and sort indicators for per-metric control.
- Fixed code duplication in WeeklyGrid.tsx.
- Added Units/Spend toggle to the toolbar.
- Refactored column sorting to use the active toggle metric.
- Simplified sort cycling to just toggle direction (DESC/ASC).
- Fixed JSX structure and code duplication.
- Increased font sizes for better readability across the grid.
- Implemented multi-metric sorting (Units DESC/ASC, Spend DESC/ASC) for week columns.
- Added visual indicators for active sort metric and direction.
- Implemented pagination and local search in WeeklyGrid to handle large datasets.
- Refactored Weekly Sales tab to show units and ad spend per SKU.
- Added default Pan-EU country filter (DE, FR, IT, ES) when no country is selected.
- Update AdsRecord interface to support weekly data (year, week, cpc, ctr, acos, conversions)
- Rewrite processAdsExcel to parse multiple sheets (2025, 2026) with 12-column format
- Update mergeSalesAndAdsData to match by ASIN+Country+Year+Week
- Add Advertising Performance section to Dashboard with Ad Spend, Attributed Sales, ACOS, ROAS
- Add Ads toggle button and summary bar to DataGrid
- Add Ad Spend lines (fuchsia dashed) to weekly comparison chart
- Fix import paths in Dashboard.tsx and AdvertisingDashboard.tsx
- Added applyPanEUGrouping() helper function in dataProcessor.ts
- Groups Amazon DE/IT/FR/ES as 'Pan-EU' when no customer filter applied
- Shows individual countries when specific filter is selected
- Updated DataGrid to accept hasCustomerFilter prop
- Updated App.tsx to pass filter state to DataGrid
- Keeps Amazon UK and Amazon SC separate
- Verified with browser testing: grouping works correctly
- Updated all toLocaleString() calls to use 'de-DE' locale
- Applied to DataGrid, Dashboard, AdvertisingDashboard, TopMovers, geminiService
- Numbers now display as €1.234 instead of €1,234
- Fixed spread operator syntax errors introduced during bulk replacement
- Verified across all tabs: Dashboard, Grid, Advertising
- Changed result.sort() to result = [...result].sort() to create new array reference
- React now properly detects changes and re-renders sorted data
- All columns (Sell Out, Units, S.O. Δ%, Units Δ%) now sort correctly
- Verified with comprehensive browser testing
Adds functionality to process and display advertising data alongside sales data. This includes:
- Introducing a new `AdvertisingDashboard` component.
- Modifying `FileUpload` to accept advertising CSVs.
- Updating `App.tsx` to manage and display both sales and ad data.
- Enhancing `dataProcessor.ts` to handle advertising CSV parsing and merging.
- Adding a `MegaphoneIcon` for advertising-related UI elements.
- Defining new types for advertising records and combined KPIs.