Files
CollectFlow/src/features/commandes-auto/actions.ts
T
Claude f104719054 Interface : passage de Next.js à une SPA React (Vite + React Router)
Le serveur étant réécrit en Rust, l'interface devient une application
React 19 côté navigateur, compilée par Vite dans dist/ et servie par le
serveur Rust (STATIC_DIR). Composants, styles et logique cliente
inchangés : seule la plomberie Next.js est remplacée.

- Outillage : Vite 8, @vitejs/plugin-react, Tailwind 4 via PostCSS,
  React Router 7 (mode déclaratif), index.html, src/main.tsx, alias @/,
  proxy /api → localhost:5643 en développement, ESLint sans plugin Next.
- Adaptations (src/shims) : next/link, next/navigation (useRouter avec
  refresh, usePathname/useSearchParams suivant aussi les replaceState de
  l'interface), next-auth/react (session lue sur /api/auth/session,
  déconnexion par /api/auth/logout).
- Actions serveur → POST /api/actions/{nom} (src/lib/rpc.ts) : mêmes noms,
  mêmes signatures, mêmes types. La connexion passe par /api/auth/login.
- Pages → table des routes (src/router.tsx) : données lues sur
  /api/pages/{nom} avec Suspense (loading.tsx au premier chargement,
  page conservée pendant une navigation ou un router.refresh()),
  error.tsx en frontière d'erreur, not-found.tsx, titres d'onglet,
  pages d'administration réservées aux administrateurs.
- Suppression du code serveur Next.js (routes /api, accès base, Qlik,
  authentification, middleware…) ; types utiles à l'interface recopiés
  dans src/types/ff.ts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LG2LLJuswrrTTPKJmunEVf
2026-10-12 19:30:20 +00:00

71 lines
2.5 KiB
TypeScript

/**
* Cadencier des commandes fournisseurs — actions exécutées par le serveur
* Rust : `POST /api/actions/{nom}`.
*/
import { callAction } from "@/lib/rpc";
import { refreshPage } from "@/lib/page-data";
export type CadenceStatut = "a_commander" | "bientot" | "ok" | "inconnu";
export interface CadenceView {
id: number;
codefou: string;
nomfou: string;
site: string;
intervalleSemaines: number;
actif: boolean;
/** Date ISO de la dernière réception, ou null si inconnue */
derniereReception: string | null;
/** Date ISO d'échéance (dernière réception + X semaines), ou null */
echeance: string | null;
/** Jours restants avant l'échéance (négatif = en retard), ou null */
joursRestants: number | null;
statut: CadenceStatut;
}
/**
* Les actions Next.js de modification appelaient `revalidatePath("/commandes-auto")`,
* dont la réponse rafraîchissait la page : même effet ici après une réussite.
*/
function rafraichirSiOk<R extends { ok: boolean }>(resultat: R): R {
if (resultat.ok) refreshPage();
return resultat;
}
/** Liste des fournisseurs (référentiel) pour le sélecteur de cadence. */
export async function getFournisseursPourCadence(): Promise<{ code: string; nom: string }[]> {
return callAction("getFournisseursPourCadence", []);
}
/**
* Retourne toutes les cadences enrichies du calcul d'échéance à partir
* de la dernière réception (FF Nancy).
*/
export async function listCadences(): Promise<CadenceView[]> {
return callAction("listCadences", []);
}
export interface UpsertCadenceInput {
codefou: string;
nomfou?: string | null;
site: string;
intervalleSemaines: number;
actif?: boolean;
}
/** Crée ou met à jour la cadence d'un fournisseur sur un site. */
export async function upsertCadence(input: UpsertCadenceInput): Promise<{ ok: boolean; error?: string }> {
return rafraichirSiOk(await callAction<{ ok: boolean; error?: string }>("upsertCadence", [input]));
}
/** Active / désactive une cadence sans la supprimer. */
export async function toggleCadence(codefou: string, site: string, actif: boolean): Promise<{ ok: boolean; error?: string }> {
return rafraichirSiOk(await callAction<{ ok: boolean; error?: string }>("toggleCadence", [codefou, site, actif]));
}
/** Supprime définitivement une cadence. */
export async function removeCadence(codefou: string, site: string): Promise<{ ok: boolean; error?: string }> {
return rafraichirSiOk(await callAction<{ ok: boolean; error?: string }>("removeCadence", [codefou, site]));
}