'use client'; import { useState, useTransition } from 'react'; import type { SwotItem, Action, ActionLink, SwotCategory } from '@prisma/client'; import { Button, Badge, Modal, ModalFooter, Input, Textarea, Select } from '@/components/ui'; import { createAction, updateAction, deleteAction } from '@/actions/swot'; type ActionWithLinks = Action & { links: (ActionLink & { swotItem: SwotItem })[]; }; interface ActionPanelProps { sessionId: string; actions: ActionWithLinks[]; allItems: SwotItem[]; linkMode: boolean; selectedItems: string[]; onEnterLinkMode: () => void; onExitLinkMode: () => void; onClearSelection: () => void; onActionHover: (itemIds: string[]) => void; onActionLeave: () => void; } const categoryBadgeVariant: Record< SwotCategory, 'strength' | 'weakness' | 'opportunity' | 'threat' > = { STRENGTH: 'strength', WEAKNESS: 'weakness', OPPORTUNITY: 'opportunity', THREAT: 'threat', }; const categoryShort: Record = { STRENGTH: 'S', WEAKNESS: 'W', OPPORTUNITY: 'O', THREAT: 'T', }; const priorityLabels = ['Basse', 'Moyenne', 'Haute']; const statusOptions = [ { value: 'todo', label: '📋 À faire' }, { value: 'in_progress', label: '⏳ En cours' }, { value: 'done', label: '✅ Terminé' }, ]; export function ActionPanel({ sessionId, actions, allItems, linkMode, selectedItems, onEnterLinkMode, onExitLinkMode, onClearSelection, onActionHover, onActionLeave, }: ActionPanelProps) { const [showModal, setShowModal] = useState(false); const [editingAction, setEditingAction] = useState(null); const [isPending, startTransition] = useTransition(); // Form state const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const [priority, setPriority] = useState(1); const [editingSelectedItems, setEditingSelectedItems] = useState([]); function openCreateModal() { if (selectedItems.length < 2) { alert('Sélectionnez au moins 2 items SWOT pour créer une action croisée'); return; } setTitle(''); setDescription(''); setPriority(1); setEditingSelectedItems([]); setEditingAction(null); setShowModal(true); } function openEditModal(action: ActionWithLinks) { setTitle(action.title); setDescription(action.description || ''); setPriority(action.priority); setEditingSelectedItems(action.links.map((link) => link.swotItemId)); setEditingAction(action); setShowModal(true); } function closeModal() { setShowModal(false); setEditingAction(null); setEditingSelectedItems([]); onExitLinkMode(); } function toggleEditingItem(itemId: string) { setEditingSelectedItems((prev) => prev.includes(itemId) ? prev.filter((id) => id !== itemId) : [...prev, itemId] ); } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (!title.trim()) return; startTransition(async () => { if (editingAction) { if (editingSelectedItems.length < 2) { alert('Une action doit être liée à au moins 2 items SWOT'); return; } await updateAction(editingAction.id, sessionId, { title: title.trim(), description: description.trim() || undefined, priority, linkedItemIds: editingSelectedItems, }); } else { await createAction(sessionId, { title: title.trim(), description: description.trim() || undefined, priority, linkedItemIds: selectedItems, }); onClearSelection(); } closeModal(); }); } async function handleDelete(actionId: string) { if (!confirm('Supprimer cette action ?')) return; startTransition(async () => { await deleteAction(actionId, sessionId); }); } async function handleStatusChange(action: ActionWithLinks, newStatus: string) { startTransition(async () => { await updateAction(action.id, sessionId, { status: newStatus }); }); } const selectedItemsData = allItems.filter((item) => selectedItems.includes(item.id)); return (
{/* Header */}
📋

Actions Croisées

{actions.length}
{linkMode ? ( ) : ( )}
{/* Selected Items Preview (in link mode) */} {linkMode && selectedItemsData.length > 0 && (
{selectedItemsData.map((item) => ( {categoryShort[item.category]}: {item.content.slice(0, 30)} {item.content.length > 30 ? '...' : ''} ))}
)} {/* Actions List */} {actions.length === 0 ? (

Aucune action pour le moment.
Créez des actions en sélectionnant plusieurs items SWOT.

) : (
{actions.map((action) => (
onActionHover(action.links.map((l) => l.swotItemId))} onMouseLeave={onActionLeave} > {/* Header with title & actions */}

{action.title}

{/* Description */} {action.description && (

{action.description}

)} {/* Linked Items */}
{action.links.map((link) => ( {link.swotItem.content.length > 25 ? link.swotItem.content.slice(0, 25) + '...' : link.swotItem.content} ))}
{/* Footer with status & priority */}
{priorityLabels[action.priority]} toggleEditingItem(item.id)} className="h-4 w-4 rounded border-border text-primary focus:ring-primary" /> {categoryShort[item.category]} {item.content} ); })}
{editingSelectedItems.length < 2 && (

Sélectionnez au moins 2 items SWOT

)}
)}
setTitle(e.target.value)} placeholder="Ex: Former à la compétence X" required />