Checkpoint: Ajout du téléchargement groupé ZIP dans Factures BAP, bouton Re-générer dans Historique BAP, filtres Validées BAP / En attente BAP dans Factures BAP
This commit is contained in:
@@ -51,7 +51,22 @@ function downloadBapPdf(
|
||||
export default function BapHistory() {
|
||||
const { data: entries, isLoading, refetch } = trpc.bapHistory.getAll.useQuery();
|
||||
const deleteMutation = trpc.bapHistory.delete.useMutation();
|
||||
const regenerateMutation = trpc.bapHistory.regenerate.useMutation();
|
||||
const [search, setSearch] = useState("");
|
||||
const [regeneratingId, setRegeneratingId] = useState<number | null>(null);
|
||||
|
||||
const handleRegenerate = async (id: number) => {
|
||||
setRegeneratingId(id);
|
||||
try {
|
||||
const result = await regenerateMutation.mutateAsync({ id });
|
||||
toast.success('PDF re-généré avec succès');
|
||||
refetch();
|
||||
} catch (err: any) {
|
||||
toast.error(err.message || 'Erreur lors de la re-génération du PDF');
|
||||
} finally {
|
||||
setRegeneratingId(null);
|
||||
}
|
||||
};
|
||||
|
||||
const filtered = (entries || []).filter((e) => {
|
||||
const q = search.toLowerCase();
|
||||
@@ -255,19 +270,43 @@ export default function BapHistory() {
|
||||
</Button>
|
||||
</div>
|
||||
) : entry.exportPath ? (
|
||||
<div className="flex items-center gap-1 text-orange-600">
|
||||
<FolderOpen className="h-3.5 w-3.5" />
|
||||
<span className="text-xs truncate max-w-[100px]" title={entry.exportPath}>
|
||||
Dossier
|
||||
</span>
|
||||
<div className="flex items-center gap-1">
|
||||
<div className="flex items-center gap-1 text-orange-600">
|
||||
<FolderOpen className="h-3.5 w-3.5" />
|
||||
<span className="text-xs truncate max-w-[80px]" title={entry.exportPath}>Dossier</span>
|
||||
</div>
|
||||
{/* Bouton Re-générer si le PDF de dossier n'est plus accessible */}
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="h-7 px-2 text-violet-600 hover:text-violet-700 hover:bg-violet-50"
|
||||
onClick={() => handleRegenerate(entry.id)}
|
||||
disabled={regeneratingId === entry.id}
|
||||
title="Re-générer le PDF annoté"
|
||||
>
|
||||
{regeneratingId === entry.id ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <RefreshCw className="h-3.5 w-3.5" />}
|
||||
</Button>
|
||||
</div>
|
||||
) : (
|
||||
<span className="text-muted-foreground text-xs">—</span>
|
||||
<div className="flex items-center gap-1">
|
||||
<span className="text-muted-foreground text-xs">—</span>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="h-7 px-2 text-violet-600 hover:text-violet-700 hover:bg-violet-50"
|
||||
onClick={() => handleRegenerate(entry.id)}
|
||||
disabled={regeneratingId === entry.id}
|
||||
title="Re-générer le PDF annoté"
|
||||
>
|
||||
{regeneratingId === entry.id ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <RefreshCw className="h-3.5 w-3.5 mr-1" />}
|
||||
<span className="text-xs">Re-générer</span>
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="flex items-center gap-1">
|
||||
{/* Bouton Réexporter */}
|
||||
{/* Bouton Réexporter (re-télécharger) */}
|
||||
{entry.pdfUrl && (
|
||||
<Button
|
||||
variant="ghost"
|
||||
@@ -280,6 +319,19 @@ export default function BapHistory() {
|
||||
<span className="text-xs">Réexporter</span>
|
||||
</Button>
|
||||
)}
|
||||
{/* Bouton Re-générer (recréer le PDF annoté depuis la base) */}
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="h-7 px-2 text-violet-600 hover:text-violet-700 hover:bg-violet-50"
|
||||
onClick={() => handleRegenerate(entry.id)}
|
||||
disabled={regeneratingId === entry.id}
|
||||
title="Re-générer le PDF annoté depuis les données en base"
|
||||
>
|
||||
{regeneratingId === entry.id
|
||||
? <Loader2 className="h-3.5 w-3.5 animate-spin" />
|
||||
: <RefreshCw className="h-3.5 w-3.5" />}
|
||||
</Button>
|
||||
{/* Bouton Supprimer */}
|
||||
<Button
|
||||
variant="ghost"
|
||||
|
||||
Reference in New Issue
Block a user