remove details attribute, use node view state instead

This commit is contained in:
Hans Pagel
2021-02-10 23:19:34 +01:00
parent de234adb8b
commit a6c1e2e20f

View File

@@ -1,4 +1,5 @@
import { Node, mergeAttributes } from '@tiptap/core' import { Node, mergeAttributes } from '@tiptap/core'
// import { update } from 'cypress/types/lodash'
export interface DetailsOptions { export interface DetailsOptions {
HTMLAttributes: { HTMLAttributes: {
@@ -17,28 +18,6 @@ export default Node.create({
HTMLAttributes: {}, HTMLAttributes: {},
}, },
addAttributes() {
return {
open: {
default: true,
parseHTML: element => {
return {
open: element.hasAttribute('open'),
}
},
renderHTML: attributes => {
if (!attributes.open) {
return null
}
return {
open: 'open',
}
},
},
}
},
parseHTML() { parseHTML() {
return [{ return [{
tag: 'details', tag: 'details',
@@ -51,32 +30,26 @@ export default Node.create({
addNodeView() { addNodeView() {
return ({ return ({
node,
HTMLAttributes, HTMLAttributes,
getPos,
editor,
}) => { }) => {
const { view } = editor
const item = document.createElement('details') const item = document.createElement('details')
let open = false
item.addEventListener('click', event => { item.addEventListener('click', event => {
// @ts-ignore
const { open } = event.target.parentElement as HTMLElement
// @ts-ignore // @ts-ignore
const { localName } = event.target const { localName } = event.target
if (typeof getPos === 'function' && localName === 'summary') { if (localName === 'summary') {
view.dispatch(view.state.tr.setNodeMarkup(getPos(), undefined, { open = !open
open: !open,
})) if (open) {
editor.commands.focus() item.setAttribute('open', 'open')
} else {
item.removeAttribute('open')
}
} }
}) })
if (node.attrs.open) {
item.setAttribute('open', 'open')
}
Object.entries(HTMLAttributes).forEach(([key, value]) => { Object.entries(HTMLAttributes).forEach(([key, value]) => {
item.setAttribute(key, value) item.setAttribute(key, value)
}) })
@@ -84,19 +57,25 @@ export default Node.create({
return { return {
dom: item, dom: item,
contentDOM: item, contentDOM: item,
update: updatedNode => { ignoreMutation: (updatedNode: MutationRecord) => {
if (updatedNode.type !== this.type) { // @ts-ignore
return false console.log({ updatedNode }, 'ignoreMutation', updatedNode.attributeName === 'open')
}
if (updatedNode.attrs.open) { return updatedNode.attributeName === 'open'
item.setAttribute('open', 'open')
} else {
item.removeAttribute('open')
}
return true
}, },
// update: updatedNode => {
// if (updatedNode.type !== this.type) {
// return false
// }
// if (updatedNode.attrs.open) {
// item.setAttribute('open', 'open')
// } else {
// item.removeAttribute('open')
// }
// return true
// },
} }
} }
}, },