UNPKG

fixed-data-table-one.com

Version:

A React table component designed to allow presenting thousands of rows of data.

137 lines (114 loc) 3.95 kB
/** * Copyright Schrodinger, LLC * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule FixedDataTableWidthHelper * @typechecks */ 'use strict'; var _React = require('./React'); var _React2 = _interopRequireDefault(_React); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getTotalWidth( /*array*/columns) /*number*/{ var totalWidth = 0; for (var i = 0; i < columns.length; ++i) { totalWidth += columns[i].props.width; } return totalWidth; } function getTotalFlexGrow( /*array*/columns) /*number*/{ var totalFlexGrow = 0; for (var i = 0; i < columns.length; ++i) { totalFlexGrow += columns[i].props.flexGrow || 0; } return totalFlexGrow; } function distributeFlexWidth( /*array*/columns, /*number*/flexWidth) /*object*/{ if (flexWidth <= 0) { return { columns: columns, width: getTotalWidth(columns) }; } var remainingFlexGrow = getTotalFlexGrow(columns); var remainingFlexWidth = flexWidth; var newColumns = []; var totalWidth = 0; for (var i = 0; i < columns.length; ++i) { var column = columns[i]; if (!column.props.flexGrow) { totalWidth += column.props.width; newColumns.push(column); continue; } var columnFlexWidth = Math.floor(column.props.flexGrow / remainingFlexGrow * remainingFlexWidth); var newColumnWidth = Math.floor(column.props.width + columnFlexWidth); totalWidth += newColumnWidth; remainingFlexGrow -= column.props.flexGrow; remainingFlexWidth -= columnFlexWidth; newColumns.push(_React2.default.cloneElement(column, { width: newColumnWidth })); } return { columns: newColumns, width: totalWidth }; } function adjustColumnGroupWidths( /*array*/columnGroups, /*number*/expectedWidth) /*object*/{ var allColumns = []; var i; for (i = 0; i < columnGroups.length; ++i) { _React2.default.Children.forEach(columnGroups[i].props.children, function (column) { allColumns.push(column); }); } var columnsWidth = getTotalWidth(allColumns); var remainingFlexGrow = getTotalFlexGrow(allColumns); var remainingFlexWidth = Math.max(expectedWidth - columnsWidth, 0); var newAllColumns = []; var newColumnGroups = []; for (i = 0; i < columnGroups.length; ++i) { var columnGroup = columnGroups[i]; var currentColumns = []; _React2.default.Children.forEach(columnGroup.props.children, function (column) { currentColumns.push(column); }); var columnGroupFlexGrow = getTotalFlexGrow(currentColumns); var columnGroupFlexWidth = Math.floor(columnGroupFlexGrow / remainingFlexGrow * remainingFlexWidth); var newColumnSettings = distributeFlexWidth(currentColumns, columnGroupFlexWidth); remainingFlexGrow -= columnGroupFlexGrow; remainingFlexWidth -= columnGroupFlexWidth; for (var j = 0; j < newColumnSettings.columns.length; ++j) { newAllColumns.push(newColumnSettings.columns[j]); } newColumnGroups.push(_React2.default.cloneElement(columnGroup, { width: newColumnSettings.width })); } return { columns: newAllColumns, columnGroups: newColumnGroups }; } function adjustColumnWidths( /*array*/columns, /*number*/expectedWidth) /*array*/{ var columnsWidth = getTotalWidth(columns); if (columnsWidth < expectedWidth) { return distributeFlexWidth(columns, expectedWidth - columnsWidth).columns; } return columns; } var FixedDataTableWidthHelper = { getTotalWidth: getTotalWidth, getTotalFlexGrow: getTotalFlexGrow, distributeFlexWidth: distributeFlexWidth, adjustColumnWidths: adjustColumnWidths, adjustColumnGroupWidths: adjustColumnGroupWidths }; module.exports = FixedDataTableWidthHelper;