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
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';
|
|
}
|
|
}
|