UNPKG

react-flexigrid

Version:

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

134 lines (116 loc) 3.72 kB
import React from 'react' import PropTypes from 'prop-types' import propTypes from './struct/propTypes' import { shallowEqual } from './utils' export default class FlexiGridColumnReorderKnobs extends React.Component { static propTypes = { prefixCls: PropTypes.string.isRequired, knobSize: PropTypes.number.isRequired, headerHeight: PropTypes.number.isRequired, headerRowHeight: PropTypes.number.isRequired, bodyWidth: PropTypes.number.isRequired, scrollX: PropTypes.number.isRequired, showScrollbarX: PropTypes.bool.isRequired, leftFixedColumns: propTypes.columns.isRequired, scrollableColumns: propTypes.columns.isRequired, rightFixedColumns: propTypes.columns.isRequired, leftFixedColumnsWidth: PropTypes.number.isRequired, scrollableColumnsWidth: PropTypes.number.isRequired, rightFixedColumnsWidth: PropTypes.number.isRequired, onColumnReorder: PropTypes.func.isRequired, } shouldComponentUpdate(nextProps) { return !shallowEqual(this.props, nextProps) } buildReorderKnob(column, leftColumnsWidth, scrollable, isRightFixedColumn) { if (column.reorderable === false) { return null } const { knobSize, headerRowHeight, headerHeight, bodyWidth, scrollX, showScrollbarX, leftFixedColumnsWidth, scrollableColumnsWidth, rightFixedColumnsWidth, } = this.props const hasChildren = column.children && column.children.length > 0 const top = headerRowHeight * (column.depth - 1) const left = leftColumnsWidth - (scrollable ? scrollX : 0) const height = ( hasChildren ? headerRowHeight : headerHeight - top ) - 1 const style = { top, left, width: knobSize, height, zIndex: scrollable ? 0 : 1, } const data = { column, knobSize, } if (showScrollbarX) { if (scrollable) { if ( left < leftFixedColumnsWidth || left > bodyWidth - rightFixedColumnsWidth - knobSize ) { style.display = 'none' } } if (isRightFixedColumn) { style.left = (bodyWidth - leftFixedColumnsWidth - rightFixedColumnsWidth) + (leftColumnsWidth - scrollableColumnsWidth) } } const key = column.key || `${leftColumnsWidth}-${column.depth}` return ( <div // eslint-disable-line key={`reorder-knob-for-${key}`} className={`${this.props.prefixCls}-reorder-knob`} style={style} onMouseDown={(e) => { this.props.onColumnReorder(data, e) }} /> ) } buildReorderKnobs(columns, leftColumnsWidth, scrollable, isRightFixed) { let width = leftColumnsWidth const knobs = [] columns.forEach((column) => { knobs.push(this.buildReorderKnob(column, width, scrollable, isRightFixed)) if (column.children && column.children.length) { knobs.push( ...this.buildReorderKnobs(column.children, width, scrollable, isRightFixed), ) } width += column.width }) return knobs } render() { const { leftFixedColumns, scrollableColumns, rightFixedColumns, leftFixedColumnsWidth, scrollableColumnsWidth, } = this.props const knobs = [ ...this.buildReorderKnobs(leftFixedColumns, 0, false, false), ...this.buildReorderKnobs(scrollableColumns, leftFixedColumnsWidth, true, false), ...this.buildReorderKnobs(rightFixedColumns, leftFixedColumnsWidth + scrollableColumnsWidth, false, true), // eslint-disable-line ] return ( <div className={`${this.props.prefixCls}-reorder-wrap`}> {knobs} </div> ) } }