diff --git a/components/NumericColumnFilter.tsx b/components/NumericColumnFilter.tsx index 0b07f28..70a8c63 100644 --- a/components/NumericColumnFilter.tsx +++ b/components/NumericColumnFilter.tsx @@ -2,7 +2,7 @@ import React, { useState, useRef, useEffect } from 'react'; export interface NumericFilterConfig { week: string; - metric: 'units' | 'spend' | 'gv'; + metric: 'units' | 'spend' | 'revenue' | 'gv'; operator: '=' | '>' | '>=' | '<' | '<=' | 'between'; value: number; value2?: number; @@ -10,7 +10,7 @@ export interface NumericFilterConfig { interface NumericColumnFilterProps { week: string; - metric: 'units' | 'spend' | 'gv'; + metric: 'units' | 'spend' | 'revenue' | 'gv'; currentFilter: NumericFilterConfig | null; onFilterChange: (filter: NumericFilterConfig | null) => void; accentColor?: 'indigo' | 'amber' | 'teal'; @@ -127,8 +127,8 @@ export const NumericColumnFilter: React.FC = ({ setIsOpen(!isOpen); }} className={`flex items-center justify-center w-4 h-4 rounded text-[9px] font-black transition-all ${isActive - ? colors.active - : `text-slate-600 ${colors.hover}` + ? colors.active + : `text-slate-600 ${colors.hover}` }`} title={isActive ? `${metric}: ${operatorSymbol} ${currentFilter?.value}${currentFilter?.value2 ? ` - ${currentFilter.value2}` : ''}` : `Filter ${metric}`} > diff --git a/components/WeeklyGrid.tsx b/components/WeeklyGrid.tsx index b08cb15..cb9836c 100644 --- a/components/WeeklyGrid.tsx +++ b/components/WeeklyGrid.tsx @@ -35,7 +35,7 @@ interface WeeklyGridProps { type SortConfig = { key: string; // weekKey or 'rank' direction: 'asc' | 'desc'; - metric: 'units' | 'spend' | 'rank' | 'gv'; + metric: 'units' | 'spend' | 'revenue' | 'rank' | 'gv'; } | null; const ROWS_PER_PAGE = 50; @@ -370,11 +370,11 @@ const WeeklyGrid: React.FC = ({ const [numericFilters, setNumericFilters] = useState([]); // Helper to get/set filter for a specific week+metric - const getNumericFilter = useCallback((week: string, metric: 'units' | 'spend' | 'gv') => { + const getNumericFilter = useCallback((week: string, metric: 'units' | 'spend' | 'revenue' | 'gv') => { return numericFilters.find(f => f.week === week && f.metric === metric) || null; }, [numericFilters]); - const setNumericFilter = useCallback((filter: NumericFilterConfig | null, week: string, metric: 'units' | 'spend' | 'gv') => { + const setNumericFilter = useCallback((filter: NumericFilterConfig | null, week: string, metric: 'units' | 'spend' | 'revenue' | 'gv') => { setNumericFilters(prev => { // Remove existing filter for this week+metric const filtered = prev.filter(f => !(f.week === week && f.metric === metric)); @@ -400,7 +400,7 @@ const WeeklyGrid: React.FC = ({ setDisplayCount(50); }, [debouncedSearch, showOnlyTop50, top50Mode]); - const handleSort = useCallback((weekKey: string, metric: 'units' | 'spend' | 'rank' | 'gv') => { + const handleSort = useCallback((weekKey: string, metric: 'units' | 'spend' | 'revenue' | 'rank' | 'gv') => { setSortConfig(prev => { if (prev?.key === weekKey && prev.metric === metric) { return { key: weekKey, direction: prev.direction === 'asc' ? 'desc' : 'asc', metric }; @@ -559,6 +559,8 @@ const WeeklyGrid: React.FC = ({ value = row.unitsByWeek[filter.week] || 0; } else if (filter.metric === 'spend') { value = row.spendByWeek[filter.week] || 0; + } else if (filter.metric === 'revenue') { + value = row.revenueByWeek?.[filter.week] || 0; } else if (filter.metric === 'gv') { value = row.gvByWeek?.[filter.week] || 0; } @@ -590,7 +592,8 @@ const WeeklyGrid: React.FC = ({ }); } else { const metricKey = metric === 'units' ? 'unitsByWeek' : - metric === 'spend' ? 'spendByWeek' : 'gvByWeek'; + metric === 'spend' ? 'spendByWeek' : + metric === 'revenue' ? 'revenueByWeek' : 'gvByWeek'; result.sort((a, b) => { const valA = a[metricKey][weekKey] || 0; @@ -889,22 +892,22 @@ const WeeklyGrid: React.FC = ({
handleSort(week, 'units')} + onClick={() => handleSort(week, primaryMetric === 'units' ? 'units' : 'revenue')} className="text-[9px] cursor-pointer hover:text-indigo-300" > - Units + {primaryMetric === 'units' ? 'Units' : 'Revenue'} - {sortConfig?.key === week && sortConfig.metric === 'units' && ( + {sortConfig?.key === week && sortConfig.metric === (primaryMetric === 'units' ? 'units' : 'revenue') && ( {sortConfig.direction === 'asc' ? '↑' : '↓'} )} setNumericFilter(f, week, 'units')} + metric={primaryMetric === 'units' ? 'units' : 'revenue'} + currentFilter={getNumericFilter(week, primaryMetric === 'units' ? 'units' : 'revenue')} + onFilterChange={(f) => setNumericFilter(f, week, primaryMetric === 'units' ? 'units' : 'revenue')} accentColor="indigo" />