"use client" import { useState } from "react" import { Sidebar } from "@/components/dashboard/sidebar" import { useBankingData } from "@/lib/hooks" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Badge } from "@/components/ui/badge" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Plus, MoreVertical, Pencil, Trash2, Tag, RefreshCw, X } from "lucide-react" import { generateId, autoCategorize, addCategory, updateCategory, deleteCategory } from "@/lib/store-db" import type { Category } from "@/lib/types" import { cn } from "@/lib/utils" const categoryColors = [ "#22c55e", "#3b82f6", "#f59e0b", "#ec4899", "#ef4444", "#8b5cf6", "#06b6d4", "#84cc16", "#f97316", "#6366f1", ] export default function CategoriesPage() { const { data, isLoading, refresh } = useBankingData() const [isDialogOpen, setIsDialogOpen] = useState(false) const [editingCategory, setEditingCategory] = useState(null) const [formData, setFormData] = useState({ name: "", color: "#22c55e", keywords: [] as string[], }) const [newKeyword, setNewKeyword] = useState("") if (isLoading || !data) { return (
) } const formatCurrency = (amount: number) => { return new Intl.NumberFormat("fr-FR", { style: "currency", currency: "EUR", }).format(amount) } const getCategoryStats = (categoryId: string) => { const categoryTransactions = data.transactions.filter((t) => t.categoryId === categoryId) const total = categoryTransactions.reduce((sum, t) => sum + Math.abs(t.amount), 0) const count = categoryTransactions.length return { total, count } } const handleNewCategory = () => { setEditingCategory(null) setFormData({ name: "", color: "#22c55e", keywords: [] }) setIsDialogOpen(true) } const handleEdit = (category: Category) => { setEditingCategory(category) setFormData({ name: category.name, color: category.color, keywords: [...category.keywords], }) setIsDialogOpen(true) } const handleSave = async () => { try { if (editingCategory) { await updateCategory({ ...editingCategory, name: formData.name, color: formData.color, keywords: formData.keywords, }) } else { await addCategory({ name: formData.name, color: formData.color, keywords: formData.keywords, icon: "tag", parentId: null, }) } refresh() setIsDialogOpen(false) } catch (error) { console.error("Error saving category:", error) alert("Erreur lors de la sauvegarde de la catégorie") } } const handleDelete = async (categoryId: string) => { if (!confirm("Supprimer cette catégorie ?")) return try { await deleteCategory(categoryId) refresh() } catch (error) { console.error("Error deleting category:", error) alert("Erreur lors de la suppression de la catégorie") } } const addKeyword = () => { if (newKeyword.trim() && !formData.keywords.includes(newKeyword.trim().toLowerCase())) { setFormData({ ...formData, keywords: [...formData.keywords, newKeyword.trim().toLowerCase()], }) setNewKeyword("") } } const removeKeyword = (keyword: string) => { setFormData({ ...formData, keywords: formData.keywords.filter((k) => k !== keyword), }) } const reApplyAutoCategories = async () => { if (!confirm("Recatégoriser automatiquement les transactions non catégorisées ?")) return try { const { updateTransaction } = await import("@/lib/store-db") const uncategorized = data.transactions.filter((t) => !t.categoryId) for (const transaction of uncategorized) { const categoryId = autoCategorize(transaction.description + " " + (transaction.memo || ""), data.categories) if (categoryId) { await updateTransaction({ ...transaction, categoryId }) } } refresh() } catch (error) { console.error("Error re-categorizing:", error) alert("Erreur lors de la recatégorisation") } } const uncategorizedCount = data.transactions.filter((t) => !t.categoryId).length return (

Catégories

Gérez vos catégories et mots-clés pour la catégorisation automatique

{uncategorizedCount > 0 && ( )}
{data.categories.map((category) => { const stats = getCategoryStats(category.id) return (
{category.name}

{stats.count} transaction{stats.count > 1 ? "s" : ""}

handleEdit(category)}> Modifier handleDelete(category.id)} className="text-red-600"> Supprimer
{formatCurrency(stats.total)}
{category.keywords.slice(0, 5).map((keyword) => ( {keyword} ))} {category.keywords.length > 5 && ( +{category.keywords.length - 5} )}
) })}
{editingCategory ? "Modifier la catégorie" : "Nouvelle catégorie"}
setFormData({ ...formData, name: e.target.value })} placeholder="Ex: Alimentation" />
{categoryColors.map((color) => (
setNewKeyword(e.target.value)} placeholder="Ajouter un mot-clé" onKeyDown={(e) => e.key === "Enter" && (e.preventDefault(), addKeyword())} />
{formData.keywords.map((keyword) => ( {keyword} ))}
) }