clauderic / clauderic/dnd-kit

Breaks when using useSortable

Open
#1,930 0 comments 0 reactions 0 assignees View on GitHub
question solid triage:done
Dominant language
TypeScript
Stars
17.6k
Forks
924
Avg merge
2d 10h
Merged PRs (30d)
2

Description

```import { createMemo, createSignal, For, JSXElement } from "solid-js";
import { TagsEnum } from "~/share/Types";
import { getBoardStore } from "./taskConductor";
import Tag from "./tag";
import { CoolText } from "./cooltext";
import { useDraggable } from "@dnd-kit/solid";
import { useSortable } from "@dnd-kit/solid/sortable";

export default function Task(props: { task_id: number, index: number }): JSXElement {
const { board, setBoard } = getBoardStore();
const Task = board.Tasks.find((x) => x.Id === props.task_id)!;
const keys_vals = createMemo(() => Object.entries(Task.Tags || {}));

const [showPopup, setShowPopup] = createSignal(false);
const [popupPos, setPopupPos] = createSignal({ x: 0, y: 0 });

const handleOpenPopup = (e: MouseEvent) => {
const target = e.currentTarget as HTMLElement;
const rect = target.getBoundingClientRect();

setPopupPos({
x: rect.left,
y: rect.bottom,
});
setShowPopup(true);
};

const { ref } = useDraggable({
get id() { return props.task_id; },
// get index() { return props.index; }
});

return (



setBoard("Tasks", (task) => task.Id === Task.Id, "Title", val)
}
class="resize-none w-full text-3xl font-semibold"
>
{Task.Title}


setBoard("Tasks", (task) => task.Id === Task.Id, "Definition", val)
}
class="resize-none w-full"
>
{Task.Definition}


{/* Это попап */}
setShowPopup(false)}
onClick={() => setShowPopup(false)}
>

setBoard(
"Tasks",
(task) => task.Id == Task.Id,
"Tags",
TagsEnum.Deadline,
`${new Date()}`,
)
}
>
Дедлайн: дд.мм.гггг


setBoard(
"Tasks",
(task) => task.Id == Task.Id,
"Tags",
TagsEnum.Executor,
"",
)
}
>
Исполнитель: Имя


setBoard(
"Tasks",
(task) => task.Id == Task.Id,
"Tags",
TagsEnum.Priority,
"0",
)
}
>
Приоритет:


setBoard(
"Tasks",
(task) => task.Id == Task.Id,
"Tags",
TagsEnum.Difficulty,
"0",
)
}
>
Сложность:



{(item, index) => (

)}





setBoard(
"Tasks",
board.Tasks.filter((task) => task.Id !== Task.Id),
)
}
/>

);
}

import { For, JSX, JSXElement, splitProps } from "solid-js";
import Task from "./task";
import { getBoardStore } from "./taskConductor";
import { CoolText } from "./cooltext";
import { twMerge } from "tailwind-merge";
import { useDroppable } from "@dnd-kit/solid";

export default function TaskColumn(
props: {
title: string;
title_id: number;
} & JSX.HTMLAttributes,
): JSXElement {
const [local, otherProps] = splitProps(props, ["title", "title_id"]);
const { board, setBoard } = getBoardStore();
const { ref, isDropTarget } = useDroppable({ id: props.title_id });

return (



setBoard("ColumnNames", (col) => col === props.title, val)
}
class="text-4xl mb-2 break-all ml-2"
>
{local.title}

{props.children}

x.Column_id === local.title_id)}>
{(item, index) => }



);
}

import { createContext, JSXElement, ParentProps, useContext } from "solid-js";
import { SetStoreFunction } from "solid-js/store";
import { BoardType } from "~/share/Types";
import { clientOnly } from "@solidjs/start";
import { move } from "@dnd-kit/helpers";

const TaskContext = createContext<{
board: BoardType;
setBoard: SetStoreFunction;
}>();

export function getBoardStore() {
return useContext(TaskContext)!;
}

const ClientDragDropProvider = clientOnly(() =>
import("@dnd-kit/solid").then((m) => ({ default: m.DragDropProvider })),
);

export default function TaskConductor(
props: ParentProps & {
class?: string;
board: BoardType;
setBoard: SetStoreFunction;
},
): JSXElement {
return (
{
if (event.operation.target === null) return;
props.setBoard(
"Tasks",
(t) => t.Id === Number(event.operation.source?.id),
"Column_id",
Number(event.operation.target.id),
);
}}
>

{props.children}



);
}

import { JSXElement } from "solid-js";
import { createStore } from "solid-js/store";
import Block from "~/components/block";
import DropDown from "~/components/dropdown";
import Logo from "~/components/logo";
import TaskColumn from "~/components/taskColumn";
import TaskConductor from "~/components/taskConductor";
import { BoardType } from "~/share/Types";

export default function WorkSpace(): JSXElement {
const [board, setBoard] = createStore({
Id: 0,
Name: "Example",
ColumnNames: ["Доступные", "В работе", "Тестирование", "Готовы"],
Tasks: [
{
Id: 0,
Board_id: 0,
Title: "Купить бобра",
Definition: "Крутое описание",
Column_id: 0,
Tags: { "1": "Олег" },
},
{
Id: 2,
Board_id: 0,
Title: "Другая таска",
Definition: "Не очень крутое описание",
Column_id: 0,
Tags: {},
},
],
});

return (




document.documentElement.classList.toggle("dark")}
/>




_Имя_

_Роль на доске_


Переименовать доску

Удалить доску



_На потом_


_На потом_


_На потом_






{
if (e.target != e.currentTarget) return;
setBoard("Tasks", (tasks) => [
...tasks,
{
Id: tasks.length + 1,
Board_id: board.Id,
Title: "Крутое",
Definition: "ааа",
Column_id: 0,
Tags: {},
},
]);
}}
>
Дважды кликните на меня чтобы создать задачу













);
}
```

When trying to create a Kanban board, I encountered some unexpected problems when using the `useSortable()` function. I had a broken selection of the area for drag and drop, and also event.operation.target was not equal to the column in which the task was currently located, but was equal to the column specified in board.Tasks[task_index].Id

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.