mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-22 22:48:08 +02:00
Chaque page reprend le socle du lot 2 : en-tête avec une phrase d'explication, couleurs du thème (plus de pages figées en blanc), textes de 12 px minimum, noms de magasins, infobulles sur le jargon, retours par toast / confirmation, états vides et d'erreur expliqués. - Accueil : CA, tickets et panier moyen d'hier vs N-1, par magasin, top 10 avec lien vers la fiche produit. - Révision d'assortiment : un seul endroit pour enregistrer et exporter (menu Export unique, mêmes droits pour tous), annulation confirmée, sens des gammes affiché partout, magasin choisi en un clic, colonnes nommées en clair, bandeau de progression au lieu de la fenêtre floue, droits lus côté serveur, ligne sélectionnée opaque sur les colonnes figées. - Recherche produit, Stocks à surveiller (export FF inchangé), Meilleures ventes, Ventes par mois (dernier mois complet par défaut), Publicités, Commandes fournisseurs, Historique, Paramètres (onglets), Synchronisation et Connexion migrés sur DataTable / Tabs / Card. - Le nom de l'utilisateur est transmis à la session (affiché dans l'en-tête). - Composants devenus inutiles supprimés (anciennes fenêtres modales, export-dropdown, financial-cell, supplier-selection). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AcA129WzGTH6zxPHFBGWmn
81 lines
3.3 KiB
TypeScript
81 lines
3.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { PackageSearch, SearchX } from "lucide-react";
|
|
import { getProduitFiche, getProduitFicheByCodeCentrale } from "@/features/produits/api/get-produit-fiche";
|
|
import { PageHeader } from "@/components/ui/page-header";
|
|
import { EmptyState } from "@/components/ui/states";
|
|
import { Terme } from "@/components/ui/tooltip";
|
|
import { ProduitSearchBar } from "./search-bar";
|
|
import { ProduitResults } from "./results";
|
|
import { ProduitFicheView } from "./fiche";
|
|
|
|
export const metadata: Metadata = { title: "Recherche produit" };
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
/**
|
|
* Recherche produit — **Qlik d'abord**, catalogue FF Nancy ensuite.
|
|
*
|
|
* - `?q=…` → liste de résultats (chargée côté client : l'extraction Qlik
|
|
* prend plusieurs secondes, on ne bloque pas le rendu serveur)
|
|
* - `?codein=…` → fiche d'un produit de notre catalogue (URL partageable)
|
|
* - `?cc=…` → fiche d'un produit du réseau par son code centrale, qu'il
|
|
* soit référencé chez nous ou non
|
|
*/
|
|
export default async function ProduitsPage(props: {
|
|
searchParams: Promise<{ q?: string; codein?: string; cc?: string }>;
|
|
}) {
|
|
const searchParams = await props.searchParams;
|
|
const q = (searchParams.q ?? "").trim();
|
|
const codein = (searchParams.codein ?? "").trim();
|
|
const codeCentrale = (searchParams.cc ?? "").trim();
|
|
|
|
const fiche = codein
|
|
? await getProduitFiche(codein)
|
|
: codeCentrale
|
|
? await getProduitFicheByCodeCentrale(codeCentrale)
|
|
: null;
|
|
const ficheDemandee = Boolean(codein || codeCentrale);
|
|
|
|
return (
|
|
<div className="mx-auto w-full max-w-screen-2xl">
|
|
<PageHeader
|
|
icon={PackageSearch}
|
|
title="Recherche produit"
|
|
description={
|
|
<>
|
|
Cherchez un produit par son nom ou son code, puis comparez ses ventes à celles des
|
|
magasins du <Terme id="reseau">réseau.</Terme>
|
|
</>
|
|
}
|
|
/>
|
|
|
|
<div className="space-y-6">
|
|
{/* key : remonte le champ quand l'URL change (retour arrière, lien partagé) */}
|
|
<ProduitSearchBar key={q} initialQuery={q} />
|
|
|
|
{ficheDemandee && !fiche && (
|
|
<EmptyState
|
|
icon={SearchX}
|
|
title="Produit introuvable"
|
|
description={
|
|
codein ? (
|
|
<>Aucun produit de notre catalogue ne porte le code article <span className="font-mono">{codein}</span>.</>
|
|
) : (
|
|
<>
|
|
Le code centrale <span className="font-mono">{codeCentrale}</span> n'est ni dans notre
|
|
catalogue, ni dans les données du réseau déjà chargées. Relancez une recherche par le nom
|
|
ou le code du produit.
|
|
</>
|
|
)
|
|
}
|
|
/>
|
|
)}
|
|
|
|
{fiche && <ProduitFicheView fiche={fiche} backQuery={q} />}
|
|
|
|
{!ficheDemandee && <ProduitResults query={q} />}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|