@tiptap/extension-task-item 2.0.0-beta.22 → 2.0.0-beta.220

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,12 +4,14 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var core = require('@tiptap/core');
6
6
 
7
- const inputRegex = /^\s*(\[([ |x])\])\s$/;
7
+ const inputRegex = /^\s*(\[([( |x])?\])\s$/;
8
8
  const TaskItem = core.Node.create({
9
9
  name: 'taskItem',
10
- defaultOptions: {
11
- nested: false,
12
- HTMLAttributes: {},
10
+ addOptions() {
11
+ return {
12
+ nested: false,
13
+ HTMLAttributes: {},
14
+ };
13
15
  },
14
16
  content() {
15
17
  return this.options.nested ? 'paragraph block*' : 'paragraph+';
@@ -30,25 +32,42 @@ const TaskItem = core.Node.create({
30
32
  parseHTML() {
31
33
  return [
32
34
  {
33
- tag: 'li[data-type="taskItem"]',
35
+ tag: `li[data-type="${this.name}"]`,
34
36
  priority: 51,
35
37
  },
36
38
  ];
37
39
  },
38
- renderHTML({ HTMLAttributes }) {
39
- return ['li', core.mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { 'data-type': 'taskItem' }), 0];
40
+ renderHTML({ node, HTMLAttributes }) {
41
+ return [
42
+ 'li',
43
+ core.mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
44
+ 'data-type': this.name,
45
+ }),
46
+ [
47
+ 'label',
48
+ [
49
+ 'input',
50
+ {
51
+ type: 'checkbox',
52
+ checked: node.attrs.checked ? 'checked' : null,
53
+ },
54
+ ],
55
+ ['span'],
56
+ ],
57
+ ['div', 0],
58
+ ];
40
59
  },
41
60
  addKeyboardShortcuts() {
42
61
  const shortcuts = {
43
- Enter: () => this.editor.commands.splitListItem('taskItem'),
44
- 'Shift-Tab': () => this.editor.commands.liftListItem('taskItem'),
62
+ Enter: () => this.editor.commands.splitListItem(this.name),
63
+ 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),
45
64
  };
46
65
  if (!this.options.nested) {
47
66
  return shortcuts;
48
67
  }
49
68
  return {
50
69
  ...shortcuts,
51
- Tab: () => this.editor.commands.sinkListItem('taskItem'),
70
+ Tab: () => this.editor.commands.sinkListItem(this.name),
52
71
  };
53
72
  },
54
73
  addNodeView() {
@@ -61,9 +80,9 @@ const TaskItem = core.Node.create({
61
80
  checkboxWrapper.contentEditable = 'false';
62
81
  checkbox.type = 'checkbox';
63
82
  checkbox.addEventListener('change', event => {
64
- // if the editor isn’t editable
65
- // we have to undo the latest change
66
- if (!editor.isEditable) {
83
+ // if the editor isn’t editable and we don't have a handler for
84
+ // readonly checks we have to undo the latest change
85
+ if (!editor.isEditable && !this.options.onReadOnlyChecked) {
67
86
  checkbox.checked = !checkbox.checked;
68
87
  return;
69
88
  }
@@ -71,15 +90,24 @@ const TaskItem = core.Node.create({
71
90
  if (editor.isEditable && typeof getPos === 'function') {
72
91
  editor
73
92
  .chain()
74
- .focus()
93
+ .focus(undefined, { scrollIntoView: false })
75
94
  .command(({ tr }) => {
76
- tr.setNodeMarkup(getPos(), undefined, {
95
+ const position = getPos();
96
+ const currentNode = tr.doc.nodeAt(position);
97
+ tr.setNodeMarkup(position, undefined, {
98
+ ...currentNode === null || currentNode === void 0 ? void 0 : currentNode.attrs,
77
99
  checked,
78
100
  });
79
101
  return true;
80
102
  })
81
103
  .run();
82
104
  }
105
+ if (!editor.isEditable && this.options.onReadOnlyChecked) {
106
+ // Reset state if onReadOnlyChecked returns false
107
+ if (!this.options.onReadOnlyChecked(node, checked)) {
108
+ checkbox.checked = !checkbox.checked;
109
+ }
110
+ }
83
111
  });
84
112
  Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {
85
113
  listItem.setAttribute(key, value);
@@ -90,9 +118,7 @@ const TaskItem = core.Node.create({
90
118
  }
91
119
  checkboxWrapper.append(checkbox, checkboxStyler);
92
120
  listItem.append(checkboxWrapper, content);
93
- Object
94
- .entries(HTMLAttributes)
95
- .forEach(([key, value]) => {
121
+ Object.entries(HTMLAttributes).forEach(([key, value]) => {
96
122
  listItem.setAttribute(key, value);
97
123
  });
98
124
  return {
@@ -130,4 +156,4 @@ const TaskItem = core.Node.create({
130
156
  exports.TaskItem = TaskItem;
131
157
  exports["default"] = TaskItem;
132
158
  exports.inputRegex = inputRegex;
133
- //# sourceMappingURL=tiptap-extension-task-item.cjs.js.map
159
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/task-item.ts"],"sourcesContent":["import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\nimport { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nexport interface TaskItemOptions {\n onReadOnlyChecked?: (node: ProseMirrorNode, checked: boolean) => boolean\n nested: boolean\n HTMLAttributes: Record<string, any>\n}\n\nexport const inputRegex = /^\\s*(\\[([( |x])?\\])\\s$/\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n addOptions() {\n return {\n nested: false,\n HTMLAttributes: {},\n }\n },\n\n content() {\n return this.options.nested ? 'paragraph block*' : 'paragraph+'\n },\n\n defining: true,\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: element => element.getAttribute('data-checked') === 'true',\n renderHTML: attributes => ({\n 'data-checked': attributes.checked,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: `li[data-type=\"${this.name}\"]`,\n priority: 51,\n },\n ]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'li',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n 'data-type': this.name,\n }),\n [\n 'label',\n [\n 'input',\n {\n type: 'checkbox',\n checked: node.attrs.checked ? 'checked' : null,\n },\n ],\n ['span'],\n ],\n ['div', 0],\n ]\n },\n\n addKeyboardShortcuts() {\n const shortcuts = {\n Enter: () => this.editor.commands.splitListItem(this.name),\n 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n }\n\n if (!this.options.nested) {\n return shortcuts\n }\n\n return {\n ...shortcuts,\n Tab: () => this.editor.commands.sinkListItem(this.name),\n }\n },\n\n addNodeView() {\n return ({\n node, HTMLAttributes, getPos, editor,\n }) => {\n const listItem = document.createElement('li')\n const checkboxWrapper = document.createElement('label')\n const checkboxStyler = document.createElement('span')\n const checkbox = document.createElement('input')\n const content = document.createElement('div')\n\n checkboxWrapper.contentEditable = 'false'\n checkbox.type = 'checkbox'\n checkbox.addEventListener('change', event => {\n // if the editor isn’t editable and we don't have a handler for\n // readonly checks we have to undo the latest change\n if (!editor.isEditable && !this.options.onReadOnlyChecked) {\n checkbox.checked = !checkbox.checked\n\n return\n }\n\n const { checked } = event.target as any\n\n if (editor.isEditable && typeof getPos === 'function') {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .command(({ tr }) => {\n const position = getPos()\n const currentNode = tr.doc.nodeAt(position)\n\n tr.setNodeMarkup(position, undefined, {\n ...currentNode?.attrs,\n checked,\n })\n\n return true\n })\n .run()\n }\n if (!editor.isEditable && this.options.onReadOnlyChecked) {\n // Reset state if onReadOnlyChecked returns false\n if (!this.options.onReadOnlyChecked(node, checked)) {\n checkbox.checked = !checkbox.checked\n }\n }\n })\n\n Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n listItem.dataset.checked = node.attrs.checked\n if (node.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n }\n\n checkboxWrapper.append(checkbox, checkboxStyler)\n listItem.append(checkboxWrapper, content)\n\n Object.entries(HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n return {\n dom: listItem,\n contentDOM: content,\n update: updatedNode => {\n if (updatedNode.type !== this.type) {\n return false\n }\n\n listItem.dataset.checked = updatedNode.attrs.checked\n if (updatedNode.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n } else {\n checkbox.removeAttribute('checked')\n }\n\n return true\n },\n }\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: match => ({\n checked: match[match.length - 1] === 'x',\n }),\n }),\n ]\n },\n})\n"],"names":["Node","mergeAttributes","wrappingInputRule"],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core';
2
2
 
3
- const inputRegex = /^\s*(\[([ |x])\])\s$/;
3
+ const inputRegex = /^\s*(\[([( |x])?\])\s$/;
4
4
  const TaskItem = Node.create({
5
5
  name: 'taskItem',
6
- defaultOptions: {
7
- nested: false,
8
- HTMLAttributes: {},
6
+ addOptions() {
7
+ return {
8
+ nested: false,
9
+ HTMLAttributes: {},
10
+ };
9
11
  },
10
12
  content() {
11
13
  return this.options.nested ? 'paragraph block*' : 'paragraph+';
@@ -26,25 +28,42 @@ const TaskItem = Node.create({
26
28
  parseHTML() {
27
29
  return [
28
30
  {
29
- tag: 'li[data-type="taskItem"]',
31
+ tag: `li[data-type="${this.name}"]`,
30
32
  priority: 51,
31
33
  },
32
34
  ];
33
35
  },
34
- renderHTML({ HTMLAttributes }) {
35
- return ['li', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { 'data-type': 'taskItem' }), 0];
36
+ renderHTML({ node, HTMLAttributes }) {
37
+ return [
38
+ 'li',
39
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
40
+ 'data-type': this.name,
41
+ }),
42
+ [
43
+ 'label',
44
+ [
45
+ 'input',
46
+ {
47
+ type: 'checkbox',
48
+ checked: node.attrs.checked ? 'checked' : null,
49
+ },
50
+ ],
51
+ ['span'],
52
+ ],
53
+ ['div', 0],
54
+ ];
36
55
  },
37
56
  addKeyboardShortcuts() {
38
57
  const shortcuts = {
39
- Enter: () => this.editor.commands.splitListItem('taskItem'),
40
- 'Shift-Tab': () => this.editor.commands.liftListItem('taskItem'),
58
+ Enter: () => this.editor.commands.splitListItem(this.name),
59
+ 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),
41
60
  };
42
61
  if (!this.options.nested) {
43
62
  return shortcuts;
44
63
  }
45
64
  return {
46
65
  ...shortcuts,
47
- Tab: () => this.editor.commands.sinkListItem('taskItem'),
66
+ Tab: () => this.editor.commands.sinkListItem(this.name),
48
67
  };
49
68
  },
50
69
  addNodeView() {
@@ -57,9 +76,9 @@ const TaskItem = Node.create({
57
76
  checkboxWrapper.contentEditable = 'false';
58
77
  checkbox.type = 'checkbox';
59
78
  checkbox.addEventListener('change', event => {
60
- // if the editor isn’t editable
61
- // we have to undo the latest change
62
- if (!editor.isEditable) {
79
+ // if the editor isn’t editable and we don't have a handler for
80
+ // readonly checks we have to undo the latest change
81
+ if (!editor.isEditable && !this.options.onReadOnlyChecked) {
63
82
  checkbox.checked = !checkbox.checked;
64
83
  return;
65
84
  }
@@ -67,15 +86,24 @@ const TaskItem = Node.create({
67
86
  if (editor.isEditable && typeof getPos === 'function') {
68
87
  editor
69
88
  .chain()
70
- .focus()
89
+ .focus(undefined, { scrollIntoView: false })
71
90
  .command(({ tr }) => {
72
- tr.setNodeMarkup(getPos(), undefined, {
91
+ const position = getPos();
92
+ const currentNode = tr.doc.nodeAt(position);
93
+ tr.setNodeMarkup(position, undefined, {
94
+ ...currentNode === null || currentNode === void 0 ? void 0 : currentNode.attrs,
73
95
  checked,
74
96
  });
75
97
  return true;
76
98
  })
77
99
  .run();
78
100
  }
101
+ if (!editor.isEditable && this.options.onReadOnlyChecked) {
102
+ // Reset state if onReadOnlyChecked returns false
103
+ if (!this.options.onReadOnlyChecked(node, checked)) {
104
+ checkbox.checked = !checkbox.checked;
105
+ }
106
+ }
79
107
  });
80
108
  Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {
81
109
  listItem.setAttribute(key, value);
@@ -86,9 +114,7 @@ const TaskItem = Node.create({
86
114
  }
87
115
  checkboxWrapper.append(checkbox, checkboxStyler);
88
116
  listItem.append(checkboxWrapper, content);
89
- Object
90
- .entries(HTMLAttributes)
91
- .forEach(([key, value]) => {
117
+ Object.entries(HTMLAttributes).forEach(([key, value]) => {
92
118
  listItem.setAttribute(key, value);
93
119
  });
94
120
  return {
@@ -124,4 +150,4 @@ const TaskItem = Node.create({
124
150
  });
125
151
 
126
152
  export { TaskItem, TaskItem as default, inputRegex };
127
- //# sourceMappingURL=tiptap-extension-task-item.esm.js.map
153
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/task-item.ts"],"sourcesContent":["import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\nimport { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nexport interface TaskItemOptions {\n onReadOnlyChecked?: (node: ProseMirrorNode, checked: boolean) => boolean\n nested: boolean\n HTMLAttributes: Record<string, any>\n}\n\nexport const inputRegex = /^\\s*(\\[([( |x])?\\])\\s$/\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n addOptions() {\n return {\n nested: false,\n HTMLAttributes: {},\n }\n },\n\n content() {\n return this.options.nested ? 'paragraph block*' : 'paragraph+'\n },\n\n defining: true,\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: element => element.getAttribute('data-checked') === 'true',\n renderHTML: attributes => ({\n 'data-checked': attributes.checked,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: `li[data-type=\"${this.name}\"]`,\n priority: 51,\n },\n ]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'li',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n 'data-type': this.name,\n }),\n [\n 'label',\n [\n 'input',\n {\n type: 'checkbox',\n checked: node.attrs.checked ? 'checked' : null,\n },\n ],\n ['span'],\n ],\n ['div', 0],\n ]\n },\n\n addKeyboardShortcuts() {\n const shortcuts = {\n Enter: () => this.editor.commands.splitListItem(this.name),\n 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n }\n\n if (!this.options.nested) {\n return shortcuts\n }\n\n return {\n ...shortcuts,\n Tab: () => this.editor.commands.sinkListItem(this.name),\n }\n },\n\n addNodeView() {\n return ({\n node, HTMLAttributes, getPos, editor,\n }) => {\n const listItem = document.createElement('li')\n const checkboxWrapper = document.createElement('label')\n const checkboxStyler = document.createElement('span')\n const checkbox = document.createElement('input')\n const content = document.createElement('div')\n\n checkboxWrapper.contentEditable = 'false'\n checkbox.type = 'checkbox'\n checkbox.addEventListener('change', event => {\n // if the editor isn’t editable and we don't have a handler for\n // readonly checks we have to undo the latest change\n if (!editor.isEditable && !this.options.onReadOnlyChecked) {\n checkbox.checked = !checkbox.checked\n\n return\n }\n\n const { checked } = event.target as any\n\n if (editor.isEditable && typeof getPos === 'function') {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .command(({ tr }) => {\n const position = getPos()\n const currentNode = tr.doc.nodeAt(position)\n\n tr.setNodeMarkup(position, undefined, {\n ...currentNode?.attrs,\n checked,\n })\n\n return true\n })\n .run()\n }\n if (!editor.isEditable && this.options.onReadOnlyChecked) {\n // Reset state if onReadOnlyChecked returns false\n if (!this.options.onReadOnlyChecked(node, checked)) {\n checkbox.checked = !checkbox.checked\n }\n }\n })\n\n Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n listItem.dataset.checked = node.attrs.checked\n if (node.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n }\n\n checkboxWrapper.append(checkbox, checkboxStyler)\n listItem.append(checkboxWrapper, content)\n\n Object.entries(HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n return {\n dom: listItem,\n contentDOM: content,\n update: updatedNode => {\n if (updatedNode.type !== this.type) {\n return false\n }\n\n listItem.dataset.checked = updatedNode.attrs.checked\n if (updatedNode.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n } else {\n checkbox.removeAttribute('checked')\n }\n\n return true\n },\n }\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: match => ({\n checked: match[match.length - 1] === 'x',\n }),\n }),\n ]\n },\n})\n"],"names":[],"mappings":"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"}
@@ -4,12 +4,14 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@tiptap/extension-task-item"] = {}, global.core));
5
5
  })(this, (function (exports, core) { 'use strict';
6
6
 
7
- const inputRegex = /^\s*(\[([ |x])\])\s$/;
7
+ const inputRegex = /^\s*(\[([( |x])?\])\s$/;
8
8
  const TaskItem = core.Node.create({
9
9
  name: 'taskItem',
10
- defaultOptions: {
11
- nested: false,
12
- HTMLAttributes: {},
10
+ addOptions() {
11
+ return {
12
+ nested: false,
13
+ HTMLAttributes: {},
14
+ };
13
15
  },
14
16
  content() {
15
17
  return this.options.nested ? 'paragraph block*' : 'paragraph+';
@@ -30,25 +32,42 @@
30
32
  parseHTML() {
31
33
  return [
32
34
  {
33
- tag: 'li[data-type="taskItem"]',
35
+ tag: `li[data-type="${this.name}"]`,
34
36
  priority: 51,
35
37
  },
36
38
  ];
37
39
  },
38
- renderHTML({ HTMLAttributes }) {
39
- return ['li', core.mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { 'data-type': 'taskItem' }), 0];
40
+ renderHTML({ node, HTMLAttributes }) {
41
+ return [
42
+ 'li',
43
+ core.mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
44
+ 'data-type': this.name,
45
+ }),
46
+ [
47
+ 'label',
48
+ [
49
+ 'input',
50
+ {
51
+ type: 'checkbox',
52
+ checked: node.attrs.checked ? 'checked' : null,
53
+ },
54
+ ],
55
+ ['span'],
56
+ ],
57
+ ['div', 0],
58
+ ];
40
59
  },
41
60
  addKeyboardShortcuts() {
42
61
  const shortcuts = {
43
- Enter: () => this.editor.commands.splitListItem('taskItem'),
44
- 'Shift-Tab': () => this.editor.commands.liftListItem('taskItem'),
62
+ Enter: () => this.editor.commands.splitListItem(this.name),
63
+ 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),
45
64
  };
46
65
  if (!this.options.nested) {
47
66
  return shortcuts;
48
67
  }
49
68
  return {
50
69
  ...shortcuts,
51
- Tab: () => this.editor.commands.sinkListItem('taskItem'),
70
+ Tab: () => this.editor.commands.sinkListItem(this.name),
52
71
  };
53
72
  },
54
73
  addNodeView() {
@@ -61,9 +80,9 @@
61
80
  checkboxWrapper.contentEditable = 'false';
62
81
  checkbox.type = 'checkbox';
63
82
  checkbox.addEventListener('change', event => {
64
- // if the editor isn’t editable
65
- // we have to undo the latest change
66
- if (!editor.isEditable) {
83
+ // if the editor isn’t editable and we don't have a handler for
84
+ // readonly checks we have to undo the latest change
85
+ if (!editor.isEditable && !this.options.onReadOnlyChecked) {
67
86
  checkbox.checked = !checkbox.checked;
68
87
  return;
69
88
  }
@@ -71,15 +90,24 @@
71
90
  if (editor.isEditable && typeof getPos === 'function') {
72
91
  editor
73
92
  .chain()
74
- .focus()
93
+ .focus(undefined, { scrollIntoView: false })
75
94
  .command(({ tr }) => {
76
- tr.setNodeMarkup(getPos(), undefined, {
95
+ const position = getPos();
96
+ const currentNode = tr.doc.nodeAt(position);
97
+ tr.setNodeMarkup(position, undefined, {
98
+ ...currentNode === null || currentNode === void 0 ? void 0 : currentNode.attrs,
77
99
  checked,
78
100
  });
79
101
  return true;
80
102
  })
81
103
  .run();
82
104
  }
105
+ if (!editor.isEditable && this.options.onReadOnlyChecked) {
106
+ // Reset state if onReadOnlyChecked returns false
107
+ if (!this.options.onReadOnlyChecked(node, checked)) {
108
+ checkbox.checked = !checkbox.checked;
109
+ }
110
+ }
83
111
  });
84
112
  Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {
85
113
  listItem.setAttribute(key, value);
@@ -90,9 +118,7 @@
90
118
  }
91
119
  checkboxWrapper.append(checkbox, checkboxStyler);
92
120
  listItem.append(checkboxWrapper, content);
93
- Object
94
- .entries(HTMLAttributes)
95
- .forEach(([key, value]) => {
121
+ Object.entries(HTMLAttributes).forEach(([key, value]) => {
96
122
  listItem.setAttribute(key, value);
97
123
  });
98
124
  return {
@@ -134,4 +160,4 @@
134
160
  Object.defineProperty(exports, '__esModule', { value: true });
135
161
 
136
162
  }));
137
- //# sourceMappingURL=tiptap-extension-task-item.umd.js.map
163
+ //# sourceMappingURL=index.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/task-item.ts"],"sourcesContent":["import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'\nimport { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nexport interface TaskItemOptions {\n onReadOnlyChecked?: (node: ProseMirrorNode, checked: boolean) => boolean\n nested: boolean\n HTMLAttributes: Record<string, any>\n}\n\nexport const inputRegex = /^\\s*(\\[([( |x])?\\])\\s$/\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n addOptions() {\n return {\n nested: false,\n HTMLAttributes: {},\n }\n },\n\n content() {\n return this.options.nested ? 'paragraph block*' : 'paragraph+'\n },\n\n defining: true,\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: element => element.getAttribute('data-checked') === 'true',\n renderHTML: attributes => ({\n 'data-checked': attributes.checked,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: `li[data-type=\"${this.name}\"]`,\n priority: 51,\n },\n ]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'li',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n 'data-type': this.name,\n }),\n [\n 'label',\n [\n 'input',\n {\n type: 'checkbox',\n checked: node.attrs.checked ? 'checked' : null,\n },\n ],\n ['span'],\n ],\n ['div', 0],\n ]\n },\n\n addKeyboardShortcuts() {\n const shortcuts = {\n Enter: () => this.editor.commands.splitListItem(this.name),\n 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n }\n\n if (!this.options.nested) {\n return shortcuts\n }\n\n return {\n ...shortcuts,\n Tab: () => this.editor.commands.sinkListItem(this.name),\n }\n },\n\n addNodeView() {\n return ({\n node, HTMLAttributes, getPos, editor,\n }) => {\n const listItem = document.createElement('li')\n const checkboxWrapper = document.createElement('label')\n const checkboxStyler = document.createElement('span')\n const checkbox = document.createElement('input')\n const content = document.createElement('div')\n\n checkboxWrapper.contentEditable = 'false'\n checkbox.type = 'checkbox'\n checkbox.addEventListener('change', event => {\n // if the editor isn’t editable and we don't have a handler for\n // readonly checks we have to undo the latest change\n if (!editor.isEditable && !this.options.onReadOnlyChecked) {\n checkbox.checked = !checkbox.checked\n\n return\n }\n\n const { checked } = event.target as any\n\n if (editor.isEditable && typeof getPos === 'function') {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .command(({ tr }) => {\n const position = getPos()\n const currentNode = tr.doc.nodeAt(position)\n\n tr.setNodeMarkup(position, undefined, {\n ...currentNode?.attrs,\n checked,\n })\n\n return true\n })\n .run()\n }\n if (!editor.isEditable && this.options.onReadOnlyChecked) {\n // Reset state if onReadOnlyChecked returns false\n if (!this.options.onReadOnlyChecked(node, checked)) {\n checkbox.checked = !checkbox.checked\n }\n }\n })\n\n Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n listItem.dataset.checked = node.attrs.checked\n if (node.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n }\n\n checkboxWrapper.append(checkbox, checkboxStyler)\n listItem.append(checkboxWrapper, content)\n\n Object.entries(HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n return {\n dom: listItem,\n contentDOM: content,\n update: updatedNode => {\n if (updatedNode.type !== this.type) {\n return false\n }\n\n listItem.dataset.checked = updatedNode.attrs.checked\n if (updatedNode.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n } else {\n checkbox.removeAttribute('checked')\n }\n\n return true\n },\n }\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: match => ({\n checked: match[match.length - 1] === 'x',\n }),\n }),\n ]\n },\n})\n"],"names":["Node","mergeAttributes","wrappingInputRule"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { Node } from '@tiptap/core';
2
+ import { Node as ProseMirrorNode } from '@tiptap/pm/model';
2
3
  export interface TaskItemOptions {
4
+ onReadOnlyChecked?: (node: ProseMirrorNode, checked: boolean) => boolean;
3
5
  nested: boolean;
4
6
  HTMLAttributes: Record<string, any>;
5
7
  }
6
8
  export declare const inputRegex: RegExp;
7
- export declare const TaskItem: Node<TaskItemOptions>;
9
+ export declare const TaskItem: Node<TaskItemOptions, any>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiptap/extension-task-item",
3
3
  "description": "task item extension for tiptap",
4
- "version": "2.0.0-beta.22",
4
+ "version": "2.0.0-beta.220",
5
5
  "homepage": "https://tiptap.dev",
6
6
  "keywords": [
7
7
  "tiptap",
@@ -12,21 +12,37 @@
12
12
  "type": "github",
13
13
  "url": "https://github.com/sponsors/ueberdosis"
14
14
  },
15
- "main": "dist/tiptap-extension-task-item.cjs.js",
16
- "umd": "dist/tiptap-extension-task-item.umd.js",
17
- "module": "dist/tiptap-extension-task-item.esm.js",
15
+ "type": "module",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/packages/extension-task-item/src/index.d.ts",
19
+ "import": "./dist/index.js",
20
+ "require": "./dist/index.cjs"
21
+ }
22
+ },
23
+ "main": "dist/index.cjs",
24
+ "module": "dist/index.js",
25
+ "umd": "dist/index.umd.js",
18
26
  "types": "dist/packages/extension-task-item/src/index.d.ts",
19
27
  "files": [
20
28
  "src",
21
29
  "dist"
22
30
  ],
23
31
  "peerDependencies": {
24
- "@tiptap/core": "^2.0.0-beta.1"
32
+ "@tiptap/core": "^2.0.0-beta.209",
33
+ "@tiptap/pm": "^2.0.0-beta.209"
34
+ },
35
+ "devDependencies": {
36
+ "@tiptap/core": "^2.0.0-beta.220",
37
+ "@tiptap/pm": "^2.0.0-beta.220"
25
38
  },
26
39
  "repository": {
27
40
  "type": "git",
28
41
  "url": "https://github.com/ueberdosis/tiptap",
29
42
  "directory": "packages/extension-task-item"
30
43
  },
31
- "gitHead": "d47b45cbc29cb5bde027a460e1ab530128e0ae48"
44
+ "scripts": {
45
+ "clean": "rm -rf dist",
46
+ "build": "npm run clean && rollup -c"
47
+ }
32
48
  }
package/src/task-item.ts CHANGED
@@ -1,18 +1,22 @@
1
- import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core'
1
+ import { mergeAttributes, Node, wrappingInputRule } from '@tiptap/core'
2
+ import { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
3
 
3
4
  export interface TaskItemOptions {
4
- nested: boolean,
5
- HTMLAttributes: Record<string, any>,
5
+ onReadOnlyChecked?: (node: ProseMirrorNode, checked: boolean) => boolean
6
+ nested: boolean
7
+ HTMLAttributes: Record<string, any>
6
8
  }
7
9
 
8
- export const inputRegex = /^\s*(\[([ |x])\])\s$/
10
+ export const inputRegex = /^\s*(\[([( |x])?\])\s$/
9
11
 
10
12
  export const TaskItem = Node.create<TaskItemOptions>({
11
13
  name: 'taskItem',
12
14
 
13
- defaultOptions: {
14
- nested: false,
15
- HTMLAttributes: {},
15
+ addOptions() {
16
+ return {
17
+ nested: false,
18
+ HTMLAttributes: {},
19
+ }
16
20
  },
17
21
 
18
22
  content() {
@@ -37,24 +41,37 @@ export const TaskItem = Node.create<TaskItemOptions>({
37
41
  parseHTML() {
38
42
  return [
39
43
  {
40
- tag: 'li[data-type="taskItem"]',
44
+ tag: `li[data-type="${this.name}"]`,
41
45
  priority: 51,
42
46
  },
43
47
  ]
44
48
  },
45
49
 
46
- renderHTML({ HTMLAttributes }) {
47
- return ['li', mergeAttributes(
48
- this.options.HTMLAttributes,
49
- HTMLAttributes,
50
- { 'data-type': 'taskItem' },
51
- ), 0]
50
+ renderHTML({ node, HTMLAttributes }) {
51
+ return [
52
+ 'li',
53
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
54
+ 'data-type': this.name,
55
+ }),
56
+ [
57
+ 'label',
58
+ [
59
+ 'input',
60
+ {
61
+ type: 'checkbox',
62
+ checked: node.attrs.checked ? 'checked' : null,
63
+ },
64
+ ],
65
+ ['span'],
66
+ ],
67
+ ['div', 0],
68
+ ]
52
69
  },
53
70
 
54
71
  addKeyboardShortcuts() {
55
72
  const shortcuts = {
56
- Enter: () => this.editor.commands.splitListItem('taskItem'),
57
- 'Shift-Tab': () => this.editor.commands.liftListItem('taskItem'),
73
+ Enter: () => this.editor.commands.splitListItem(this.name),
74
+ 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),
58
75
  }
59
76
 
60
77
  if (!this.options.nested) {
@@ -63,16 +80,13 @@ export const TaskItem = Node.create<TaskItemOptions>({
63
80
 
64
81
  return {
65
82
  ...shortcuts,
66
- Tab: () => this.editor.commands.sinkListItem('taskItem'),
83
+ Tab: () => this.editor.commands.sinkListItem(this.name),
67
84
  }
68
85
  },
69
86
 
70
87
  addNodeView() {
71
88
  return ({
72
- node,
73
- HTMLAttributes,
74
- getPos,
75
- editor,
89
+ node, HTMLAttributes, getPos, editor,
76
90
  }) => {
77
91
  const listItem = document.createElement('li')
78
92
  const checkboxWrapper = document.createElement('label')
@@ -83,9 +97,9 @@ export const TaskItem = Node.create<TaskItemOptions>({
83
97
  checkboxWrapper.contentEditable = 'false'
84
98
  checkbox.type = 'checkbox'
85
99
  checkbox.addEventListener('change', event => {
86
- // if the editor isn’t editable
87
- // we have to undo the latest change
88
- if (!editor.isEditable) {
100
+ // if the editor isn’t editable and we don't have a handler for
101
+ // readonly checks we have to undo the latest change
102
+ if (!editor.isEditable && !this.options.onReadOnlyChecked) {
89
103
  checkbox.checked = !checkbox.checked
90
104
 
91
105
  return
@@ -96,9 +110,13 @@ export const TaskItem = Node.create<TaskItemOptions>({
96
110
  if (editor.isEditable && typeof getPos === 'function') {
97
111
  editor
98
112
  .chain()
99
- .focus()
113
+ .focus(undefined, { scrollIntoView: false })
100
114
  .command(({ tr }) => {
101
- tr.setNodeMarkup(getPos(), undefined, {
115
+ const position = getPos()
116
+ const currentNode = tr.doc.nodeAt(position)
117
+
118
+ tr.setNodeMarkup(position, undefined, {
119
+ ...currentNode?.attrs,
102
120
  checked,
103
121
  })
104
122
 
@@ -106,6 +124,12 @@ export const TaskItem = Node.create<TaskItemOptions>({
106
124
  })
107
125
  .run()
108
126
  }
127
+ if (!editor.isEditable && this.options.onReadOnlyChecked) {
128
+ // Reset state if onReadOnlyChecked returns false
129
+ if (!this.options.onReadOnlyChecked(node, checked)) {
130
+ checkbox.checked = !checkbox.checked
131
+ }
132
+ }
109
133
  })
110
134
 
111
135
  Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {
@@ -120,11 +144,9 @@ export const TaskItem = Node.create<TaskItemOptions>({
120
144
  checkboxWrapper.append(checkbox, checkboxStyler)
121
145
  listItem.append(checkboxWrapper, content)
122
146
 
123
- Object
124
- .entries(HTMLAttributes)
125
- .forEach(([key, value]) => {
126
- listItem.setAttribute(key, value)
127
- })
147
+ Object.entries(HTMLAttributes).forEach(([key, value]) => {
148
+ listItem.setAttribute(key, value)
149
+ })
128
150
 
129
151
  return {
130
152
  dom: listItem,
package/LICENSE.md DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2021, überdosis GbR
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1 +0,0 @@
1
- {"version":3,"file":"tiptap-extension-task-item.cjs.js","sources":["../src/task-item.ts"],"sourcesContent":["import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core'\n\nexport interface TaskItemOptions {\n nested: boolean,\n HTMLAttributes: Record<string, any>,\n}\n\nexport const inputRegex = /^\\s*(\\[([ |x])\\])\\s$/\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n defaultOptions: {\n nested: false,\n HTMLAttributes: {},\n },\n\n content() {\n return this.options.nested ? 'paragraph block*' : 'paragraph+'\n },\n\n defining: true,\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: element => element.getAttribute('data-checked') === 'true',\n renderHTML: attributes => ({\n 'data-checked': attributes.checked,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'li[data-type=\"taskItem\"]',\n priority: 51,\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', mergeAttributes(\n this.options.HTMLAttributes,\n HTMLAttributes,\n { 'data-type': 'taskItem' },\n ), 0]\n },\n\n addKeyboardShortcuts() {\n const shortcuts = {\n Enter: () => this.editor.commands.splitListItem('taskItem'),\n 'Shift-Tab': () => this.editor.commands.liftListItem('taskItem'),\n }\n\n if (!this.options.nested) {\n return shortcuts\n }\n\n return {\n ...shortcuts,\n Tab: () => this.editor.commands.sinkListItem('taskItem'),\n }\n },\n\n addNodeView() {\n return ({\n node,\n HTMLAttributes,\n getPos,\n editor,\n }) => {\n const listItem = document.createElement('li')\n const checkboxWrapper = document.createElement('label')\n const checkboxStyler = document.createElement('span')\n const checkbox = document.createElement('input')\n const content = document.createElement('div')\n\n checkboxWrapper.contentEditable = 'false'\n checkbox.type = 'checkbox'\n checkbox.addEventListener('change', event => {\n // if the editor isn’t editable\n // we have to undo the latest change\n if (!editor.isEditable) {\n checkbox.checked = !checkbox.checked\n\n return\n }\n\n const { checked } = event.target as any\n\n if (editor.isEditable && typeof getPos === 'function') {\n editor\n .chain()\n .focus()\n .command(({ tr }) => {\n tr.setNodeMarkup(getPos(), undefined, {\n checked,\n })\n\n return true\n })\n .run()\n }\n })\n\n Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n listItem.dataset.checked = node.attrs.checked\n if (node.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n }\n\n checkboxWrapper.append(checkbox, checkboxStyler)\n listItem.append(checkboxWrapper, content)\n\n Object\n .entries(HTMLAttributes)\n .forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n return {\n dom: listItem,\n contentDOM: content,\n update: updatedNode => {\n if (updatedNode.type !== this.type) {\n return false\n }\n\n listItem.dataset.checked = updatedNode.attrs.checked\n if (updatedNode.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n } else {\n checkbox.removeAttribute('checked')\n }\n\n return true\n },\n }\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: match => ({\n checked: match[match.length - 1] === 'x',\n }),\n }),\n ]\n },\n})\n"],"names":["Node","mergeAttributes","wrappingInputRule"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tiptap-extension-task-item.esm.js","sources":["../src/task-item.ts"],"sourcesContent":["import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core'\n\nexport interface TaskItemOptions {\n nested: boolean,\n HTMLAttributes: Record<string, any>,\n}\n\nexport const inputRegex = /^\\s*(\\[([ |x])\\])\\s$/\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n defaultOptions: {\n nested: false,\n HTMLAttributes: {},\n },\n\n content() {\n return this.options.nested ? 'paragraph block*' : 'paragraph+'\n },\n\n defining: true,\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: element => element.getAttribute('data-checked') === 'true',\n renderHTML: attributes => ({\n 'data-checked': attributes.checked,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'li[data-type=\"taskItem\"]',\n priority: 51,\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', mergeAttributes(\n this.options.HTMLAttributes,\n HTMLAttributes,\n { 'data-type': 'taskItem' },\n ), 0]\n },\n\n addKeyboardShortcuts() {\n const shortcuts = {\n Enter: () => this.editor.commands.splitListItem('taskItem'),\n 'Shift-Tab': () => this.editor.commands.liftListItem('taskItem'),\n }\n\n if (!this.options.nested) {\n return shortcuts\n }\n\n return {\n ...shortcuts,\n Tab: () => this.editor.commands.sinkListItem('taskItem'),\n }\n },\n\n addNodeView() {\n return ({\n node,\n HTMLAttributes,\n getPos,\n editor,\n }) => {\n const listItem = document.createElement('li')\n const checkboxWrapper = document.createElement('label')\n const checkboxStyler = document.createElement('span')\n const checkbox = document.createElement('input')\n const content = document.createElement('div')\n\n checkboxWrapper.contentEditable = 'false'\n checkbox.type = 'checkbox'\n checkbox.addEventListener('change', event => {\n // if the editor isn’t editable\n // we have to undo the latest change\n if (!editor.isEditable) {\n checkbox.checked = !checkbox.checked\n\n return\n }\n\n const { checked } = event.target as any\n\n if (editor.isEditable && typeof getPos === 'function') {\n editor\n .chain()\n .focus()\n .command(({ tr }) => {\n tr.setNodeMarkup(getPos(), undefined, {\n checked,\n })\n\n return true\n })\n .run()\n }\n })\n\n Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n listItem.dataset.checked = node.attrs.checked\n if (node.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n }\n\n checkboxWrapper.append(checkbox, checkboxStyler)\n listItem.append(checkboxWrapper, content)\n\n Object\n .entries(HTMLAttributes)\n .forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n return {\n dom: listItem,\n contentDOM: content,\n update: updatedNode => {\n if (updatedNode.type !== this.type) {\n return false\n }\n\n listItem.dataset.checked = updatedNode.attrs.checked\n if (updatedNode.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n } else {\n checkbox.removeAttribute('checked')\n }\n\n return true\n },\n }\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: match => ({\n checked: match[match.length - 1] === 'x',\n }),\n }),\n ]\n },\n})\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tiptap-extension-task-item.umd.js","sources":["../src/task-item.ts"],"sourcesContent":["import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core'\n\nexport interface TaskItemOptions {\n nested: boolean,\n HTMLAttributes: Record<string, any>,\n}\n\nexport const inputRegex = /^\\s*(\\[([ |x])\\])\\s$/\n\nexport const TaskItem = Node.create<TaskItemOptions>({\n name: 'taskItem',\n\n defaultOptions: {\n nested: false,\n HTMLAttributes: {},\n },\n\n content() {\n return this.options.nested ? 'paragraph block*' : 'paragraph+'\n },\n\n defining: true,\n\n addAttributes() {\n return {\n checked: {\n default: false,\n keepOnSplit: false,\n parseHTML: element => element.getAttribute('data-checked') === 'true',\n renderHTML: attributes => ({\n 'data-checked': attributes.checked,\n }),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'li[data-type=\"taskItem\"]',\n priority: 51,\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['li', mergeAttributes(\n this.options.HTMLAttributes,\n HTMLAttributes,\n { 'data-type': 'taskItem' },\n ), 0]\n },\n\n addKeyboardShortcuts() {\n const shortcuts = {\n Enter: () => this.editor.commands.splitListItem('taskItem'),\n 'Shift-Tab': () => this.editor.commands.liftListItem('taskItem'),\n }\n\n if (!this.options.nested) {\n return shortcuts\n }\n\n return {\n ...shortcuts,\n Tab: () => this.editor.commands.sinkListItem('taskItem'),\n }\n },\n\n addNodeView() {\n return ({\n node,\n HTMLAttributes,\n getPos,\n editor,\n }) => {\n const listItem = document.createElement('li')\n const checkboxWrapper = document.createElement('label')\n const checkboxStyler = document.createElement('span')\n const checkbox = document.createElement('input')\n const content = document.createElement('div')\n\n checkboxWrapper.contentEditable = 'false'\n checkbox.type = 'checkbox'\n checkbox.addEventListener('change', event => {\n // if the editor isn’t editable\n // we have to undo the latest change\n if (!editor.isEditable) {\n checkbox.checked = !checkbox.checked\n\n return\n }\n\n const { checked } = event.target as any\n\n if (editor.isEditable && typeof getPos === 'function') {\n editor\n .chain()\n .focus()\n .command(({ tr }) => {\n tr.setNodeMarkup(getPos(), undefined, {\n checked,\n })\n\n return true\n })\n .run()\n }\n })\n\n Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n listItem.dataset.checked = node.attrs.checked\n if (node.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n }\n\n checkboxWrapper.append(checkbox, checkboxStyler)\n listItem.append(checkboxWrapper, content)\n\n Object\n .entries(HTMLAttributes)\n .forEach(([key, value]) => {\n listItem.setAttribute(key, value)\n })\n\n return {\n dom: listItem,\n contentDOM: content,\n update: updatedNode => {\n if (updatedNode.type !== this.type) {\n return false\n }\n\n listItem.dataset.checked = updatedNode.attrs.checked\n if (updatedNode.attrs.checked) {\n checkbox.setAttribute('checked', 'checked')\n } else {\n checkbox.removeAttribute('checked')\n }\n\n return true\n },\n }\n }\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: inputRegex,\n type: this.type,\n getAttributes: match => ({\n checked: match[match.length - 1] === 'x',\n }),\n }),\n ]\n },\n})\n"],"names":["Node","mergeAttributes","wrappingInputRule"],"mappings":"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"}