You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.4 KiB
92 lines
2.4 KiB
// @ts-nocheck
|
|
import { Node as ProseMirrorNode } from 'prosemirror-model'
|
|
import { NodeView } from 'prosemirror-view'
|
|
|
|
export function updateColumns(node: ProseMirrorNode, colgroup: Element, table: Element, cellMinWidth: number, overrideCol?: number, overrideValue?: any) {
|
|
let totalWidth = 0
|
|
let fixedWidth = true
|
|
let nextDOM = colgroup.firstChild
|
|
const row = node.firstChild
|
|
|
|
for (let i = 0, col = 0; i < row.childCount; i += 1) {
|
|
const { colspan, colwidth } = row.child(i).attrs
|
|
|
|
for (let j = 0; j < colspan; j += 1, col += 1) {
|
|
const hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j]
|
|
const cssWidth = hasWidth ? `${hasWidth}px` : ''
|
|
|
|
totalWidth += hasWidth || cellMinWidth
|
|
|
|
if (!hasWidth) {
|
|
fixedWidth = false
|
|
}
|
|
|
|
if (!nextDOM) {
|
|
colgroup.appendChild(document.createElement('col')).style.width = cssWidth
|
|
} else {
|
|
if (nextDOM.style.width !== cssWidth) {
|
|
nextDOM.style.width = cssWidth
|
|
}
|
|
|
|
nextDOM = nextDOM.nextSibling
|
|
}
|
|
}
|
|
}
|
|
|
|
while (nextDOM) {
|
|
const after = nextDOM.nextSibling
|
|
|
|
nextDOM.parentNode.removeChild(nextDOM)
|
|
nextDOM = after
|
|
}
|
|
|
|
if (fixedWidth) {
|
|
table.style.width = `${totalWidth}px`
|
|
table.style.minWidth = ''
|
|
} else {
|
|
table.style.width = ''
|
|
table.style.minWidth = `${totalWidth}px`
|
|
}
|
|
}
|
|
|
|
export class TableView implements NodeView {
|
|
|
|
node: ProseMirrorNode
|
|
|
|
cellMinWidth: number
|
|
|
|
dom: Element
|
|
|
|
table: Element
|
|
|
|
colgroup: Element
|
|
|
|
contentDOM: Element
|
|
|
|
constructor(node: ProseMirrorNode, cellMinWidth: number) {
|
|
this.node = node
|
|
this.cellMinWidth = cellMinWidth
|
|
this.dom = document.createElement('div')
|
|
this.dom.className = 'tableWrapper'
|
|
this.table = this.dom.appendChild(document.createElement('table'))
|
|
this.colgroup = this.table.appendChild(document.createElement('colgroup'))
|
|
updateColumns(node, this.colgroup, this.table, cellMinWidth)
|
|
this.contentDOM = this.table.appendChild(document.createElement('tbody'))
|
|
}
|
|
|
|
update(node: ProseMirrorNode) {
|
|
if (node.type !== this.node.type) {
|
|
return false
|
|
}
|
|
|
|
this.node = node
|
|
updateColumns(node, this.colgroup, this.table, this.cellMinWidth)
|
|
|
|
return true
|
|
}
|
|
|
|
ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Element }) {
|
|
return mutation.type === 'attributes' && (mutation.target === this.table || this.colgroup.contains(mutation.target))
|
|
}
|
|
}
|