forked from adazzle/react-data-grid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathColumnMetricsMixin.js
114 lines (98 loc) · 3.01 KB
/
ColumnMetricsMixin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
const ColumnMetrics = require('./ColumnMetrics');
const DOMMetrics = require('./DOMMetrics');
Object.assign = require('object-assign');
const PropTypes = require('react').PropTypes;
const ColumnUtils = require('./ColumnUtils');
import ReactDOM from 'react-dom';
class Column {
key: string;
left: number;
width: number;
}
type ColumnMetricsType = {
columns: Array<Column>;
totalWidth: number;
minColumnWidth: number;
};
module.exports = {
mixins: [DOMMetrics.MetricsMixin],
propTypes: {
columns: PropTypes.arrayOf(Column),
minColumnWidth: PropTypes.number,
columnEquality: PropTypes.func
},
DOMMetrics: {
gridWidth(): number {
return ReactDOM.findDOMNode(this).parentElement.offsetWidth;
}
},
getDefaultProps(): {minColumnWidth: number; columnEquality: (a: Column, b: Column) => boolean} {
return {
minColumnWidth: 80,
columnEquality: ColumnMetrics.sameColumn
};
},
componentWillMount() {
this._mounted = true;
},
componentWillReceiveProps(nextProps: ColumnMetricsType) {
if (nextProps.columns) {
if (!ColumnMetrics.sameColumns(this.props.columns, nextProps.columns, this.props.columnEquality) ||
nextProps.minWidth !== this.props.minWidth) {
let columnMetrics = this.createColumnMetrics(nextProps);
this.setState({columnMetrics: columnMetrics});
}
}
},
getTotalWidth() {
let totalWidth = 0;
if (this._mounted) {
totalWidth = this.DOMMetrics.gridWidth();
} else {
totalWidth = ColumnUtils.getSize(this.props.columns) * this.props.minColumnWidth;
}
return totalWidth;
},
getColumnMetricsType(metrics: ColumnMetricsType): { columns: ColumnMetricsType } {
let totalWidth = metrics.totalWidth || this.getTotalWidth();
let currentMetrics = {
columns: metrics.columns,
totalWidth: totalWidth,
minColumnWidth: metrics.minColumnWidth
};
let updatedMetrics = ColumnMetrics.recalculate(currentMetrics);
return updatedMetrics;
},
getColumn(idx) {
let columns = this.state.columnMetrics.columns;
if (Array.isArray(columns)) {
return columns[idx];
}else if (typeof Immutable !== 'undefined') {
return columns.get(idx);
}
},
getSize() {
let columns = this.state.columnMetrics.columns;
if (Array.isArray(columns)) {
return columns.length;
}else if (typeof Immutable !== 'undefined') {
return columns.size;
}
},
metricsUpdated() {
let columnMetrics = this.createColumnMetrics();
this.setState({columnMetrics});
},
createColumnMetrics(props = this.props) {
let gridColumns = this.setupGridColumns(props);
return this.getColumnMetricsType({
columns: gridColumns,
minColumnWidth: this.props.minColumnWidth,
totalWidth: props.minWidth
});
},
onColumnResize(index: number, width: number) {
let columnMetrics = ColumnMetrics.resizeColumn(this.state.columnMetrics, index, width);
this.setState({columnMetrics});
}
};