@deephaven/iris-grid 1.6.1-beta.0 → 1.7.0

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.
Files changed (38) hide show
  1. package/dist/ColumnHeaderGroup.d.ts +9 -8
  2. package/dist/ColumnHeaderGroup.d.ts.map +1 -1
  3. package/dist/ColumnHeaderGroup.js.map +1 -1
  4. package/dist/CommonTypes.d.ts +18 -2
  5. package/dist/CommonTypes.d.ts.map +1 -1
  6. package/dist/CommonTypes.js.map +1 -1
  7. package/dist/IrisGrid.d.ts +14 -5
  8. package/dist/IrisGrid.d.ts.map +1 -1
  9. package/dist/IrisGrid.js +110 -45
  10. package/dist/IrisGrid.js.map +1 -1
  11. package/dist/IrisGridMetricCalculator.d.ts +42 -23
  12. package/dist/IrisGridMetricCalculator.d.ts.map +1 -1
  13. package/dist/IrisGridMetricCalculator.js +120 -5
  14. package/dist/IrisGridMetricCalculator.js.map +1 -1
  15. package/dist/IrisGridRenderer.d.ts +3 -15
  16. package/dist/IrisGridRenderer.d.ts.map +1 -1
  17. package/dist/IrisGridRenderer.js +3 -3
  18. package/dist/IrisGridRenderer.js.map +1 -1
  19. package/dist/IrisGridTableModel.d.ts +1 -0
  20. package/dist/IrisGridTableModel.d.ts.map +1 -1
  21. package/dist/IrisGridTableModel.js +3 -0
  22. package/dist/IrisGridTableModel.js.map +1 -1
  23. package/dist/IrisGridTreeTableModel.d.ts +2 -2
  24. package/dist/IrisGridTreeTableModel.d.ts.map +1 -1
  25. package/dist/IrisGridTreeTableModel.js +0 -1
  26. package/dist/IrisGridTreeTableModel.js.map +1 -1
  27. package/dist/IrisGridUtils.d.ts +5 -5
  28. package/dist/IrisGridUtils.d.ts.map +1 -1
  29. package/dist/IrisGridUtils.js +4 -2
  30. package/dist/IrisGridUtils.js.map +1 -1
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/mousehandlers/IrisGridContextMenuHandler.d.ts.map +1 -1
  36. package/dist/mousehandlers/IrisGridContextMenuHandler.js +23 -2
  37. package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -1
  38. package/package.json +16 -16
package/dist/IrisGrid.js CHANGED
@@ -14,7 +14,7 @@ import deepEqual from 'fast-deep-equal';
14
14
  import Log from '@deephaven/log';
15
15
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
16
16
  import { ContextActions, Stack, Menu, Page, Popper, ThemeExport, Tooltip, Button, ContextActionUtils, SlideTransition } from '@deephaven/components';
17
- import { Grid, GridRange, GridUtils, isEditableGridModel, isExpandableGridModel, isDeletableGridModel } from '@deephaven/grid';
17
+ import { Grid, GridRange, GridUtils, isEditableGridModel, isExpandableGridModel, isDeletableGridModel, isExpandableColumnGridModel } from '@deephaven/grid';
18
18
  import { dhEye, dhFilterFilled, dhGraphLineUp, dhTriangleDownSquare, vsClose, vsCloudDownload, vsEdit, vsFilter, vsMenu, vsReply, vsRuby, vsSearch, vsSplitHorizontal, vsSymbolOperator, vsTools } from '@deephaven/icons';
19
19
  import { DateUtils, Formatter, FormatterUtils, TableUtils, isSortDirection } from '@deephaven/jsapi-utils';
20
20
  import { assertNotNull, copyToClipboard, EMPTY_ARRAY, EMPTY_MAP, Pending, PromiseUtils, ValidationError, getOrThrow } from '@deephaven/utils';
@@ -310,7 +310,9 @@ class IrisGrid extends Component {
310
310
  }, {
311
311
  max: 1
312
312
  }));
313
- _defineProperty(this, "getCachedStateOverride", memoize((hoverSelectColumn, isFilterBarShown, isSelectingColumn, loadingScrimProgress, quickFilters, advancedFilters, sorts, reverse, rollupConfig, isMenuShown) => ({
313
+ _defineProperty(this, "getCachedStateOverride", memoize((model, theme, hoverSelectColumn, isFilterBarShown, isSelectingColumn, loadingScrimProgress, quickFilters, advancedFilters, sorts, reverse, rollupConfig, isMenuShown) => ({
314
+ model,
315
+ theme,
314
316
  hoverSelectColumn,
315
317
  isFilterBarShown,
316
318
  isSelectingColumn,
@@ -914,6 +916,29 @@ class IrisGrid extends Component {
914
916
  } = this.props;
915
917
  return this.getCachedKeyHandlers(keyHandlers);
916
918
  }
919
+ getMetricState() {
920
+ var _this$grid2;
921
+ var gridMetricState = (_this$grid2 = this.grid) === null || _this$grid2 === void 0 ? void 0 : _this$grid2.getMetricState();
922
+ if (gridMetricState == null) {
923
+ return undefined;
924
+ }
925
+ var {
926
+ advancedFilters,
927
+ hoverSelectColumn,
928
+ isFilterBarShown,
929
+ isMenuShown,
930
+ loadingScrimProgress,
931
+ quickFilters,
932
+ sorts,
933
+ reverse,
934
+ rollupConfig
935
+ } = this.state;
936
+ var {
937
+ model,
938
+ isSelectingColumn
939
+ } = this.props;
940
+ return _objectSpread(_objectSpread({}, gridMetricState), this.getCachedStateOverride(model, this.getTheme(), hoverSelectColumn, isFilterBarShown, isSelectingColumn, loadingScrimProgress, quickFilters, advancedFilters, sorts, reverse, rollupConfig, isMenuShown));
941
+ }
917
942
  get renderer() {
918
943
  var {
919
944
  renderer
@@ -1279,6 +1304,10 @@ class IrisGrid extends Component {
1279
1304
  advancedFilters,
1280
1305
  quickFilters
1281
1306
  } = this.state;
1307
+ if (advancedFilters.size === 0 && quickFilters.size === 0) {
1308
+ log.debug('No filters to rebuild');
1309
+ return;
1310
+ }
1282
1311
  var {
1283
1312
  columns,
1284
1313
  formatter
@@ -1730,8 +1759,8 @@ class IrisGrid extends Component {
1730
1759
  model.removeEventListener(IrisGridModel.EVENT.TABLE_CHANGED, this.handleTableChanged);
1731
1760
  }
1732
1761
  focus() {
1733
- var _this$grid2;
1734
- (_this$grid2 = this.grid) === null || _this$grid2 === void 0 ? void 0 : _this$grid2.focus();
1762
+ var _this$grid3;
1763
+ (_this$grid3 = this.grid) === null || _this$grid3 === void 0 ? void 0 : _this$grid3.focus();
1735
1764
  }
1736
1765
  focusFilterBar(column) {
1737
1766
  var {
@@ -1761,13 +1790,13 @@ class IrisGrid extends Component {
1761
1790
  lastLeft
1762
1791
  } = metrics;
1763
1792
  if (column < left) {
1764
- var _this$grid3;
1765
- (_this$grid3 = this.grid) === null || _this$grid3 === void 0 ? void 0 : _this$grid3.setViewState({
1793
+ var _this$grid4;
1794
+ (_this$grid4 = this.grid) === null || _this$grid4 === void 0 ? void 0 : _this$grid4.setViewState({
1766
1795
  left: column
1767
1796
  }, true);
1768
1797
  } else if (rightVisible < column) {
1769
- var _this$grid4, _this$grid5;
1770
- var metricState = (_this$grid4 = this.grid) === null || _this$grid4 === void 0 ? void 0 : _this$grid4.getMetricState();
1798
+ var _this$grid5;
1799
+ var metricState = this.getMetricState();
1771
1800
  assertNotNull(metricState);
1772
1801
  var newLeft = metricCalculator.getLastLeft(metricState, column, metricCalculator.getVisibleWidth(metricState));
1773
1802
  (_this$grid5 = this.grid) === null || _this$grid5 === void 0 ? void 0 : _this$grid5.setViewState({
@@ -1832,6 +1861,33 @@ class IrisGrid extends Component {
1832
1861
  movedColumns: newMovedColumns
1833
1862
  });
1834
1863
  }
1864
+ toggleExpandColumn(modelIndex) {
1865
+ log.debug2('Toggle expand column', modelIndex);
1866
+ var {
1867
+ model
1868
+ } = this.props;
1869
+ if (isExpandableColumnGridModel(model) && model.hasExpandableColumns) {
1870
+ model.setColumnExpanded(modelIndex, !model.isColumnExpanded(modelIndex));
1871
+ }
1872
+ }
1873
+ expandAllColumns() {
1874
+ log.debug2('Expand all columns');
1875
+ var {
1876
+ model
1877
+ } = this.props;
1878
+ if (isExpandableColumnGridModel(model) && model.isExpandAllColumnsAvailable) {
1879
+ model.expandAllColumns();
1880
+ }
1881
+ }
1882
+ collapseAllColumns() {
1883
+ log.debug2('Collapse all columns');
1884
+ var {
1885
+ model
1886
+ } = this.props;
1887
+ if (isExpandableColumnGridModel(model) && model.isExpandAllColumnsAvailable) {
1888
+ model.collapseAllColumns();
1889
+ }
1890
+ }
1835
1891
  handleColumnVisibilityChanged(modelIndexes, isVisible) {
1836
1892
  var _this$grid7;
1837
1893
  var {
@@ -1859,16 +1915,12 @@ class IrisGrid extends Component {
1859
1915
  handleColumnVisibilityReset() {
1860
1916
  var _model$layoutHints$fr, _model$layoutHints2;
1861
1917
  var {
1862
- metricCalculator,
1863
- metrics
1918
+ metricCalculator
1864
1919
  } = this.state;
1865
1920
  var {
1866
1921
  model
1867
1922
  } = this.props;
1868
- assertNotNull(metrics);
1869
- for (var i = 0; i < metrics.columnCount; i += 1) {
1870
- metricCalculator.resetColumnWidth(i);
1871
- }
1923
+ metricCalculator.resetAllColumnWidths();
1872
1924
  this.handleMovedColumnsChanged(model.initialMovedColumns);
1873
1925
  this.handleHeaderGroupsChanged(model.initialColumnHeaderGroups);
1874
1926
  this.setState({
@@ -1957,6 +2009,17 @@ class IrisGrid extends Component {
1957
2009
  }
1958
2010
  (_this$grid9 = this.grid) === null || _this$grid9 === void 0 ? void 0 : _this$grid9.forceUpdate();
1959
2011
  }
2012
+
2013
+ /**
2014
+ * Updates grid metrics after model columns have changed
2015
+ * to keep Grid and IrisGrid metrics in sync since metrics are stored in both places.
2016
+ */
2017
+ updateMetrics() {
2018
+ var _this$grid10;
2019
+ this.setState({
2020
+ metrics: (_this$grid10 = this.grid) === null || _this$grid10 === void 0 ? void 0 : _this$grid10.updateMetrics()
2021
+ });
2022
+ }
1960
2023
  toggleSort(columnIndex, addToExisting) {
1961
2024
  log.info('Toggling sort for column', columnIndex);
1962
2025
  var {
@@ -1975,15 +2038,15 @@ class IrisGrid extends Component {
1975
2038
  }
1976
2039
  }
1977
2040
  updateSorts(sorts) {
1978
- var _this$grid10;
2041
+ var _this$grid11;
1979
2042
  this.startLoading('Sorting...');
1980
2043
  this.setState({
1981
2044
  sorts
1982
2045
  });
1983
- (_this$grid10 = this.grid) === null || _this$grid10 === void 0 ? void 0 : _this$grid10.forceUpdate();
2046
+ (_this$grid11 = this.grid) === null || _this$grid11 === void 0 ? void 0 : _this$grid11.forceUpdate();
1984
2047
  }
1985
2048
  sortColumn(modelColumn) {
1986
- var _this$grid11;
2049
+ var _this$grid12;
1987
2050
  var direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : TableUtils.sortDirection.none;
1988
2051
  var isAbs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1989
2052
  var addToExisting = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
@@ -1996,15 +2059,15 @@ class IrisGrid extends Component {
1996
2059
  this.setState({
1997
2060
  sorts
1998
2061
  });
1999
- (_this$grid11 = this.grid) === null || _this$grid11 === void 0 ? void 0 : _this$grid11.forceUpdate();
2062
+ (_this$grid12 = this.grid) === null || _this$grid12 === void 0 ? void 0 : _this$grid12.forceUpdate();
2000
2063
  }
2001
2064
  reverse(reverse) {
2002
- var _this$grid12;
2065
+ var _this$grid13;
2003
2066
  this.startLoading('Reversing...');
2004
2067
  this.setState({
2005
2068
  reverse
2006
2069
  });
2007
- (_this$grid12 = this.grid) === null || _this$grid12 === void 0 ? void 0 : _this$grid12.forceUpdate();
2070
+ (_this$grid13 = this.grid) === null || _this$grid13 === void 0 ? void 0 : _this$grid13.forceUpdate();
2008
2071
  }
2009
2072
  isReversible() {
2010
2073
  var {
@@ -2045,8 +2108,8 @@ class IrisGrid extends Component {
2045
2108
  this.focusFilterBar(columnIndex);
2046
2109
  }
2047
2110
  } else {
2048
- var _this$grid13;
2049
- (_this$grid13 = this.grid) === null || _this$grid13 === void 0 ? void 0 : _this$grid13.focus();
2111
+ var _this$grid14;
2112
+ (_this$grid14 = this.grid) === null || _this$grid14 === void 0 ? void 0 : _this$grid14.focus();
2050
2113
  }
2051
2114
  }
2052
2115
  isTableSearchAvailable() {
@@ -2083,13 +2146,13 @@ class IrisGrid extends Component {
2083
2146
  var _this$crossColumnRef2;
2084
2147
  (_this$crossColumnRef2 = this.crossColumnRef) === null || _this$crossColumnRef2 === void 0 ? void 0 : _this$crossColumnRef2.current.focus();
2085
2148
  } else {
2086
- var _this$grid14;
2087
- (_this$grid14 = this.grid) === null || _this$grid14 === void 0 ? void 0 : _this$grid14.focus();
2149
+ var _this$grid15;
2150
+ (_this$grid15 = this.grid) === null || _this$grid15 === void 0 ? void 0 : _this$grid15.focus();
2088
2151
  }
2089
2152
  });
2090
2153
  }
2091
2154
  toggleGotoRow() {
2092
- var _this$grid15, _this$grid16;
2155
+ var _this$grid16, _this$grid17;
2093
2156
  var row = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
2094
2157
  var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2095
2158
  var columnName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
@@ -2111,8 +2174,8 @@ class IrisGrid extends Component {
2111
2174
  (_this$gotoRowRef$curr = this.gotoRowRef.current) === null || _this$gotoRowRef$curr === void 0 ? void 0 : _this$gotoRowRef$curr.focus();
2112
2175
  return;
2113
2176
  }
2114
- var cursorRow = (_this$grid15 = this.grid) === null || _this$grid15 === void 0 ? void 0 : _this$grid15.state.cursorRow;
2115
- var cursorColumn = (_this$grid16 = this.grid) === null || _this$grid16 === void 0 ? void 0 : _this$grid16.state.cursorColumn;
2177
+ var cursorRow = (_this$grid16 = this.grid) === null || _this$grid16 === void 0 ? void 0 : _this$grid16.state.cursorRow;
2178
+ var cursorColumn = (_this$grid17 = this.grid) === null || _this$grid17 === void 0 ? void 0 : _this$grid17.state.cursorColumn;
2116
2179
  if (cursorRow == null || cursorColumn == null) {
2117
2180
  // if a cell is not selected / grid is not rendered
2118
2181
  this.setState({
@@ -2279,7 +2342,7 @@ class IrisGrid extends Component {
2279
2342
  this.setAdvancedFilter(index, filter, options);
2280
2343
  }
2281
2344
  handleAdvancedFilterSortChange(column, direction) {
2282
- var _this$grid17;
2345
+ var _this$grid18;
2283
2346
  var addToExisting = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2284
2347
  var {
2285
2348
  model
@@ -2302,11 +2365,11 @@ class IrisGrid extends Component {
2302
2365
  this.setState({
2303
2366
  sorts
2304
2367
  });
2305
- (_this$grid17 = this.grid) === null || _this$grid17 === void 0 ? void 0 : _this$grid17.forceUpdate();
2368
+ (_this$grid18 = this.grid) === null || _this$grid18 === void 0 ? void 0 : _this$grid18.forceUpdate();
2306
2369
  }
2307
2370
  handleAdvancedFilterDone() {
2308
- var _this$grid18;
2309
- (_this$grid18 = this.grid) === null || _this$grid18 === void 0 ? void 0 : _this$grid18.focus();
2371
+ var _this$grid19;
2372
+ (_this$grid19 = this.grid) === null || _this$grid19 === void 0 ? void 0 : _this$grid19.focus();
2310
2373
  }
2311
2374
  handleAdvancedMenuOpened(column) {
2312
2375
  this.setState({
@@ -2392,8 +2455,8 @@ class IrisGrid extends Component {
2392
2455
  var setGridFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
2393
2456
  var defocusInput = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
2394
2457
  if (setGridFocus) {
2395
- var _this$grid19;
2396
- (_this$grid19 = this.grid) === null || _this$grid19 === void 0 ? void 0 : _this$grid19.focus();
2458
+ var _this$grid20;
2459
+ (_this$grid20 = this.grid) === null || _this$grid20 === void 0 ? void 0 : _this$grid20.focus();
2397
2460
  }
2398
2461
  if (defocusInput) {
2399
2462
  this.setState({
@@ -2520,7 +2583,7 @@ class IrisGrid extends Component {
2520
2583
  }
2521
2584
  }
2522
2585
  handleUpdate() {
2523
- var _this$grid20;
2586
+ var _this$grid21;
2524
2587
  log.debug2('Received model update');
2525
2588
  var {
2526
2589
  advancedFilters,
@@ -2549,7 +2612,7 @@ class IrisGrid extends Component {
2549
2612
  } else {
2550
2613
  this.lastLoadedConfig = null;
2551
2614
  }
2552
- (_this$grid20 = this.grid) === null || _this$grid20 === void 0 ? void 0 : _this$grid20.forceUpdate();
2615
+ (_this$grid21 = this.grid) === null || _this$grid21 === void 0 ? void 0 : _this$grid21.forceUpdate();
2553
2616
  this.stopLoading();
2554
2617
  }
2555
2618
  handleTableChanged() {
@@ -2562,13 +2625,13 @@ class IrisGrid extends Component {
2562
2625
  });
2563
2626
  }
2564
2627
  handleViewChanged(metrics) {
2565
- var _this$grid$state, _this$grid21;
2628
+ var _this$grid$state, _this$grid22;
2566
2629
  var {
2567
2630
  model
2568
2631
  } = this.props;
2569
2632
  var {
2570
2633
  selectionEndRow = 0
2571
- } = (_this$grid$state = (_this$grid21 = this.grid) === null || _this$grid21 === void 0 ? void 0 : _this$grid21.state) !== null && _this$grid$state !== void 0 ? _this$grid$state : {};
2634
+ } = (_this$grid$state = (_this$grid22 = this.grid) === null || _this$grid22 === void 0 ? void 0 : _this$grid22.state) !== null && _this$grid$state !== void 0 ? _this$grid$state : {};
2572
2635
  var pendingRowCount = 0;
2573
2636
  if (isEditableGridModel(model) && model.isEditable) {
2574
2637
  assertNotNull(metrics);
@@ -2596,7 +2659,7 @@ class IrisGrid extends Component {
2596
2659
  });
2597
2660
  }
2598
2661
  handleSelectionChanged(selectedRanges) {
2599
- var _this$grid22;
2662
+ var _this$grid23;
2600
2663
  assertNotNull(selectedRanges);
2601
2664
  var {
2602
2665
  onSelectionChanged
@@ -2612,7 +2675,7 @@ class IrisGrid extends Component {
2612
2675
  copyOperation: null
2613
2676
  });
2614
2677
  }
2615
- if (((_this$grid22 = this.grid) === null || _this$grid22 === void 0 ? void 0 : _this$grid22.state.cursorRow) != null) {
2678
+ if (((_this$grid23 = this.grid) === null || _this$grid23 === void 0 ? void 0 : _this$grid23.state.cursorRow) != null) {
2616
2679
  this.setState({
2617
2680
  gotoRow: "".concat(this.grid.state.cursorRow + 1)
2618
2681
  });
@@ -2631,8 +2694,8 @@ class IrisGrid extends Component {
2631
2694
  this.setState({
2632
2695
  columnHeaderGroups: IrisGridUtils.parseColumnHeaderGroups(model, columnHeaderGroups).groups
2633
2696
  }, () => {
2634
- var _this$grid23;
2635
- return (_this$grid23 = this.grid) === null || _this$grid23 === void 0 ? void 0 : _this$grid23.forceUpdate();
2697
+ var _this$grid24;
2698
+ return (_this$grid24 = this.grid) === null || _this$grid24 === void 0 ? void 0 : _this$grid24.forceUpdate();
2636
2699
  });
2637
2700
  }
2638
2701
  handleTooltipRef(tooltip) {
@@ -2766,14 +2829,16 @@ class IrisGrid extends Component {
2766
2829
  }
2767
2830
  }
2768
2831
  handleCustomColumnsChanged() {
2769
- log.debug('custom columns changed');
2832
+ log.debug('Model columns changed');
2770
2833
  var {
2771
2834
  isReady
2772
2835
  } = this.state;
2773
2836
  if (isReady) {
2774
- var _this$grid24;
2837
+ this.updateMetrics();
2838
+
2839
+ // Make sure stopLoading() is called after the updateMetrics call,
2840
+ // otherwise IrisGridModelUpdater queues an extra setViewport based on old metrics.
2775
2841
  this.stopLoading();
2776
- (_this$grid24 = this.grid) === null || _this$grid24 === void 0 ? void 0 : _this$grid24.forceUpdate();
2777
2842
  } else {
2778
2843
  this.loadTableState();
2779
2844
  }
@@ -3546,7 +3611,7 @@ class IrisGrid extends Component {
3546
3611
  } = theme;
3547
3612
  var filter = this.getCachedFilter(customFilters, quickFilters, advancedFilters, searchFilter);
3548
3613
  var userColumnWidths = metricCalculator.getUserColumnWidths();
3549
- var stateOverride = this.getCachedStateOverride(hoverSelectColumn, isFilterBarShown, isSelectingColumn, loadingScrimProgress, quickFilters, advancedFilters, sorts, reverse, rollupConfig, isMenuShown);
3614
+ var stateOverride = this.getCachedStateOverride(model, theme, hoverSelectColumn, isFilterBarShown, isSelectingColumn, loadingScrimProgress, quickFilters, advancedFilters, sorts, reverse, rollupConfig, isMenuShown);
3550
3615
  var top = metrics ? metrics.top : 0;
3551
3616
  var bottom = metrics ? metrics.bottomViewport : 0;
3552
3617
  var left = null;