From 83d101ddc13ae2a1d1af00549eae299bf2d5ffae Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Fri, 3 Apr 2026 10:46:09 +0200 Subject: [PATCH] feat: add interactive client component for Hit Parade data visualization with sorting, filtering, and date range controls --- src/app/(dashboard)/hit-parade/client.tsx | 30 +++++++++++------------ src/app/(dashboard)/settings/page.tsx | 2 +- src/app/api/ai/analyze/route.ts | 2 +- src/app/api/ai/batch-analyze/route.ts | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/app/(dashboard)/hit-parade/client.tsx b/src/app/(dashboard)/hit-parade/client.tsx index 53015df..336dcc8 100644 --- a/src/app/(dashboard)/hit-parade/client.tsx +++ b/src/app/(dashboard)/hit-parade/client.tsx @@ -194,16 +194,16 @@ export function HitParadeClient({ dateDebut, dateFin, pivotted }: Props) { - % Marge + - % Marge + - % Marge + @@ -218,36 +218,36 @@ export function HitParadeClient({ dateDebut, dateFin, pivotted }: Props) { {row.ca292 > 0 ? formatCA(row.ca292) : —} - - {row.stock292 > 0 ? formatQte(row.stock292) : —} - {row.ca292 > 0 ? formatPct(row.ca292, row.marge292) : ""} + + {row.stock292 > 0 ? formatQte(row.stock292) : —} + {row.qte579 > 0 ? formatQte(row.qte579) : —} {row.ca579 > 0 ? formatCA(row.ca579) : —} - - {row.stock579 > 0 ? formatQte(row.stock579) : —} - {row.ca579 > 0 ? formatPct(row.ca579, row.marge579) : ""} + + {row.stock579 > 0 ? formatQte(row.stock579) : —} + {row.qteTotal > 0 ? formatQte(row.qteTotal) : —} {row.caTotal > 0 ? formatCA(row.caTotal) : —} - - {row.stockTotal > 0 ? formatQte(row.stockTotal) : 0} - {row.caTotal > 0 ? formatPct(row.caTotal, row.margeTotal) : ""} + + {row.stockTotal > 0 ? formatQte(row.stockTotal) : 0} + ))} @@ -258,16 +258,16 @@ export function HitParadeClient({ dateDebut, dateFin, pivotted }: Props) { {formatQte(totals.qte292)} {formatCA(totals.ca292)} - {formatQte(totals.stock292)} {formatPct(totals.ca292, totals.marge292)} + {formatQte(totals.stock292)} {formatQte(totals.qte579)} {formatCA(totals.ca579)} - {formatQte(totals.stock579)} {formatPct(totals.ca579, totals.marge579)} + {formatQte(totals.stock579)} {formatQte(totals.qteTotal)} {formatCA(totals.caTotal)} - {formatQte(totals.stockTotal)} {formatPct(totals.caTotal, totals.margeTotal)} + {formatQte(totals.stockTotal)} diff --git a/src/app/(dashboard)/settings/page.tsx b/src/app/(dashboard)/settings/page.tsx index 55c7d78..9e8dca3 100644 --- a/src/app/(dashboard)/settings/page.tsx +++ b/src/app/(dashboard)/settings/page.tsx @@ -118,7 +118,7 @@ export default function SettingsPage() { const [dbError, setDbError] = useState(null); const [saveStatus, setSaveStatus] = useState<"idle" | "saving" | "saved">("idle"); const [models, setModels] = useState([]); - const [selectedModel, setSelectedModel] = useState("google/gemini-flash-1.5"); + const [selectedModel, setSelectedModel] = useState("google/gemini-2.0-flash-001"); const [modelsStatus, setModelsStatus] = useState<"idle" | "loading" | "ok" | "error">("idle"); const [isMounted, setIsMounted] = useState(false); diff --git a/src/app/api/ai/analyze/route.ts b/src/app/api/ai/analyze/route.ts index 91cd9d8..c2dd588 100644 --- a/src/app/api/ai/analyze/route.ts +++ b/src/app/api/ai/analyze/route.ts @@ -13,7 +13,7 @@ const SITE_LABELS: Record = { "292": "Frouard", "579": "Houdemon export async function POST(req: NextRequest) { const config = await getSavedDatabaseConfig(); const apiKey = process.env.OPENROUTER_API_KEY || config?.openRouterKey; - const model = config?.openRouterModel || "google/gemini-flash-1.5"; + const model = config?.openRouterModel || "google/gemini-2.0-flash-001"; if (!apiKey) { console.error("[AI] OPENROUTER_API_KEY is missing."); diff --git a/src/app/api/ai/batch-analyze/route.ts b/src/app/api/ai/batch-analyze/route.ts index 40a085f..88f4fba 100644 --- a/src/app/api/ai/batch-analyze/route.ts +++ b/src/app/api/ai/batch-analyze/route.ts @@ -36,7 +36,7 @@ const BatchAnalyzeSchema = z.object({ export async function POST(req: NextRequest) { const config = await getSavedDatabaseConfig(); const apiKey = process.env.OPENROUTER_API_KEY || config?.openRouterKey; - const model = config?.openRouterModel || "google/gemini-flash-1.5"; + const model = config?.openRouterModel || "google/gemini-2.0-flash-001"; if (!apiKey) { console.error("[batch-analyze] API key manquante.");