@deephaven/iris-grid 1.22.1 → 1.22.2-alpha-pivot-builder.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 (195) hide show
  1. package/README.md +284 -1
  2. package/dist/AdvancedFilterCreator.js +65 -102
  3. package/dist/AdvancedFilterCreator.js.map +1 -1
  4. package/dist/AdvancedFilterCreatorFilterItem.js +22 -37
  5. package/dist/AdvancedFilterCreatorFilterItem.js.map +1 -1
  6. package/dist/AdvancedFilterCreatorSelectValue.js +37 -63
  7. package/dist/AdvancedFilterCreatorSelectValue.js.map +1 -1
  8. package/dist/AdvancedFilterCreatorSelectValueList.js +29 -59
  9. package/dist/AdvancedFilterCreatorSelectValueList.js.map +1 -1
  10. package/dist/ColumnHeaderGroup.js +6 -8
  11. package/dist/ColumnHeaderGroup.js.map +1 -1
  12. package/dist/ColumnStatistics.js +22 -28
  13. package/dist/ColumnStatistics.js.map +1 -1
  14. package/dist/CommonTypes.d.ts +62 -2
  15. package/dist/CommonTypes.d.ts.map +1 -1
  16. package/dist/CommonTypes.js.map +1 -1
  17. package/dist/CrossColumnSearch.js +20 -29
  18. package/dist/CrossColumnSearch.js.map +1 -1
  19. package/dist/FilterInputField.js +19 -46
  20. package/dist/FilterInputField.js.map +1 -1
  21. package/dist/GotoRow.js +32 -29
  22. package/dist/GotoRow.js.map +1 -1
  23. package/dist/IrisGrid.d.ts +85 -2
  24. package/dist/IrisGrid.d.ts.map +1 -1
  25. package/dist/IrisGrid.js +709 -861
  26. package/dist/IrisGrid.js.map +1 -1
  27. package/dist/IrisGridBottomBar.js +10 -11
  28. package/dist/IrisGridBottomBar.js.map +1 -1
  29. package/dist/IrisGridCacheUtils.js +28 -8
  30. package/dist/IrisGridCacheUtils.js.map +1 -1
  31. package/dist/IrisGridCellOverflowModal.js +30 -13
  32. package/dist/IrisGridCellOverflowModal.js.map +1 -1
  33. package/dist/IrisGridCellRendererUtils.js +6 -12
  34. package/dist/IrisGridCellRendererUtils.js.map +1 -1
  35. package/dist/IrisGridCopyHandler.js +28 -47
  36. package/dist/IrisGridCopyHandler.js.map +1 -1
  37. package/dist/IrisGridMetricCalculator.js +28 -51
  38. package/dist/IrisGridMetricCalculator.js.map +1 -1
  39. package/dist/IrisGridModel.d.ts +30 -1
  40. package/dist/IrisGridModel.d.ts.map +1 -1
  41. package/dist/IrisGridModel.js +36 -1
  42. package/dist/IrisGridModel.js.map +1 -1
  43. package/dist/IrisGridModelUpdater.js +32 -30
  44. package/dist/IrisGridModelUpdater.js.map +1 -1
  45. package/dist/IrisGridModelWidgetProps.d.ts +26 -0
  46. package/dist/IrisGridModelWidgetProps.d.ts.map +1 -0
  47. package/dist/IrisGridModelWidgetProps.js +2 -0
  48. package/dist/IrisGridModelWidgetProps.js.map +1 -0
  49. package/dist/IrisGridPartitionSelector.js +28 -62
  50. package/dist/IrisGridPartitionSelector.js.map +1 -1
  51. package/dist/IrisGridProxyModel.d.ts.map +1 -1
  52. package/dist/IrisGridProxyModel.js +41 -14
  53. package/dist/IrisGridProxyModel.js.map +1 -1
  54. package/dist/IrisGridRenderer.js +162 -264
  55. package/dist/IrisGridRenderer.js.map +1 -1
  56. package/dist/IrisGridTableModel.js +23 -16
  57. package/dist/IrisGridTableModel.js.map +1 -1
  58. package/dist/IrisGridTableModelTemplate.js +49 -73
  59. package/dist/IrisGridTableModelTemplate.js.map +1 -1
  60. package/dist/IrisGridTestUtils.js +19 -19
  61. package/dist/IrisGridTestUtils.js.map +1 -1
  62. package/dist/IrisGridTextCellRenderer.d.ts.map +1 -1
  63. package/dist/IrisGridTextCellRenderer.js +36 -53
  64. package/dist/IrisGridTextCellRenderer.js.map +1 -1
  65. package/dist/IrisGridTheme.js +9 -1
  66. package/dist/IrisGridTheme.js.map +1 -1
  67. package/dist/IrisGridThemeProvider.js +5 -7
  68. package/dist/IrisGridThemeProvider.js.map +1 -1
  69. package/dist/IrisGridTreeTableModel.js +5 -9
  70. package/dist/IrisGridTreeTableModel.js.map +1 -1
  71. package/dist/IrisGridUtils.d.ts +25 -2
  72. package/dist/IrisGridUtils.d.ts.map +1 -1
  73. package/dist/IrisGridUtils.js +297 -294
  74. package/dist/IrisGridUtils.js.map +1 -1
  75. package/dist/LazyIrisGrid.d.ts +1 -1
  76. package/dist/NoPastePermissionModal.js +3 -5
  77. package/dist/NoPastePermissionModal.js.map +1 -1
  78. package/dist/PendingDataBottomBar.js +27 -16
  79. package/dist/PendingDataBottomBar.js.map +1 -1
  80. package/dist/ToastBottomBar.js +16 -8
  81. package/dist/ToastBottomBar.js.map +1 -1
  82. package/dist/format-context-menus/CustomFormatAction.js +11 -24
  83. package/dist/format-context-menus/CustomFormatAction.js.map +1 -1
  84. package/dist/index.d.ts +1 -0
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +1 -0
  87. package/dist/index.js.map +1 -1
  88. package/dist/key-handlers/CopyCellKeyHandler.js +3 -4
  89. package/dist/key-handlers/CopyCellKeyHandler.js.map +1 -1
  90. package/dist/key-handlers/CopyKeyHandler.js +1 -3
  91. package/dist/key-handlers/CopyKeyHandler.js.map +1 -1
  92. package/dist/key-handlers/ReverseKeyHandler.js +1 -3
  93. package/dist/key-handlers/ReverseKeyHandler.js.map +1 -1
  94. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +35 -59
  95. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +1 -1
  96. package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js +13 -29
  97. package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js.map +1 -1
  98. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js +8 -17
  99. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js.map +1 -1
  100. package/dist/mousehandlers/IrisGridContextMenuHandler.js +96 -199
  101. package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -1
  102. package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js +2 -4
  103. package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js.map +1 -1
  104. package/dist/mousehandlers/IrisGridFilterMouseHandler.js +16 -30
  105. package/dist/mousehandlers/IrisGridFilterMouseHandler.js.map +1 -1
  106. package/dist/mousehandlers/IrisGridPartitionedTableMouseHandler.js +5 -13
  107. package/dist/mousehandlers/IrisGridPartitionedTableMouseHandler.js.map +1 -1
  108. package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js +20 -36
  109. package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js.map +1 -1
  110. package/dist/mousehandlers/IrisGridSortMouseHandler.js +3 -5
  111. package/dist/mousehandlers/IrisGridSortMouseHandler.js.map +1 -1
  112. package/dist/mousehandlers/IrisGridTokenMouseHandler.js +9 -18
  113. package/dist/mousehandlers/IrisGridTokenMouseHandler.js.map +1 -1
  114. package/dist/mousehandlers/PendingMouseHandler.js +10 -18
  115. package/dist/mousehandlers/PendingMouseHandler.js.map +1 -1
  116. package/dist/sidebar/AdvancedSettingsMenu.js +12 -5
  117. package/dist/sidebar/AdvancedSettingsMenu.js.map +1 -1
  118. package/dist/sidebar/ChartBuilder.js +45 -102
  119. package/dist/sidebar/ChartBuilder.js.map +1 -1
  120. package/dist/sidebar/CustomColumnBuilder.js +35 -77
  121. package/dist/sidebar/CustomColumnBuilder.js.map +1 -1
  122. package/dist/sidebar/CustomColumnInput.js +9 -11
  123. package/dist/sidebar/CustomColumnInput.js.map +1 -1
  124. package/dist/sidebar/InputEditor.js +17 -24
  125. package/dist/sidebar/InputEditor.js.map +1 -1
  126. package/dist/sidebar/IrisGridTableOptionsWidgetProps.d.ts +22 -0
  127. package/dist/sidebar/IrisGridTableOptionsWidgetProps.d.ts.map +1 -0
  128. package/dist/sidebar/IrisGridTableOptionsWidgetProps.js +2 -0
  129. package/dist/sidebar/IrisGridTableOptionsWidgetProps.js.map +1 -0
  130. package/dist/sidebar/OptionType.d.ts +8 -0
  131. package/dist/sidebar/OptionType.d.ts.map +1 -1
  132. package/dist/sidebar/OptionType.js +7 -0
  133. package/dist/sidebar/OptionType.js.map +1 -1
  134. package/dist/sidebar/PluginTableOptionsErrorBoundary.d.ts +30 -0
  135. package/dist/sidebar/PluginTableOptionsErrorBoundary.d.ts.map +1 -0
  136. package/dist/sidebar/PluginTableOptionsErrorBoundary.js +55 -0
  137. package/dist/sidebar/PluginTableOptionsErrorBoundary.js.map +1 -0
  138. package/dist/sidebar/RollupRows.js +72 -113
  139. package/dist/sidebar/RollupRows.js.map +1 -1
  140. package/dist/sidebar/SelectDistinctBuilder.js +16 -33
  141. package/dist/sidebar/SelectDistinctBuilder.js.map +1 -1
  142. package/dist/sidebar/TableCsvExporter.js +50 -74
  143. package/dist/sidebar/TableCsvExporter.js.map +1 -1
  144. package/dist/sidebar/TableSaver.js +18 -42
  145. package/dist/sidebar/TableSaver.js.map +1 -1
  146. package/dist/sidebar/aggregations/AggregationEdit.js +25 -18
  147. package/dist/sidebar/aggregations/AggregationEdit.js.map +1 -1
  148. package/dist/sidebar/aggregations/AggregationUtils.js +1 -3
  149. package/dist/sidebar/aggregations/AggregationUtils.js.map +1 -1
  150. package/dist/sidebar/aggregations/Aggregations.js +45 -34
  151. package/dist/sidebar/aggregations/Aggregations.js.map +1 -1
  152. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +35 -24
  153. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -1
  154. package/dist/sidebar/conditional-formatting/ConditionEditor.js +38 -21
  155. package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -1
  156. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +27 -11
  157. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -1
  158. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +9 -11
  159. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -1
  160. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +48 -57
  161. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -1
  162. package/dist/sidebar/conditional-formatting/RowFormatEditor.js +35 -24
  163. package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -1
  164. package/dist/sidebar/conditional-formatting/StyleEditor.js +26 -11
  165. package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -1
  166. package/dist/sidebar/index.d.ts +3 -2
  167. package/dist/sidebar/index.d.ts.map +1 -1
  168. package/dist/sidebar/index.js.map +1 -1
  169. package/dist/sidebar/visibility-ordering-builder/SearchItem.js +5 -7
  170. package/dist/sidebar/visibility-ordering-builder/SearchItem.js.map +1 -1
  171. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.js +24 -18
  172. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.js.map +1 -1
  173. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +166 -256
  174. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -1
  175. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js +4 -11
  176. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js.map +1 -1
  177. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js +28 -14
  178. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +1 -1
  179. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +16 -19
  180. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -1
  181. package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js +1 -3
  182. package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js.map +1 -1
  183. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +19 -29
  184. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -1
  185. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.js +39 -52
  186. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.js.map +1 -1
  187. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +18 -23
  188. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -1
  189. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +19 -15
  190. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -1
  191. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +16 -30
  192. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +1 -1
  193. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +30 -39
  194. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -1
  195. package/package.json +16 -16
package/dist/IrisGrid.js CHANGED
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
2
8
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
3
9
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -42,6 +48,7 @@ import IrisGridModel from "./IrisGridModel.js";
42
48
  import { isPartitionedGridModel } from "./PartitionedGridModel.js";
43
49
  import IrisGridPartitionSelector from "./IrisGridPartitionSelector.js";
44
50
  import SelectDistinctBuilder from "./sidebar/SelectDistinctBuilder.js";
51
+ import PluginTableOptionsErrorBoundary from "./sidebar/PluginTableOptionsErrorBoundary.js";
45
52
  import AdvancedSettingsType from "./sidebar/AdvancedSettingsType.js";
46
53
  import AdvancedSettingsMenu from "./sidebar/AdvancedSettingsMenu.js";
47
54
  import SHORTCUTS from "./IrisGridShortcuts.js";
@@ -49,7 +56,6 @@ import ConditionalFormattingMenu from "./sidebar/conditional-formatting/Conditio
49
56
  import ConditionalFormatEditor from "./sidebar/conditional-formatting/ConditionalFormatEditor.js";
50
57
  import IrisGridCellOverflowModal from "./IrisGridCellOverflowModal.js";
51
58
  import GotoRow from "./GotoRow.js";
52
- import AggregationOperation from "./sidebar/aggregations/AggregationOperation.js";
53
59
  import { IrisGridThemeContext } from "./IrisGridThemeProvider.js";
54
60
  import { isMissingPartitionError } from "./MissingPartitionError.js";
55
61
  import { NoPastePermissionModal } from "./NoPastePermissionModal.js";
@@ -67,19 +73,28 @@ var DEFAULT_AGGREGATION_SETTINGS = Object.freeze({
67
73
  });
68
74
  var UNFORMATTED_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS z";
69
75
  function isEmptyConfig(_ref) {
70
- var {
71
- advancedFilters,
72
- aggregationSettings,
73
- customColumns,
74
- quickFilters,
75
- reverse,
76
- rollupConfig,
77
- searchFilter,
78
- selectDistinctColumns,
79
- sorts
80
- } = _ref;
76
+ var advancedFilters = _ref.advancedFilters,
77
+ aggregationSettings = _ref.aggregationSettings,
78
+ customColumns = _ref.customColumns,
79
+ quickFilters = _ref.quickFilters,
80
+ reverse = _ref.reverse,
81
+ rollupConfig = _ref.rollupConfig,
82
+ searchFilter = _ref.searchFilter,
83
+ selectDistinctColumns = _ref.selectDistinctColumns,
84
+ sorts = _ref.sorts;
81
85
  return advancedFilters.size === 0 && aggregationSettings.aggregations.length === 0 && customColumns.length === 0 && quickFilters.size === 0 && !reverse && rollupConfig == null && searchFilter == null && selectDistinctColumns.length === 0 && sorts.length === 0;
82
86
  }
87
+
88
+ /**
89
+ * The subset of `IrisGridProps` that overrides how the grid presents its
90
+ * model: theme, canvas renderer, extra mouse handlers, and the metric
91
+ * calculator factory. Hosts that render `<IrisGrid>` on behalf of a plugin
92
+ * (e.g. `GridWidgetPlugin`) accept this as a single passthrough bag so they
93
+ * don't need to know each view concern by name, and plugins build it from
94
+ * their own hooks. Kept as a `Pick` (not `Partial<IrisGridProps>`) so it can
95
+ * never clobber structural props like `model` or `ref`.
96
+ */
97
+
83
98
  class IrisGrid extends Component {
84
99
  constructor(props) {
85
100
  var _model$layoutHints, _model$columns$0$name, _model$columns$;
@@ -117,6 +132,13 @@ class IrisGrid extends Component {
117
132
  _defineProperty(this, "tableUtils", void 0);
118
133
  _defineProperty(this, "keyHandlers", void 0);
119
134
  _defineProperty(this, "mouseHandlers", void 0);
135
+ /**
136
+ * The metric calculator factory most recently used to instantiate the
137
+ * calculator currently stored in state. Used by `maybeRebuildMetricCalculator`
138
+ * (called from `componentDidUpdate` when the `getMetricCalculator` prop
139
+ * changes) to detect when a different factory is supplied and rebuild.
140
+ */
141
+ _defineProperty(this, "lastMetricCalculatorFactory", void 0);
120
142
  _defineProperty(this, "slideTransitionRef", /*#__PURE__*/React.createRef());
121
143
  _defineProperty(this, "bottomTransitionRef", /*#__PURE__*/React.createRef());
122
144
  _defineProperty(this, "getAdvancedMenuOpenedHandler", memoize(column => this.handleAdvancedMenuOpened.bind(this, column), {
@@ -146,63 +168,72 @@ class IrisGrid extends Component {
146
168
  optionItems.push({
147
169
  type: OptionType.CHART_BUILDER,
148
170
  title: 'Chart Builder',
149
- icon: dhGraphLineUp
171
+ icon: dhGraphLineUp,
172
+ order: 100
150
173
  });
151
174
  }
152
175
  if (isOrganizeColumnsAvailable) {
153
176
  optionItems.push({
154
177
  type: OptionType.VISIBILITY_ORDERING_BUILDER,
155
178
  title: 'Organize Columns',
156
- icon: dhEye
179
+ icon: dhEye,
180
+ order: 200
157
181
  });
158
182
  }
159
183
  if (isFormatColumnsAvailable) {
160
184
  optionItems.push({
161
185
  type: OptionType.CONDITIONAL_FORMATTING,
162
186
  title: 'Conditional Formatting',
163
- icon: vsEdit
187
+ icon: vsEdit,
188
+ order: 300
164
189
  });
165
190
  }
166
191
  if (isCustomColumnsAvailable) {
167
192
  optionItems.push({
168
193
  type: OptionType.CUSTOM_COLUMN_BUILDER,
169
194
  title: 'Custom Columns',
170
- icon: vsSplitHorizontal
195
+ icon: vsSplitHorizontal,
196
+ order: 400
171
197
  });
172
198
  }
173
199
  if (isRollupAvailable) {
174
200
  optionItems.push({
175
201
  type: OptionType.ROLLUP_ROWS,
176
202
  title: 'Rollup Rows',
177
- icon: dhTriangleDownSquare
203
+ icon: dhTriangleDownSquare,
204
+ order: 500
178
205
  });
179
206
  }
180
207
  if (isTotalsAvailable) {
181
208
  optionItems.push({
182
209
  type: OptionType.AGGREGATIONS,
183
210
  title: 'Aggregate Columns',
184
- icon: vsSymbolOperator
211
+ icon: vsSymbolOperator,
212
+ order: 600
185
213
  });
186
214
  }
187
215
  if (isSelectDistinctAvailable) {
188
216
  optionItems.push({
189
217
  type: OptionType.SELECT_DISTINCT,
190
218
  title: 'Select Distinct Values',
191
- icon: vsRuby
219
+ icon: vsRuby,
220
+ order: 700
192
221
  });
193
222
  }
194
223
  if (isExportAvailable && canDownloadCsv) {
195
224
  optionItems.push({
196
225
  type: OptionType.TABLE_EXPORTER,
197
226
  title: 'Download CSV',
198
- icon: vsCloudDownload
227
+ icon: vsCloudDownload,
228
+ order: 800
199
229
  });
200
230
  }
201
231
  if (hasAdvancedSettings) {
202
232
  optionItems.push({
203
233
  type: OptionType.ADVANCED_SETTINGS,
204
234
  title: 'Advanced Settings',
205
- icon: vsTools
235
+ icon: vsTools,
236
+ order: 900
206
237
  });
207
238
  }
208
239
  optionItems.push({
@@ -211,7 +242,8 @@ class IrisGrid extends Component {
211
242
  subtitle: toggleFilterBarAction.shortcut.getDisplayText(),
212
243
  icon: vsFilter,
213
244
  isOn: isFilterBarShown,
214
- onChange: toggleFilterBarAction.action
245
+ onChange: toggleFilterBarAction.action,
246
+ order: 1000
215
247
  });
216
248
  if (canToggleSearch) {
217
249
  optionItems.push({
@@ -220,7 +252,8 @@ class IrisGrid extends Component {
220
252
  subtitle: toggleSearchBarAction.shortcut.getDisplayText(),
221
253
  icon: vsSearch,
222
254
  isOn: showSearchBar,
223
- onChange: toggleSearchBarAction.action
255
+ onChange: toggleSearchBarAction.action,
256
+ order: 1100
224
257
  });
225
258
  }
226
259
  optionItems.push({
@@ -229,48 +262,76 @@ class IrisGrid extends Component {
229
262
  subtitle: toggleGotoRowAction.shortcut.getDisplayText(),
230
263
  icon: vsReply,
231
264
  isOn: showGotoRow,
232
- onChange: toggleGotoRowAction.action
265
+ onChange: toggleGotoRowAction.action,
266
+ order: 1200
233
267
  });
234
268
  return Object.freeze(optionItems);
235
269
  }, {
236
270
  max: 1
237
271
  }));
272
+ /**
273
+ * Apply the `transformTableOptions` transform (if any) to the
274
+ * default option list.
275
+ * Catches exceptions so a buggy plugin can't break the grid,
276
+ * and warns about duplicate `type` collisions.
277
+ */
278
+ _defineProperty(this, "getCachedTransformedOptionItems", memoize((items, transformTableOptions) => {
279
+ if (transformTableOptions == null) {
280
+ return items;
281
+ }
282
+ var transformedItems;
283
+ try {
284
+ transformedItems = transformTableOptions(items);
285
+ } catch (err) {
286
+ log.error('transformTableOptions threw an error; falling back to defaults.', err);
287
+ return items;
288
+ }
289
+ // Stably sort by ascending `order`. Items without an `order` sink to
290
+ // the end of the menu (default `Infinity`), while items with an `order`
291
+ // are positioned by their weight. Decorate-sort-undecorate guarantees
292
+ // stability regardless of the engine's sort implementation.
293
+ var sortedItems = transformedItems.map((item, index) => ({
294
+ item,
295
+ index
296
+ })).sort((a, b) => {
297
+ var _a$item$order, _b$item$order;
298
+ return ((_a$item$order = a.item.order) !== null && _a$item$order !== void 0 ? _a$item$order : Infinity) - ((_b$item$order = b.item.order) !== null && _b$item$order !== void 0 ? _b$item$order : Infinity) || a.index - b.index;
299
+ }).map(_ref2 => {
300
+ var item = _ref2.item;
301
+ return item;
302
+ });
303
+ var keys = new Set();
304
+ for (var i = 0; i < sortedItems.length; i += 1) {
305
+ var key = String(sortedItems[i].type);
306
+ if (keys.has(key)) {
307
+ log.warn("transformTableOptions produced duplicate type \"".concat(key, "\"; ") + 'only the first entry will be accessible from the menu.');
308
+ break;
309
+ }
310
+ keys.add(key);
311
+ }
312
+ return Object.freeze(sortedItems);
313
+ }, {
314
+ max: 1
315
+ }));
238
316
  _defineProperty(this, "getCachedHiddenColumns", memoize((metricCalculator, userColumnWidths) => IrisGridUtils.getHiddenColumns(new Map([...metricCalculator.initialColumnWidths, ...userColumnWidths])), {
239
317
  max: 1
240
318
  }));
241
319
  _defineProperty(this, "getAggregationMap", memoize((columns, aggregations) => {
242
320
  var aggregationMap = {};
243
- aggregations.forEach(_ref2 => {
244
- var {
245
- operation,
246
- selected,
247
- invert
248
- } = _ref2;
321
+ aggregations.forEach(_ref3 => {
322
+ var operation = _ref3.operation,
323
+ selected = _ref3.selected,
324
+ invert = _ref3.invert;
249
325
  aggregationMap[operation] = AggregationUtils.getOperationColumnNames(columns, operation, selected, invert);
250
326
  });
251
327
  return aggregationMap;
252
328
  }, {
253
329
  max: 1
254
330
  }));
255
- _defineProperty(this, "getOperationMap", memoize((columns, aggregations) => {
256
- var operationMap = {};
257
- aggregations.filter(a => !AggregationUtils.isRollupOperation(a.operation)).forEach(_ref3 => {
258
- var {
259
- operation,
260
- selected,
261
- invert
262
- } = _ref3;
263
- AggregationUtils.getOperationColumnNames(columns, operation, selected, invert).forEach(name => {
264
- var _operationMap$name;
265
- var newOperations = [...((_operationMap$name = operationMap[name]) !== null && _operationMap$name !== void 0 ? _operationMap$name : []), operation];
266
- operationMap[name] = Object.freeze(newOperations);
267
- });
268
- });
269
- return operationMap;
270
- }, {
331
+ _defineProperty(this, "getOperationMap", memoize((columns, aggregations) => IrisGridUtils.getOperationMap(columns, aggregations), {
271
332
  max: 1
272
333
  }));
273
- _defineProperty(this, "getOperationOrder", memoize(aggregations => aggregations.map(a => a.operation).filter(o => !AggregationUtils.isRollupOperation(o)), {
334
+ _defineProperty(this, "getOperationOrder", memoize(aggregations => IrisGridUtils.getOperationOrder(aggregations), {
274
335
  max: 1
275
336
  }));
276
337
  _defineProperty(this, "getCachedFormatColumns", memoize((dh, columns, rules) => getFormatColumns(dh, columns, rules), {
@@ -298,28 +359,7 @@ class IrisGrid extends Component {
298
359
  _defineProperty(this, "getModelRollupConfig", memoize((originalColumns, config, aggregationSettings) => IrisGridUtils.getModelRollupConfig(originalColumns, config, aggregationSettings), {
299
360
  max: 1
300
361
  }));
301
- _defineProperty(this, "getModelTotalsConfig", memoize((columns, config, aggregationSettings) => {
302
- var _config$columns$lengt, _config$columns;
303
- if (((_config$columns$lengt = config === null || config === void 0 || (_config$columns = config.columns) === null || _config$columns === void 0 ? void 0 : _config$columns.length) !== null && _config$columns$lengt !== void 0 ? _config$columns$lengt : 0) > 0) {
304
- // If we've got rollups, then aggregations are applied as part of that...
305
- return null;
306
- }
307
-
308
- // Filter out aggregations without any columns actually selected
309
- var aggregations = aggregationSettings.aggregations.filter(agg => agg.selected.length > 0 || agg.invert);
310
- if (aggregations.length === 0) {
311
- // We don't actually have any aggregations set, don't bother
312
- return null;
313
- }
314
- var operationMap = this.getOperationMap(columns, aggregations);
315
- var operationOrder = this.getOperationOrder(aggregations);
316
- return {
317
- operationMap,
318
- operationOrder,
319
- showOnTop: aggregationSettings.showOnTop,
320
- defaultOperation: AggregationOperation.SKIP
321
- };
322
- }, {
362
+ _defineProperty(this, "getModelTotalsConfig", memoize((columns, config, aggregationSettings) => IrisGridUtils.getModelTotalsConfig(columns, config, aggregationSettings), {
323
363
  max: 1
324
364
  }));
325
365
  _defineProperty(this, "getCachedStateOverride", memoize((model, theme, hoverSelectColumn, isFilterBarShown, isSelectingColumn, loadingScrimProgress, quickFilters, advancedFilters, sorts, reverse, rollupConfig, isMenuShown) => ({
@@ -349,9 +389,7 @@ class IrisGrid extends Component {
349
389
 
350
390
  // We only show the row footers when we have floating rows for aggregations
351
391
  var rowFooterWidth = floatingRowCount > 0 ? (_theme$rowFooterWidth = theme === null || theme === void 0 ? void 0 : theme.rowFooterWidth) !== null && _theme$rowFooterWidth !== void 0 ? _theme$rowFooterWidth : baseTheme.rowFooterWidth : 0;
352
- var {
353
- metricCalculator
354
- } = this.state;
392
+ var metricCalculator = this.state.metricCalculator;
355
393
  if (metricCalculator != null) {
356
394
  metricCalculator.resetCalculatedColumnWidths();
357
395
  metricCalculator.resetCalculatedRowHeights();
@@ -372,7 +410,7 @@ class IrisGrid extends Component {
372
410
  _defineProperty(this, "getCachedKeyHandlers", memoize(keyHandlers => [...keyHandlers, ...this.keyHandlers].sort((a, b) => a.order - b.order), {
373
411
  max: 1
374
412
  }));
375
- _defineProperty(this, "getCachedMouseHandlers", memoize(mouseHandlers => [...mouseHandlers, ...this.mouseHandlers].map(handler => typeof handler === 'function' ? handler(this) : handler), {
413
+ _defineProperty(this, "getCachedMouseHandlers", memoize(mouseHandlersProp => [...mouseHandlersProp, ...this.mouseHandlers].map(handler => typeof handler === 'function' ? handler(this) : handler), {
376
414
  max: 1
377
415
  }));
378
416
  _defineProperty(this, "getCachedRenderer", memoize(rendererProp => rendererProp !== null && rendererProp !== void 0 ? rendererProp : new IrisGridRenderer(), {
@@ -397,21 +435,15 @@ class IrisGrid extends Component {
397
435
  max: 1
398
436
  }));
399
437
  _defineProperty(this, "updateSearchFilter", debounce((searchValue, selectedSearchColumns, columns, invertSearchColumns) => {
400
- var {
401
- model
402
- } = this.props;
438
+ var model = this.props.model;
403
439
  var searchFilter = CrossColumnSearch.createSearchFilter(model.dh, searchValue, selectedSearchColumns, columns, invertSearchColumns);
404
440
  this.setState({
405
441
  searchFilter
406
442
  });
407
443
  }, SET_FILTER_DEBOUNCE));
408
444
  _defineProperty(this, "showViewportLoading", throttle(() => {
409
- var {
410
- model
411
- } = this.props;
412
- var {
413
- loadingSpinnerShown
414
- } = this.state;
445
+ var model = this.props.model;
446
+ var loadingSpinnerShown = this.state.loadingSpinnerShown;
415
447
  if (model.isViewportPending && !loadingSpinnerShown) {
416
448
  // We only want to show the viewport loading if the viewport is still loading
417
449
  // and we're not already showing a loader for something else
@@ -431,9 +463,7 @@ class IrisGrid extends Component {
431
463
  });
432
464
  }, SET_CONDITIONAL_FORMAT_DEBOUNCE));
433
465
  _defineProperty(this, "handleDownloadProgressUpdate", throttle((tableDownloadProgress, tableDownloadEstimatedTime) => {
434
- var {
435
- tableDownloadStatus
436
- } = this.state;
466
+ var tableDownloadStatus = this.state.tableDownloadStatus;
437
467
  if (tableDownloadStatus === TableCsvExporter.DOWNLOAD_STATUS.DOWNLOADING) {
438
468
  this.setState({
439
469
  tableDownloadProgress,
@@ -473,12 +503,8 @@ class IrisGrid extends Component {
473
503
  if (expandCellTooltipProps == null) {
474
504
  return null;
475
505
  }
476
- var {
477
- expandTooltipDisplayValue
478
- } = this.state;
479
- var {
480
- model
481
- } = this.props;
506
+ var expandTooltipDisplayValue = this.state.expandTooltipDisplayValue;
507
+ var model = this.props.model;
482
508
  var isExpandAllAvailable = isExpandableGridModel(model) && model.isExpandAllAvailable;
483
509
  var wrapperStyle = _objectSpread(_objectSpread({
484
510
  position: 'absolute'
@@ -510,9 +536,7 @@ class IrisGrid extends Component {
510
536
  if (hoverTooltipProps == null) {
511
537
  return null;
512
538
  }
513
- var {
514
- hoverDisplayValue
515
- } = this.state;
539
+ var hoverDisplayValue = this.state.hoverDisplayValue;
516
540
  var wrapperStyle = _objectSpread(_objectSpread({
517
541
  position: 'absolute'
518
542
  }, hoverTooltipProps), {}, {
@@ -571,11 +595,14 @@ class IrisGrid extends Component {
571
595
  this.handleMenuSelect = this.handleMenuSelect.bind(this);
572
596
  this.handleMenuBack = this.handleMenuBack.bind(this);
573
597
  this.handleRequestFailed = this.handleRequestFailed.bind(this);
598
+ this.handlePending = this.handlePending.bind(this);
599
+ this.handlePendingCleared = this.handlePendingCleared.bind(this);
574
600
  this.handleSelectionChanged = this.handleSelectionChanged.bind(this);
575
601
  this.handleMovedColumnsChanged = this.handleMovedColumnsChanged.bind(this);
576
602
  this.handleHeaderGroupsChanged = this.handleHeaderGroupsChanged.bind(this);
577
603
  this.handleUpdate = this.handleUpdate.bind(this);
578
604
  this.handleTableChanged = this.handleTableChanged.bind(this);
605
+ this.handleModelChanged = this.handleModelChanged.bind(this);
579
606
  this.handleTooltipRef = this.handleTooltipRef.bind(this);
580
607
  this.handleViewChanged = this.handleViewChanged.bind(this);
581
608
  this.handleFormatSelection = this.handleFormatSelection.bind(this);
@@ -648,9 +675,7 @@ class IrisGrid extends Component {
648
675
  };
649
676
  this.discardAction = {
650
677
  action: () => {
651
- var {
652
- model
653
- } = this.props;
678
+ var model = this.props.model;
654
679
  if (isEditableGridModel(model) && model.isEditable && model.pendingDataMap.size > 0) {
655
680
  this.discardPending().catch(log.error);
656
681
  }
@@ -659,9 +684,7 @@ class IrisGrid extends Component {
659
684
  };
660
685
  this.commitAction = {
661
686
  action: () => {
662
- var {
663
- model
664
- } = this.props;
687
+ var model = this.props.model;
665
688
  if (isEditableGridModel(model) && model.isEditable && model.pendingDataMap.size > 0 && model.pendingDataErrors.size === 0) {
666
689
  this.commitPending().catch(log.error);
667
690
  }
@@ -669,56 +692,56 @@ class IrisGrid extends Component {
669
692
  shortcut: SHORTCUTS.INPUT_TABLE.COMMIT
670
693
  };
671
694
  this.contextActions = [this.toggleFilterBarAction, this.toggleSearchBarAction, this.toggleGotoRowAction, this.discardAction, this.commitAction];
672
- var {
673
- aggregationSettings: _aggregationSettings,
674
- conditionalFormats,
675
- customColumnFormatMap,
676
- columnAlignmentMap,
677
- isFilterBarShown: _isFilterBarShown,
678
- isSelectingPartition,
679
- partitions,
680
- partitionConfig,
681
- model: _model,
682
- movedColumns: movedColumnsProp,
683
- movedRows: movedRowsProp,
684
- rollupConfig: _rollupConfig,
685
- userColumnWidths: _userColumnWidths,
686
- userColumnWidthsByName,
687
- userRowHeights,
688
- showSearchBar: _showSearchBar,
689
- searchValue: _searchValue,
690
- selectedSearchColumns: _selectedSearchColumns,
691
- invertSearchColumns: _invertSearchColumns,
692
- advancedFilters: _advancedFilters,
693
- quickFilters: _quickFilters,
694
- selectDistinctColumns,
695
- pendingDataMap,
696
- canCopy,
697
- frozenColumns,
698
- columnHeaderGroups,
699
- getMetricCalculator
700
- } = props;
701
- var {
702
- dh: _dh
703
- } = _model;
695
+ var _aggregationSettings = props.aggregationSettings,
696
+ conditionalFormats = props.conditionalFormats,
697
+ customColumnFormatMap = props.customColumnFormatMap,
698
+ columnAlignmentMap = props.columnAlignmentMap,
699
+ _isFilterBarShown = props.isFilterBarShown,
700
+ isSelectingPartition = props.isSelectingPartition,
701
+ partitions = props.partitions,
702
+ partitionConfig = props.partitionConfig,
703
+ _model = props.model,
704
+ movedColumnsProp = props.movedColumns,
705
+ movedRowsProp = props.movedRows,
706
+ _rollupConfig = props.rollupConfig,
707
+ _userColumnWidths = props.userColumnWidths,
708
+ userColumnWidthsByName = props.userColumnWidthsByName,
709
+ userRowHeights = props.userRowHeights,
710
+ _showSearchBar = props.showSearchBar,
711
+ _searchValue = props.searchValue,
712
+ _selectedSearchColumns = props.selectedSearchColumns,
713
+ _invertSearchColumns = props.invertSearchColumns,
714
+ _advancedFilters = props.advancedFilters,
715
+ _quickFilters = props.quickFilters,
716
+ selectDistinctColumns = props.selectDistinctColumns,
717
+ pendingDataMap = props.pendingDataMap,
718
+ canCopy = props.canCopy,
719
+ frozenColumns = props.frozenColumns,
720
+ columnHeaderGroups = props.columnHeaderGroups,
721
+ getMetricCalculator = props.getMetricCalculator;
722
+ var _dh = _model.dh;
704
723
  var _keyHandlers = [new CopyCellKeyHandler(this), new ReverseKeyHandler(this), new ClearFilterKeyHandler(this)];
705
- var _mouseHandlers = [new IrisGridCellOverflowMouseHandler(this), new IrisGridRowTreeMouseHandler(this), new IrisGridTokenMouseHandler(this), new IrisGridColumnSelectMouseHandler(this), new IrisGridColumnTooltipMouseHandler(this), new IrisGridSortMouseHandler(this), new IrisGridFilterMouseHandler(this), new IrisGridContextMenuHandler(this, _dh), new IrisGridDataSelectMouseHandler(this), new PendingMouseHandler(this), new IrisGridPartitionedTableMouseHandler(this), ...(canCopy ? [new IrisGridCopyCellMouseHandler(this)] : [])];
724
+ var mouseHandlers = [new IrisGridCellOverflowMouseHandler(this), new IrisGridRowTreeMouseHandler(this), new IrisGridTokenMouseHandler(this), new IrisGridColumnSelectMouseHandler(this), new IrisGridColumnTooltipMouseHandler(this), new IrisGridSortMouseHandler(this), new IrisGridFilterMouseHandler(this), new IrisGridContextMenuHandler(this, _dh), new IrisGridDataSelectMouseHandler(this), new PendingMouseHandler(this), new IrisGridPartitionedTableMouseHandler(this), ...(canCopy ? [new IrisGridCopyCellMouseHandler(this)] : [])];
706
725
  if (canCopy) {
707
726
  _keyHandlers.push(new CopyKeyHandler(this));
708
727
  }
709
728
  var _movedColumns = movedColumnsProp.length > 0 ? movedColumnsProp : _model.initialMovedColumns;
710
729
  var movedRows = movedRowsProp.length > 0 ? movedRowsProp : _model.initialMovedRows;
711
- var _metricCalculator = getMetricCalculator({
730
+ var metricCalculatorFactory = getMetricCalculator;
731
+ var _metricCalculator = metricCalculatorFactory({
712
732
  userColumnWidths: new Map(_userColumnWidths),
713
733
  userColumnWidthsByName: userColumnWidthsByName != null ? new Map(userColumnWidthsByName) : undefined,
714
734
  userRowHeights: new Map(userRowHeights),
715
735
  movedColumns: _movedColumns,
716
736
  initialColumnWidths: new Map(_model === null || _model === void 0 || (_model$layoutHints = _model.layoutHints) === null || _model$layoutHints === void 0 || (_model$layoutHints = _model$layoutHints.hiddenColumns) === null || _model$layoutHints === void 0 ? void 0 : _model$layoutHints.map(name => [_model.getColumnIndexByName(name), 0]))
717
737
  });
738
+ // Remember the factory we used so we can detect a model-driven swap
739
+ // (e.g. pivot-builder's proxy swapping its inner model) on COLUMNS_CHANGED.
740
+ this.lastMetricCalculatorFactory = metricCalculatorFactory;
718
741
  var searchColumns = _selectedSearchColumns !== null && _selectedSearchColumns !== void 0 ? _selectedSearchColumns : [];
719
742
  var _searchFilter = CrossColumnSearch.createSearchFilter(_dh, _searchValue, searchColumns, _model.columns, _invertSearchColumns);
720
743
  this.tableUtils = new TableUtils(_dh);
721
- this.mouseHandlers = _mouseHandlers;
744
+ this.mouseHandlers = mouseHandlers;
722
745
  this.keyHandlers = _keyHandlers;
723
746
  this.state = {
724
747
  isFilterBarShown: _isFilterBarShown,
@@ -810,31 +833,38 @@ class IrisGrid extends Component {
810
833
  };
811
834
  }
812
835
  componentDidMount() {
813
- var {
814
- model
815
- } = this.props;
836
+ var model = this.props.model;
816
837
  this.initState();
817
838
  this.startListening(model);
818
839
  }
819
840
  componentDidUpdate(prevProps, prevState) {
820
- var {
821
- inputFilters,
822
- isSelectingColumn,
823
- settings,
824
- model,
825
- customFilters,
826
- sorts
827
- } = this.props;
841
+ var _this$props = this.props,
842
+ inputFilters = _this$props.inputFilters,
843
+ isSelectingColumn = _this$props.isSelectingColumn,
844
+ settings = _this$props.settings,
845
+ model = _this$props.model,
846
+ customFilters = _this$props.customFilters,
847
+ sorts = _this$props.sorts,
848
+ getMetricCalculator = _this$props.getMetricCalculator;
828
849
  if (model !== prevProps.model) {
829
850
  this.stopListening(prevProps.model);
830
851
  this.startListening(model);
831
852
  }
853
+
854
+ // The renderer and mouse handlers flow through memoized getters in
855
+ // render(), so a `renderer` / `mouseHandlers` prop change naturally
856
+ // propagates on the next render. The metric calculator, however, lives in
857
+ // component state, so mirror that path when the `getMetricCalculator` prop
858
+ // changes (e.g. the pivot-builder middleware swapping the pivot factory in
859
+ // or out) so the calculator stays in sync. Moved columns are not touched
860
+ // here — a model swap resets them via `handleModelChanged`.
861
+ if (getMetricCalculator !== prevProps.getMetricCalculator) {
862
+ this.maybeRebuildMetricCalculator();
863
+ }
832
864
  var changedInputFilters = inputFilters !== prevProps.inputFilters ? inputFilters.filter(inputFilter => !prevProps.inputFilters.includes(inputFilter)) : [];
833
865
  if (changedInputFilters.length > 0) {
834
866
  var _advancedSettings$get;
835
- var {
836
- advancedSettings
837
- } = this.props;
867
+ var advancedSettings = this.props.advancedSettings;
838
868
  var replaceExistingFilters = (_advancedSettings$get = advancedSettings.get(AdvancedSettingsType.FILTER_CONTROL_CHANGE_CLEARS_ALL_FILTERS)) !== null && _advancedSettings$get !== void 0 ? _advancedSettings$get : false;
839
869
  if (replaceExistingFilters) {
840
870
  this.clearGridInputField();
@@ -861,10 +891,8 @@ class IrisGrid extends Component {
861
891
  if (sorts !== prevProps.sorts) {
862
892
  this.updateSorts(sorts);
863
893
  }
864
- var {
865
- loadingScrimStartTime,
866
- loadingScrimFinishTime
867
- } = this;
894
+ var loadingScrimStartTime = this.loadingScrimStartTime,
895
+ loadingScrimFinishTime = this.loadingScrimFinishTime;
868
896
  if (loadingScrimStartTime != null && loadingScrimFinishTime != null) {
869
897
  window.requestAnimationFrame(() => {
870
898
  var now = Date.now();
@@ -886,9 +914,7 @@ class IrisGrid extends Component {
886
914
  });
887
915
  });
888
916
  }
889
- var {
890
- openOptions
891
- } = this.state;
917
+ var openOptions = this.state.openOptions;
892
918
  if (openOptions !== prevState.openOptions) {
893
919
  var isAggEditType = option => option.type === OptionType.AGGREGATION_EDIT;
894
920
  if (!openOptions.some(isAggEditType) && prevState.openOptions.some(isAggEditType)) {
@@ -898,9 +924,7 @@ class IrisGrid extends Component {
898
924
  this.sendStateChange();
899
925
  }
900
926
  componentWillUnmount() {
901
- var {
902
- model
903
- } = this.props;
927
+ var model = this.props.model;
904
928
  this.stopListening(model);
905
929
  this.pending.cancel();
906
930
  this.updateSearchFilter.cancel();
@@ -918,9 +942,7 @@ class IrisGrid extends Component {
918
942
  return (_this$grid$canvasWrap = (_this$grid = this.grid) === null || _this$grid === void 0 ? void 0 : _this$grid.canvasWrapper.current) !== null && _this$grid$canvasWrap !== void 0 ? _this$grid$canvasWrap : null;
919
943
  }
920
944
  getKeyHandlers() {
921
- var {
922
- keyHandlers
923
- } = this.props;
945
+ var keyHandlers = this.props.keyHandlers;
924
946
  return this.getCachedKeyHandlers(keyHandlers);
925
947
  }
926
948
  getMetricState() {
@@ -929,52 +951,40 @@ class IrisGrid extends Component {
929
951
  if (gridMetricState == null) {
930
952
  return undefined;
931
953
  }
932
- var {
933
- advancedFilters,
934
- hoverSelectColumn,
935
- isFilterBarShown,
936
- isMenuShown,
937
- loadingScrimProgress,
938
- quickFilters,
939
- sorts,
940
- reverse,
941
- rollupConfig
942
- } = this.state;
943
- var {
944
- model,
945
- isSelectingColumn
946
- } = this.props;
954
+ var _this$state = this.state,
955
+ advancedFilters = _this$state.advancedFilters,
956
+ hoverSelectColumn = _this$state.hoverSelectColumn,
957
+ isFilterBarShown = _this$state.isFilterBarShown,
958
+ isMenuShown = _this$state.isMenuShown,
959
+ loadingScrimProgress = _this$state.loadingScrimProgress,
960
+ quickFilters = _this$state.quickFilters,
961
+ sorts = _this$state.sorts,
962
+ reverse = _this$state.reverse,
963
+ rollupConfig = _this$state.rollupConfig;
964
+ var _this$props2 = this.props,
965
+ model = _this$props2.model,
966
+ isSelectingColumn = _this$props2.isSelectingColumn;
947
967
  return _objectSpread(_objectSpread({}, gridMetricState), this.getCachedStateOverride(model, this.getTheme(), hoverSelectColumn, isFilterBarShown, isSelectingColumn, loadingScrimProgress, quickFilters, advancedFilters, sorts, reverse, rollupConfig, isMenuShown));
948
968
  }
949
969
  get renderer() {
950
- var {
951
- renderer
952
- } = this.props;
970
+ var renderer = this.props.renderer;
953
971
  return this.getCachedRenderer(renderer);
954
972
  }
955
973
  getMouseHandlers() {
956
- var {
957
- mouseHandlers
958
- } = this.props;
974
+ var mouseHandlers = this.props.mouseHandlers;
959
975
  return this.getCachedMouseHandlers(mouseHandlers);
960
976
  }
961
977
  getValueForCell(columnIndex, rowIndex) {
962
978
  var rawValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
963
- var {
964
- model
965
- } = this.props;
966
- var {
967
- dh
968
- } = model;
979
+ var model = this.props.model;
980
+ var dh = model.dh;
969
981
  var modelColumn = this.getModelColumn(columnIndex);
970
982
  var modelRow = this.getModelRow(rowIndex);
971
983
  if (rawValue && modelColumn != null && modelRow != null) {
972
984
  var value = model.valueForCell(modelColumn, modelRow);
973
985
  if (TableUtils.isDateType(model.columns[modelColumn].type)) {
974
986
  // The returned value is just a long value, we should return the value formatted as a full date string
975
- var {
976
- formatter
977
- } = model;
987
+ var formatter = model.formatter;
978
988
  return dh.i18n.DateTimeFormat.format(UNFORMATTED_DATE_PATTERN, value, dh.i18n.TimeZone.getTimeZone(formatter.timeZone));
979
989
  }
980
990
  return value;
@@ -994,13 +1004,9 @@ class IrisGrid extends Component {
994
1004
  * @returns Model column index, or null if not found
995
1005
  */
996
1006
  getModelColumn(columnIndex) {
997
- var {
998
- metrics
999
- } = this.state;
1007
+ var metrics = this.state.metrics;
1000
1008
  assertNotNull(metrics);
1001
- var {
1002
- modelColumns
1003
- } = metrics;
1009
+ var modelColumns = metrics.modelColumns;
1004
1010
  if (modelColumns == null) {
1005
1011
  return null;
1006
1012
  }
@@ -1011,13 +1017,9 @@ class IrisGrid extends Component {
1011
1017
  return columnIndex != null ? modelColumns.get(columnIndex) : null;
1012
1018
  }
1013
1019
  getModelRow(rowIndex) {
1014
- var {
1015
- metrics
1016
- } = this.state;
1020
+ var metrics = this.state.metrics;
1017
1021
  assertNotNull(metrics);
1018
- var {
1019
- modelRows
1020
- } = metrics;
1022
+ var modelRows = metrics.modelRows;
1021
1023
  if (modelRows == null) {
1022
1024
  return null;
1023
1025
  }
@@ -1025,21 +1027,17 @@ class IrisGrid extends Component {
1025
1027
  }
1026
1028
  getTheme() {
1027
1029
  var _ref4;
1028
- var {
1029
- model,
1030
- theme,
1031
- density
1032
- } = this.props;
1033
- var {
1034
- theme: contextTheme,
1035
- density: contextDensity
1036
- } = this.context;
1030
+ var _this$props3 = this.props,
1031
+ model = _this$props3.model,
1032
+ theme = _this$props3.theme,
1033
+ density = _this$props3.density;
1034
+ var _this$context = this.context,
1035
+ contextTheme = _this$context.theme,
1036
+ contextDensity = _this$context.density;
1037
1037
  return this.getCachedTheme(contextTheme, theme, (_ref4 = isEditableGridModel(model) && model.isEditable) !== null && _ref4 !== void 0 ? _ref4 : false, model.floatingTopRowCount + model.floatingBottomRowCount, density !== null && density !== void 0 ? density : contextDensity);
1038
1038
  }
1039
1039
  getVisibleColumn(modelIndex) {
1040
- var {
1041
- movedColumns
1042
- } = this.state;
1040
+ var movedColumns = this.state.movedColumns;
1043
1041
  return GridUtils.getVisibleIndex(modelIndex, movedColumns);
1044
1042
  }
1045
1043
  makeQuickFilter(column, text, timeZone) {
@@ -1060,27 +1058,20 @@ class IrisGrid extends Component {
1060
1058
  */
1061
1059
  applyInputFilters(inputFilters) {
1062
1060
  var replaceExisting = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1063
- var {
1064
- model
1065
- } = this.props;
1066
- var {
1067
- advancedFilters,
1068
- quickFilters
1069
- } = this.state;
1061
+ var model = this.props.model;
1062
+ var _this$state2 = this.state,
1063
+ advancedFilters = _this$state2.advancedFilters,
1064
+ quickFilters = _this$state2.quickFilters;
1070
1065
  var newAdvancedFilters = replaceExisting ? new Map() : new Map(advancedFilters);
1071
1066
  var newQuickFilters = replaceExisting ? new Map() : new Map(quickFilters);
1072
1067
  var isChanged = replaceExisting && advancedFilters.size > 0;
1073
1068
  inputFilters.forEach(_ref5 => {
1074
- var {
1075
- name,
1076
- type,
1077
- value
1078
- } = _ref5;
1069
+ var name = _ref5.name,
1070
+ type = _ref5.type,
1071
+ value = _ref5.value;
1079
1072
  var modelIndex = model.columns.findIndex(_ref6 => {
1080
- var {
1081
- name: columnName,
1082
- type: columnType
1083
- } = _ref6;
1073
+ var columnName = _ref6.name,
1074
+ columnType = _ref6.type;
1084
1075
  return columnName === name && columnType === type;
1085
1076
  });
1086
1077
  if (modelIndex >= 0) {
@@ -1107,19 +1098,13 @@ class IrisGrid extends Component {
1107
1098
  * @returns True if the filters have changed because this quick filter was applied
1108
1099
  */
1109
1100
  applyQuickFilter(modelIndex, value, quickFilters) {
1110
- var {
1111
- model
1112
- } = this.props;
1113
- var {
1114
- formatter
1115
- } = model;
1101
+ var model = this.props.model;
1102
+ var formatter = model.formatter;
1116
1103
  var column = model.columns[modelIndex];
1117
1104
  if (value != null && "".concat(value).trim().length > 0) {
1118
1105
  var quickFilter = quickFilters.get(modelIndex);
1119
1106
  if (quickFilter != null) {
1120
- var {
1121
- text
1122
- } = quickFilter;
1107
+ var text = quickFilter.text;
1123
1108
  if (text === value) {
1124
1109
  log.debug2('Ignoring change to existing filter');
1125
1110
  return false;
@@ -1144,9 +1129,7 @@ class IrisGrid extends Component {
1144
1129
  resetRanges: true
1145
1130
  });
1146
1131
  this.setState(_ref7 => {
1147
- var {
1148
- advancedFilters
1149
- } = _ref7;
1132
+ var advancedFilters = _ref7.advancedFilters;
1150
1133
  var newAdvancedFilters = new Map(advancedFilters);
1151
1134
  if (filter == null) {
1152
1135
  newAdvancedFilters.delete(modelIndex);
@@ -1174,9 +1157,7 @@ class IrisGrid extends Component {
1174
1157
  resetRanges: true
1175
1158
  });
1176
1159
  this.setState(_ref8 => {
1177
- var {
1178
- quickFilters
1179
- } = _ref8;
1160
+ var quickFilters = _ref8.quickFilters;
1180
1161
  var newQuickFilters = new Map(quickFilters);
1181
1162
  newQuickFilters.set(modelIndex, {
1182
1163
  filter,
@@ -1195,21 +1176,15 @@ class IrisGrid extends Component {
1195
1176
  setFilterMap(filterMap) {
1196
1177
  var _advancedSettings$get2;
1197
1178
  log.debug('setFilterMap', filterMap);
1198
- var {
1199
- advancedSettings
1200
- } = this.props;
1179
+ var advancedSettings = this.props.advancedSettings;
1201
1180
  var clearFiltersOnLinkerFilterUpdate = (_advancedSettings$get2 = advancedSettings.get(AdvancedSettingsType.LINK_CHANGE_CLEARS_ALL_FILTERS)) !== null && _advancedSettings$get2 !== void 0 ? _advancedSettings$get2 : false;
1202
1181
  if (clearFiltersOnLinkerFilterUpdate) {
1203
1182
  this.clearAllFilters();
1204
1183
  }
1205
- var {
1206
- model
1207
- } = this.props;
1184
+ var model = this.props.model;
1208
1185
  filterMap.forEach((_ref9, columnName) => {
1209
- var {
1210
- columnType,
1211
- filterList
1212
- } = _ref9;
1186
+ var columnType = _ref9.columnType,
1187
+ filterList = _ref9.filterList;
1213
1188
  var column = model.columns.find(c => c.name === columnName && c.type === columnType);
1214
1189
  if (column == null) {
1215
1190
  return;
@@ -1220,9 +1195,7 @@ class IrisGrid extends Component {
1220
1195
  if (combinedText.length === 0) {
1221
1196
  this.removeQuickFilter(columnIndex);
1222
1197
  } else {
1223
- var {
1224
- formatter
1225
- } = model;
1198
+ var formatter = model.formatter;
1226
1199
  this.setQuickFilter(columnIndex, this.makeQuickFilter(column, combinedText, formatter.timeZone), "".concat(combinedText));
1227
1200
  }
1228
1201
  });
@@ -1233,10 +1206,8 @@ class IrisGrid extends Component {
1233
1206
  });
1234
1207
  var clearRange = Array.isArray(modelRange) ? modelRange : [modelRange, modelRange];
1235
1208
  this.setState(_ref0 => {
1236
- var {
1237
- advancedFilters,
1238
- quickFilters
1239
- } = _ref0;
1209
+ var advancedFilters = _ref0.advancedFilters,
1210
+ quickFilters = _ref0.quickFilters;
1240
1211
  var newAdvancedFilters = advancedFilters ? new Map(advancedFilters) : new Map();
1241
1212
  var newQuickFilters = quickFilters ? new Map(quickFilters) : new Map();
1242
1213
  newAdvancedFilters.forEach((_, column) => {
@@ -1260,9 +1231,7 @@ class IrisGrid extends Component {
1260
1231
  resetRanges: true
1261
1232
  });
1262
1233
  this.setState(_ref1 => {
1263
- var {
1264
- quickFilters
1265
- } = _ref1;
1234
+ var quickFilters = _ref1.quickFilters;
1266
1235
  var newQuickFilters = new Map(quickFilters);
1267
1236
  newQuickFilters.delete(modelColumn);
1268
1237
  return {
@@ -1272,11 +1241,10 @@ class IrisGrid extends Component {
1272
1241
  }
1273
1242
  clearAllFilters() {
1274
1243
  log.debug('Clearing all filters');
1275
- var {
1276
- advancedFilters,
1277
- quickFilters,
1278
- searchFilter
1279
- } = this.state;
1244
+ var _this$state3 = this.state,
1245
+ advancedFilters = _this$state3.advancedFilters,
1246
+ quickFilters = _this$state3.quickFilters,
1247
+ searchFilter = _this$state3.searchFilter;
1280
1248
  if (quickFilters.size === 0 && advancedFilters.size === 0 && searchFilter === null) {
1281
1249
  return;
1282
1250
  }
@@ -1316,28 +1284,21 @@ class IrisGrid extends Component {
1316
1284
  * Rebuilds all the current filters. Necessary if something like the time zone has changed.
1317
1285
  */
1318
1286
  rebuildFilters() {
1319
- var {
1320
- model
1321
- } = this.props;
1322
- var {
1323
- advancedFilters,
1324
- quickFilters
1325
- } = this.state;
1287
+ var model = this.props.model;
1288
+ var _this$state4 = this.state,
1289
+ advancedFilters = _this$state4.advancedFilters,
1290
+ quickFilters = _this$state4.quickFilters;
1326
1291
  if (advancedFilters.size === 0 && quickFilters.size === 0) {
1327
1292
  log.debug('No filters to rebuild');
1328
1293
  return;
1329
1294
  }
1330
- var {
1331
- columns,
1332
- formatter
1333
- } = model;
1295
+ var columns = model.columns,
1296
+ formatter = model.formatter;
1334
1297
  log.debug('Rebuilding filters');
1335
1298
  var newAdvancedFilters = new Map();
1336
1299
  var newQuickFilters = new Map();
1337
1300
  advancedFilters.forEach((value, key) => {
1338
- var {
1339
- options
1340
- } = value;
1301
+ var options = value.options;
1341
1302
  var column = columns[key];
1342
1303
  var filter = this.tableUtils.makeAdvancedFilter(column, options, formatter.timeZone);
1343
1304
  newAdvancedFilters.set(key, {
@@ -1346,9 +1307,7 @@ class IrisGrid extends Component {
1346
1307
  });
1347
1308
  });
1348
1309
  quickFilters.forEach((value, key) => {
1349
- var {
1350
- text
1351
- } = value;
1310
+ var text = value.text;
1352
1311
  var column = columns[key];
1353
1312
  newQuickFilters.set(key, {
1354
1313
  text,
@@ -1364,10 +1323,8 @@ class IrisGrid extends Component {
1364
1323
  });
1365
1324
  }
1366
1325
  setFilters(_ref10) {
1367
- var {
1368
- quickFilters,
1369
- advancedFilters
1370
- } = _ref10;
1326
+ var quickFilters = _ref10.quickFilters,
1327
+ advancedFilters = _ref10.advancedFilters;
1371
1328
  this.setState({
1372
1329
  quickFilters,
1373
1330
  advancedFilters
@@ -1410,12 +1367,8 @@ class IrisGrid extends Component {
1410
1367
  updateFormatter(updatedFormats) {
1411
1368
  var _this$globalColumnFor;
1412
1369
  var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
1413
- var {
1414
- customColumnFormatMap
1415
- } = this.state;
1416
- var {
1417
- model
1418
- } = this.props;
1370
+ var customColumnFormatMap = this.state.customColumnFormatMap;
1371
+ var model = this.props.model;
1419
1372
  var update = _objectSpread({
1420
1373
  customColumnFormatMap
1421
1374
  }, updatedFormats);
@@ -1431,15 +1384,11 @@ class IrisGrid extends Component {
1431
1384
  });
1432
1385
  }
1433
1386
  initFormatter() {
1434
- var {
1435
- settings
1436
- } = this.props;
1387
+ var settings = this.props.settings;
1437
1388
  this.updateFormatterSettings(settings);
1438
1389
  }
1439
1390
  initState() {
1440
- var {
1441
- model
1442
- } = this.props;
1391
+ var model = this.props.model;
1443
1392
  try {
1444
1393
  if (isPartitionedGridModel(model) && model.isPartitionRequired) {
1445
1394
  this.loadPartitionsTable(model);
@@ -1451,18 +1400,17 @@ class IrisGrid extends Component {
1451
1400
  }
1452
1401
  }
1453
1402
  loadTableState() {
1454
- var {
1455
- applyInputFiltersOnInit,
1456
- inputFilters,
1457
- sorts,
1458
- model,
1459
- reverse,
1460
- reverseType,
1461
- customColumns,
1462
- searchValue,
1463
- selectedSearchColumns,
1464
- invertSearchColumns
1465
- } = this.props;
1403
+ var _this$props4 = this.props,
1404
+ applyInputFiltersOnInit = _this$props4.applyInputFiltersOnInit,
1405
+ inputFilters = _this$props4.inputFilters,
1406
+ sorts = _this$props4.sorts,
1407
+ model = _this$props4.model,
1408
+ reverse = _this$props4.reverse,
1409
+ reverseType = _this$props4.reverseType,
1410
+ customColumns = _this$props4.customColumns,
1411
+ searchValue = _this$props4.searchValue,
1412
+ selectedSearchColumns = _this$props4.selectedSearchColumns,
1413
+ invertSearchColumns = _this$props4.invertSearchColumns;
1466
1414
  var searchColumns = selectedSearchColumns !== null && selectedSearchColumns !== void 0 ? selectedSearchColumns : [];
1467
1415
  var searchFilter = CrossColumnSearch.createSearchFilter(model.dh, searchValue, searchColumns, model.columns, invertSearchColumns);
1468
1416
  if (applyInputFiltersOnInit) {
@@ -1484,9 +1432,7 @@ class IrisGrid extends Component {
1484
1432
  var _this = this;
1485
1433
  return _asyncToGenerator(function* () {
1486
1434
  try {
1487
- var {
1488
- partitionConfig
1489
- } = _this.state;
1435
+ var partitionConfig = _this.state.partitionConfig;
1490
1436
  if (!partitionConfig) {
1491
1437
  _this.startLoading('Loading partitions...', {
1492
1438
  loadingCancelShown: false,
@@ -1512,9 +1458,7 @@ class IrisGrid extends Component {
1512
1458
  var _this2 = this;
1513
1459
  return _asyncToGenerator(function* () {
1514
1460
  var keyTable = yield _this2.pending.add(model.partitionKeysTable(), resolved => resolved.close());
1515
- var {
1516
- dh
1517
- } = model;
1461
+ var dh = model.dh;
1518
1462
  var sorts = keyTable.columns.map(column => column.sort().desc());
1519
1463
  keyTable.applySort(sorts);
1520
1464
  keyTable.setViewport(0, 0);
@@ -1523,9 +1467,7 @@ class IrisGrid extends Component {
1523
1467
  // It's possible that the key table does not have any rows of data yet, so just wait until it does have one
1524
1468
  keyTable.addEventListener(dh.Table.EVENT_UPDATED, event => {
1525
1469
  try {
1526
- var {
1527
- detail: data
1528
- } = event;
1470
+ var data = event.detail;
1529
1471
  if (data.rows.length === 0) {
1530
1472
  // We received an update and the table is still empty. Stop showing the loading spinner so we know
1531
1473
  _this2.stopLoading();
@@ -1557,18 +1499,20 @@ class IrisGrid extends Component {
1557
1499
  * @returns A promise that resolves when the partition key has been successfully selected.
1558
1500
  */
1559
1501
  selectPartitionKeyFromTable(rowIndex) {
1560
- var {
1561
- model
1562
- } = this.props;
1502
+ var model = this.props.model;
1563
1503
  assertNotNull(rowIndex);
1564
1504
  if (isPartitionedGridModel(model)) {
1565
1505
  var data = this.getRowDataMap(rowIndex);
1566
1506
  var partitionColumnSet = new Set(model.partitionColumns.map(column => column.name));
1567
1507
  var values = Object.entries(data).filter(_ref11 => {
1568
- var [key, _] = _ref11;
1508
+ var _ref12 = _slicedToArray(_ref11, 2),
1509
+ key = _ref12[0],
1510
+ _ = _ref12[1];
1569
1511
  return partitionColumnSet.has(key);
1570
- }).map(_ref12 => {
1571
- var [key, columnData] = _ref12;
1512
+ }).map(_ref13 => {
1513
+ var _ref14 = _slicedToArray(_ref13, 2),
1514
+ key = _ref14[0],
1515
+ columnData = _ref14[1];
1572
1516
  return columnData.value;
1573
1517
  });
1574
1518
  var newPartition = {
@@ -1583,9 +1527,7 @@ class IrisGrid extends Component {
1583
1527
  }
1584
1528
  copyCell(columnIndex, rowIndex) {
1585
1529
  var rawValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1586
- var {
1587
- canCopy
1588
- } = this.props;
1530
+ var canCopy = this.props.canCopy;
1589
1531
  if (canCopy) {
1590
1532
  var value = String(this.getValueForCell(columnIndex, rowIndex, rawValue));
1591
1533
  copyToClipboard(value).catch(e => log.error('Unable to copy cell', e));
@@ -1598,12 +1540,8 @@ class IrisGrid extends Component {
1598
1540
  if (columnIndex === null) {
1599
1541
  return;
1600
1542
  }
1601
- var {
1602
- canCopy
1603
- } = this.props;
1604
- var {
1605
- movedColumns
1606
- } = this.state;
1543
+ var canCopy = this.props.canCopy;
1544
+ var movedColumns = this.state.movedColumns;
1607
1545
  if (canCopy) {
1608
1546
  var copyOperation = {
1609
1547
  columnIndex,
@@ -1629,14 +1567,12 @@ class IrisGrid extends Component {
1629
1567
  var includeHeaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1630
1568
  var formatValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
1631
1569
  var error = arguments.length > 3 ? arguments[3] : undefined;
1632
- var {
1633
- model,
1634
- canCopy
1635
- } = this.props;
1636
- var {
1637
- metricCalculator,
1638
- movedColumns
1639
- } = this.state;
1570
+ var _this$props5 = this.props,
1571
+ model = _this$props5.model,
1572
+ canCopy = _this$props5.canCopy;
1573
+ var _this$state5 = this.state,
1574
+ metricCalculator = _this$state5.metricCalculator,
1575
+ movedColumns = _this$state5.movedColumns;
1640
1576
  var userColumnWidths = metricCalculator.getUserColumnWidths();
1641
1577
  if (canCopy) {
1642
1578
  var copyOperation = {
@@ -1655,11 +1591,13 @@ class IrisGrid extends Component {
1655
1591
  }
1656
1592
  }
1657
1593
  startLoading(loadingText) {
1658
- var {
1659
- resetRanges = false,
1660
- loadingCancelShown = true,
1661
- loadingBlocksGrid = true
1662
- } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1594
+ var _ref15 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1595
+ _ref15$resetRanges = _ref15.resetRanges,
1596
+ resetRanges = _ref15$resetRanges === void 0 ? false : _ref15$resetRanges,
1597
+ _ref15$loadingCancelS = _ref15.loadingCancelShown,
1598
+ loadingCancelShown = _ref15$loadingCancelS === void 0 ? true : _ref15$loadingCancelS,
1599
+ _ref15$loadingBlocksG = _ref15.loadingBlocksGrid,
1600
+ loadingBlocksGrid = _ref15$loadingBlocksG === void 0 ? true : _ref15$loadingBlocksG;
1663
1601
  this.setState({
1664
1602
  loadingText,
1665
1603
  loadingCancelShown,
@@ -1674,10 +1612,8 @@ class IrisGrid extends Component {
1674
1612
  }
1675
1613
  if (this.loadingScrimStartTime == null) {
1676
1614
  var _this$gridWrapper$get, _this$gridWrapper;
1677
- var {
1678
- minScrimTransitionTime,
1679
- maxScrimTransitionTime
1680
- } = theme;
1615
+ var minScrimTransitionTime = theme.minScrimTransitionTime,
1616
+ maxScrimTransitionTime = theme.maxScrimTransitionTime;
1681
1617
  assertNotNull(minScrimTransitionTime);
1682
1618
  assertNotNull(maxScrimTransitionTime);
1683
1619
  var height = (_this$gridWrapper$get = (_this$gridWrapper = this.gridWrapper) === null || _this$gridWrapper === void 0 ? void 0 : _this$gridWrapper.getBoundingClientRect().height) !== null && _this$gridWrapper$get !== void 0 ? _this$gridWrapper$get : 0;
@@ -1716,17 +1652,16 @@ class IrisGrid extends Component {
1716
1652
  rollback() {
1717
1653
  if (this.lastLoadedConfig) {
1718
1654
  log.debug('loading last loading config', this.lastLoadedConfig);
1719
- var {
1720
- advancedFilters,
1721
- aggregationSettings,
1722
- customColumns,
1723
- quickFilters,
1724
- reverse,
1725
- rollupConfig,
1726
- searchFilter,
1727
- selectDistinctColumns,
1728
- sorts
1729
- } = this.lastLoadedConfig;
1655
+ var _this$lastLoadedConfi = this.lastLoadedConfig,
1656
+ advancedFilters = _this$lastLoadedConfi.advancedFilters,
1657
+ aggregationSettings = _this$lastLoadedConfi.aggregationSettings,
1658
+ customColumns = _this$lastLoadedConfi.customColumns,
1659
+ quickFilters = _this$lastLoadedConfi.quickFilters,
1660
+ reverse = _this$lastLoadedConfi.reverse,
1661
+ rollupConfig = _this$lastLoadedConfi.rollupConfig,
1662
+ searchFilter = _this$lastLoadedConfi.searchFilter,
1663
+ selectDistinctColumns = _this$lastLoadedConfi.selectDistinctColumns,
1664
+ sorts = _this$lastLoadedConfi.sorts;
1730
1665
  this.lastLoadedConfig = null;
1731
1666
  this.setState({
1732
1667
  advancedFilters,
@@ -1764,33 +1699,33 @@ class IrisGrid extends Component {
1764
1699
  startListening(model) {
1765
1700
  model.addEventListener(IrisGridModel.EVENT.UPDATED, this.handleUpdate);
1766
1701
  model.addEventListener(IrisGridModel.EVENT.REQUEST_FAILED, this.handleRequestFailed);
1702
+ model.addEventListener(IrisGridModel.EVENT.PENDING, this.handlePending);
1703
+ model.addEventListener(IrisGridModel.EVENT.PENDING_CLEARED, this.handlePendingCleared);
1767
1704
  model.addEventListener(IrisGridModel.EVENT.COLUMNS_CHANGED, this.handleCustomColumnsChanged);
1768
1705
  model.addEventListener(IrisGridModel.EVENT.PENDING_DATA_UPDATED, this.handlePendingDataUpdated);
1769
1706
  model.addEventListener(IrisGridModel.EVENT.VIEWPORT_UPDATED, this.handleViewportUpdated);
1770
1707
  model.addEventListener(IrisGridModel.EVENT.TABLE_CHANGED, this.handleTableChanged);
1708
+ model.addEventListener(IrisGridModel.EVENT.MODEL_CHANGED, this.handleModelChanged);
1771
1709
  }
1772
1710
  stopListening(model) {
1773
1711
  model.removeEventListener(IrisGridModel.EVENT.UPDATED, this.handleUpdate);
1774
1712
  model.removeEventListener(IrisGridModel.EVENT.REQUEST_FAILED, this.handleRequestFailed);
1713
+ model.removeEventListener(IrisGridModel.EVENT.PENDING, this.handlePending);
1714
+ model.removeEventListener(IrisGridModel.EVENT.PENDING_CLEARED, this.handlePendingCleared);
1775
1715
  model.removeEventListener(IrisGridModel.EVENT.COLUMNS_CHANGED, this.handleCustomColumnsChanged);
1776
1716
  model.removeEventListener(IrisGridModel.EVENT.PENDING_DATA_UPDATED, this.handlePendingDataUpdated);
1777
1717
  model.removeEventListener(IrisGridModel.EVENT.VIEWPORT_UPDATED, this.handleViewportUpdated);
1778
1718
  model.removeEventListener(IrisGridModel.EVENT.TABLE_CHANGED, this.handleTableChanged);
1719
+ model.removeEventListener(IrisGridModel.EVENT.MODEL_CHANGED, this.handleModelChanged);
1779
1720
  }
1780
1721
  focus() {
1781
1722
  var _this$grid3;
1782
1723
  (_this$grid3 = this.grid) === null || _this$grid3 === void 0 || _this$grid3.focus();
1783
1724
  }
1784
1725
  focusFilterBar(column) {
1785
- var {
1786
- movedColumns
1787
- } = this.state;
1788
- var {
1789
- model
1790
- } = this.props;
1791
- var {
1792
- columnCount
1793
- } = model;
1726
+ var movedColumns = this.state.movedColumns;
1727
+ var model = this.props.model;
1728
+ var columnCount = model.columnCount;
1794
1729
  var modelColumn = GridUtils.getModelIndex(column, movedColumns);
1795
1730
  if (column == null || columnCount <= column || !model.isFilterable(modelColumn)) {
1796
1731
  this.setState({
@@ -1798,10 +1733,9 @@ class IrisGrid extends Component {
1798
1733
  });
1799
1734
  return;
1800
1735
  }
1801
- var {
1802
- metricCalculator,
1803
- metrics
1804
- } = this.state;
1736
+ var _this$state6 = this.state,
1737
+ metricCalculator = _this$state6.metricCalculator,
1738
+ metrics = _this$state6.metrics;
1805
1739
  assertNotNull(metrics);
1806
1740
  var metricState = this.getMetricState();
1807
1741
  assertNotNull(metricState);
@@ -1821,21 +1755,17 @@ class IrisGrid extends Component {
1821
1755
  }
1822
1756
  hideColumnByVisibleIndex(columnVisibleIndex) {
1823
1757
  var _this$grid5;
1824
- var {
1825
- metricCalculator,
1826
- movedColumns
1827
- } = this.state;
1758
+ var _this$state7 = this.state,
1759
+ metricCalculator = _this$state7.metricCalculator,
1760
+ movedColumns = _this$state7.movedColumns;
1828
1761
  metricCalculator.setColumnWidth(GridUtils.getModelIndex(columnVisibleIndex, movedColumns), 0);
1829
1762
  (_this$grid5 = this.grid) === null || _this$grid5 === void 0 || _this$grid5.forceUpdate();
1830
1763
  }
1831
1764
  freezeColumnByColumnName(columnName) {
1832
- var {
1833
- frozenColumns,
1834
- movedColumns
1835
- } = this.state;
1836
- var {
1837
- model
1838
- } = this.props;
1765
+ var _this$state8 = this.state,
1766
+ frozenColumns = _this$state8.frozenColumns,
1767
+ movedColumns = _this$state8.movedColumns;
1768
+ var model = this.props.model;
1839
1769
  log.debug2('freezing column', columnName);
1840
1770
  var allFrozenColumns = frozenColumns == null ? new Set(model.frozenColumns) : new Set(frozenColumns);
1841
1771
  allFrozenColumns.add(columnName);
@@ -1849,13 +1779,10 @@ class IrisGrid extends Component {
1849
1779
  });
1850
1780
  }
1851
1781
  unFreezeColumnByColumnName(columnName) {
1852
- var {
1853
- frozenColumns,
1854
- movedColumns
1855
- } = this.state;
1856
- var {
1857
- model
1858
- } = this.props;
1782
+ var _this$state9 = this.state,
1783
+ frozenColumns = _this$state9.frozenColumns,
1784
+ movedColumns = _this$state9.movedColumns;
1785
+ var model = this.props.model;
1859
1786
  log.debug2('unfreezing column', columnName);
1860
1787
  var allFrozenColumns = frozenColumns == null ? new Set(model.frozenColumns) : new Set(frozenColumns);
1861
1788
  allFrozenColumns.delete(columnName);
@@ -1883,37 +1810,30 @@ class IrisGrid extends Component {
1883
1810
  }
1884
1811
  toggleExpandColumn(modelIndex, expandDescendants) {
1885
1812
  log.debug2('Toggle expand column', modelIndex);
1886
- var {
1887
- model
1888
- } = this.props;
1813
+ var model = this.props.model;
1889
1814
  if (isExpandableColumnGridModel(model) && model.hasExpandableColumns) {
1890
1815
  model.setColumnExpanded(modelIndex, !model.isColumnExpanded(modelIndex), expandDescendants);
1891
1816
  }
1892
1817
  }
1893
1818
  expandAllColumns() {
1894
1819
  log.debug2('Expand all columns');
1895
- var {
1896
- model
1897
- } = this.props;
1820
+ var model = this.props.model;
1898
1821
  if (isExpandableColumnGridModel(model) && model.isExpandAllColumnsAvailable) {
1899
1822
  model.expandAllColumns();
1900
1823
  }
1901
1824
  }
1902
1825
  collapseAllColumns() {
1903
1826
  log.debug2('Collapse all columns');
1904
- var {
1905
- model
1906
- } = this.props;
1827
+ var model = this.props.model;
1907
1828
  if (isExpandableColumnGridModel(model) && model.isExpandAllColumnsAvailable) {
1908
1829
  model.collapseAllColumns();
1909
1830
  }
1910
1831
  }
1911
1832
  handleColumnVisibilityChanged(modelIndexes, isVisible) {
1912
1833
  var _this$grid6;
1913
- var {
1914
- metricCalculator,
1915
- metrics
1916
- } = this.state;
1834
+ var _this$state0 = this.state,
1835
+ metricCalculator = _this$state0.metricCalculator,
1836
+ metrics = _this$state0.metrics;
1917
1837
  assertNotNull(metrics);
1918
1838
  if (isVisible) {
1919
1839
  modelIndexes.forEach(modelIndex => {
@@ -1938,12 +1858,8 @@ class IrisGrid extends Component {
1938
1858
  }
1939
1859
  handleColumnVisibilityReset() {
1940
1860
  var _model$layoutHints$fr, _model$layoutHints2;
1941
- var {
1942
- metricCalculator
1943
- } = this.state;
1944
- var {
1945
- model
1946
- } = this.props;
1861
+ var metricCalculator = this.state.metricCalculator;
1862
+ var model = this.props.model;
1947
1863
  metricCalculator.resetAllColumnWidths();
1948
1864
  this.handleMovedColumnsChanged(model.initialMovedColumns);
1949
1865
  this.handleHeaderGroupsChanged(model.initialColumnHeaderGroups);
@@ -1952,9 +1868,7 @@ class IrisGrid extends Component {
1952
1868
  });
1953
1869
  }
1954
1870
  handleCrossColumnSearch(searchValue, selectedSearchColumns, invertSearchColumns) {
1955
- var {
1956
- model
1957
- } = this.props;
1871
+ var model = this.props.model;
1958
1872
  this.startLoading('Searching...');
1959
1873
  this.updateSearchFilter(searchValue, selectedSearchColumns, model.columns, invertSearchColumns);
1960
1874
  this.setState({
@@ -1981,9 +1895,7 @@ class IrisGrid extends Component {
1981
1895
  }
1982
1896
  handlePartitionChange(partitionConfig) {
1983
1897
  this.startLoading('Partitioning...');
1984
- var {
1985
- partitionConfig: prevConfig
1986
- } = this.state;
1898
+ var prevConfig = this.state.partitionConfig;
1987
1899
  if (prevConfig !== partitionConfig) {
1988
1900
  this.setState({
1989
1901
  partitionConfig
@@ -1995,19 +1907,14 @@ class IrisGrid extends Component {
1995
1907
  return;
1996
1908
  }
1997
1909
  log.error(error);
1998
- var {
1999
- onError
2000
- } = this.props;
1910
+ var onError = this.props.onError;
2001
1911
  onError(error);
2002
1912
  }
2003
1913
  handleViewportUpdated() {
2004
- var {
2005
- model
2006
- } = this.props;
2007
- var {
2008
- loadingText,
2009
- loadingSpinnerShown
2010
- } = this.state;
1914
+ var model = this.props.model;
1915
+ var _this$state1 = this.state,
1916
+ loadingText = _this$state1.loadingText,
1917
+ loadingSpinnerShown = _this$state1.loadingSpinnerShown;
2011
1918
  var loadingMessage = 'Waiting for viewport...';
2012
1919
 
2013
1920
  // pending and no timer already exists
@@ -2020,13 +1927,13 @@ class IrisGrid extends Component {
2020
1927
  }
2021
1928
  showAllColumns() {
2022
1929
  var _this$grid8;
2023
- var {
2024
- metricCalculator
2025
- } = this.state;
1930
+ var metricCalculator = this.state.metricCalculator;
2026
1931
  var userColumnWidths = metricCalculator.getUserColumnWidths();
2027
1932
  var entries = [...userColumnWidths.entries()];
2028
1933
  for (var i = 0; i < entries.length; i += 1) {
2029
- var [modelIndex, columnWidth] = entries[i];
1934
+ var _entries$i = _slicedToArray(entries[i], 2),
1935
+ modelIndex = _entries$i[0],
1936
+ columnWidth = _entries$i[1];
2030
1937
  if (columnWidth === 0) {
2031
1938
  metricCalculator.resetColumnWidth(modelIndex);
2032
1939
  }
@@ -2046,15 +1953,11 @@ class IrisGrid extends Component {
2046
1953
  }
2047
1954
  toggleSort(columnIndex, addToExisting) {
2048
1955
  log.info('Toggling sort for column', columnIndex);
2049
- var {
2050
- model
2051
- } = this.props;
1956
+ var model = this.props.model;
2052
1957
  var modelColumn = this.getModelColumn(columnIndex);
2053
1958
  assertNotNull(modelColumn);
2054
1959
  if (model.isColumnSortable(columnIndex)) {
2055
- var {
2056
- sorts: currentSorts
2057
- } = this.state;
1960
+ var currentSorts = this.state.sorts;
2058
1961
  var sorts = TableUtils.toggleSortForColumn(currentSorts, model.columns, modelColumn, addToExisting);
2059
1962
  this.updateSorts(sorts);
2060
1963
  } else {
@@ -2075,9 +1978,7 @@ class IrisGrid extends Component {
2075
1978
  var isAbs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2076
1979
  var addToExisting = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
2077
1980
  assertNotNull(modelColumn);
2078
- var {
2079
- model
2080
- } = this.props;
1981
+ var model = this.props.model;
2081
1982
  var sorts = TableUtils.sortColumn(model.sort, model.columns, modelColumn, direction, isAbs, addToExisting);
2082
1983
  this.startLoading('Sorting...');
2083
1984
  this.setState({
@@ -2094,16 +1995,12 @@ class IrisGrid extends Component {
2094
1995
  (_this$grid10 = this.grid) === null || _this$grid10 === void 0 || _this$grid10.forceUpdate();
2095
1996
  }
2096
1997
  isReversible() {
2097
- var {
2098
- model
2099
- } = this.props;
1998
+ var model = this.props.model;
2100
1999
  return model.isReversible;
2101
2000
  }
2102
2001
  toggleFilterBar() {
2103
2002
  var focusIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.lastFocusedFilterBarColumn;
2104
- var {
2105
- isFilterBarShown
2106
- } = this.state;
2003
+ var isFilterBarShown = this.state.isFilterBarShown;
2107
2004
  isFilterBarShown = !isFilterBarShown;
2108
2005
  this.setState({
2109
2006
  isFilterBarShown
@@ -2113,12 +2010,8 @@ class IrisGrid extends Component {
2113
2010
  this.focusFilterBar(focusIndex);
2114
2011
  } else {
2115
2012
  var columnIndex = 0;
2116
- var {
2117
- model
2118
- } = this.props;
2119
- var {
2120
- columnCount
2121
- } = model;
2013
+ var model = this.props.model;
2014
+ var columnCount = model.columnCount;
2122
2015
  for (var i = 0; i < columnCount; i += 1) {
2123
2016
  var modelColumn = this.getModelColumn(i);
2124
2017
  if (modelColumn != null) {
@@ -2138,13 +2031,10 @@ class IrisGrid extends Component {
2138
2031
  }
2139
2032
  isTableSearchAvailable() {
2140
2033
  var _model$layoutHints3, _dh$SearchDisplayMode, _dh$SearchDisplayMode2;
2141
- var {
2142
- model,
2143
- canToggleSearch
2144
- } = this.props;
2145
- var {
2146
- dh
2147
- } = model;
2034
+ var _this$props6 = this.props,
2035
+ model = _this$props6.model,
2036
+ canToggleSearch = _this$props6.canToggleSearch;
2037
+ var dh = model.dh;
2148
2038
  var searchDisplayMode = model === null || model === void 0 || (_model$layoutHints3 = model.layoutHints) === null || _model$layoutHints3 === void 0 ? void 0 : _model$layoutHints3.searchDisplayMode;
2149
2039
  if (searchDisplayMode === ((_dh$SearchDisplayMode = dh.SearchDisplayMode) === null || _dh$SearchDisplayMode === void 0 ? void 0 : _dh$SearchDisplayMode.SEARCH_DISPLAY_HIDE)) {
2150
2040
  return false;
@@ -2155,9 +2045,7 @@ class IrisGrid extends Component {
2155
2045
  return canToggleSearch;
2156
2046
  }
2157
2047
  toggleSearchBar() {
2158
- var {
2159
- showSearchBar
2160
- } = this.state;
2048
+ var showSearchBar = this.state.showSearchBar;
2161
2049
  if (!this.isTableSearchAvailable()) {
2162
2050
  return;
2163
2051
  }
@@ -2180,9 +2068,7 @@ class IrisGrid extends Component {
2180
2068
  var row = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
2181
2069
  var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
2182
2070
  var columnName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
2183
- var {
2184
- isGotoShown
2185
- } = this.state;
2071
+ var isGotoShown = this.state.isGotoShown;
2186
2072
  if (row || value) {
2187
2073
  var _this$gotoRowRef$curr;
2188
2074
  // if invoked with a row, keep open instead of toggle
@@ -2213,12 +2099,8 @@ class IrisGrid extends Component {
2213
2099
  return;
2214
2100
  }
2215
2101
  // if a row is selected
2216
- var {
2217
- model
2218
- } = this.props;
2219
- var {
2220
- name
2221
- } = model.columns[cursorColumn];
2102
+ var model = this.props.model;
2103
+ var name = model.columns[cursorColumn].name;
2222
2104
 
2223
2105
  // Use raw value (same as Copy Cell Unformatted) to preserve full precision and timezone
2224
2106
  var text = String(this.getValueForCell(cursorColumn, cursorRow, true));
@@ -2236,15 +2118,11 @@ class IrisGrid extends Component {
2236
2118
  var _this3 = this;
2237
2119
  return _asyncToGenerator(function* () {
2238
2120
  var _document;
2239
- var {
2240
- model
2241
- } = _this3.props;
2121
+ var model = _this3.props.model;
2242
2122
  if (!isEditableGridModel(model) || !model.isEditable) {
2243
2123
  throw new Error('Cannot save, table is not editable');
2244
2124
  }
2245
- var {
2246
- pendingSavePromise
2247
- } = _this3.state;
2125
+ var pendingSavePromise = _this3.state.pendingSavePromise;
2248
2126
  if (pendingSavePromise != null) {
2249
2127
  throw new Error('Save already in progress');
2250
2128
  }
@@ -2280,9 +2158,7 @@ class IrisGrid extends Component {
2280
2158
  discardPending() {
2281
2159
  var _this4 = this;
2282
2160
  return _asyncToGenerator(function* () {
2283
- var {
2284
- pendingSavePromise
2285
- } = _this4.state;
2161
+ var pendingSavePromise = _this4.state.pendingSavePromise;
2286
2162
  if (pendingSavePromise != null) {
2287
2163
  throw new Error('Cannot cancel a save in progress');
2288
2164
  }
@@ -2300,9 +2176,7 @@ class IrisGrid extends Component {
2300
2176
  * @param column The column in this table to link
2301
2177
  */
2302
2178
  selectColumn(column) {
2303
- var {
2304
- onColumnSelected
2305
- } = this.props;
2179
+ var onColumnSelected = this.props.onColumnSelected;
2306
2180
  onColumnSelected(column);
2307
2181
  }
2308
2182
 
@@ -2311,9 +2185,7 @@ class IrisGrid extends Component {
2311
2185
  */
2312
2186
  selectData(columnIndex, rowIndex) {
2313
2187
  var dataMap = this.getRowDataMap(rowIndex);
2314
- var {
2315
- onDataSelected
2316
- } = this.props;
2188
+ var onDataSelected = this.props.onDataSelected;
2317
2189
  onDataSelected(rowIndex, dataMap);
2318
2190
  }
2319
2191
 
@@ -2324,20 +2196,14 @@ class IrisGrid extends Component {
2324
2196
  */
2325
2197
  getRowDataMap(rowIndex) {
2326
2198
  var _this5 = this;
2327
- var {
2328
- model
2329
- } = this.props;
2330
- var {
2331
- columns,
2332
- groupedColumns
2333
- } = model;
2199
+ var model = this.props.model;
2200
+ var columns = model.columns,
2201
+ groupedColumns = model.groupedColumns;
2334
2202
  var dataMap = {};
2335
2203
  var _loop = function _loop() {
2336
2204
  var column = columns[i];
2337
- var {
2338
- name,
2339
- type
2340
- } = column;
2205
+ var name = column.name,
2206
+ type = column.type;
2341
2207
  var value = model.valueForCell(i, rowIndex);
2342
2208
  var text = model.textForCell(i, rowIndex);
2343
2209
  var visibleIndex = _this5.getVisibleColumn(i);
@@ -2358,9 +2224,7 @@ class IrisGrid extends Component {
2358
2224
  return dataMap;
2359
2225
  }
2360
2226
  handleAdvancedFilterChange(column, filter, options) {
2361
- var {
2362
- model
2363
- } = this.props;
2227
+ var model = this.props.model;
2364
2228
  var index = model.getColumnIndexByName(column.name);
2365
2229
  assertNotNull(index);
2366
2230
  this.setAdvancedFilter(index, filter, options);
@@ -2368,9 +2232,7 @@ class IrisGrid extends Component {
2368
2232
  handleAdvancedFilterSortChange(column, direction) {
2369
2233
  var _this$grid15;
2370
2234
  var addToExisting = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
2371
- var {
2372
- model
2373
- } = this.props;
2235
+ var model = this.props.model;
2374
2236
  var columnIndex = model.getColumnIndexByName(column.name);
2375
2237
  assertNotNull(columnIndex);
2376
2238
  var columnName = model.columns[columnIndex].name;
@@ -2396,10 +2258,8 @@ class IrisGrid extends Component {
2396
2258
  (_this$grid16 = this.grid) === null || _this$grid16 === void 0 || _this$grid16.focus();
2397
2259
  }
2398
2260
  handleAdvancedFilterToggleMaximize(column) {
2399
- this.setState(_ref13 => {
2400
- var {
2401
- maximizedAdvancedFilter
2402
- } = _ref13;
2261
+ this.setState(_ref16 => {
2262
+ var maximizedAdvancedFilter = _ref16.maximizedAdvancedFilter;
2403
2263
  return {
2404
2264
  maximizedAdvancedFilter: maximizedAdvancedFilter === column ? null : column
2405
2265
  };
@@ -2425,10 +2285,9 @@ class IrisGrid extends Component {
2425
2285
  }
2426
2286
  handleAdvancedMenuClosed(columnIndex) {
2427
2287
  var _this$filterInputRef;
2428
- var {
2429
- focusedFilterBarColumn,
2430
- isFilterBarShown
2431
- } = this.state;
2288
+ var _this$state10 = this.state,
2289
+ focusedFilterBarColumn = _this$state10.focusedFilterBarColumn,
2290
+ isFilterBarShown = _this$state10.isFilterBarShown;
2432
2291
  if (isFilterBarShown && focusedFilterBarColumn === columnIndex && ((_this$filterInputRef = this.filterInputRef) === null || _this$filterInputRef === void 0 ? void 0 : _this$filterInputRef.current) !== null) {
2433
2292
  var _this$filterInputRef2;
2434
2293
  (_this$filterInputRef2 = this.filterInputRef) === null || _this$filterInputRef2 === void 0 || _this$filterInputRef2.current.focus();
@@ -2453,10 +2312,9 @@ class IrisGrid extends Component {
2453
2312
  // TODO: IDS-4242 Update Chart Preview
2454
2313
  }
2455
2314
  handleChartCreate(settings) {
2456
- var {
2457
- model,
2458
- onCreateChart
2459
- } = this.props;
2315
+ var _this$props7 = this.props,
2316
+ model = _this$props7.model,
2317
+ onCreateChart = _this$props7.onCreateChart;
2460
2318
  onCreateChart(settings, model);
2461
2319
  }
2462
2320
  handleGridError(error) {
@@ -2472,11 +2330,9 @@ class IrisGrid extends Component {
2472
2330
  this.startLoading('Filtering...', {
2473
2331
  resetRanges: true
2474
2332
  });
2475
- this.setState(_ref14 => {
2476
- var {
2477
- focusedFilterBarColumn,
2478
- quickFilters
2479
- } = _ref14;
2333
+ this.setState(_ref17 => {
2334
+ var focusedFilterBarColumn = _ref17.focusedFilterBarColumn,
2335
+ quickFilters = _ref17.quickFilters;
2480
2336
  var newQuickFilters = new Map(quickFilters);
2481
2337
  if (focusedFilterBarColumn != null) {
2482
2338
  var modelIndex = this.getModelColumn(focusedFilterBarColumn);
@@ -2502,9 +2358,7 @@ class IrisGrid extends Component {
2502
2358
  }
2503
2359
  }
2504
2360
  handleFilterBarTab(backward) {
2505
- var {
2506
- focusedFilterBarColumn
2507
- } = this.state;
2361
+ var focusedFilterBarColumn = this.state.focusedFilterBarColumn;
2508
2362
  assertNotNull(focusedFilterBarColumn);
2509
2363
  if (backward) {
2510
2364
  this.focusFilterBar(focusedFilterBarColumn - 1);
@@ -2513,13 +2367,9 @@ class IrisGrid extends Component {
2513
2367
  }
2514
2368
  }
2515
2369
  handleFormatSelection(modelIndex, selectedFormat) {
2516
- var {
2517
- model
2518
- } = this.props;
2370
+ var model = this.props.model;
2519
2371
  var column = model.columns[modelIndex];
2520
- var {
2521
- customColumnFormatMap: prevCustomColumnFormatMap
2522
- } = this.state;
2372
+ var prevCustomColumnFormatMap = this.state.customColumnFormatMap;
2523
2373
  var customColumnFormatMap = new Map(prevCustomColumnFormatMap);
2524
2374
  if (selectedFormat != null) {
2525
2375
  var normalizedType = TableUtils.getNormalizedType(column.type);
@@ -2534,14 +2384,11 @@ class IrisGrid extends Component {
2534
2384
  });
2535
2385
  }
2536
2386
  handleColumnAlignmentChange(modelIndex, alignment) {
2537
- var {
2538
- model
2539
- } = this.props;
2387
+ var model = this.props.model;
2540
2388
  var column = model.columns[modelIndex];
2541
- this.setState(_ref15 => {
2542
- var {
2543
- columnAlignmentMap = EMPTY_MAP
2544
- } = _ref15;
2389
+ this.setState(_ref18 => {
2390
+ var _ref18$columnAlignmen = _ref18.columnAlignmentMap,
2391
+ columnAlignmentMap = _ref18$columnAlignmen === void 0 ? EMPTY_MAP : _ref18$columnAlignmen;
2545
2392
  var newColumnAlignmentMap = new Map(columnAlignmentMap);
2546
2393
  if (alignment != null) {
2547
2394
  newColumnAlignmentMap.set(column.name, alignment);
@@ -2566,10 +2413,8 @@ class IrisGrid extends Component {
2566
2413
  });
2567
2414
  }
2568
2415
  handleMenuBack() {
2569
- this.setState(_ref16 => {
2570
- var {
2571
- openOptions
2572
- } = _ref16;
2416
+ this.setState(_ref19 => {
2417
+ var openOptions = _ref19.openOptions;
2573
2418
  var newOptions = [...openOptions];
2574
2419
  newOptions.pop();
2575
2420
  return {
@@ -2578,24 +2423,19 @@ class IrisGrid extends Component {
2578
2423
  });
2579
2424
  }
2580
2425
  handleMenuSelect(option) {
2581
- this.setState(_ref17 => {
2582
- var {
2583
- openOptions
2584
- } = _ref17;
2426
+ this.setState(_ref20 => {
2427
+ var openOptions = _ref20.openOptions;
2585
2428
  return {
2586
2429
  openOptions: [...openOptions, option]
2587
2430
  };
2588
2431
  });
2589
2432
  }
2590
2433
  handleRequestFailed(event) {
2591
- var {
2592
- detail: error
2593
- } = event;
2434
+ var _ref21 = event,
2435
+ error = _ref21.detail;
2594
2436
  log.error('request failed:', error);
2595
2437
  this.stopLoading();
2596
- var {
2597
- partitionConfig
2598
- } = this.state;
2438
+ var partitionConfig = this.state.partitionConfig;
2599
2439
  if (isMissingPartitionError(error) && partitionConfig != null) {
2600
2440
  // We'll try loading the initial partition again
2601
2441
  this.startLoading('Reloading partition...', {
@@ -2613,26 +2453,52 @@ class IrisGrid extends Component {
2613
2453
  this.rollback();
2614
2454
  } else {
2615
2455
  log.error('Table failed and unable to rollback');
2616
- var {
2617
- onError
2618
- } = this.props;
2456
+ var onError = this.props.onError;
2619
2457
  onError(new Error("Error displaying table: ".concat(error)));
2620
2458
  }
2621
2459
  }
2460
+
2461
+ /**
2462
+ * Raise the loading scrim in response to a model-driven `PENDING` event. The
2463
+ * model is the start signal, mirroring how `UPDATED`/`COLUMNS_CHANGED` are
2464
+ * already the model-driven stop signal. Idempotent: the first message within
2465
+ * a commit wins (the `loadingScrimStartTime == null` guard collapses multiple
2466
+ * pending operations into a single scrim).
2467
+ */
2468
+ handlePending(event) {
2469
+ var _ref22 = event,
2470
+ detail = _ref22.detail;
2471
+ var _ref23 = detail !== null && detail !== void 0 ? detail : {},
2472
+ text = _ref23.text,
2473
+ options = _ref23.options;
2474
+ if (this.loadingScrimStartTime == null) {
2475
+ this.startLoading(text !== null && text !== void 0 ? text : 'Loading...', _objectSpread({
2476
+ loadingCancelShown: false
2477
+ }, options));
2478
+ }
2479
+ }
2480
+
2481
+ /**
2482
+ * Clear the loading scrim in response to a model-driven `PENDING_CLEARED`
2483
+ * event. Only needed for operations that do not naturally end in
2484
+ * `UPDATED`/`COLUMNS_CHANGED`/`REQUEST_FAILED`.
2485
+ */
2486
+ handlePendingCleared() {
2487
+ this.stopLoading();
2488
+ }
2622
2489
  handleUpdate() {
2623
2490
  var _this$grid18;
2624
2491
  log.debug2('Received model update');
2625
- var {
2626
- advancedFilters,
2627
- aggregationSettings,
2628
- customColumns,
2629
- quickFilters,
2630
- reverse,
2631
- rollupConfig,
2632
- searchFilter,
2633
- selectDistinctColumns,
2634
- sorts
2635
- } = this.state;
2492
+ var _this$state11 = this.state,
2493
+ advancedFilters = _this$state11.advancedFilters,
2494
+ aggregationSettings = _this$state11.aggregationSettings,
2495
+ customColumns = _this$state11.customColumns,
2496
+ quickFilters = _this$state11.quickFilters,
2497
+ reverse = _this$state11.reverse,
2498
+ rollupConfig = _this$state11.rollupConfig,
2499
+ searchFilter = _this$state11.searchFilter,
2500
+ selectDistinctColumns = _this$state11.selectDistinctColumns,
2501
+ sorts = _this$state11.sorts;
2636
2502
  var config = {
2637
2503
  advancedFilters,
2638
2504
  aggregationSettings,
@@ -2653,35 +2519,39 @@ class IrisGrid extends Component {
2653
2519
  this.stopLoading();
2654
2520
  }
2655
2521
  handleTableChanged() {
2656
- var {
2657
- model
2658
- } = this.props;
2659
- // movedColumns reset triggers metricCalculator update in the Grid component
2660
- this.setState({
2661
- movedColumns: model.initialMovedColumns
2662
- });
2522
+ var model = this.props.model;
2663
2523
  // For partitioned tables, we want to rebuild filters on table change to ensure filters are applied to the new partition
2664
- var {
2665
- partitionConfig
2666
- } = this.state;
2524
+ var partitionConfig = this.state.partitionConfig;
2667
2525
  if (isPartitionedGridModel(model) && (partitionConfig === null || partitionConfig === void 0 ? void 0 : partitionConfig.mode) !== 'keys') {
2668
2526
  this.rebuildFilters();
2669
2527
  }
2670
2528
  }
2529
+
2530
+ /**
2531
+ * Handle an inner-model swap on a proxy model (`MODEL_CHANGED`). The previous
2532
+ * model's `movedColumns` reference indices that may not exist in the new
2533
+ * model (e.g. a pivot exposes a different column set), so reset them to the
2534
+ * new model's initial order. The metric calculator is rebuilt separately when
2535
+ * the `getMetricCalculator` prop changes (see `componentDidUpdate`); a calc
2536
+ * whose seed `movedColumns` are now stale self-heals because `getMetrics`
2537
+ * reconciles against the grid's current `movedColumns` at draw time.
2538
+ */
2539
+ handleModelChanged() {
2540
+ var model = this.props.model;
2541
+ this.setState({
2542
+ movedColumns: model.initialMovedColumns
2543
+ });
2544
+ }
2671
2545
  handleViewChanged(metrics) {
2672
2546
  var _this$grid$state, _this$grid19;
2673
- var {
2674
- model
2675
- } = this.props;
2676
- var {
2677
- selectionEndRow = 0
2678
- } = (_this$grid$state = (_this$grid19 = this.grid) === null || _this$grid19 === void 0 ? void 0 : _this$grid19.state) !== null && _this$grid$state !== void 0 ? _this$grid$state : {};
2547
+ var model = this.props.model;
2548
+ var _ref24 = (_this$grid$state = (_this$grid19 = this.grid) === null || _this$grid19 === void 0 ? void 0 : _this$grid19.state) !== null && _this$grid$state !== void 0 ? _this$grid$state : {},
2549
+ _ref24$selectionEndRo = _ref24.selectionEndRow,
2550
+ selectionEndRow = _ref24$selectionEndRo === void 0 ? 0 : _ref24$selectionEndRo;
2679
2551
  var pendingRowCount = 0;
2680
2552
  if (isEditableGridModel(model) && model.isEditable) {
2681
2553
  assertNotNull(metrics);
2682
- var {
2683
- bottomViewport
2684
- } = metrics;
2554
+ var bottomViewport = metrics.bottomViewport;
2685
2555
 
2686
2556
  // We have an editable table that we can add new rows to
2687
2557
  // Display empty rows beneath the table rows that user can fill in
@@ -2704,12 +2574,8 @@ class IrisGrid extends Component {
2704
2574
  }
2705
2575
  handleSelectionChanged(selectedRanges) {
2706
2576
  assertNotNull(selectedRanges);
2707
- var {
2708
- onSelectionChanged
2709
- } = this.props;
2710
- var {
2711
- copyOperation
2712
- } = this.state;
2577
+ var onSelectionChanged = this.props.onSelectionChanged;
2578
+ var copyOperation = this.state.copyOperation;
2713
2579
  this.setState({
2714
2580
  selectedRanges
2715
2581
  });
@@ -2736,12 +2602,8 @@ class IrisGrid extends Component {
2736
2602
  }, onChangeApplied);
2737
2603
  }
2738
2604
  handleHeaderGroupsChanged(columnHeaderGroups) {
2739
- var {
2740
- model
2741
- } = this.props;
2742
- var {
2743
- columnHeaderGroups: prevColumnHeaderGroups
2744
- } = this.state;
2605
+ var model = this.props.model;
2606
+ var prevColumnHeaderGroups = this.state.columnHeaderGroups;
2745
2607
  if (prevColumnHeaderGroups === columnHeaderGroups) {
2746
2608
  return;
2747
2609
  }
@@ -2769,10 +2631,9 @@ class IrisGrid extends Component {
2769
2631
  }
2770
2632
  handleConditionalFormatCreate() {
2771
2633
  log.debug('Create new conditional format');
2772
- var {
2773
- openOptions,
2774
- conditionalFormats
2775
- } = this.state;
2634
+ var _this$state12 = this.state,
2635
+ openOptions = _this$state12.openOptions,
2636
+ conditionalFormats = _this$state12.conditionalFormats;
2776
2637
  this.setState({
2777
2638
  openOptions: [...openOptions, {
2778
2639
  type: OptionType.CONDITIONAL_FORMATTING_EDIT,
@@ -2785,10 +2646,9 @@ class IrisGrid extends Component {
2785
2646
  }
2786
2647
  handleConditionalFormatEdit(index) {
2787
2648
  log.debug('Edit conditional format', index);
2788
- var {
2789
- openOptions,
2790
- conditionalFormats
2791
- } = this.state;
2649
+ var _this$state13 = this.state,
2650
+ openOptions = _this$state13.openOptions,
2651
+ conditionalFormats = _this$state13.conditionalFormats;
2792
2652
  this.setState({
2793
2653
  openOptions: [...openOptions, {
2794
2654
  type: OptionType.CONDITIONAL_FORMATTING_EDIT,
@@ -2825,19 +2685,14 @@ class IrisGrid extends Component {
2825
2685
  }
2826
2686
  handleUpdateCustomColumns(customColumns) {
2827
2687
  log.info("handleUpdateCustomColumns:", customColumns);
2828
- var {
2829
- model
2830
- } = this.props;
2831
- var {
2832
- movedColumns,
2833
- sorts,
2834
- quickFilters,
2835
- advancedFilters,
2836
- selectDistinctColumns
2837
- } = this.state;
2838
- var {
2839
- columns
2840
- } = model;
2688
+ var model = this.props.model;
2689
+ var _this$state14 = this.state,
2690
+ movedColumns = _this$state14.movedColumns,
2691
+ sorts = _this$state14.sorts,
2692
+ quickFilters = _this$state14.quickFilters,
2693
+ advancedFilters = _this$state14.advancedFilters,
2694
+ selectDistinctColumns = _this$state14.selectDistinctColumns;
2695
+ var columns = model.columns;
2841
2696
  var oldCustomColumns = model.customColumns.map(customColumn => "".concat(customColumn));
2842
2697
  var removedColumnNames = IrisGridUtils.getRemovedCustomColumnNames(oldCustomColumns, customColumns);
2843
2698
  if (removedColumnNames.length > 0) {
@@ -2883,9 +2738,7 @@ class IrisGrid extends Component {
2883
2738
  }
2884
2739
  handleCustomColumnsChanged() {
2885
2740
  log.debug('Model columns changed');
2886
- var {
2887
- isReady
2888
- } = this.state;
2741
+ var isReady = this.state.isReady;
2889
2742
  if (isReady) {
2890
2743
  this.updateMetrics();
2891
2744
 
@@ -2896,6 +2749,50 @@ class IrisGrid extends Component {
2896
2749
  this.loadTableState();
2897
2750
  }
2898
2751
  }
2752
+
2753
+ /**
2754
+ * Rebuild the metric calculator when the `getMetricCalculator` prop swaps for
2755
+ * a different factory (e.g. entering or leaving a pivot, where the
2756
+ * pivot-builder middleware flips the prop). The renderer and mouse handlers
2757
+ * are recomputed via their memoized getters on the next render and do not
2758
+ * need explicit handling here.
2759
+ *
2760
+ * User column-widths / row-heights from the previous calculator are not
2761
+ * carried over: a factory swap means the column set has effectively changed,
2762
+ * so the stored sizes wouldn't map to anything meaningful.
2763
+ *
2764
+ * Moved columns are NOT reset here — that is owned by `handleModelChanged`
2765
+ * (the `MODEL_CHANGED` event) so that a plain prop swap against the same
2766
+ * model preserves the user's layout. The new calculator is seeded with the
2767
+ * current moved columns; `getMetrics` reconciles against the grid's live
2768
+ * `movedColumns` at draw time, so a later reset stays consistent.
2769
+ */
2770
+ maybeRebuildMetricCalculator() {
2771
+ var _model$layoutHints4;
2772
+ var getMetricCalculator = this.props.getMetricCalculator;
2773
+ var factory = getMetricCalculator;
2774
+ if (factory === this.lastMetricCalculatorFactory) return;
2775
+ var model = this.props.model;
2776
+ var movedColumns = this.state.movedColumns;
2777
+ var next = factory({
2778
+ userColumnWidths: new Map(),
2779
+ userRowHeights: new Map(),
2780
+ movedColumns,
2781
+ initialColumnWidths: new Map(model === null || model === void 0 || (_model$layoutHints4 = model.layoutHints) === null || _model$layoutHints4 === void 0 || (_model$layoutHints4 = _model$layoutHints4.hiddenColumns) === null || _model$layoutHints4 === void 0 ? void 0 : _model$layoutHints4.map(name => [model.getColumnIndexByName(name), 0]))
2782
+ });
2783
+ this.lastMetricCalculatorFactory = factory;
2784
+ log.debug('Swapping metric calculator', next);
2785
+ // Also push the new calculator onto the Grid synchronously so any
2786
+ // immediately-following read of `Grid.metricCalculator` (before React has
2787
+ // committed the setState below) uses the new instance against the new
2788
+ // model rather than invoking the old calculator and potentially throwing.
2789
+ if (this.grid != null) {
2790
+ this.grid.metricCalculator = next;
2791
+ }
2792
+ this.setState({
2793
+ metricCalculator: next
2794
+ });
2795
+ }
2899
2796
  handlePendingCommitClicked() {
2900
2797
  return this.commitPending();
2901
2798
  }
@@ -2905,13 +2802,9 @@ class IrisGrid extends Component {
2905
2802
  handlePendingDataUpdated() {
2906
2803
  var _this$grid21;
2907
2804
  log.debug('pending data updated');
2908
- var {
2909
- model
2910
- } = this.props;
2911
- var {
2912
- pendingDataMap,
2913
- pendingDataErrors
2914
- } = model;
2805
+ var model = this.props.model;
2806
+ var pendingDataMap = model.pendingDataMap,
2807
+ pendingDataErrors = model.pendingDataErrors;
2915
2808
  this.setState({
2916
2809
  pendingDataMap,
2917
2810
  pendingDataErrors,
@@ -2921,10 +2814,9 @@ class IrisGrid extends Component {
2921
2814
  }
2922
2815
  handleResizeColumn(modelIndex) {
2923
2816
  var _this$grid22;
2924
- var {
2925
- metrics,
2926
- metricCalculator
2927
- } = this.state;
2817
+ var _this$state15 = this.state,
2818
+ metrics = _this$state15.metrics,
2819
+ metricCalculator = _this$state15.metricCalculator;
2928
2820
  if (!metrics) throw new Error('Metrics not set');
2929
2821
  var contentWidth = getOrThrow(metrics.contentColumnWidths, modelIndex);
2930
2822
  var userWidths = metricCalculator.getUserColumnWidths();
@@ -2938,17 +2830,19 @@ class IrisGrid extends Component {
2938
2830
  }
2939
2831
  handleResizeAllColumns() {
2940
2832
  var _this$grid23;
2941
- var {
2942
- metrics,
2943
- metricCalculator
2944
- } = this.state;
2833
+ var _this$state16 = this.state,
2834
+ metrics = _this$state16.metrics,
2835
+ metricCalculator = _this$state16.metricCalculator;
2945
2836
  if (!metrics) throw new Error('Metrics not set');
2946
2837
  var allColumns = [...metrics.allColumnWidths.entries()];
2947
- var visibleColumns = allColumns.filter(_ref18 => {
2948
- var [_, width] = _ref18;
2838
+ var visibleColumns = allColumns.filter(_ref25 => {
2839
+ var _ref26 = _slicedToArray(_ref25, 2),
2840
+ _ = _ref26[0],
2841
+ width = _ref26[1];
2949
2842
  return width !== 0;
2950
- }).map(_ref19 => {
2951
- var [modelIndex] = _ref19;
2843
+ }).map(_ref27 => {
2844
+ var _ref28 = _slicedToArray(_ref27, 1),
2845
+ modelIndex = _ref28[0];
2952
2846
  return modelIndex;
2953
2847
  });
2954
2848
  var contentWidths = metrics.contentColumnWidths;
@@ -2984,9 +2878,7 @@ class IrisGrid extends Component {
2984
2878
  var added = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
2985
2879
  var removed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
2986
2880
  log.debug('handleAggregationsChange', aggregationSettings, added, removed);
2987
- var {
2988
- rollupConfig
2989
- } = this.state;
2881
+ var rollupConfig = this.state.rollupConfig;
2990
2882
  var isRollup = ((_rollupConfig$columns = rollupConfig === null || rollupConfig === void 0 || (_rollupConfig$columns2 = rollupConfig.columns) === null || _rollupConfig$columns2 === void 0 ? void 0 : _rollupConfig$columns2.length) !== null && _rollupConfig$columns !== void 0 ? _rollupConfig$columns : 0) > 0;
2991
2883
  // Do not start loading if this is rollup and added / removed aggregations are prohibited for rollups
2992
2884
  var changes = [...added, ...removed];
@@ -3006,19 +2898,15 @@ class IrisGrid extends Component {
3006
2898
  handleAggregationChange(aggregation) {
3007
2899
  var _rollupConfig$columns3, _rollupConfig$columns4;
3008
2900
  log.debug('handleAggregationChange', aggregation);
3009
- var {
3010
- rollupConfig
3011
- } = this.state;
2901
+ var rollupConfig = this.state.rollupConfig;
3012
2902
  var isRollup = ((_rollupConfig$columns3 = rollupConfig === null || rollupConfig === void 0 || (_rollupConfig$columns4 = rollupConfig.columns) === null || _rollupConfig$columns4 === void 0 ? void 0 : _rollupConfig$columns4.length) !== null && _rollupConfig$columns3 !== void 0 ? _rollupConfig$columns3 : 0) > 0;
3013
2903
  // Do not start loading if this is rollup and the aggregation is prohibited for rollups
3014
2904
  var shouldStartLoading = !(isRollup && AggregationUtils.isRollupProhibited(aggregation.operation));
3015
2905
  if (shouldStartLoading) {
3016
2906
  this.startLoading("Aggregating ".concat(aggregation.operation, "..."));
3017
2907
  }
3018
- this.setState(_ref20 => {
3019
- var {
3020
- aggregationSettings
3021
- } = _ref20;
2908
+ this.setState(_ref29 => {
2909
+ var aggregationSettings = _ref29.aggregationSettings;
3022
2910
  return {
3023
2911
  selectedAggregation: aggregation,
3024
2912
  aggregationSettings: _objectSpread(_objectSpread({}, aggregationSettings), {}, {
@@ -3034,9 +2922,7 @@ class IrisGrid extends Component {
3034
2922
  */
3035
2923
  handleAggregationEdit(aggregation) {
3036
2924
  log.debug('handleAggregationEdit', aggregation);
3037
- var {
3038
- openOptions
3039
- } = this.state;
2925
+ var openOptions = this.state.openOptions;
3040
2926
  this.setState({
3041
2927
  openOptions: [...openOptions, {
3042
2928
  type: OptionType.AGGREGATION_EDIT,
@@ -3051,9 +2937,7 @@ class IrisGrid extends Component {
3051
2937
 
3052
2938
  // Un-hide hidden group-by columns.
3053
2939
  if ((rollupConfig === null || rollupConfig === void 0 ? void 0 : rollupConfig.columns) != null && rollupConfig.columns.length > 0) {
3054
- var {
3055
- metricCalculator
3056
- } = this.state;
2940
+ var metricCalculator = this.state.metricCalculator;
3057
2941
  var userColumnWidthsByName = metricCalculator.getUserColumnWidthsByName();
3058
2942
  rollupConfig.columns.forEach(name => {
3059
2943
  if (userColumnWidthsByName.get(name) === 0) {
@@ -3092,9 +2976,7 @@ class IrisGrid extends Component {
3092
2976
  });
3093
2977
  }
3094
2978
  handleDownloadTableStart() {
3095
- var {
3096
- canDownloadCsv
3097
- } = this.props;
2979
+ var canDownloadCsv = this.props.canDownloadCsv;
3098
2980
  if (canDownloadCsv) {
3099
2981
  this.setState({
3100
2982
  isTableDownloading: true,
@@ -3107,9 +2989,7 @@ class IrisGrid extends Component {
3107
2989
  }
3108
2990
  }
3109
2991
  handleDownloadTable(fileName, frozenTable, tableSubscription, snapshotRanges, modelRanges, includeColumnHeaders, useUnformattedValues) {
3110
- var {
3111
- canDownloadCsv
3112
- } = this.props;
2992
+ var canDownloadCsv = this.props.canDownloadCsv;
3113
2993
  if (canDownloadCsv) {
3114
2994
  log.info('start table downloading', fileName, frozenTable, tableSubscription, snapshotRanges, modelRanges, includeColumnHeaders, useUnformattedValues);
3115
2995
  this.setState(() => {
@@ -3130,13 +3010,9 @@ class IrisGrid extends Component {
3130
3010
  */
3131
3011
  removeEmptyAggregations() {
3132
3012
  log.debug('removeEmptyAggregations');
3133
- this.setState(_ref21 => {
3134
- var {
3135
- aggregationSettings
3136
- } = _ref21;
3137
- var {
3138
- aggregations
3139
- } = aggregationSettings;
3013
+ this.setState(_ref30 => {
3014
+ var aggregationSettings = _ref30.aggregationSettings;
3015
+ var aggregations = aggregationSettings.aggregations;
3140
3016
  var newAggregations = aggregations.filter(a => a.selected.length > 0 || a.invert);
3141
3017
  if (newAggregations.length !== aggregations.length) {
3142
3018
  return {
@@ -3158,16 +3034,11 @@ class IrisGrid extends Component {
3158
3034
  return _asyncToGenerator(function* () {
3159
3035
  var _this6$grid;
3160
3036
  var isBackwards = _arguments.length > 1 && _arguments[1] !== undefined ? _arguments[1] : false;
3161
- var {
3162
- gotoValueSelectedColumnName: selectedColumnName,
3163
- gotoValueSelectedFilter
3164
- } = _this6.state;
3165
- var {
3166
- model
3167
- } = _this6.props;
3168
- var {
3169
- dh
3170
- } = model;
3037
+ var _this6$state = _this6.state,
3038
+ selectedColumnName = _this6$state.gotoValueSelectedColumnName,
3039
+ gotoValueSelectedFilter = _this6$state.gotoValueSelectedFilter;
3040
+ var model = _this6.props.model;
3041
+ var dh = model.dh;
3171
3042
  if (!model.isSeekRowAvailable) {
3172
3043
  return;
3173
3044
  }
@@ -3186,9 +3057,7 @@ class IrisGrid extends Component {
3186
3057
  var isIgnoreCase = gotoValueSelectedFilter === FilterType.eqIgnoreCase || gotoValueSelectedFilter === FilterType.containsIgnoreCase;
3187
3058
  try {
3188
3059
  var _this6$grid2;
3189
- var {
3190
- formatter
3191
- } = model;
3060
+ var formatter = model.formatter;
3192
3061
  var columnDataType = TableUtils.getNormalizedType(selectedColumn.type);
3193
3062
  var rowIndex;
3194
3063
  switch (columnDataType) {
@@ -3200,7 +3069,9 @@ class IrisGrid extends Component {
3200
3069
  }
3201
3070
  case TableUtils.dataType.DATETIME:
3202
3071
  {
3203
- var [startDate] = DateUtils.parseDateRange(dh, inputString, formatter.timeZone);
3072
+ var _DateUtils$parseDateR = DateUtils.parseDateRange(dh, inputString, formatter.timeZone),
3073
+ _DateUtils$parseDateR2 = _slicedToArray(_DateUtils$parseDateR, 1),
3074
+ startDate = _DateUtils$parseDateR2[0];
3204
3075
  rowIndex = yield model.seekRow(searchFromRow, selectedColumn, dh.ValueType.DATETIME, startDate, undefined, undefined, isBackwards !== null && isBackwards !== void 0 ? isBackwards : false);
3205
3076
  break;
3206
3077
  }
@@ -3263,9 +3134,7 @@ class IrisGrid extends Component {
3263
3134
  * @param ranges The ranges to delete
3264
3135
  */
3265
3136
  deleteRanges(ranges) {
3266
- var {
3267
- model
3268
- } = this.props;
3137
+ var model = this.props.model;
3269
3138
  if (!isDeletableGridModel(model) || !model.isDeletable) {
3270
3139
  throw new Error('Model does not support deleting ranges');
3271
3140
  }
@@ -3279,13 +3148,9 @@ class IrisGrid extends Component {
3279
3148
  if (this.grid == null) {
3280
3149
  return;
3281
3150
  }
3282
- var {
3283
- isSelectingColumn
3284
- } = this.props;
3151
+ var isSelectingColumn = this.props.isSelectingColumn;
3285
3152
  if (isSelectingColumn) {
3286
- var {
3287
- columnAllowedCursor
3288
- } = this.props;
3153
+ var columnAllowedCursor = this.props.columnAllowedCursor;
3289
3154
  this.grid.setState({
3290
3155
  cursor: columnAllowedCursor
3291
3156
  });
@@ -3315,15 +3180,9 @@ class IrisGrid extends Component {
3315
3180
  if (!this.grid) {
3316
3181
  return;
3317
3182
  }
3318
- var {
3319
- state: irisGridState
3320
- } = this;
3321
- var {
3322
- state: gridState
3323
- } = this.grid;
3324
- var {
3325
- onStateChange
3326
- } = this.props;
3183
+ var irisGridState = this.state;
3184
+ var gridState = this.grid.state;
3185
+ var onStateChange = this.props.onStateChange;
3327
3186
  onStateChange(irisGridState, gridState);
3328
3187
  }
3329
3188
  handleOverflowClose() {
@@ -3346,22 +3205,19 @@ class IrisGrid extends Component {
3346
3205
  }
3347
3206
  getColumnBoundingRect() {
3348
3207
  var _this$gridWrapper2;
3349
- var {
3350
- metrics,
3351
- shownColumnTooltip
3352
- } = this.state;
3208
+ var _this$state17 = this.state,
3209
+ metrics = _this$state17.metrics,
3210
+ shownColumnTooltip = _this$state17.shownColumnTooltip;
3353
3211
  assertNotNull(metrics);
3354
3212
  assertNotNull(shownColumnTooltip);
3355
3213
  var gridRect = (_this$gridWrapper2 = this.gridWrapper) === null || _this$gridWrapper2 === void 0 ? void 0 : _this$gridWrapper2.getBoundingClientRect();
3356
3214
  var popperMargin = 20;
3357
3215
  assertNotNull(gridRect);
3358
- var {
3359
- columnHeaderHeight,
3360
- allColumnXs,
3361
- allColumnWidths,
3362
- width,
3363
- columnHeaderMaxDepth
3364
- } = metrics;
3216
+ var columnHeaderHeight = metrics.columnHeaderHeight,
3217
+ allColumnXs = metrics.allColumnXs,
3218
+ allColumnWidths = metrics.allColumnWidths,
3219
+ width = metrics.width,
3220
+ columnHeaderMaxDepth = metrics.columnHeaderMaxDepth;
3365
3221
  var columnX = allColumnXs.get(shownColumnTooltip);
3366
3222
  var columnWidth = allColumnWidths.get(shownColumnTooltip);
3367
3223
  assertNotNull(columnX);
@@ -3382,18 +3238,12 @@ class IrisGrid extends Component {
3382
3238
  };
3383
3239
  }
3384
3240
  handleGotoRowSelectedRowNumberSubmit() {
3385
- var {
3386
- gotoRow: rowNumber
3387
- } = this.state;
3241
+ var rowNumber = this.state.gotoRow;
3388
3242
  this.focusRowInGrid(rowNumber);
3389
3243
  }
3390
3244
  focusRowInGrid(rowNumber) {
3391
- var {
3392
- model
3393
- } = this.props;
3394
- var {
3395
- rowCount
3396
- } = model;
3245
+ var model = this.props.model;
3246
+ var rowCount = model.rowCount;
3397
3247
  this.setState({
3398
3248
  gotoRow: rowNumber
3399
3249
  });
@@ -3437,13 +3287,11 @@ class IrisGrid extends Component {
3437
3287
  this.focusRowInGrid(rowNumber);
3438
3288
  }
3439
3289
  getColumnTooltip(visibleIndex, metrics, model) {
3440
- var {
3441
- columnHeaderHeight,
3442
- columnHeaderMaxDepth,
3443
- allColumnXs,
3444
- allColumnWidths,
3445
- width
3446
- } = metrics;
3290
+ var columnHeaderHeight = metrics.columnHeaderHeight,
3291
+ columnHeaderMaxDepth = metrics.columnHeaderMaxDepth,
3292
+ allColumnXs = metrics.allColumnXs,
3293
+ allColumnWidths = metrics.allColumnWidths,
3294
+ width = metrics.width;
3447
3295
  var columnX = allColumnXs.get(visibleIndex);
3448
3296
  var columnWidth = allColumnWidths.get(visibleIndex);
3449
3297
  if (columnX == null || columnWidth == null) {
@@ -3526,14 +3374,11 @@ class IrisGrid extends Component {
3526
3374
  }
3527
3375
  handleGotoValueSelectedColumnNameChanged(columnName) {
3528
3376
  var _this$grid28;
3529
- var {
3530
- model
3531
- } = this.props;
3377
+ var model = this.props.model;
3532
3378
  var cursorRow = (_this$grid28 = this.grid) === null || _this$grid28 === void 0 ? void 0 : _this$grid28.state.cursorRow;
3533
- var {
3534
- gotoValueSelectedColumnName: prevColumnName,
3535
- gotoValueManuallyChanged
3536
- } = this.state;
3379
+ var _this$state18 = this.state,
3380
+ prevColumnName = _this$state18.gotoValueSelectedColumnName,
3381
+ gotoValueManuallyChanged = _this$state18.gotoValueManuallyChanged;
3537
3382
  if (cursorRow != null) {
3538
3383
  var index = model.getColumnIndexByName(columnName);
3539
3384
  var column = IrisGridUtils.getColumnByName(model.columns, columnName);
@@ -3572,9 +3417,7 @@ class IrisGrid extends Component {
3572
3417
  });
3573
3418
  }
3574
3419
  handleGotoValueSubmitted(isBackwards) {
3575
- var {
3576
- gotoValue
3577
- } = this.state;
3420
+ var gotoValue = this.state.gotoValue;
3578
3421
  this.seekRow(gotoValue, isBackwards);
3579
3422
  }
3580
3423
 
@@ -3601,15 +3444,11 @@ class IrisGrid extends Component {
3601
3444
  return null;
3602
3445
  }
3603
3446
  var debounceMs = Math.min(Math.max(IrisGrid.minDebounce, Math.round(metrics.rowCount / 200)), IrisGrid.maxDebounce);
3604
- var {
3605
- x,
3606
- y,
3607
- width: fieldWidth,
3608
- height: fieldHeight
3609
- } = filterBoxCoordinates;
3610
- var {
3611
- width
3612
- } = metrics;
3447
+ var x = filterBoxCoordinates.x,
3448
+ y = filterBoxCoordinates.y,
3449
+ fieldWidth = filterBoxCoordinates.width,
3450
+ fieldHeight = filterBoxCoordinates.height;
3451
+ var width = metrics.width;
3613
3452
  var style = {
3614
3453
  top: y,
3615
3454
  left: x,
@@ -3658,99 +3497,96 @@ class IrisGrid extends Component {
3658
3497
  _this7 = this,
3659
3498
  _this$grid30,
3660
3499
  _openOptions;
3661
- var {
3662
- children,
3663
- customFilters,
3664
- getDownloadWorker,
3665
- isSelectingColumn,
3666
- isStuckToBottom,
3667
- isStuckToRight,
3668
- model,
3669
- name,
3670
- onlyFetchVisibleColumns,
3671
- alwaysFetchColumns,
3672
- advancedSettings,
3673
- onAdvancedSettingsChange,
3674
- canDownloadCsv,
3675
- onCreateChart
3676
- } = this.props;
3677
- var {
3678
- metricCalculator,
3679
- metrics,
3680
- isFilterBarShown,
3681
- isSelectingPartition,
3682
- isMenuShown,
3683
- isReady,
3684
- copyOperation,
3685
- focusedFilterBarColumn,
3686
- loadingText,
3687
- loadingScrimProgress,
3688
- loadingSpinnerShown,
3689
- loadingCancelShown,
3690
- loadingBlocksGrid,
3691
- shownColumnTooltip,
3692
- hoverAdvancedFilter,
3693
- shownAdvancedFilter,
3694
- maximizedAdvancedFilter,
3695
- hoverSelectColumn,
3696
- quickFilters,
3697
- advancedFilters,
3698
- searchFilter,
3699
- selectDistinctColumns,
3700
- movedColumns,
3701
- movedRows,
3702
- formatter,
3703
- conditionalFormats,
3704
- conditionalFormatPreview,
3705
- conditionalFormatEditIndex,
3706
- columnAlignmentMap,
3707
- sorts,
3708
- reverse,
3709
- customColumns,
3710
- selectedRanges,
3711
- isTableDownloading,
3712
- tableDownloadStatus,
3713
- tableDownloadProgress,
3714
- tableDownloadEstimatedTime,
3715
- showSearchBar,
3716
- searchValue,
3717
- selectedSearchColumns,
3718
- invertSearchColumns,
3719
- aggregationSettings,
3720
- selectedAggregation,
3721
- rollupConfig,
3722
- openOptions,
3723
- pendingSavePromise,
3724
- pendingSaveError,
3725
- pendingRowCount,
3726
- pendingDataErrors,
3727
- pendingDataMap,
3728
- toastMessage,
3729
- frozenColumns,
3730
- columnHeaderGroups,
3731
- showOverflowModal,
3732
- showNoPastePermissionModal,
3733
- noPastePermissionError,
3734
- overflowText,
3735
- overflowButtonTooltipProps,
3736
- expandCellTooltipProps,
3737
- hoverTooltipProps,
3738
- isGotoShown,
3739
- gotoRow,
3740
- gotoRowError,
3741
- gotoValueError,
3742
- gotoValueSelectedColumnName,
3743
- gotoValue,
3744
- gotoValueSelectedFilter,
3745
- partitionConfig
3746
- } = this.state;
3500
+ var _this$props8 = this.props,
3501
+ children = _this$props8.children,
3502
+ customFilters = _this$props8.customFilters,
3503
+ getDownloadWorker = _this$props8.getDownloadWorker,
3504
+ isSelectingColumn = _this$props8.isSelectingColumn,
3505
+ isStuckToBottom = _this$props8.isStuckToBottom,
3506
+ isStuckToRight = _this$props8.isStuckToRight,
3507
+ model = _this$props8.model,
3508
+ name = _this$props8.name,
3509
+ onlyFetchVisibleColumns = _this$props8.onlyFetchVisibleColumns,
3510
+ alwaysFetchColumns = _this$props8.alwaysFetchColumns,
3511
+ advancedSettings = _this$props8.advancedSettings,
3512
+ onAdvancedSettingsChange = _this$props8.onAdvancedSettingsChange,
3513
+ canDownloadCsv = _this$props8.canDownloadCsv,
3514
+ onCreateChart = _this$props8.onCreateChart,
3515
+ transformTableOptions = _this$props8.transformTableOptions;
3516
+ var _this$state19 = this.state,
3517
+ metricCalculator = _this$state19.metricCalculator,
3518
+ metrics = _this$state19.metrics,
3519
+ isFilterBarShown = _this$state19.isFilterBarShown,
3520
+ isSelectingPartition = _this$state19.isSelectingPartition,
3521
+ isMenuShown = _this$state19.isMenuShown,
3522
+ isReady = _this$state19.isReady,
3523
+ copyOperation = _this$state19.copyOperation,
3524
+ focusedFilterBarColumn = _this$state19.focusedFilterBarColumn,
3525
+ loadingText = _this$state19.loadingText,
3526
+ loadingScrimProgress = _this$state19.loadingScrimProgress,
3527
+ loadingSpinnerShown = _this$state19.loadingSpinnerShown,
3528
+ loadingCancelShown = _this$state19.loadingCancelShown,
3529
+ loadingBlocksGrid = _this$state19.loadingBlocksGrid,
3530
+ shownColumnTooltip = _this$state19.shownColumnTooltip,
3531
+ hoverAdvancedFilter = _this$state19.hoverAdvancedFilter,
3532
+ shownAdvancedFilter = _this$state19.shownAdvancedFilter,
3533
+ maximizedAdvancedFilter = _this$state19.maximizedAdvancedFilter,
3534
+ hoverSelectColumn = _this$state19.hoverSelectColumn,
3535
+ quickFilters = _this$state19.quickFilters,
3536
+ advancedFilters = _this$state19.advancedFilters,
3537
+ searchFilter = _this$state19.searchFilter,
3538
+ selectDistinctColumns = _this$state19.selectDistinctColumns,
3539
+ movedColumns = _this$state19.movedColumns,
3540
+ movedRows = _this$state19.movedRows,
3541
+ formatter = _this$state19.formatter,
3542
+ conditionalFormats = _this$state19.conditionalFormats,
3543
+ conditionalFormatPreview = _this$state19.conditionalFormatPreview,
3544
+ conditionalFormatEditIndex = _this$state19.conditionalFormatEditIndex,
3545
+ columnAlignmentMap = _this$state19.columnAlignmentMap,
3546
+ sorts = _this$state19.sorts,
3547
+ reverse = _this$state19.reverse,
3548
+ customColumns = _this$state19.customColumns,
3549
+ selectedRanges = _this$state19.selectedRanges,
3550
+ isTableDownloading = _this$state19.isTableDownloading,
3551
+ tableDownloadStatus = _this$state19.tableDownloadStatus,
3552
+ tableDownloadProgress = _this$state19.tableDownloadProgress,
3553
+ tableDownloadEstimatedTime = _this$state19.tableDownloadEstimatedTime,
3554
+ showSearchBar = _this$state19.showSearchBar,
3555
+ searchValue = _this$state19.searchValue,
3556
+ selectedSearchColumns = _this$state19.selectedSearchColumns,
3557
+ invertSearchColumns = _this$state19.invertSearchColumns,
3558
+ aggregationSettings = _this$state19.aggregationSettings,
3559
+ selectedAggregation = _this$state19.selectedAggregation,
3560
+ rollupConfig = _this$state19.rollupConfig,
3561
+ openOptions = _this$state19.openOptions,
3562
+ pendingSavePromise = _this$state19.pendingSavePromise,
3563
+ pendingSaveError = _this$state19.pendingSaveError,
3564
+ pendingRowCount = _this$state19.pendingRowCount,
3565
+ pendingDataErrors = _this$state19.pendingDataErrors,
3566
+ pendingDataMap = _this$state19.pendingDataMap,
3567
+ toastMessage = _this$state19.toastMessage,
3568
+ frozenColumns = _this$state19.frozenColumns,
3569
+ columnHeaderGroups = _this$state19.columnHeaderGroups,
3570
+ showOverflowModal = _this$state19.showOverflowModal,
3571
+ showNoPastePermissionModal = _this$state19.showNoPastePermissionModal,
3572
+ noPastePermissionError = _this$state19.noPastePermissionError,
3573
+ overflowText = _this$state19.overflowText,
3574
+ overflowButtonTooltipProps = _this$state19.overflowButtonTooltipProps,
3575
+ expandCellTooltipProps = _this$state19.expandCellTooltipProps,
3576
+ hoverTooltipProps = _this$state19.hoverTooltipProps,
3577
+ isGotoShown = _this$state19.isGotoShown,
3578
+ gotoRow = _this$state19.gotoRow,
3579
+ gotoRowError = _this$state19.gotoRowError,
3580
+ gotoValueError = _this$state19.gotoValueError,
3581
+ gotoValueSelectedColumnName = _this$state19.gotoValueSelectedColumnName,
3582
+ gotoValue = _this$state19.gotoValue,
3583
+ gotoValueSelectedFilter = _this$state19.gotoValueSelectedFilter,
3584
+ partitionConfig = _this$state19.partitionConfig;
3747
3585
  if (!isReady) {
3748
3586
  return null;
3749
3587
  }
3750
3588
  var theme = this.getTheme();
3751
- var {
3752
- columnHeaderHeight: singleColumnHeaderHeight
3753
- } = theme;
3589
+ var singleColumnHeaderHeight = theme.columnHeaderHeight;
3754
3590
  var filter = this.getCachedFilter(customFilters, quickFilters, advancedFilters, searchFilter);
3755
3591
  var userColumnWidths = metricCalculator.getUserColumnWidths();
3756
3592
  var stateOverride = this.getCachedStateOverride(model, theme, hoverSelectColumn, isFilterBarShown, isSelectingColumn, loadingScrimProgress, quickFilters, advancedFilters, sorts, reverse, rollupConfig, isMenuShown);
@@ -3807,9 +3643,7 @@ class IrisGrid extends Component {
3807
3643
  var metricState = this.getMetricState();
3808
3644
 
3809
3645
  // Advanced Filter buttons
3810
- var {
3811
- visibleColumns
3812
- } = metrics;
3646
+ var visibleColumns = metrics.visibleColumns;
3813
3647
  var _loop2 = function _loop2() {
3814
3648
  var columnIndex = visibleColumns[i];
3815
3649
  var modelColumn = _this7.getModelColumn(columnIndex);
@@ -3817,10 +3651,8 @@ class IrisGrid extends Component {
3817
3651
  var isFilterable = model.isFilterable(modelColumn);
3818
3652
  var buttonCoordinates = isFilterable && metricState ? metricCalculator.getAdvancedFilterButtonCoordinates(columnIndex, metricState, metrics) : null;
3819
3653
  if (buttonCoordinates != null) {
3820
- var {
3821
- x,
3822
- y
3823
- } = buttonCoordinates;
3654
+ var x = buttonCoordinates.x,
3655
+ y = buttonCoordinates.y;
3824
3656
  var style = {
3825
3657
  position: 'absolute',
3826
3658
  top: y,
@@ -3881,13 +3713,11 @@ class IrisGrid extends Component {
3881
3713
  }
3882
3714
  var advancedFilterMenus = [];
3883
3715
  if (metrics) {
3884
- var {
3885
- gridX,
3886
- visibleColumns: _visibleColumns,
3887
- allColumnXs,
3888
- allColumnWidths,
3889
- columnHeaderHeight
3890
- } = metrics;
3716
+ var gridX = metrics.gridX,
3717
+ _visibleColumns = metrics.visibleColumns,
3718
+ allColumnXs = metrics.allColumnXs,
3719
+ allColumnWidths = metrics.allColumnWidths,
3720
+ columnHeaderHeight = metrics.columnHeaderHeight;
3891
3721
  var _loop3 = function _loop3() {
3892
3722
  var columnIndex = _visibleColumns[_i4];
3893
3723
  var columnX = allColumnXs.get(columnIndex);
@@ -3918,9 +3748,8 @@ class IrisGrid extends Component {
3918
3748
  return 1; // continue
3919
3749
  }
3920
3750
  var advancedFilter = advancedFilters.get(modelColumn);
3921
- var {
3922
- options: advancedFilterOptions
3923
- } = advancedFilter || {};
3751
+ var _ref31 = advancedFilter || {},
3752
+ advancedFilterOptions = _ref31.options;
3924
3753
  var sort = TableUtils.getSortForColumn(model.sort, column.name);
3925
3754
  var sortDirection = sort ? sort.direction : null;
3926
3755
  if (!isSortDirection(sortDirection)) {
@@ -3953,7 +3782,8 @@ class IrisGrid extends Component {
3953
3782
  if (_loop3()) continue;
3954
3783
  }
3955
3784
  }
3956
- var optionItems = this.getCachedOptionItems(onCreateChart !== undefined && model.isChartBuilderAvailable, model.isCustomColumnsAvailable, model.isFormatColumnsAvailable, model.isOrganizeColumnsAvailable, model.isRollupAvailable, model.isTotalsAvailable || isRollup, model.isSelectDistinctAvailable, model.isExportAvailable, this.toggleFilterBarAction, this.toggleSearchBarAction, this.toggleGotoRowAction, isFilterBarShown, showSearchBar, canDownloadCsv, this.isTableSearchAvailable(), isGotoShown, advancedSettings.size > 0);
3785
+ var defaultOptionItems = this.getCachedOptionItems(onCreateChart !== undefined && model.isChartBuilderAvailable, model.isCustomColumnsAvailable, model.isFormatColumnsAvailable, model.isOrganizeColumnsAvailable, model.isRollupAvailable, model.isTotalsAvailable || isRollup, model.isSelectDistinctAvailable, model.isExportAvailable, this.toggleFilterBarAction, this.toggleSearchBarAction, this.toggleGotoRowAction, isFilterBarShown, showSearchBar, canDownloadCsv, this.isTableSearchAvailable(), isGotoShown, advancedSettings.size > 0);
3786
+ var optionItems = this.getCachedTransformedOptionItems(defaultOptionItems, transformTableOptions);
3957
3787
  var hiddenColumns = this.getCachedHiddenColumns(metricCalculator, userColumnWidths);
3958
3788
  var openOptionsStack = openOptions.map(option => {
3959
3789
  switch (option.type) {
@@ -4048,7 +3878,25 @@ class IrisGrid extends Component {
4048
3878
  onChange: onAdvancedSettingsChange
4049
3879
  });
4050
3880
  default:
4051
- throw Error("Unexpected option type ".concat(option.type));
3881
+ {
3882
+ // Plugin-contributed items render their own page via
3883
+ // `configPage`. The page is isolated inside an error
3884
+ // boundary so a throwing plugin doesn't tear down the
3885
+ // entire grid subtree. Built-in items that hit the default
3886
+ // case indicate a programmer error (unhandled enum case).
3887
+ var PluginPage = option.configPage;
3888
+ if (PluginPage == null) {
3889
+ throw Error("Unexpected option type ".concat(option.type));
3890
+ }
3891
+ return /*#__PURE__*/_jsx(PluginTableOptionsErrorBoundary, {
3892
+ itemType: String(option.type),
3893
+ onBack: this.handleMenuBack,
3894
+ children: /*#__PURE__*/_jsx(PluginPage, {
3895
+ model: model,
3896
+ onBack: this.handleMenuBack
3897
+ })
3898
+ }, String(option.type));
3899
+ }
4052
3900
  }
4053
3901
  });
4054
3902
  return /*#__PURE__*/_jsxs("div", {