mirror of
https://github.com/linsa-io/linsa.git
synced 2026-01-12 12:20:23 +01:00
* wip * wip page * chore: style * wip pages * wip pages * chore: toggle * chore: link * feat: topic search * chore: page section * refactor: apply tailwind class ordering * fix: handle loggedIn user for guest route * feat: folder & image schema * chore: move utils to shared * refactor: tailwind class ordering * feat: img ext for editor * refactor: remove qa * fix: tanstack start * fix: wrong import * chore: use toast * chore: schema
65 lines
1.4 KiB
TypeScript
65 lines
1.4 KiB
TypeScript
import { ReactNodeViewRenderer } from "@tiptap/react"
|
|
import { mergeAttributes } from "@tiptap/core"
|
|
import { TaskItemView } from "./components/task-item-view"
|
|
import { TaskItem as TiptapTaskItem } from "@tiptap/extension-task-item"
|
|
|
|
export const TaskItem = TiptapTaskItem.extend({
|
|
name: "taskItem",
|
|
|
|
draggable: true,
|
|
|
|
addOptions() {
|
|
return {
|
|
...this.parent?.(),
|
|
nested: true,
|
|
}
|
|
},
|
|
|
|
addAttributes() {
|
|
return {
|
|
checked: {
|
|
default: false,
|
|
keepOnSplit: false,
|
|
parseHTML: (element) => {
|
|
const dataChecked = element.getAttribute("data-checked")
|
|
return dataChecked === "" || dataChecked === "true"
|
|
},
|
|
renderHTML: (attributes) => ({
|
|
"data-checked": attributes.checked,
|
|
}),
|
|
},
|
|
}
|
|
},
|
|
|
|
renderHTML({ node, HTMLAttributes }) {
|
|
return [
|
|
"li",
|
|
mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
|
|
"data-type": this.name,
|
|
}),
|
|
[
|
|
"div",
|
|
{ class: "taskItem-checkbox-container" },
|
|
[
|
|
"label",
|
|
[
|
|
"input",
|
|
{
|
|
type: "checkbox",
|
|
checked: node.attrs.checked ? "checked" : null,
|
|
class: "taskItem-checkbox",
|
|
},
|
|
],
|
|
],
|
|
],
|
|
["div", { class: "taskItem-content" }, 0],
|
|
]
|
|
},
|
|
|
|
addNodeView() {
|
|
return ReactNodeViewRenderer(TaskItemView, {
|
|
as: "span",
|
|
})
|
|
},
|
|
})
|