remove details attribute, use node view state instead
This commit is contained in:
@@ -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
|
||||||
|
// },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user