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 };
}