feat(kanban): drag-to-delete trash zone + bulk delete for task cards

Salvages #28125 by @Jpalmer95. Adds:
- Drag-to-delete trash zone in the kanban dashboard
- Bulk delete endpoint with cascading delete_task cleanup
- Frontend updates (drag visual + drop handler)
- Confirmation prompt before delete

Resolved end-of-file test conflict by appending both halves.
This commit is contained in:
Jpalmer95 2026-05-18 21:40:08 -07:00 committed by Teknium
parent e3823657d6
commit dfcf48b476
6 changed files with 266 additions and 14 deletions

View file

@ -816,6 +816,34 @@ def test_list_tasks_order_by(kanban_home):
except ValueError as e:
assert "order_by must be one of" in str(e)
def test_delete_task_removes_task_and_cascades(kanban_home):
with kb.connect() as conn:
t = kb.create_task(conn, title="to-delete", assignee="alice")
kb.add_comment(conn, t, "user", "comment")
kb.add_comment(conn, t, "user", "another")
assert kb.delete_task(conn, t)
assert kb.get_task(conn, t) is None
assert len(kb.list_comments(conn, t)) == 0
assert len(kb.list_events(conn, t)) == 0
assert len(kb.list_runs(conn, t)) == 0
def test_delete_task_returns_false_for_missing_task(kanban_home):
with kb.connect() as conn:
assert not kb.delete_task(conn, "t_nonexistent")
def test_delete_task_cascades_links(kanban_home):
with kb.connect() as conn:
p = kb.create_task(conn, title="parent")
c = kb.create_task(conn, title="child", parents=[p])
child = kb.get_task(conn, c)
assert child is not None and child.status == "todo"
kb.delete_task(conn, p)
assert kb.get_task(conn, p) is None
child_after = kb.get_task(conn, c)
assert child_after is not None and child_after.status == "ready"
# ---------------------------------------------------------------------------
# Comments / events / worker context