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.

72 lines
2.0 KiB

export class TableView {
constructor(node, cellMinWidth) {
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) {
if (node.type != this.node.type) return false;
this.node = node;
updateColumns(node, this.colgroup, this.table, this.cellMinWidth);
return true;
}
ignoreMutation(record) {
return (
record.type == 'attributes' &&
(record.target == this.table || this.colgroup.contains(record.target))
);
}
}
export function updateColumns(
node,
colgroup,
table,
cellMinWidth,
overrideCol,
overrideValue,
) {
let totalWidth = 0,
fixedWidth = true;
let nextDOM = colgroup.firstChild,
row = node.firstChild;
for (let i = 0, col = 0; i < row.childCount; i++) {
let { colspan, colwidth } = row.child(i).attrs;
for (let j = 0; j < colspan; j++, col++) {
let hasWidth =
overrideCol == col ? overrideValue : colwidth && colwidth[j];
let 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) {
let 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';
}
}