feat: add transaction deduplication feature and enhance filtering options in settings and transactions pages
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import {
|
||||
Card,
|
||||
@@ -19,19 +20,39 @@ import {
|
||||
AlertDialogTitle,
|
||||
AlertDialogTrigger,
|
||||
} from "@/components/ui/alert-dialog";
|
||||
import { Trash2, Tags } from "lucide-react";
|
||||
import { Trash2, Tags, Copy } from "lucide-react";
|
||||
|
||||
interface DangerZoneCardProps {
|
||||
categorizedCount: number;
|
||||
onClearCategories: () => void;
|
||||
onResetData: () => void;
|
||||
onDeduplicate: () => Promise<{ deletedCount: number; duplicatesFound: number }>;
|
||||
}
|
||||
|
||||
export function DangerZoneCard({
|
||||
categorizedCount,
|
||||
onClearCategories,
|
||||
onResetData,
|
||||
onDeduplicate,
|
||||
}: DangerZoneCardProps) {
|
||||
const [deduplicating, setDeduplicating] = useState(false);
|
||||
|
||||
const handleDeduplicate = async () => {
|
||||
setDeduplicating(true);
|
||||
try {
|
||||
const result = await onDeduplicate();
|
||||
if (result.deletedCount > 0) {
|
||||
alert(`${result.deletedCount} transaction${result.deletedCount > 1 ? "s" : ""} en double supprimée${result.deletedCount > 1 ? "s" : ""}`);
|
||||
} else {
|
||||
alert("Aucun doublon trouvé");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
alert("Erreur lors du dédoublonnage");
|
||||
} finally {
|
||||
setDeduplicating(false);
|
||||
}
|
||||
};
|
||||
return (
|
||||
<Card className="border-red-200">
|
||||
<CardHeader>
|
||||
@@ -44,6 +65,48 @@ export function DangerZoneCard({
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-3">
|
||||
{/* Dédoublonnage */}
|
||||
<AlertDialog>
|
||||
<AlertDialogTrigger asChild>
|
||||
<Button
|
||||
variant="outline"
|
||||
className="w-full justify-start border-blue-300 text-blue-700 hover:bg-blue-50"
|
||||
disabled={deduplicating}
|
||||
>
|
||||
<Copy className="w-4 h-4 mr-2" />
|
||||
Dédoublonner les transactions
|
||||
{deduplicating && (
|
||||
<span className="ml-auto text-xs text-muted-foreground">
|
||||
En cours...
|
||||
</span>
|
||||
)}
|
||||
</Button>
|
||||
</AlertDialogTrigger>
|
||||
<AlertDialogContent>
|
||||
<AlertDialogHeader>
|
||||
<AlertDialogTitle>
|
||||
Dédoublonner les transactions ?
|
||||
</AlertDialogTitle>
|
||||
<AlertDialogDescription>
|
||||
Cette action va rechercher et supprimer les transactions en double
|
||||
dans votre base de données. Les critères de dédoublonnage sont :
|
||||
même compte, même date, même montant et même libellé. La première
|
||||
transaction trouvée sera conservée, les autres seront supprimées.
|
||||
</AlertDialogDescription>
|
||||
</AlertDialogHeader>
|
||||
<AlertDialogFooter>
|
||||
<AlertDialogCancel>Annuler</AlertDialogCancel>
|
||||
<AlertDialogAction
|
||||
onClick={handleDeduplicate}
|
||||
className="bg-blue-600 hover:bg-blue-700"
|
||||
disabled={deduplicating}
|
||||
>
|
||||
{deduplicating ? "Dédoublonnage..." : "Dédoublonner"}
|
||||
</AlertDialogAction>
|
||||
</AlertDialogFooter>
|
||||
</AlertDialogContent>
|
||||
</AlertDialog>
|
||||
|
||||
{/* Supprimer catégories des opérations */}
|
||||
<AlertDialog>
|
||||
<AlertDialogTrigger asChild>
|
||||
|
||||
Reference in New Issue
Block a user