Fix: Forecast View now respects global filters (Product Line, ASIN, etc.)

This commit is contained in:
Christian Vidal Wolf
2026-01-27 10:45:59 +01:00
parent 5cac85c693
commit 1438049c71
+27 -7
View File
@@ -65,12 +65,32 @@ const ForecastView: React.FC<ForecastViewProps> = ({ data, filters, top50Ranking
return MONTH_ORDER.slice(0, lastDataMonthIdx + 1); return MONTH_ORDER.slice(0, lastDataMonthIdx + 1);
}, [filters.month, lastDataMonthIdx]); }, [filters.month, lastDataMonthIdx]);
// Global Aggregate Data // Base Global Filtering (Line, ASIN, SKU, Title)
const baseFilteredData = useMemo(() => {
let result = data;
if (filters.line && filters.line.length > 0) {
result = result.filter(p => filters.line.includes(p.line));
}
if (filters.asin && filters.asin.length > 0) {
result = result.filter(p => filters.asin.includes(p.asin));
}
if (filters.sku && filters.sku.length > 0) {
result = result.filter(p => filters.sku.includes(p.sku));
}
if (filters.title && filters.title.length > 0) {
result = result.filter(p => filters.title.includes(p.title));
}
return result;
}, [data, filters.line, filters.asin, filters.sku, filters.title]);
// Global Aggregate Data (respects filters)
const globalMonthlyData = useMemo(() => { const globalMonthlyData = useMemo(() => {
return MONTH_ORDER.map(m => { return MONTH_ORDER.map(m => {
let forecast = 0; let forecast = 0;
let actual = 0; let actual = 0;
data.forEach(p => { baseFilteredData.forEach(p => {
const monthPoint = p.monthlyData.find(md => md.month === m); const monthPoint = p.monthlyData.find(md => md.month === m);
if (monthPoint) { if (monthPoint) {
forecast += monthPoint.forecastUnits; forecast += monthPoint.forecastUnits;
@@ -79,7 +99,7 @@ const ForecastView: React.FC<ForecastViewProps> = ({ data, filters, top50Ranking
}); });
return { name: m, Forecast: forecast, Actual: actual }; return { name: m, Forecast: forecast, Actual: actual };
}); });
}, [data]); }, [baseFilteredData]);
const globalSummary = useMemo(() => { const globalSummary = useMemo(() => {
let periodForecast = 0; let periodForecast = 0;
@@ -87,7 +107,7 @@ const ForecastView: React.FC<ForecastViewProps> = ({ data, filters, top50Ranking
let annualForecast = 0; let annualForecast = 0;
let annualActual = 0; let annualActual = 0;
data.forEach(p => { baseFilteredData.forEach(p => {
annualForecast += p.annualForecast; annualForecast += p.annualForecast;
p.monthlyData.forEach(md => { p.monthlyData.forEach(md => {
annualActual += md.actualUnits; annualActual += md.actualUnits;
@@ -109,10 +129,10 @@ const ForecastView: React.FC<ForecastViewProps> = ({ data, filters, top50Ranking
annualActual, annualActual,
annualFulfillment annualFulfillment
}; };
}, [data, activeMonths]); }, [baseFilteredData, activeMonths]);
const filteredProducts = useMemo(() => { const filteredProducts = useMemo(() => {
let result = data; let result = baseFilteredData;
if (searchTerm) { if (searchTerm) {
const s = searchTerm.toLowerCase(); const s = searchTerm.toLowerCase();
@@ -129,7 +149,7 @@ const ForecastView: React.FC<ForecastViewProps> = ({ data, filters, top50Ranking
} }
return result; return result;
}, [data, searchTerm, showOnlyTop50, top50Mode, top50Ranking]); }, [baseFilteredData, searchTerm, showOnlyTop50, top50Mode, top50Ranking]);
const sortedProducts = useMemo(() => { const sortedProducts = useMemo(() => {
const result = [...filteredProducts]; const result = [...filteredProducts];