fix: 🐛 More robust column width calculation

Set minimum column width based on options (default 70), also measure
rowIndex column directly in DOM
This commit is contained in:
Faris Ansari 2018-10-11 13:05:25 +05:30
parent 01d74ef6ad
commit 84b7fa3d83
3 changed files with 34 additions and 12 deletions

View File

@ -53,6 +53,7 @@ export default {
layout: 'fixed', // fixed, fluid, ratio layout: 'fixed', // fixed, fluid, ratio
noDataMessage: 'No Data', noDataMessage: 'No Data',
cellHeight: 40, cellHeight: 40,
minimumColumnWidth: 70,
inlineFilters: false, inlineFilters: false,
treeView: false, treeView: false,
checkedRowStatus: true, checkedRowStatus: true,

View File

@ -204,3 +204,16 @@ $.scrollbarWidth = function scrollbarWidth() {
$.hasVerticalOverflow = function (element) { $.hasVerticalOverflow = function (element) {
return element.scrollHeight > element.offsetHeight + 10; return element.scrollHeight > element.offsetHeight + 10;
}; };
$.measureTextWidth = function(text) {
const div = document.createElement('div');
div.style.position = 'absolute';
div.style.visibility = 'hidden';
div.style.height = 'auto';
div.style.width = 'auto';
div.style.whiteSpace = 'nowrap';
div.innerText = text;
document.body.appendChild(div);
return div.clientWidth + 1;
}

View File

@ -145,6 +145,17 @@ export default class Style {
setupNaturalColumnWidth() { setupNaturalColumnWidth() {
if (!$('.dt-row')) return; if (!$('.dt-row')) return;
$.each('.dt-row-header .dt-cell', this.header).map($headerCell => {
const { colIndex } = $.data($headerCell);
const column = this.datamanager.getColumn(colIndex);
let width = $.style($('.dt-cell__content', $headerCell), 'width');
if (typeof width === 'number' && width >= this.options.minimumColumnWidth) {
column.naturalWidth = width;
} else {
column.naturalWidth = this.options.minimumColumnWidth;
}
});
// set initial width as naturally calculated by table's first row // set initial width as naturally calculated by table's first row
$.each('.dt-row-0 .dt-cell', this.bodyScrollable).map($cell => { $.each('.dt-row-0 .dt-cell', this.bodyScrollable).map($cell => {
const { const {
@ -155,11 +166,15 @@ export default class Style {
let naturalWidth = $.style($('.dt-cell__content', $cell), 'width'); let naturalWidth = $.style($('.dt-cell__content', $cell), 'width');
if (column.id === '_rowIndex') { if (column.id === '_rowIndex') {
naturalWidth = this.getRowIndexColumnWidth(naturalWidth); naturalWidth = this.getRowIndexColumnWidth();
column.width = naturalWidth; column.width = naturalWidth;
} }
column.naturalWidth = naturalWidth; if (typeof naturalWidth === 'number' && naturalWidth >= this.options.minimumColumnWidth) {
column.naturalWidth = naturalWidth;
} else {
column.naturalWidth = this.options.minimumColumnWidth;
}
}); });
} }
@ -308,16 +323,9 @@ export default class Style {
return $(`.dt-cell--col-${colIndex}`, this.header); return $(`.dt-cell--col-${colIndex}`, this.header);
} }
getRowIndexColumnWidth(baseWidth) { getRowIndexColumnWidth() {
this._rowIndexColumnWidthMap = this._rowIndexColumnWidthMap || {};
const rowCount = this.datamanager.getRowCount(); const rowCount = this.datamanager.getRowCount();
const digits = (rowCount + '').length; const padding = 22;
return $.measureTextWidth(rowCount + '') + padding;
if (!this._rowIndexColumnWidthMap[digits]) {
// add 8px for each unit
this._rowIndexColumnWidthMap[digits] = baseWidth + ((digits - 1) * 8);
}
return this._rowIndexColumnWidthMap[digits];
} }
} }