diff --git a/modules/planka/api.php b/modules/planka/api.php index b83b993..b5d58a1 100644 --- a/modules/planka/api.php +++ b/modules/planka/api.php @@ -69,9 +69,10 @@ if ($action === 'board') { $resp = planka_api('GET', '/api/boards/' . $id, null, $token); $inc = $resp['included'] ?? []; - // Filter lists that actually belong to this board (prevents ghost lists from other boards) + // Filter: only lists with a real name (Planka creates unnamed "None" placeholder lists) $lists = array_values(array_filter($inc['lists'] ?? [], fn($l) => - isset($l['boardId']) ? $l['boardId'] === $id : true + !empty($l['name']) && $l['name'] !== 'None' && + (isset($l['boardId']) ? $l['boardId'] === $id : true) )); // Filter cards that belong to a list in this board $listIds = array_column($lists, 'id'); diff --git a/planka.php b/planka.php index 55fb509..6b9e6d0 100644 --- a/planka.php +++ b/planka.php @@ -205,9 +205,16 @@ async function dropCard(listId) { if (!dragCardId) return; const card = state.cards.find(c => c.id === dragCardId); if (!card || card.listId === listId) return; - await apiFetch('update_card', { id: dragCardId }, 'PATCH', { listId }); + // Planka requires position when changing listId + const targetCards = state.cards.filter(c => c.listId === listId); + const maxPos = targetCards.reduce((m, c) => Math.max(m, c.position || 0), 0); + const position = maxPos + 65535; + const res = await apiFetch('update_card', { id: dragCardId }, 'PATCH', { listId, position }); + if (!res.ok) { showToast('Erreur déplacement : ' + (res.error || 'inconnu'), 'error'); return; } card.listId = listId; + card.position = position; renderBoard(); + showToast('Carte déplacée'); } async function quickAddCard(listId) {