diff --git a/src/actions/swot.ts b/src/actions/swot.ts index 70691ce..b02eb56 100644 --- a/src/actions/swot.ts +++ b/src/actions/swot.ts @@ -183,6 +183,7 @@ export async function updateAction( description?: string; priority?: number; status?: string; + linkedItemIds?: string[]; } ) { const session = await auth(); diff --git a/src/components/swot/ActionPanel.tsx b/src/components/swot/ActionPanel.tsx index e01cad7..fff5c8f 100644 --- a/src/components/swot/ActionPanel.tsx +++ b/src/components/swot/ActionPanel.tsx @@ -66,6 +66,7 @@ export function ActionPanel({ const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const [priority, setPriority] = useState(1); + const [editingSelectedItems, setEditingSelectedItems] = useState([]); function openCreateModal() { if (selectedItems.length < 2) { @@ -75,6 +76,7 @@ export function ActionPanel({ setTitle(''); setDescription(''); setPriority(1); + setEditingSelectedItems([]); setEditingAction(null); setShowModal(true); } @@ -83,6 +85,7 @@ export function ActionPanel({ setTitle(action.title); setDescription(action.description || ''); setPriority(action.priority); + setEditingSelectedItems(action.links.map((link) => link.swotItemId)); setEditingAction(action); setShowModal(true); } @@ -90,9 +93,16 @@ export function ActionPanel({ 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(); @@ -100,10 +110,15 @@ export function ActionPanel({ 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, { @@ -302,6 +317,48 @@ export function ActionPanel({ )} + {editingAction && ( +
+

+ Items liés ({editingSelectedItems.length}) : +

+
+ {allItems.map((item) => { + const isSelected = editingSelectedItems.includes(item.id); + return ( + + ); + })} +
+ {editingSelectedItems.length < 2 && ( +

+ Sélectionnez au moins 2 items SWOT +

+ )} +
+ )} +
0) { + await prisma.actionLink.createMany({ + data: linkedItemIds.map((swotItemId) => ({ + actionId, + swotItemId, + })), + }); + } + } + return prisma.action.update({ where: { id: actionId }, - data, + data: updateData, + include: { + links: { + include: { + swotItem: true, + }, + }, + }, }); }