Breaks when using useSortable
- 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}
{/* Это попап */}
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),
);
}}
>
);
}
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
Assessment
This issue has not been assessed yet.