From 2ae7fb301c6e798e1ffaa16728f293870d1cf6ef Mon Sep 17 00:00:00 2001 From: le king fu Date: Sun, 22 Feb 2026 10:09:14 -0500 Subject: [PATCH] fix: decouple dynamic report from global page date filters The dynamic report now relies exclusively on its own panel filters instead of inheriting the global period selector date range. Co-Authored-By: Claude Opus 4.6 --- src/components/reports/DynamicReport.tsx | 6 +--- src/components/reports/DynamicReportPanel.tsx | 8 ++--- src/hooks/useReports.ts | 3 +- src/pages/ReportsPage.tsx | 2 -- src/services/reportService.ts | 35 ++----------------- 5 files changed, 7 insertions(+), 47 deletions(-) diff --git a/src/components/reports/DynamicReport.tsx b/src/components/reports/DynamicReport.tsx index 4e8ad1e..3cd947b 100644 --- a/src/components/reports/DynamicReport.tsx +++ b/src/components/reports/DynamicReport.tsx @@ -12,11 +12,9 @@ interface DynamicReportProps { config: PivotConfig; result: PivotResult; onConfigChange: (config: PivotConfig) => void; - dateFrom?: string; - dateTo?: string; } -export default function DynamicReport({ config, result, onConfigChange, dateFrom, dateTo }: DynamicReportProps) { +export default function DynamicReport({ config, result, onConfigChange }: DynamicReportProps) { const { t } = useTranslation(); const [viewMode, setViewMode] = useState("table"); const [fullscreen, setFullscreen] = useState(false); @@ -101,8 +99,6 @@ export default function DynamicReport({ config, result, onConfigChange, dateFrom diff --git a/src/components/reports/DynamicReportPanel.tsx b/src/components/reports/DynamicReportPanel.tsx index c443b20..e2b3074 100644 --- a/src/components/reports/DynamicReportPanel.tsx +++ b/src/components/reports/DynamicReportPanel.tsx @@ -10,11 +10,9 @@ const ALL_MEASURES: PivotMeasureId[] = ["periodic", "ytd"]; interface DynamicReportPanelProps { config: PivotConfig; onChange: (config: PivotConfig) => void; - dateFrom?: string; - dateTo?: string; } -export default function DynamicReportPanel({ config, onChange, dateFrom, dateTo }: DynamicReportPanelProps) { +export default function DynamicReportPanel({ config, onChange }: DynamicReportPanelProps) { const { t } = useTranslation(); const [menuTarget, setMenuTarget] = useState<{ id: string; type: "field" | "measure"; x: number; y: number } | null>(null); const [filterValues, setFilterValues] = useState>({}); @@ -36,12 +34,12 @@ export default function DynamicReportPanel({ config, onChange, dateFrom, dateTo useEffect(() => { for (const fieldId of filterFieldIds) { if (!filterValues[fieldId]) { - getDynamicFilterValues(fieldId as PivotFieldId, dateFrom, dateTo).then((vals) => { + getDynamicFilterValues(fieldId as PivotFieldId).then((vals) => { setFilterValues((prev) => ({ ...prev, [fieldId]: vals })); }); } } - }, [filterFieldIds.join(","), dateFrom, dateTo]); + }, [filterFieldIds.join(",")]); // Close menu on outside click useEffect(() => { diff --git a/src/hooks/useReports.ts b/src/hooks/useReports.ts index 250a50c..7973c66 100644 --- a/src/hooks/useReports.ts +++ b/src/hooks/useReports.ts @@ -191,8 +191,7 @@ export function useReports() { dispatch({ type: "SET_PIVOT_RESULT", payload: { rows: [], columnValues: [], dimensionLabels: {} } }); break; } - const { dateFrom, dateTo } = computeDateRange(period, customFrom, customTo); - const data = await getDynamicReportData(pivotCfg, dateFrom, dateTo); + const data = await getDynamicReportData(pivotCfg); if (fetchId !== fetchIdRef.current) return; dispatch({ type: "SET_PIVOT_RESULT", payload: data }); break; diff --git a/src/pages/ReportsPage.tsx b/src/pages/ReportsPage.tsx index f185871..1d74a7b 100644 --- a/src/pages/ReportsPage.tsx +++ b/src/pages/ReportsPage.tsx @@ -138,8 +138,6 @@ export default function ReportsPage() { config={state.pivotConfig} result={state.pivotResult} onConfigChange={setPivotConfig} - dateFrom={dateFrom} - dateTo={dateTo} /> )} diff --git a/src/services/reportService.ts b/src/services/reportService.ts index 5d7a899..16ca28c 100644 --- a/src/services/reportService.ts +++ b/src/services/reportService.ts @@ -168,8 +168,6 @@ function needsCategoryJoin(fields: PivotFieldId[]): boolean { export async function getDynamicReportData( config: PivotConfig, - dateFrom?: string, - dateTo?: string, ): Promise { const db = await getDb(); @@ -202,17 +200,6 @@ export async function getDynamicReportData( const params: unknown[] = []; let paramIndex = 1; - if (dateFrom) { - whereClauses.push(`t.date >= $${paramIndex}`); - params.push(dateFrom); - paramIndex++; - } - if (dateTo) { - whereClauses.push(`t.date <= $${paramIndex}`); - params.push(dateTo); - paramIndex++; - } - // Apply filter values (include / exclude) for (const fieldId of filterFields) { const entry = config.filters[fieldId]; @@ -330,37 +317,19 @@ export async function getDynamicReportData( export async function getDynamicFilterValues( fieldId: PivotFieldId, - dateFrom?: string, - dateTo?: string, ): Promise { const db = await getDb(); const def = FIELD_SQL[fieldId]; const useCatJoin = needsCategoryJoin([fieldId]); - const whereClauses: string[] = []; - const params: unknown[] = []; - let paramIndex = 1; - - if (dateFrom) { - whereClauses.push(`t.date >= $${paramIndex}`); - params.push(dateFrom); - paramIndex++; - } - if (dateTo) { - whereClauses.push(`t.date <= $${paramIndex}`); - params.push(dateTo); - paramIndex++; - } - - const whereSQL = whereClauses.length > 0 ? `WHERE ${whereClauses.join(" AND ")}` : ""; const joinSQL = useCatJoin ? `LEFT JOIN categories c ON t.category_id = c.id LEFT JOIN categories parent_cat ON c.parent_id = parent_cat.id` : ""; const rows = await db.select>( - `SELECT DISTINCT ${def.select} AS val FROM transactions t ${joinSQL} ${whereSQL} ORDER BY val`, - params, + `SELECT DISTINCT ${def.select} AS val FROM transactions t ${joinSQL} ORDER BY val`, + [], ); return rows.map((r) => r.val); }