"use client"; import { useState } from "react"; import { Trash2, Plus, RefreshCw, Pencil } from "lucide-react"; import { toast } from "sonner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Skeleton } from "@/components/ui/skeleton"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { usePrecedents, useDeletePrecedent, useReExtractHalachot, type Precedent, type PracticeArea, } from "@/lib/api/precedent-library"; import { PRACTICE_AREAS, PRECEDENT_LEVELS, practiceAreaShort } from "./practice-area"; import { PrecedentUploadSheet } from "./precedent-upload-sheet"; import { PrecedentEditSheet } from "./precedent-edit-sheet"; function formatDate(iso: string | null) { if (!iso) return "—"; try { return new Date(iso).toLocaleDateString("he-IL"); } catch { return iso; } } function StatusPill({ p }: { p: Precedent }) { if (p.extraction_status === "failed") { return נכשל; } if (p.extraction_status !== "completed") { return בעיבוד; } if (p.halacha_extraction_status !== "completed") { return מחלץ הלכות; } if (p.halachot_count === 0) { return ללא הלכות; } return ( {p.approved_count}/{p.halachot_count} מאושרות ); } function PrecedentRow({ p, onEdit, }: { p: Precedent; onEdit: (id: string) => void; }) { const del = useDeletePrecedent(); const reExtract = useReExtractHalachot(); const onDelete = async () => { if (!window.confirm(`למחוק את ${p.case_number}? cascade ימחק את ה-chunks וההלכות.`)) return; try { await del.mutateAsync(p.id); toast.success("נמחק"); } catch (e) { toast.error(e instanceof Error ? e.message : "שגיאה"); } }; const onReExtract = async () => { try { await reExtract.mutateAsync(p.id); toast.success("חילוץ הלכות החל"); } catch (e) { toast.error(e instanceof Error ? e.message : "שגיאה"); } }; return ( {p.case_number} {p.case_name || "—"} {p.court || "—"} {formatDate(p.date)} {p.practice_area ? ( {practiceAreaShort(p.practice_area)} ) : ( — )} {p.precedent_level || "—"} onEdit(p.id)} aria-label={`ערוך את ${p.case_number}`} title="ערוך פרטים" className="text-ink-muted hover:text-navy" > ); } export function LibraryListPanel() { const [practiceArea, setPracticeArea] = useState(""); const [precedentLevel, setPrecedentLevel] = useState(""); const [search, setSearch] = useState(""); const [uploadOpen, setUploadOpen] = useState(false); const [editingId, setEditingId] = useState(null); const { data, isPending, error } = usePrecedents({ practiceArea: practiceArea || undefined, precedentLevel: precedentLevel || undefined, search: search.trim() || undefined, limit: 200, }); return ( חיפוש (מספר תיק / שם / תקציר) setSearch(e.target.value)} placeholder="עע"מ 3975/22" dir="rtl" /> תחום setPracticeArea(v === "_all" ? "" : v as PracticeArea)}> הכל {PRACTICE_AREAS.map((a) => ( {a.label} ))} רמת תקדים setPrecedentLevel(v === "_all" ? "" : v)}> הכל {PRECEDENT_LEVELS.map((l) => ( {l.label} ))} setUploadOpen(true)} className="bg-navy text-parchment hover:bg-navy-soft"> העלאת פסיקה {error ? ( {error.message} ) : ( מס׳ / מראה מקום שם / ערכאה תאריך תחום רמה הלכות {isPending ? ( [...Array(5)].map((_, i) => ( {[...Array(7)].map((_, j) => ( ))} )) ) : !data?.items.length ? ( אין פסיקה בקורפוס. העלה את פסק הדין הראשון. ) : ( data.items.map((p) => ( )) )} )} { if (!open) setEditingId(null); }} /> ); }