kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import TaskItem from "@tiptap/extension-task-item";
2import type { NodeViewProps } from "@tiptap/react";
3import {
4 NodeViewContent,
5 NodeViewWrapper,
6 ReactNodeViewRenderer,
7} from "@tiptap/react";
8import { Checkbox } from "@/components/ui/checkbox";
9
10function TaskItemNodeView({ editor, node, updateAttributes }: NodeViewProps) {
11 const checked = Boolean(node.attrs.checked);
12 const isEditable = editor.isEditable;
13
14 return (
15 <NodeViewWrapper
16 as="li"
17 data-type="taskItem"
18 data-checked={checked ? "true" : "false"}
19 >
20 <div contentEditable={false} className="kaneo-task-item-checkbox">
21 <Checkbox
22 checked={checked}
23 disabled={!isEditable}
24 aria-label={
25 checked ? "Mark task as incomplete" : "Mark task as complete"
26 }
27 onCheckedChange={(value) => {
28 if (!isEditable) return;
29 updateAttributes({ checked: value === true });
30 }}
31 />
32 </div>
33 <NodeViewContent as="div" />
34 </NodeViewWrapper>
35 );
36}
37
38export const TaskItemWithCheckbox = TaskItem.extend({
39 addNodeView() {
40 return ReactNodeViewRenderer(TaskItemNodeView);
41 },
42});