tiptap-extensions
Version:
Extensions for tiptap
76 lines (67 loc) • 1.77 kB
JavaScript
import { Node } from 'tiptap'
import { sinkListItem, splitToDefaultListItem, liftListItem } from 'tiptap-commands'
export default class TodoItem extends Node {
get name() {
return 'todo_item'
}
get defaultOptions() {
return {
nested: false,
}
}
get view() {
return {
props: ['node', 'updateAttrs', 'view'],
methods: {
onChange() {
this.updateAttrs({
done: !this.node.attrs.done,
})
},
},
template: `
<li :data-type="node.type.name" :data-done="node.attrs.done.toString()" data-drag-handle>
<span class="todo-checkbox" contenteditable="false" ="onChange"></span>
<div class="todo-content" ref="content" :contenteditable="view.editable.toString()"></div>
</li>
`,
}
}
get schema() {
return {
attrs: {
done: {
default: false,
},
},
draggable: true,
content: this.options.nested ? '(paragraph|todo_list)+' : 'paragraph+',
toDOM: node => {
const { done } = node.attrs
return [
'li',
{
'data-type': this.name,
'data-done': done.toString(),
},
['span', { class: 'todo-checkbox', contenteditable: 'false' }],
['div', { class: 'todo-content' }, 0],
]
},
parseDOM: [{
priority: 51,
tag: `[data-type="${this.name}"]`,
getAttrs: dom => ({
done: dom.getAttribute('data-done') === 'true',
}),
}],
}
}
keys({ type }) {
return {
Enter: splitToDefaultListItem(type),
Tab: this.options.nested ? sinkListItem(type) : () => {},
'Shift-Tab': liftListItem(type),
}
}
}