From dba47956b168913601cca156d10358163e15647b Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sun, 24 May 2026 16:17:36 +0100 Subject: [PATCH] feat(bases): block intra-column drops while sort is active + add hint --- .../base/components/views/kanban/base-kanban.tsx | 6 ++++++ .../base/components/views/kanban/kanban-card.tsx | 3 +++ .../base/components/views/kanban/kanban-column.tsx | 3 +++ .../src/features/base/hooks/use-kanban-card-drag.ts | 11 +++++++++-- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/apps/client/src/features/base/components/views/kanban/base-kanban.tsx b/apps/client/src/features/base/components/views/kanban/base-kanban.tsx index 9b5bfdfa5..16e0b66d9 100644 --- a/apps/client/src/features/base/components/views/kanban/base-kanban.tsx +++ b/apps/client/src/features/base/components/views/kanban/base-kanban.tsx @@ -248,6 +248,11 @@ export function BaseKanban({ ))} )} + {sortsActive && ( +
+ {t("Sorted — cards within a column can't be reordered.")} +
+ )}
{columns.map((column) => ( ))}
diff --git a/apps/client/src/features/base/components/views/kanban/kanban-card.tsx b/apps/client/src/features/base/components/views/kanban/kanban-card.tsx index 31b11f5b6..bbd92db92 100644 --- a/apps/client/src/features/base/components/views/kanban/kanban-card.tsx +++ b/apps/client/src/features/base/components/views/kanban/kanban-card.tsx @@ -14,6 +14,7 @@ type KanbanCardProps = { primaryProperty: IBaseProperty | undefined; onClick: (rowId: string) => void; onDrop: (payload: CardDropPayload) => void; + sortsActive: boolean; }; export function KanbanCard({ @@ -22,12 +23,14 @@ export function KanbanCard({ primaryProperty, onClick, onDrop, + sortsActive, }: KanbanCardProps) { const { t } = useTranslation(); const { ref, isDragging, closestEdge } = useKanbanCardDrag({ cardId: row.id, columnKey, onDrop, + sortsActive, }); const titleValue = primaryProperty diff --git a/apps/client/src/features/base/components/views/kanban/kanban-column.tsx b/apps/client/src/features/base/components/views/kanban/kanban-column.tsx index bc165a550..f531deb06 100644 --- a/apps/client/src/features/base/components/views/kanban/kanban-column.tsx +++ b/apps/client/src/features/base/components/views/kanban/kanban-column.tsx @@ -16,6 +16,7 @@ type KanbanColumnProps = { onCardDrop: (payload: CardDropPayload) => void; onColumnReorder: (payload: ColumnReorderPayload) => void; onHide: (columnKey: string) => void; + sortsActive: boolean; }; export function KanbanColumn({ @@ -26,6 +27,7 @@ export function KanbanColumn({ onCardDrop, onColumnReorder, onHide, + sortsActive, }: KanbanColumnProps) { const { ref: bodyRef, isOver } = useKanbanColumnDrop({ columnKey: column.key, @@ -56,6 +58,7 @@ export function KanbanColumn({ primaryProperty={primaryProperty} onClick={onCardClick} onDrop={onCardDrop} + sortsActive={sortsActive} /> ))} onAddCard(column.key)} /> diff --git a/apps/client/src/features/base/hooks/use-kanban-card-drag.ts b/apps/client/src/features/base/hooks/use-kanban-card-drag.ts index f132bb953..501a88a1c 100644 --- a/apps/client/src/features/base/hooks/use-kanban-card-drag.ts +++ b/apps/client/src/features/base/hooks/use-kanban-card-drag.ts @@ -28,11 +28,13 @@ export function useKanbanCardDrag({ cardId, columnKey, onDrop, + sortsActive, disabled, }: { cardId: string; columnKey: string; onDrop: (payload: CardDropPayload) => void; + sortsActive: boolean; disabled?: boolean; }) { const ref = useRef(null); @@ -61,7 +63,12 @@ export function useKanbanCardDrag({ element: el, canDrop: ({ source }) => { if (source.data.type !== "base-kanban-card") return false; - return source.data.cardId !== cardId; + if (source.data.cardId === cardId) return false; + // Block intra-column drops when a sort is active (the slot would + // visibly snap back to the sort's chosen position, confusing the + // user). Cross-column drops still work and change the cell value. + if (sortsActive && source.data.columnKey === columnKey) return false; + return true; }, getData: ({ input, element }) => attachClosestEdge( @@ -85,7 +92,7 @@ export function useKanbanCardDrag({ }, }), ); - }, [cardId, columnKey, disabled]); + }, [cardId, columnKey, disabled, sortsActive]); return { ref, isDragging, closestEdge }; }