"use client"; import { useState, useEffect } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Textarea } from "@/components/ui/textarea"; import { useMethodology, useUpdateMethodology, useResetMethodology, } from "@/lib/api/methodology"; import { toast } from "sonner"; import { Save, RotateCcw, Plus, Trash2, Loader2, ChevronDown, ChevronUp } from "lucide-react"; const OUTCOME_LABELS: Record = { universal: "כללי (לכל סוגי התוצאות)", rejection: "דחייה", full_acceptance: "קבלה מלאה", partial_acceptance: "קבלה חלקית", betterment_levy: "היטל השבחה", }; type RulesSection = { key: string; label: string; original: string[]; draft: string[]; isOverride: boolean; dirty: boolean; expanded: boolean; }; export function DiscussionRulesPanel() { const { data, isLoading } = useMethodology("discussion_rules"); const update = useUpdateMethodology("discussion_rules"); const reset = useResetMethodology("discussion_rules"); const [sections, setSections] = useState([]); useEffect(() => { if (!data?.items) return; const order = ["universal", "rejection", "partial_acceptance", "full_acceptance", "betterment_levy"]; setSections( order .filter((k) => k in data.items) .map((key) => ({ key, label: OUTCOME_LABELS[key] ?? key, original: data.items[key].value, draft: [...data.items[key].value], isOverride: data.items[key].is_override, dirty: false, expanded: key === "universal", })), ); }, [data]); const toggle = (idx: number) => { setSections((prev) => prev.map((s, i) => (i === idx ? { ...s, expanded: !s.expanded } : s)), ); }; const updateRule = (sIdx: number, rIdx: number, text: string) => { setSections((prev) => prev.map((s, i) => { if (i !== sIdx) return s; const draft = [...s.draft]; draft[rIdx] = text; return { ...s, draft, dirty: JSON.stringify(draft) !== JSON.stringify(s.original) }; }), ); }; const addRule = (sIdx: number) => { setSections((prev) => prev.map((s, i) => { if (i !== sIdx) return s; const draft = [...s.draft, ""]; return { ...s, draft, dirty: true }; }), ); }; const removeRule = (sIdx: number, rIdx: number) => { setSections((prev) => prev.map((s, i) => { if (i !== sIdx) return s; const draft = s.draft.filter((_, j) => j !== rIdx); return { ...s, draft, dirty: JSON.stringify(draft) !== JSON.stringify(s.original) }; }), ); }; const handleSave = (sec: RulesSection) => { const cleaned = sec.draft.filter((s) => s.trim()); update.mutate( { key: sec.key, value: cleaned }, { onSuccess: () => toast.success(`${sec.label} נשמר`), onError: () => toast.error("שגיאה בשמירה"), }, ); }; const handleReset = (sec: RulesSection) => { reset.mutate(sec.key, { onSuccess: () => toast.success(`${sec.label} אופס`), onError: () => toast.error("שגיאה באיפוס"), }); }; if (isLoading) { return (
טוען...
); } return (
{sections.map((sec, si) => ( {/* Accordion header */} {/* Expanded content */} {sec.expanded && (
{sec.draft.map((rule, ri) => (