@gridsuite/commons-ui 0.29.2 → 0.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,31 +5,31 @@ exports["default"] = exports.DEFAULT_ROW_HEIGHT = exports.DEFAULT_HEADER_HEIGHT
5
5
 
6
6
  var _react = _interopRequireWildcard(require("react"));
7
7
 
8
+ var _reactIntl = require("react-intl");
9
+
8
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
11
 
10
12
  var _clsx3 = _interopRequireDefault(require("clsx"));
11
13
 
12
- var _TableCell = _interopRequireDefault(require("@mui/material/TableCell"));
13
-
14
- var _reactVirtualized = require("react-virtualized");
14
+ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
15
15
 
16
- var _TableSortLabel = _interopRequireDefault(require("@mui/material/TableSortLabel"));
16
+ var _material = require("@mui/material");
17
17
 
18
- var _memoizeOne = _interopRequireDefault(require("memoize-one"));
18
+ var _withStyles = _interopRequireDefault(require("@mui/styles/withStyles"));
19
19
 
20
20
  var _GetApp = _interopRequireDefault(require("@mui/icons-material/GetApp"));
21
21
 
22
- var _reactCsvDownloader = _interopRequireDefault(require("react-csv-downloader"));
22
+ var _reactVirtualized = require("react-virtualized");
23
23
 
24
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
24
+ var _reactCsvDownloader = _interopRequireDefault(require("react-csv-downloader"));
25
25
 
26
- var _reactIntl = require("react-intl");
26
+ var _overflowableText = _interopRequireDefault(require("../OverflowableText/overflowable-text"));
27
27
 
28
- var _withStyles = _interopRequireDefault(require("@mui/styles/withStyles"));
28
+ var _KeyedColumnsRowIndexer = require("./KeyedColumnsRowIndexer");
29
29
 
30
- var _overflowableText = _interopRequireDefault(require("../OverflowableText/overflowable-text"));
30
+ var _ColumnHeader = _interopRequireDefault(require("./ColumnHeader"));
31
31
 
32
- var _excluded = ["name", "classes", "rows", "columns", "rowHeight", "headerHeight", "rowCount", "sortable", "enableExportCSV"],
32
+ var _excluded = ["sort"],
33
33
  _excluded2 = ["dataKey"];
34
34
 
35
35
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
@@ -38,10 +38,14 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
38
38
 
39
39
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
40
40
 
41
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
42
-
43
41
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
44
42
 
43
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
44
+
45
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
46
+
47
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
48
+
45
49
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
46
50
 
47
51
  function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
@@ -50,6 +54,8 @@ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Objec
50
54
 
51
55
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
52
56
 
57
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
58
+
53
59
  function getTextWidth(text) {
54
60
  // re-use canvas object for better performance
55
61
  var canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement('canvas'));
@@ -102,48 +108,132 @@ var defaultStyles = {
102
108
  }
103
109
  };
104
110
 
111
+ var AmongChooser = function AmongChooser(props) {
112
+ var options = props.options,
113
+ value = props.value,
114
+ setValue = props.setValue,
115
+ id = props.id;
116
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", null, props.label), /*#__PURE__*/_react["default"].createElement(_material.Autocomplete, {
117
+ id: id,
118
+ value: value !== null && value !== void 0 ? value : [],
119
+ multiple: true,
120
+ onChange: function onChange(evt, newVal) {
121
+ setValue(newVal);
122
+ },
123
+ options: options // getOptionLabel={(code) => options.get(code)}
124
+ ,
125
+ renderInput: function renderInput(props) {
126
+ return /*#__PURE__*/_react["default"].createElement(_material.TextField // label={<FormattedMessage id={titleMessage} />}
127
+ , props);
128
+ },
129
+ renderTags: function renderTags(val, getTagsProps) {
130
+ return val.map(function (code, index) {
131
+ return /*#__PURE__*/_react["default"].createElement(_material.Chip, _extends({
132
+ id: 'chip_' + code,
133
+ size: 'small',
134
+ label: code
135
+ }, getTagsProps({
136
+ index: index
137
+ })));
138
+ });
139
+ }
140
+ }));
141
+ };
142
+
143
+ var initIndexer = function initIndexer(props, oldProps, versionSetter) {
144
+ if (!props.sortable) {
145
+ return null;
146
+ }
147
+
148
+ if (props.indexer) {
149
+ return props.indexer;
150
+ } else if (!props.sort) {
151
+ return new _KeyedColumnsRowIndexer.KeyedColumnsRowIndexer(true, true, null, versionSetter);
152
+ } else if (typeof props.sort === 'function') {
153
+ return new _KeyedColumnsRowIndexer.KeyedColumnsRowIndexer(true, true, function (cbfgs, done_cb) {
154
+ console.debug('dummy func, now :-/');
155
+ done_cb(true);
156
+ }, versionSetter);
157
+ } else if (typeof props.sort === 'object') {
158
+ return props.sort;
159
+ } else {
160
+ console.warn('unknown type of sort', props.sort);
161
+ }
162
+
163
+ return new _KeyedColumnsRowIndexer.KeyedColumnsRowIndexer(true, true, null, versionSetter);
164
+ };
165
+
105
166
  var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
106
167
  _inheritsLoose(MuiVirtualizedTable, _React$PureComponent);
107
168
 
108
- function MuiVirtualizedTable(props, context) {
169
+ function MuiVirtualizedTable(_props, context) {
109
170
  var _this;
110
171
 
111
- _this = _React$PureComponent.call(this, props, context) || this;
172
+ _this = _React$PureComponent.call(this, _props, context) || this;
112
173
 
113
- _defineProperty(_assertThisInitialized(_this), "state", {
114
- key: undefined,
115
- direction: 'asc',
116
- headerHeight: _this.props.headerHeight
174
+ _defineProperty(_assertThisInitialized(_this), "setVersion", function (v) {
175
+ _this.setState({
176
+ indirectionVersion: v
177
+ });
117
178
  });
118
179
 
119
- _defineProperty(_assertThisInitialized(_this), "reorderIndex", (0, _memoizeOne["default"])(function (key, direction, filter, rows) {
120
- if (!rows) return [];
121
- var indexedArray = [];
180
+ _defineProperty(_assertThisInitialized(_this), "preFilterData", (0, _memoizeOne["default"])(function (columns, rows) {
181
+ return _this.state.indexer.preFilterRowMapping(columns, rows);
182
+ }));
122
183
 
123
- for (var i = 0; i < rows.length; i++) {
124
- var row = rows[i];
125
- if (!filter || filter(row)) indexedArray.push([row, i]);
126
- }
184
+ _defineProperty(_assertThisInitialized(_this), "reorderIndex", (0, _memoizeOne["default"])(function (indirectorVersion, rows, columns) {
185
+ var indexer = _this.state.indexer;
186
+ if (!rows) return {
187
+ viewIndexToModel: [],
188
+ rowGetter: function rowGetter(viewIndex) {
189
+ return viewIndex;
190
+ }
191
+ };
192
+ var props = _this.props;
193
+
194
+ if (indexer && props.sort) {
195
+ var highestCodedColumn = indexer.highestCodedColumn(props.columns);
196
+
197
+ if (highestCodedColumn !== 0) {
198
+ var colIdx = Math.abs(highestCodedColumn) - 1;
199
+ var ret = props.sort(props.columns[colIdx].dataKey, highestCodedColumn > 0, !!props.columns[colIdx].numeric);
200
+ return {
201
+ viewIndexToModel: ret,
202
+ rowGetter: function rowGetter(viewIndex) {
203
+ if (viewIndex >= ret.length || viewIndex < 0) {
204
+ return {};
205
+ }
206
+
207
+ var modelIndex = ret[viewIndex];
208
+ return rows[modelIndex];
209
+ }
210
+ };
211
+ }
212
+ } else if (indexer) {
213
+ var prefiltered = _this.preFilterData(columns, rows);
127
214
 
128
- function compareValue(a, b, isNumeric, reverse) {
129
- var mult = reverse ? 1 : -1;
130
- if (a === undefined && b === undefined) return 0;else if (a === undefined) return mult;else if (b === undefined) return -mult;
131
- return isNumeric ? (Number(a) < Number(b) ? 1 : -1) * mult : ('' + a).localeCompare(b) * mult;
132
- }
215
+ var reorderedIndex = indexer.makeGroupAndSortIndirector(prefiltered, columns);
216
+ return {
217
+ viewIndexToModel: reorderedIndex,
218
+ rowGetter: function rowGetter(viewIndex) {
219
+ if (reorderedIndex === null) return rows[viewIndex];
133
220
 
134
- if (key !== undefined) {
135
- var reverse = direction === 'asc';
136
- var isNumeric = _this.props.columns[key].numeric;
137
- var dataKey = _this.props.columns[key].dataKey;
138
- if (dataKey && dataKey !== '' && _this.state.direction !== '') if (_this.props.sort) return _this.props.sort(dataKey, reverse, isNumeric);
139
- indexedArray.sort(function (a, b) {
140
- return compareValue(a[0][dataKey], b[0][dataKey], isNumeric, reverse);
141
- });
221
+ if (viewIndex >= reorderedIndex.length || viewIndex < 0) {
222
+ return {};
223
+ }
224
+
225
+ var modelIndex = reorderedIndex[viewIndex];
226
+ return rows[modelIndex];
227
+ }
228
+ };
142
229
  }
143
230
 
144
- return indexedArray.map(function (k) {
145
- return k[1];
146
- });
231
+ return {
232
+ viewIndexToModel: null,
233
+ rowGetter: function rowGetter(viewIndex) {
234
+ return rows[viewIndex];
235
+ }
236
+ };
147
237
  }));
148
238
 
149
239
  _defineProperty(_assertThisInitialized(_this), "computeDataWidth", function (text) {
@@ -156,14 +246,16 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
156
246
  if (col.width) {
157
247
  sizes[col.dataKey] = col.width;
158
248
  } else {
159
- /* calculate the header (and min size if exists) */
249
+ /* calculate the header (and min size if exists)
250
+ * NB : ignores the possible icons
251
+ */
160
252
  var size = Math.max(col.minWidth || 0, _this.computeDataWidth(col.label));
161
253
  /* calculate for each row the width, and keep the max */
162
254
 
163
255
  for (var i = 0; i < rows.length; ++i) {
164
- var text = _this.getDisplayValue(col, rowGetter({
165
- index: i
166
- })[col.dataKey]);
256
+ var gotRow = rowGetter(i);
257
+
258
+ var text = _this.getDisplayValue(col, gotRow[col.dataKey]);
167
259
 
168
260
  size = Math.max(size, _this.computeDataWidth(text));
169
261
  }
@@ -175,55 +267,202 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
175
267
  return sizes;
176
268
  }));
177
269
 
270
+ _defineProperty(_assertThisInitialized(_this), "openPopover", function (popoverTarget, colKey) {
271
+ if (_this.state.indexer.delegatorCallback) {
272
+ return; // retro compatibility stops here ;-)
273
+ }
274
+
275
+ var col = _this.props.columns.find(function (c) {
276
+ return c.dataKey === colKey;
277
+ });
278
+
279
+ if ((0, _KeyedColumnsRowIndexer.getHelper)(col) !== _KeyedColumnsRowIndexer.collectibleHelper) {
280
+ return;
281
+ }
282
+
283
+ _this.setState({
284
+ popoverAnchorEl: popoverTarget,
285
+ popoverColKey: colKey
286
+ });
287
+ });
288
+
289
+ _defineProperty(_assertThisInitialized(_this), "closePopover", function (evt, reason) {
290
+ var bumpsVersion = false;
291
+
292
+ if (reason === 'backdropClick') {
293
+ bumpsVersion = _this._commitFilterChange();
294
+ }
295
+
296
+ _this.setState({
297
+ popoverAnchorEl: null,
298
+ popoverColKey: null,
299
+ deferredFilterChange: null,
300
+ indirectionVersion: _this.state.indirectionVersion + (bumpsVersion ? 1 : 0)
301
+ });
302
+ });
303
+
304
+ _defineProperty(_assertThisInitialized(_this), "makeColumnFilterEditor", function () {
305
+ var _prefiltered$colsStat, _col$label;
306
+
307
+ var colKey = _this.state.popoverColKey;
308
+
309
+ var outerParams = _this.state.indexer.getColFilterOuterParams(colKey);
310
+
311
+ var userParams = !_this.props.defersFilterChanges || !_this.state.deferredFilterChange ? _this.state.indexer.getColFilterUserParams(colKey) : _this.state.deferredFilterChange.newVal;
312
+
313
+ var prefiltered = _this.preFilterData(_this.props.columns, _this.props.rows);
314
+
315
+ var options = [];
316
+
317
+ if (outerParams) {
318
+ options.push.apply(options, outerParams);
319
+ }
320
+
321
+ var colStat = prefiltered === null || prefiltered === void 0 ? void 0 : (_prefiltered$colsStat = prefiltered.colsStats) === null || _prefiltered$colsStat === void 0 ? void 0 : _prefiltered$colsStat[colKey];
322
+
323
+ if (colStat === null || colStat === void 0 ? void 0 : colStat.seen) {
324
+ var _loop = function _loop() {
325
+ var key = _step.value;
326
+
327
+ if (options.findIndex(function (o) {
328
+ return o === key;
329
+ }) < 0) {
330
+ options.push(key);
331
+ }
332
+ };
333
+
334
+ for (var _iterator = _createForOfIteratorHelperLoose(Object.getOwnPropertyNames(colStat.seen)), _step; !(_step = _iterator()).done;) {
335
+ _loop();
336
+ }
337
+ }
338
+
339
+ var col = _this.props.columns.find(function (c) {
340
+ return c.dataKey === colKey;
341
+ });
342
+
343
+ return /*#__PURE__*/_react["default"].createElement(AmongChooser, {
344
+ options: options,
345
+ value: userParams,
346
+ id: 'fielt' + colKey,
347
+ label: (_col$label = col === null || col === void 0 ? void 0 : col.label) !== null && _col$label !== void 0 ? _col$label : "\u2208",
348
+ setValue: function setValue(newVal) {
349
+ _this.onFilterParamsChange(newVal, colKey);
350
+ }
351
+ });
352
+ });
353
+
354
+ _defineProperty(_assertThisInitialized(_this), "_commitFilterChange", function () {
355
+ if (_this.state.deferredFilterChange) {
356
+ var _newVal;
357
+
358
+ var colKey = _this.state.deferredFilterChange.colKey;
359
+ var newVal = _this.state.deferredFilterChange.newVal;
360
+
361
+ if (((_newVal = newVal) === null || _newVal === void 0 ? void 0 : _newVal.length) === 0) {
362
+ newVal = null;
363
+ }
364
+
365
+ if (_this.state.indexer.setColFilterUserParams(colKey, newVal)) {
366
+ return true;
367
+ }
368
+ }
369
+
370
+ return false;
371
+ });
372
+
373
+ _defineProperty(_assertThisInitialized(_this), "sortClickHandler", function (evt, name, columnIndex) {
374
+ var colKey = _this.props.columns[columnIndex].dataKey;
375
+
376
+ if (evt.altKey) {
377
+ _this.openPopover(evt.target, colKey);
378
+
379
+ return;
380
+ }
381
+
382
+ var way = _KeyedColumnsRowIndexer.CHANGE_WAYS.SIMPLE;
383
+
384
+ if (evt.ctrlKey && evt.shiftKey) {
385
+ way = _KeyedColumnsRowIndexer.CHANGE_WAYS.AMEND;
386
+ } else if (evt.ctrlKey) {
387
+ way = _KeyedColumnsRowIndexer.CHANGE_WAYS.REMOVE;
388
+ } else if (evt.shiftKey) {
389
+ way = _KeyedColumnsRowIndexer.CHANGE_WAYS.TAIL;
390
+ }
391
+
392
+ if (_this.state.indexer.updateSortingFromUser(colKey, way)) {
393
+ _this.setState({
394
+ indirectionVersion: _this.state.indirectionVersion + 1
395
+ });
396
+ }
397
+ });
398
+
399
+ _defineProperty(_assertThisInitialized(_this), "filterClickHandler", function (evt, retargeted, columnIndex) {
400
+ var colKey = _this.props.columns[columnIndex].dataKey;
401
+
402
+ _this.openPopover(retargeted, colKey);
403
+ });
404
+
178
405
  _defineProperty(_assertThisInitialized(_this), "sortableHeader", function (_ref) {
406
+ var _prefiltered$colsStat2;
407
+
179
408
  var label = _ref.label,
180
- columnIndex = _ref.columnIndex,
181
- width = _ref.width;
182
- var _this$props = _this.props,
183
- columns = _this$props.columns,
184
- classes = _this$props.classes;
185
- return /*#__PURE__*/_react["default"].createElement(_TableSortLabel["default"], {
186
- component: "div",
187
- className: (0, _clsx3["default"])(classes.tableCell, classes.flexContainer, classes.header),
188
- active: columnIndex === _this.state.key,
189
- style: {
190
- justifyContent: columns[columnIndex].numeric ? 'flex-end' : 'baseline',
191
- height: _this.state.headerHeight
409
+ columnIndex = _ref.columnIndex;
410
+ var columns = _this.props.columns;
411
+ var indexer = _this.state.indexer;
412
+ var colKey = columns[columnIndex].dataKey;
413
+ var signedRank = indexer.columnSortingSignedRank(colKey);
414
+ var userParams = indexer.getColFilterUserParams(colKey);
415
+ var numeric = columns[columnIndex].numeric;
416
+
417
+ var prefiltered = _this.preFilterData(columns, _this.props.rows);
418
+
419
+ var colStat = prefiltered === null || prefiltered === void 0 ? void 0 : (_prefiltered$colsStat2 = prefiltered.colsStats) === null || _prefiltered$colsStat2 === void 0 ? void 0 : _prefiltered$colsStat2[colKey];
420
+ var filterLevel = 0;
421
+
422
+ if (colStat === null || colStat === void 0 ? void 0 : colStat.seen) {
423
+ var countSeen = Object.getOwnPropertyNames(colStat.seen).length;
424
+ var userSelectedCount = userParams === null || userParams === void 0 ? void 0 : userParams.length;
425
+ filterLevel += userSelectedCount ? 1 : 0;
426
+ filterLevel += userSelectedCount >= countSeen ? 2 : 0;
427
+ } // disable filtering when a cellRenderer is defined,
428
+ // as we have no simple way to match for chosen value(s)
429
+
430
+
431
+ var onFilterClick = numeric || _this.props.sort || columns[columnIndex].cellRenderer ? undefined : function (ev, retargeted) {
432
+ _this.filterClickHandler(ev, retargeted, columnIndex);
433
+ };
434
+ return /*#__PURE__*/_react["default"].createElement(_ColumnHeader["default"], {
435
+ label: label,
436
+ ref: function ref(e) {
437
+ return _this._registerHeader(label, e);
192
438
  },
193
- direction: _this.state.direction,
194
- onClick: function onClick() {
195
- var _this$state = _this.state,
196
- key = _this$state.key,
197
- direction = _this$state.direction;
198
- if (key === undefined) key = columnIndex;else if (direction === 'asc') direction = 'desc';else {
199
- key = undefined;
200
- direction = 'asc';
201
- }
202
-
203
- _this.setState({
204
- key: key,
205
- direction: direction
206
- });
439
+ sortSignedRank: signedRank,
440
+ filterLevel: filterLevel,
441
+ numeric: numeric,
442
+ onSortClick: function onSortClick(ev, name) {
443
+ _this.sortClickHandler(ev, name, columnIndex);
207
444
  },
208
- width: width,
209
- ref: function ref(e) {
210
- return _this._registerObserver(e);
211
- }
212
- }, /*#__PURE__*/_react["default"].createElement("div", {
445
+ onFilterClick: onFilterClick
446
+ });
447
+ });
448
+
449
+ _defineProperty(_assertThisInitialized(_this), "simpleHeaderRenderer", function (_ref2) {
450
+ var label = _ref2.label;
451
+ return /*#__PURE__*/_react["default"].createElement("div", {
213
452
  ref: function ref(element) {
214
453
  _this._registerHeader(label, element);
215
454
  }
216
- }, label));
455
+ }, label);
217
456
  });
218
457
 
219
- _defineProperty(_assertThisInitialized(_this), "getRowClassName", function (_ref2) {
458
+ _defineProperty(_assertThisInitialized(_this), "getRowClassName", function (_ref3) {
220
459
  var _rowGetter, _rowGetter2, _clsx;
221
460
 
222
- var index = _ref2.index,
223
- rowGetter = _ref2.rowGetter;
224
- var _this$props2 = _this.props,
225
- classes = _this$props2.classes,
226
- onRowClick = _this$props2.onRowClick;
461
+ var index = _ref3.index,
462
+ rowGetter = _ref3.rowGetter;
463
+ var _this$props = _this.props,
464
+ classes = _this$props.classes,
465
+ onRowClick = _this$props.onRowClick;
227
466
  return (0, _clsx3["default"])(classes.tableRow, classes.flexContainer, index % 2 === 0 && classes.rowBackgroundDark, index % 2 !== 0 && classes.rowBackgroundLight, ((_rowGetter = rowGetter(index)) === null || _rowGetter === void 0 ? void 0 : _rowGetter.notClickable) === true && classes.noClick, (_clsx = {}, _clsx[classes.tableRowHover] = index !== -1 && onRowClick != null && !(((_rowGetter2 = rowGetter(index)) === null || _rowGetter2 === void 0 ? void 0 : _rowGetter2.notClickable) === true), _clsx));
228
467
  });
229
468
 
@@ -235,22 +474,22 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
235
474
  }
236
475
  });
237
476
 
238
- _defineProperty(_assertThisInitialized(_this), "cellRenderer", function (_ref3) {
477
+ _defineProperty(_assertThisInitialized(_this), "cellRenderer", function (_ref4) {
239
478
  var _rows$rowIndex, _rows$rowIndex2, _clsx2;
240
479
 
241
- var cellData = _ref3.cellData,
242
- columnIndex = _ref3.columnIndex,
243
- rowIndex = _ref3.rowIndex;
244
- var _this$props3 = _this.props,
245
- columns = _this$props3.columns,
246
- classes = _this$props3.classes,
247
- rowHeight = _this$props3.rowHeight,
248
- onCellClick = _this$props3.onCellClick,
249
- rows = _this$props3.rows;
480
+ var cellData = _ref4.cellData,
481
+ columnIndex = _ref4.columnIndex,
482
+ rowIndex = _ref4.rowIndex;
483
+ var _this$props2 = _this.props,
484
+ columns = _this$props2.columns,
485
+ classes = _this$props2.classes,
486
+ rowHeight = _this$props2.rowHeight,
487
+ onCellClick = _this$props2.onCellClick,
488
+ rows = _this$props2.rows;
250
489
 
251
490
  var displayedValue = _this.getDisplayValue(columns[columnIndex], cellData);
252
491
 
253
- return /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
492
+ return /*#__PURE__*/_react["default"].createElement(_material.TableCell, {
254
493
  component: "div",
255
494
  className: (0, _clsx3["default"])(classes.tableCell, classes.flexContainer, (_clsx2 = {}, _clsx2[classes.noClick] = displayedValue === undefined || ((_rows$rowIndex = rows[rowIndex]) === null || _rows$rowIndex === void 0 ? void 0 : _rows$rowIndex.notClickable) === true || onCellClick == null || columns[columnIndex].clickable === undefined || !columns[columnIndex].clickable, _clsx2[classes.tableCellColor] = displayedValue === undefined || onCellClick !== null && !((_rows$rowIndex2 = rows[rowIndex]) === null || _rows$rowIndex2 === void 0 ? void 0 : _rows$rowIndex2.notClickable) === true && columns[columnIndex].clickable !== undefined && columns[columnIndex].clickable, _clsx2)),
256
495
  variant: "body",
@@ -272,55 +511,81 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
272
511
  }));
273
512
  });
274
513
 
275
- _defineProperty(_assertThisInitialized(_this), "headerRenderer", function (_ref4) {
276
- var label = _ref4.label,
277
- columnIndex = _ref4.columnIndex;
278
- var _this$props4 = _this.props,
279
- columns = _this$props4.columns,
280
- classes = _this$props4.classes;
281
- return /*#__PURE__*/_react["default"].createElement(_TableCell["default"], {
282
- component: "div",
283
- className: (0, _clsx3["default"])(classes.tableCell, classes.flexContainer, classes.noClick, classes.header),
284
- variant: "head",
285
- style: {
286
- height: _this.state.headerHeight
514
+ _defineProperty(_assertThisInitialized(_this), "makeSizedTable", function (height, width, sizes, reorderedIndex, _rowGetter3) {
515
+ var _reorderedIndex$lengt;
516
+
517
+ var _this$props3 = _this.props,
518
+ sort = _this$props3.sort,
519
+ otherProps = _objectWithoutPropertiesLoose(_this$props3, _excluded);
520
+
521
+ return /*#__PURE__*/_react["default"].createElement(_reactVirtualized.Table, _extends({}, otherProps, {
522
+ height: height,
523
+ width: width,
524
+ rowHeight: otherProps.rowHeight,
525
+ gridStyle: {
526
+ direction: 'inherit'
287
527
  },
288
- align: columns[columnIndex].numeric || false ? 'right' : 'left',
289
- ref: function ref(e) {
290
- return _this._registerObserver(e);
291
- }
292
- }, /*#__PURE__*/_react["default"].createElement("div", {
293
- ref: function ref(element) {
294
- _this._registerHeader(label, element);
528
+ headerHeight: _this.state.headerHeight,
529
+ className: otherProps.classes.table,
530
+ onRowClick: _this.props.onRowClick &&
531
+ /* The {...otherProps} just above would hold the slot onRowClick */
532
+ _this.onClickableRowClick,
533
+ rowCount: (_reorderedIndex$lengt = reorderedIndex === null || reorderedIndex === void 0 ? void 0 : reorderedIndex.length) !== null && _reorderedIndex$lengt !== void 0 ? _reorderedIndex$lengt : otherProps.rows.length,
534
+ rowClassName: function rowClassName(_ref5) {
535
+ var index = _ref5.index;
536
+ return _this.getRowClassName({
537
+ index: index,
538
+ rowGetter: _rowGetter3
539
+ });
540
+ },
541
+ rowGetter: function rowGetter(_ref6) {
542
+ var index = _ref6.index;
543
+ return _rowGetter3(index);
295
544
  }
296
- }, label));
545
+ }), otherProps.columns.map(function (_ref7, index) {
546
+ var dataKey = _ref7.dataKey,
547
+ other = _objectWithoutPropertiesLoose(_ref7, _excluded2);
548
+
549
+ return /*#__PURE__*/_react["default"].createElement(_reactVirtualized.Column, _extends({
550
+ key: dataKey,
551
+ headerRenderer: _this.makeHeaderRenderer(dataKey, index),
552
+ className: otherProps.classes.flexContainer,
553
+ cellRenderer: _this.cellRenderer,
554
+ dataKey: dataKey,
555
+ flexGrow: 1,
556
+ width: sizes[dataKey]
557
+ }, other));
558
+ }));
297
559
  });
298
560
 
299
561
  _defineProperty(_assertThisInitialized(_this), "getCSVFilename", function () {
300
- if (_this.props.name && _this.props.name.length > 0) {
562
+ var _this$props$name;
563
+
564
+ if (((_this$props$name = _this.props.name) === null || _this$props$name === void 0 ? void 0 : _this$props$name.length) > 0) {
301
565
  return _this.props.name.replace(/\s/g, '_');
302
566
  } else {
303
- var filename = '';
304
-
305
- _this.props.columns.forEach(function (col, idx) {
306
- filename += col.label;
307
- if (idx !== _this.props.columns.length - 1) filename += '_';
308
- });
309
-
567
+ var filename = Object.entries(_this.props.columns).map(function (p) {
568
+ return p[1].label;
569
+ }).join('_');
310
570
  return filename;
311
571
  }
312
572
  });
313
573
 
314
574
  _defineProperty(_assertThisInitialized(_this), "getCSVData", function () {
315
- var reorderedIndex = _this.reorderIndex(_this.state.key, _this.state.direction, _this.props.filter, _this.props.rows);
575
+ var _reorderedIndex$viewI, _reorderedIndex$viewI2;
316
576
 
577
+ var reorderedIndex = _this.reorderIndex(_this.state.indirectionVersion, _this.props.rows, _this.props.columns);
578
+
579
+ var rowsCount = (_reorderedIndex$viewI = (_reorderedIndex$viewI2 = reorderedIndex.viewIndexToModel) === null || _reorderedIndex$viewI2 === void 0 ? void 0 : _reorderedIndex$viewI2.length) !== null && _reorderedIndex$viewI !== void 0 ? _reorderedIndex$viewI : _this.props.rows.length;
317
580
  var csvData = [];
318
- reorderedIndex.forEach(function (index) {
581
+
582
+ var _loop2 = function _loop2(index) {
319
583
  var myobj = {};
320
- var sortedRow = _this.props.rows[index];
584
+ var sortedRow = reorderedIndex.rowGetter(index);
585
+ var exportedKeys = _this.props.exportCSVDataKeys;
321
586
 
322
587
  _this.props.columns.forEach(function (col) {
323
- if (_this.props.exportCSVDataKeys !== undefined && _this.props.exportCSVDataKeys.find(function (el) {
588
+ if (exportedKeys === null || exportedKeys === void 0 ? void 0 : exportedKeys.find(function (el) {
324
589
  return el === col.dataKey;
325
590
  })) {
326
591
  myobj[col.dataKey] = sortedRow[col.dataKey];
@@ -328,7 +593,12 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
328
593
  });
329
594
 
330
595
  csvData.push(myobj);
331
- });
596
+ };
597
+
598
+ for (var index = 0; index < rowsCount; ++index) {
599
+ _loop2(index);
600
+ }
601
+
332
602
  return Promise.resolve(csvData);
333
603
  });
334
604
 
@@ -352,17 +622,43 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
352
622
  _this._registerObserver = _this._registerObserver.bind(_assertThisInitialized(_this));
353
623
  _this.headers = (0, _react.createRef)();
354
624
  _this.headers.current = {};
355
- var options = {
625
+ var _options = {
356
626
  root: null,
357
627
  rootMargin: '0px',
358
628
  threshold: 0.1
359
629
  };
360
- _this.observer = new IntersectionObserver(_this._computeHeaderSize, options);
630
+ _this.observer = new IntersectionObserver(_this._computeHeaderSize, _options);
631
+ _this.state = {
632
+ headerHeight: _this.props.headerHeight,
633
+ indexer: initIndexer(_props, null, _this.setVersion),
634
+ indirectionVersion: 0,
635
+ reorderIndex: null,
636
+ popoverAnchorEl: null,
637
+ popoverColKey: null,
638
+ deferredFilterChange: null
639
+ };
361
640
  return _this;
362
641
  }
363
642
 
364
643
  var _proto = MuiVirtualizedTable.prototype;
365
644
 
645
+ _proto.componentDidUpdate = function componentDidUpdate(oldProps) {
646
+ if (oldProps.data !== this.props.data) {
647
+ this.setState({
648
+ indexer: initIndexer(this.props, oldProps)
649
+ });
650
+ }
651
+ };
652
+
653
+ _proto.componentDidMount = function componentDidMount() {
654
+ window.addEventListener('resize', this._computeHeaderSize);
655
+ };
656
+
657
+ _proto.componentWillUnmount = function componentWillUnmount() {
658
+ window.removeEventListener('resize', this._computeHeaderSize);
659
+ this.observer.disconnect();
660
+ };
661
+
366
662
  _proto._registerHeader = function _registerHeader(label, header) {
367
663
  if (header !== null) {
368
664
  this.headers.current[label] = header;
@@ -375,21 +671,34 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
375
671
  }
376
672
  };
377
673
 
674
+ _proto.onFilterParamsChange = function onFilterParamsChange(newVal, colKey) {
675
+ var nonEmpty = newVal.length === 0 ? null : newVal;
676
+
677
+ if (this.props.defersFilterChanges) {
678
+ this.setState({
679
+ deferredFilterChange: {
680
+ newVal: newVal,
681
+ colKey: colKey
682
+ }
683
+ });
684
+ } else if (this.state.indexer.setColFilterUserParams(colKey, nonEmpty)) {
685
+ this.setState({
686
+ indirectionVersion: this.state.indirectionVersion + 1
687
+ });
688
+ }
689
+ };
690
+
378
691
  _proto.getDisplayValue = function getDisplayValue(column, cellData) {
379
692
  var displayedValue;
380
693
 
381
- if (column.numeric) {
382
- if (!isNaN(cellData)) {
383
- if (column.fractionDigits !== undefined && column.fractionDigits !== 0) {
384
- displayedValue = Number(cellData).toFixed(column.fractionDigits);
385
- } else {
386
- displayedValue = Math.round(cellData);
387
- }
388
- } else {
389
- displayedValue = '';
390
- }
391
- } else {
694
+ if (!column.numeric) {
392
695
  displayedValue = cellData;
696
+ } else if (isNaN(cellData)) {
697
+ displayedValue = '';
698
+ } else if (column.fractionDigits === undefined || column.fractionDigits === 0) {
699
+ displayedValue = Math.round(cellData);
700
+ } else {
701
+ displayedValue = Number(cellData).toFixed(column.fractionDigits);
393
702
  }
394
703
 
395
704
  if (column.unit !== undefined) {
@@ -401,17 +710,16 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
401
710
  };
402
711
 
403
712
  _proto._computeHeaderSize = function _computeHeaderSize() {
404
- console.debug('recompute header size');
405
713
  var headers = Object.values(this.headers.current);
406
- if (headers.length === 0) return;
407
- var headerHeight = this.props.headerHeight;
408
- headers.forEach(function (h) {
409
- // https://developer.mozilla.org/fr/docs/Web/API/Element/scrollHeight
410
- // The scrollHeight value is equal to the minimum height the element
411
- // would require in order to fit all the content in the viewport
412
- // without using a vertical scrollbar.
413
- headerHeight = Math.max(h.scrollHeight + DEFAULT_CELL_PADDING, headerHeight);
714
+ if (headers.length === 0) return; // for now keep 'historical' use of scrollHeight,
715
+ // though it can not make a difference from clientHeight,
716
+ // as overflow-y as no scroll value
717
+
718
+ var scrollHeights = headers.map(function (header) {
719
+ return header.scrollHeight;
414
720
  });
721
+ var headerHeight = Math.max(Math.max.apply(Math, scrollHeights) + DEFAULT_CELL_PADDING, this.props.headerHeight // hides (most often) padding override by forcing height
722
+ );
415
723
 
416
724
  if (headerHeight !== this.state.headerHeight) {
417
725
  this.setState({
@@ -420,45 +728,41 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
420
728
  }
421
729
  };
422
730
 
423
- _proto.componentDidMount = function componentDidMount() {
424
- window.addEventListener('resize', this._computeHeaderSize);
425
- };
731
+ _proto.makeHeaderRenderer = function makeHeaderRenderer(dataKey, columnIndex) {
732
+ var _this2 = this;
426
733
 
427
- _proto.componentWillUnmount = function componentWillUnmount() {
428
- window.removeEventListener('resize', this._computeHeaderSize);
429
- this.observer.disconnect();
734
+ var _this$props4 = this.props,
735
+ columns = _this$props4.columns,
736
+ classes = _this$props4.classes;
737
+ return function (headerProps) {
738
+ return /*#__PURE__*/_react["default"].createElement(_material.TableCell, {
739
+ component: "div",
740
+ className: (0, _clsx3["default"])(classes.tableCell, classes.flexContainer, classes.noClick, classes.header),
741
+ variant: "head",
742
+ style: {
743
+ height: _this2.state.headerHeight
744
+ },
745
+ align: columns[columnIndex].numeric || false ? 'right' : 'left',
746
+ ref: function ref(e) {
747
+ return _this2._registerObserver(e);
748
+ }
749
+ }, _this2.props.sortable ? _this2.sortableHeader(_extends({}, headerProps, {
750
+ columnIndex: columnIndex,
751
+ key: {
752
+ dataKey: dataKey
753
+ }
754
+ })) : _this2.simpleHeaderRenderer(_extends({}, headerProps)));
755
+ };
430
756
  };
431
757
 
432
758
  _proto.render = function render() {
433
- var _this2 = this;
434
-
435
- var _this$props5 = this.props,
436
- name = _this$props5.name,
437
- classes = _this$props5.classes,
438
- rows = _this$props5.rows,
439
- columns = _this$props5.columns,
440
- rowHeight = _this$props5.rowHeight,
441
- headerHeight = _this$props5.headerHeight,
442
- rowCount = _this$props5.rowCount,
443
- sortable = _this$props5.sortable,
444
- enableExportCSV = _this$props5.enableExportCSV,
445
- tableProps = _objectWithoutPropertiesLoose(_this$props5, _excluded);
446
-
447
- if (tableProps.onRowClick) {
448
- tableProps.onRowClick = this.onClickableRowClick;
449
- }
450
-
451
- var reorderedIndex = this.reorderIndex(this.state.key, this.state.direction, this.props.filter, this.props.rows);
759
+ var _this3 = this;
452
760
 
453
- var getIndexFor = function getIndexFor(index) {
454
- return index < reorderedIndex.length ? reorderedIndex[index] : 0;
455
- };
761
+ var _this$reorderIndex = this.reorderIndex(this.state.indirectionVersion, this.props.rows, this.props.columns),
762
+ viewIndexToModel = _this$reorderIndex.viewIndexToModel,
763
+ rowGetter = _this$reorderIndex.rowGetter;
456
764
 
457
- var _rowGetter3 = function rowGetter(index) {
458
- return _this2.props.rows[getIndexFor(index)];
459
- };
460
-
461
- var sizes = this.sizes(this.props.columns, this.props.rows, _rowGetter3);
765
+ var sizes = this.sizes(this.props.columns, this.props.rows, rowGetter);
462
766
  var csvHeaders = this.csvHeaders(this.props.columns, this.props.exportCSVDataKeys);
463
767
  return /*#__PURE__*/_react["default"].createElement("div", {
464
768
  style: {
@@ -466,7 +770,7 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
466
770
  flexDirection: 'column',
467
771
  height: '100%'
468
772
  }
469
- }, enableExportCSV && /*#__PURE__*/_react["default"].createElement("div", {
773
+ }, this.props.enableExportCSV && /*#__PURE__*/_react["default"].createElement("div", {
470
774
  style: {
471
775
  display: 'flex',
472
776
  justifyContent: 'flex-end',
@@ -478,67 +782,30 @@ var MuiVirtualizedTable = /*#__PURE__*/function (_React$PureComponent) {
478
782
  datas: this.getCSVData,
479
783
  columns: csvHeaders,
480
784
  filename: this.getCSVFilename()
481
- }, /*#__PURE__*/_react["default"].createElement(_IconButton["default"], {
785
+ }, /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
482
786
  "aria-label": "exportCSVButton",
483
787
  size: "large"
484
788
  }, /*#__PURE__*/_react["default"].createElement(_GetApp["default"], null)))), /*#__PURE__*/_react["default"].createElement("div", {
485
789
  style: {
486
790
  flexGrow: 1
487
791
  }
488
- }, /*#__PURE__*/_react["default"].createElement(_reactVirtualized.AutoSizer, null, function (_ref5) {
489
- var height = _ref5.height,
490
- width = _ref5.width;
491
- return /*#__PURE__*/_react["default"].createElement(_reactVirtualized.Table, _extends({
492
- height: height,
493
- width: width,
494
- rowHeight: rowHeight,
495
- gridStyle: {
496
- direction: 'inherit'
497
- },
498
- headerHeight: _this2.state.headerHeight,
499
- className: classes.table
500
- }, tableProps, {
501
- rowCount: reorderedIndex.length,
502
- rowClassName: function rowClassName(_ref6) {
503
- var index = _ref6.index;
504
- return _this2.getRowClassName({
505
- index: index,
506
- rowGetter: _rowGetter3
507
- });
508
- },
509
- rowGetter: function rowGetter(_ref7) {
510
- var index = _ref7.index;
511
- return _rowGetter3(index);
512
- }
513
- }), columns.map(function (_ref8, index) {
514
- var dataKey = _ref8.dataKey,
515
- other = _objectWithoutPropertiesLoose(_ref8, _excluded2);
516
-
517
- return /*#__PURE__*/_react["default"].createElement(_reactVirtualized.Column, _extends({
518
- key: dataKey,
519
- headerRenderer: function headerRenderer(headerProps) {
520
- if (sortable) {
521
- return _this2.sortableHeader(_extends({}, headerProps, {
522
- width: sizes[dataKey],
523
- columnIndex: index,
524
- key: {
525
- dataKey: dataKey
526
- }
527
- }));
528
- } else {
529
- return _this2.headerRenderer(_extends({}, headerProps, {
530
- columnIndex: index
531
- }));
532
- }
533
- },
534
- className: classes.flexContainer,
535
- cellRenderer: _this2.cellRenderer,
536
- dataKey: dataKey,
537
- flexGrow: 1,
538
- width: sizes[dataKey]
539
- }, other));
540
- }));
541
- })));
792
+ }, /*#__PURE__*/_react["default"].createElement(_reactVirtualized.AutoSizer, null, function (_ref8) {
793
+ var height = _ref8.height,
794
+ width = _ref8.width;
795
+ return _this3.makeSizedTable(height, width, sizes, viewIndexToModel, rowGetter);
796
+ })), this.state.popoverAnchorEl && /*#__PURE__*/_react["default"].createElement(_material.Popover, {
797
+ anchorEl: this.state.popoverAnchorEl,
798
+ anchorOrigin: {
799
+ vertical: 'center',
800
+ horizontal: 'center'
801
+ },
802
+ transformOrigin: {
803
+ vertical: 'center',
804
+ horizontal: 'center'
805
+ },
806
+ onClose: this.closePopover,
807
+ open: !!this.state.popoverAnchorEl
808
+ }, this.makeColumnFilterEditor()));
542
809
  };
543
810
 
544
811
  return MuiVirtualizedTable;
@@ -566,13 +833,14 @@ MuiVirtualizedTable.propTypes = process.env.NODE_ENV !== "production" ? {
566
833
  })).isRequired,
567
834
  enableExportCSV: _propTypes["default"].bool,
568
835
  exportCSVDataKeys: _propTypes["default"].array,
836
+ sort: _propTypes["default"].func,
569
837
  sortable: _propTypes["default"].bool,
838
+ indexer: _propTypes["default"].object,
570
839
  headerHeight: _propTypes["default"].number,
571
840
  onRowClick: _propTypes["default"].func,
572
841
  onCellClick: _propTypes["default"].func,
573
842
  rowHeight: _propTypes["default"].number,
574
- filter: _propTypes["default"].func,
575
- sort: _propTypes["default"].func
843
+ filter: _propTypes["default"].func
576
844
  } : {};
577
845
 
578
846
  var _default = (0, _withStyles["default"])(defaultStyles)(MuiVirtualizedTable);