@deephaven/iris-grid 0.43.0 → 0.44.1-beta.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 (282) hide show
  1. package/dist/AdvancedFilterCreator.css +106 -0
  2. package/dist/AdvancedFilterCreator.css.map +1 -0
  3. package/dist/AdvancedFilterCreator.js +541 -0
  4. package/dist/AdvancedFilterCreator.js.map +1 -0
  5. package/dist/AdvancedFilterCreatorFilterItem.css +9 -0
  6. package/dist/AdvancedFilterCreatorFilterItem.css.map +1 -0
  7. package/dist/AdvancedFilterCreatorFilterItem.js +184 -0
  8. package/dist/AdvancedFilterCreatorFilterItem.js.map +1 -0
  9. package/dist/AdvancedFilterCreatorSelectValue.css +50 -0
  10. package/dist/AdvancedFilterCreatorSelectValue.css.map +1 -0
  11. package/dist/AdvancedFilterCreatorSelectValue.js +301 -0
  12. package/dist/AdvancedFilterCreatorSelectValue.js.map +1 -0
  13. package/dist/AdvancedFilterCreatorSelectValueList.js +272 -0
  14. package/dist/AdvancedFilterCreatorSelectValueList.js.map +1 -0
  15. package/dist/ColumnHeaderGroup.js +61 -0
  16. package/dist/ColumnHeaderGroup.js.map +1 -0
  17. package/dist/ColumnStatistics.css +76 -0
  18. package/dist/ColumnStatistics.css.map +1 -0
  19. package/dist/ColumnStatistics.js +202 -0
  20. package/dist/ColumnStatistics.js.map +1 -0
  21. package/dist/CommonTypes.js +2 -0
  22. package/dist/CommonTypes.js.map +1 -0
  23. package/dist/CrossColumnSearch.css +35 -0
  24. package/dist/CrossColumnSearch.css.map +1 -0
  25. package/dist/CrossColumnSearch.js +199 -0
  26. package/dist/CrossColumnSearch.js.map +1 -0
  27. package/dist/FilterInputField.css +56 -0
  28. package/dist/FilterInputField.css.map +1 -0
  29. package/dist/FilterInputField.js +232 -0
  30. package/dist/FilterInputField.js.map +1 -0
  31. package/dist/GotoRow.css +45 -0
  32. package/dist/GotoRow.css.map +1 -0
  33. package/dist/GotoRow.js +298 -0
  34. package/dist/GotoRow.js.map +1 -0
  35. package/dist/IrisGrid.css +359 -0
  36. package/dist/IrisGrid.css.map +1 -0
  37. package/dist/IrisGrid.js +3651 -0
  38. package/dist/IrisGrid.js.map +1 -0
  39. package/dist/IrisGridBottomBar.css +85 -0
  40. package/dist/IrisGridBottomBar.css.map +1 -0
  41. package/dist/IrisGridBottomBar.js +36 -0
  42. package/dist/IrisGridBottomBar.js.map +1 -0
  43. package/dist/IrisGridCellOverflowModal.css +17 -0
  44. package/dist/IrisGridCellOverflowModal.css.map +1 -0
  45. package/dist/IrisGridCellOverflowModal.js +157 -0
  46. package/dist/IrisGridCellOverflowModal.js.map +1 -0
  47. package/dist/IrisGridCellRendererUtils.js +20 -0
  48. package/dist/IrisGridCellRendererUtils.js.map +1 -0
  49. package/dist/IrisGridCopyHandler.css +64 -0
  50. package/dist/IrisGridCopyHandler.css.map +1 -0
  51. package/dist/IrisGridCopyHandler.js +331 -0
  52. package/dist/IrisGridCopyHandler.js.map +1 -0
  53. package/dist/IrisGridDataBarCellRenderer.js +10 -0
  54. package/dist/IrisGridDataBarCellRenderer.js.map +1 -0
  55. package/dist/IrisGridIcons.js +25 -0
  56. package/dist/IrisGridIcons.js.map +1 -0
  57. package/dist/IrisGridMetricCalculator.js +33 -0
  58. package/dist/IrisGridMetricCalculator.js.map +1 -0
  59. package/dist/IrisGridModel.js +263 -0
  60. package/dist/IrisGridModel.js.map +1 -0
  61. package/dist/IrisGridModelFactory.js +27 -0
  62. package/dist/IrisGridModelFactory.js.map +1 -0
  63. package/dist/IrisGridModelUpdater.js +96 -0
  64. package/dist/IrisGridModelUpdater.js.map +1 -0
  65. package/dist/IrisGridPartitionSelector.css +48 -0
  66. package/dist/IrisGridPartitionSelector.css.map +1 -0
  67. package/dist/IrisGridPartitionSelector.js +198 -0
  68. package/dist/IrisGridPartitionSelector.js.map +1 -0
  69. package/dist/IrisGridProxyModel.js +530 -0
  70. package/dist/IrisGridProxyModel.js.map +1 -0
  71. package/dist/IrisGridRenderer.js +779 -0
  72. package/dist/IrisGridRenderer.js.map +1 -0
  73. package/dist/IrisGridShortcuts.js +59 -0
  74. package/dist/IrisGridShortcuts.js.map +1 -0
  75. package/dist/IrisGridTableModel.js +273 -0
  76. package/dist/IrisGridTableModel.js.map +1 -0
  77. package/dist/IrisGridTableModelTemplate.js +1589 -0
  78. package/dist/IrisGridTableModelTemplate.js.map +1 -0
  79. package/dist/IrisGridTestUtils.js +121 -0
  80. package/dist/IrisGridTestUtils.js.map +1 -0
  81. package/dist/IrisGridTextCellRenderer.js +139 -0
  82. package/dist/IrisGridTextCellRenderer.js.map +1 -0
  83. package/dist/IrisGridTheme.js +96 -0
  84. package/dist/IrisGridTheme.js.map +1 -0
  85. package/dist/IrisGridTheme.module.css +69 -0
  86. package/dist/IrisGridTheme.module.css.map +1 -0
  87. package/dist/IrisGridTreeTableModel.js +145 -0
  88. package/dist/IrisGridTreeTableModel.js.map +1 -0
  89. package/dist/IrisGridUtils.js +1279 -0
  90. package/dist/IrisGridUtils.js.map +1 -0
  91. package/dist/MissingKeyError.js +15 -0
  92. package/dist/MissingKeyError.js.map +1 -0
  93. package/dist/PartitionSelectorSearch.css +22 -0
  94. package/dist/PartitionSelectorSearch.css.map +1 -0
  95. package/dist/PartitionSelectorSearch.js +317 -0
  96. package/dist/PartitionSelectorSearch.js.map +1 -0
  97. package/dist/PendingDataBottomBar.css +13 -0
  98. package/dist/PendingDataBottomBar.css.map +1 -0
  99. package/dist/PendingDataBottomBar.js +98 -0
  100. package/dist/PendingDataBottomBar.js.map +1 -0
  101. package/dist/TableViewportUpdater.js +156 -0
  102. package/dist/TableViewportUpdater.js.map +1 -0
  103. package/dist/ToastBottomBar.js +42 -0
  104. package/dist/ToastBottomBar.js.map +1 -0
  105. package/dist/TreeTableViewportUpdater.js +96 -0
  106. package/dist/TreeTableViewportUpdater.js.map +1 -0
  107. package/dist/declaration.d.js +2 -0
  108. package/dist/declaration.d.js.map +1 -0
  109. package/dist/format-context-menus/CustomFormatAction.css +25 -0
  110. package/dist/format-context-menus/CustomFormatAction.css.map +1 -0
  111. package/dist/format-context-menus/CustomFormatAction.js +132 -0
  112. package/dist/format-context-menus/CustomFormatAction.js.map +1 -0
  113. package/dist/format-context-menus/DateTimeFormatContextMenu.js +53 -0
  114. package/dist/format-context-menus/DateTimeFormatContextMenu.js.map +1 -0
  115. package/dist/format-context-menus/DecimalFormatContextMenu.js +59 -0
  116. package/dist/format-context-menus/DecimalFormatContextMenu.js.map +1 -0
  117. package/dist/format-context-menus/FormatContextMenuUtils.js +63 -0
  118. package/dist/format-context-menus/FormatContextMenuUtils.js.map +1 -0
  119. package/dist/format-context-menus/IntegerFormatContextMenu.js +43 -0
  120. package/dist/format-context-menus/IntegerFormatContextMenu.js.map +1 -0
  121. package/dist/format-context-menus/index.js +4 -0
  122. package/dist/format-context-menus/index.js.map +1 -0
  123. package/dist/index.js +24 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/key-handlers/ClearFilterKeyHandler.js +21 -0
  126. package/dist/key-handlers/ClearFilterKeyHandler.js.map +1 -0
  127. package/dist/key-handlers/CopyKeyHandler.js +31 -0
  128. package/dist/key-handlers/CopyKeyHandler.js.map +1 -0
  129. package/dist/key-handlers/ReverseKeyHandler.js +32 -0
  130. package/dist/key-handlers/ReverseKeyHandler.js.map +1 -0
  131. package/dist/key-handlers/index.js +4 -0
  132. package/dist/key-handlers/index.js.map +1 -0
  133. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +175 -0
  134. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +1 -0
  135. package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js +139 -0
  136. package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js.map +1 -0
  137. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js +83 -0
  138. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js.map +1 -0
  139. package/dist/mousehandlers/IrisGridContextMenuHandler.css +19 -0
  140. package/dist/mousehandlers/IrisGridContextMenuHandler.css.map +1 -0
  141. package/dist/mousehandlers/IrisGridContextMenuHandler.js +1220 -0
  142. package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -0
  143. package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js +28 -0
  144. package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js.map +1 -0
  145. package/dist/mousehandlers/IrisGridFilterMouseHandler.js +80 -0
  146. package/dist/mousehandlers/IrisGridFilterMouseHandler.js.map +1 -0
  147. package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js +126 -0
  148. package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js.map +1 -0
  149. package/dist/mousehandlers/IrisGridSortMouseHandler.js +46 -0
  150. package/dist/mousehandlers/IrisGridSortMouseHandler.js.map +1 -0
  151. package/dist/mousehandlers/IrisGridTokenMouseHandler.js +151 -0
  152. package/dist/mousehandlers/IrisGridTokenMouseHandler.js.map +1 -0
  153. package/dist/mousehandlers/PendingMouseHandler.js +39 -0
  154. package/dist/mousehandlers/PendingMouseHandler.js.map +1 -0
  155. package/dist/mousehandlers/index.js +11 -0
  156. package/dist/mousehandlers/index.js.map +1 -0
  157. package/dist/sidebar/AdvancedSettings.js +6 -0
  158. package/dist/sidebar/AdvancedSettings.js.map +1 -0
  159. package/dist/sidebar/AdvancedSettingsMenu.js +29 -0
  160. package/dist/sidebar/AdvancedSettingsMenu.js.map +1 -0
  161. package/dist/sidebar/AdvancedSettingsType.js +7 -0
  162. package/dist/sidebar/AdvancedSettingsType.js.map +1 -0
  163. package/dist/sidebar/ChartBuilder.css +56 -0
  164. package/dist/sidebar/ChartBuilder.css.map +1 -0
  165. package/dist/sidebar/ChartBuilder.js +443 -0
  166. package/dist/sidebar/ChartBuilder.js.map +1 -0
  167. package/dist/sidebar/CustomColumnBuilder.css +58 -0
  168. package/dist/sidebar/CustomColumnBuilder.css.map +1 -0
  169. package/dist/sidebar/CustomColumnBuilder.js +384 -0
  170. package/dist/sidebar/CustomColumnBuilder.js.map +1 -0
  171. package/dist/sidebar/CustomColumnInput.d.ts.map +1 -1
  172. package/dist/sidebar/CustomColumnInput.js +91 -0
  173. package/dist/sidebar/CustomColumnInput.js.map +1 -0
  174. package/dist/sidebar/InputEditor.css +35 -0
  175. package/dist/sidebar/InputEditor.css.map +1 -0
  176. package/dist/sidebar/InputEditor.d.ts +4 -2
  177. package/dist/sidebar/InputEditor.d.ts.map +1 -1
  178. package/dist/sidebar/InputEditor.js +180 -0
  179. package/dist/sidebar/InputEditor.js.map +1 -0
  180. package/dist/sidebar/OptionType.js +19 -0
  181. package/dist/sidebar/OptionType.js.map +1 -0
  182. package/dist/sidebar/RollupRows.css +120 -0
  183. package/dist/sidebar/RollupRows.css.map +1 -0
  184. package/dist/sidebar/RollupRows.js +519 -0
  185. package/dist/sidebar/RollupRows.js.map +1 -0
  186. package/dist/sidebar/SelectDistinctBuilder.css +41 -0
  187. package/dist/sidebar/SelectDistinctBuilder.css.map +1 -0
  188. package/dist/sidebar/SelectDistinctBuilder.js +155 -0
  189. package/dist/sidebar/SelectDistinctBuilder.js.map +1 -0
  190. package/dist/sidebar/TableCsvExporter.css +32 -0
  191. package/dist/sidebar/TableCsvExporter.css.map +1 -0
  192. package/dist/sidebar/TableCsvExporter.js +399 -0
  193. package/dist/sidebar/TableCsvExporter.js.map +1 -0
  194. package/dist/sidebar/TableSaver.js +487 -0
  195. package/dist/sidebar/TableSaver.js.map +1 -0
  196. package/dist/sidebar/aggregations/AggregationEdit.css +61 -0
  197. package/dist/sidebar/aggregations/AggregationEdit.css.map +1 -0
  198. package/dist/sidebar/aggregations/AggregationEdit.js +155 -0
  199. package/dist/sidebar/aggregations/AggregationEdit.js.map +1 -0
  200. package/dist/sidebar/aggregations/AggregationOperation.js +19 -0
  201. package/dist/sidebar/aggregations/AggregationOperation.js.map +1 -0
  202. package/dist/sidebar/aggregations/AggregationUtils.js +59 -0
  203. package/dist/sidebar/aggregations/AggregationUtils.js.map +1 -0
  204. package/dist/sidebar/aggregations/Aggregations.css +43 -0
  205. package/dist/sidebar/aggregations/Aggregations.css.map +1 -0
  206. package/dist/sidebar/aggregations/Aggregations.js +178 -0
  207. package/dist/sidebar/aggregations/Aggregations.js.map +1 -0
  208. package/dist/sidebar/aggregations/index.js +2 -0
  209. package/dist/sidebar/aggregations/index.js.map +1 -0
  210. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +123 -0
  211. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -0
  212. package/dist/sidebar/conditional-formatting/ConditionEditor.js +243 -0
  213. package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -0
  214. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css +22 -0
  215. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css.map +1 -0
  216. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +109 -0
  217. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -0
  218. package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js +18 -0
  219. package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js.map +1 -0
  220. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css +57 -0
  221. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css.map +1 -0
  222. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +150 -0
  223. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -0
  224. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +635 -0
  225. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -0
  226. package/dist/sidebar/conditional-formatting/RowFormatEditor.js +122 -0
  227. package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -0
  228. package/dist/sidebar/conditional-formatting/StyleEditor.css +55 -0
  229. package/dist/sidebar/conditional-formatting/StyleEditor.css.map +1 -0
  230. package/dist/sidebar/conditional-formatting/StyleEditor.js +150 -0
  231. package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -0
  232. package/dist/sidebar/icons/BarIcon.js +24 -0
  233. package/dist/sidebar/icons/BarIcon.js.map +1 -0
  234. package/dist/sidebar/icons/FormatColumnWhereIcon.js +42 -0
  235. package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +1 -0
  236. package/dist/sidebar/icons/FormatRowWhereIcon.js +36 -0
  237. package/dist/sidebar/icons/FormatRowWhereIcon.js.map +1 -0
  238. package/dist/sidebar/icons/HistogramIcon.js +24 -0
  239. package/dist/sidebar/icons/HistogramIcon.js.map +1 -0
  240. package/dist/sidebar/icons/LineIcon.js +27 -0
  241. package/dist/sidebar/icons/LineIcon.js.map +1 -0
  242. package/dist/sidebar/icons/PieIcon.js +24 -0
  243. package/dist/sidebar/icons/PieIcon.js.map +1 -0
  244. package/dist/sidebar/icons/ScatterIcon.js +74 -0
  245. package/dist/sidebar/icons/ScatterIcon.js.map +1 -0
  246. package/dist/sidebar/icons/index.js +8 -0
  247. package/dist/sidebar/icons/index.js.map +1 -0
  248. package/dist/sidebar/index.d.ts +1 -0
  249. package/dist/sidebar/index.d.ts.map +1 -1
  250. package/dist/sidebar/index.js +19 -0
  251. package/dist/sidebar/index.js.map +1 -0
  252. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css +68 -0
  253. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css.map +1 -0
  254. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +964 -0
  255. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -0
  256. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js +132 -0
  257. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js.map +1 -0
  258. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css +29 -0
  259. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css.map +1 -0
  260. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js +188 -0
  261. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +1 -0
  262. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +81 -0
  263. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -0
  264. package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js +30 -0
  265. package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js.map +1 -0
  266. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +158 -0
  267. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -0
  268. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +146 -0
  269. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +1 -0
  270. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +59 -0
  271. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -0
  272. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +139 -0
  273. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +1 -0
  274. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +44 -0
  275. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -0
  276. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +129 -0
  277. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +1 -0
  278. package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js +4 -0
  279. package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js.map +1 -0
  280. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +261 -0
  281. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -0
  282. package/package.json +15 -15
@@ -0,0 +1,964 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
3
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
6
+ import React, { Component } from 'react';
7
+ import classNames from 'classnames';
8
+ import { GridUtils } from '@deephaven/grid';
9
+ import { TextUtils, assertNotNull, DbNameValidator } from '@deephaven/utils';
10
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
11
+ import { dhEye, dhEyeSlash, dhSortAlphaDown, dhSortAlphaUp, dhArrowToTop, dhArrowToBottom, vsChevronUp, vsChevronDown, vsSymbolStructure, vsRefresh, vsCircleLargeFilled, vsAdd } from '@deephaven/icons';
12
+ import memoize from 'memoizee';
13
+ import debounce from 'lodash.debounce';
14
+ import { Button, SearchInput } from '@deephaven/components';
15
+ import clamp from 'lodash.clamp';
16
+ import throttle from 'lodash.throttle';
17
+ import "./VisibilityOrderingBuilder.css";
18
+ import ColumnHeaderGroup from "../../ColumnHeaderGroup.js";
19
+ import VisibilityOrderingItem from "./VisibilityOrderingItem.js";
20
+ import { flattenTree, getTreeItems } from "./sortable-tree/utilities.js";
21
+ import SortableTree from "./sortable-tree/SortableTree.js";
22
+ import { moveItemsFromDrop, moveToGroup } from "./VisibilityOrderingBuilderUtils.js";
23
+ var DEBOUNCE_SEARCH_COLUMN = 150;
24
+ class VisibilityOrderingBuilder extends Component {
25
+ constructor(props) {
26
+ super(props);
27
+ _defineProperty(this, "list", void 0);
28
+ _defineProperty(this, "debouncedSearchColumns", debounce(this.searchColumns, DEBOUNCE_SEARCH_COLUMN));
29
+ _defineProperty(this, "handleGroupColorChange", throttle((group, color) => {
30
+ var {
31
+ columnHeaderGroups,
32
+ onColumnHeaderGroupChanged
33
+ } = this.props;
34
+ var newGroups = [...columnHeaderGroups];
35
+ var newGroup = new ColumnHeaderGroup(_objectSpread(_objectSpread({}, group), {}, {
36
+ color
37
+ }));
38
+ newGroups.splice(newGroups.findIndex(_ref => {
39
+ var {
40
+ name
41
+ } = _ref;
42
+ return name === group.name;
43
+ }), 1, newGroup);
44
+ onColumnHeaderGroupChanged(newGroups);
45
+ }, 250));
46
+ _defineProperty(this, "renderItem", memoize(_ref2 => {
47
+ var {
48
+ value,
49
+ clone,
50
+ item,
51
+ ref,
52
+ handleProps
53
+ } = _ref2;
54
+ var {
55
+ onColumnVisibilityChanged
56
+ } = this.props;
57
+ var {
58
+ selectedColumns
59
+ } = this.state;
60
+ var displayString = value;
61
+
62
+ // The cloned drag overlay we want to show the items being dragged
63
+ if (clone) {
64
+ var selectedItemNames = this.getSelectedParentItems().map(_ref3 => {
65
+ var {
66
+ id
67
+ } = _ref3;
68
+ return id;
69
+ });
70
+ displayString = selectedItemNames.join(', ');
71
+ }
72
+ return /*#__PURE__*/React.createElement(VisibilityOrderingItem, {
73
+ ref: ref,
74
+ value: displayString,
75
+ clone: clone,
76
+ item: item,
77
+ childCount: selectedColumns.size,
78
+ onVisibilityChange: onColumnVisibilityChanged,
79
+ onClick: this.handleItemClick,
80
+ onGroupDelete: this.handleGroupDelete,
81
+ onGroupColorChange: this.handleGroupColorChange,
82
+ onGroupNameChange: this.handleGroupNameChange,
83
+ validateGroupName: this.validateGroupName,
84
+ handleProps: handleProps
85
+ });
86
+ }));
87
+ _defineProperty(this, "getMemoizedFirstMovableIndex", memoize((model, columns, movedColumns) => {
88
+ for (var i = 0; i < columns.length; i += 1) {
89
+ var modelIndex = GridUtils.getModelIndex(i, movedColumns);
90
+ if (model.isColumnMovable(modelIndex)) {
91
+ return i;
92
+ }
93
+ }
94
+ return null;
95
+ }));
96
+ _defineProperty(this, "getMemoizedLastMovableIndex", memoize((model, columns, movedColumns) => {
97
+ for (var i = columns.length - 1; i >= 0; i -= 1) {
98
+ var modelIndex = GridUtils.getModelIndex(i, movedColumns);
99
+ if (model.isColumnMovable(modelIndex)) {
100
+ return i;
101
+ }
102
+ }
103
+ return null;
104
+ }));
105
+ _defineProperty(this, "memoizedGetTreeItems", memoize((columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns) => getTreeItems(columns, movedColumns, columnHeaderGroups, hiddenColumns, [...selectedColumns.values()])));
106
+ _defineProperty(this, "makeVisibilityOrderingList", memoize((columns, treeItems) => {
107
+ var {
108
+ movedColumns
109
+ } = this.props;
110
+ var elements = [];
111
+ var firstMovableIndex = this.getFirstMovableIndex();
112
+ var lastMovableIndex = this.getLastMovableIndex();
113
+ var firstMovableTreeIndex = treeItems.findIndex(_ref4 => {
114
+ var {
115
+ data
116
+ } = _ref4;
117
+ return Array.isArray(data.visibleIndex) ? data.visibleIndex[0] === firstMovableIndex : data.visibleIndex === firstMovableIndex;
118
+ });
119
+ var lastMovableTreeIndex = treeItems.findIndex(_ref5 => {
120
+ var {
121
+ data
122
+ } = _ref5;
123
+ return Array.isArray(data.visibleIndex) ? data.visibleIndex[1] === lastMovableIndex : data.visibleIndex === lastMovableIndex;
124
+ });
125
+ var movableItems = treeItems.slice(firstMovableTreeIndex, lastMovableTreeIndex + 1);
126
+
127
+ // No movable items. Render all as immovable
128
+ if (firstMovableIndex == null || lastMovableIndex === null) {
129
+ for (var visibleIndex = 0; visibleIndex < columns.length; visibleIndex += 1) {
130
+ var modelIndex = GridUtils.getModelIndex(visibleIndex, movedColumns);
131
+ var column = columns[modelIndex];
132
+ elements.push(this.renderImmovableItem(column.name));
133
+ }
134
+ return elements;
135
+ }
136
+
137
+ // Currently immovable groups are not supported
138
+ for (var _visibleIndex = 0; _visibleIndex < firstMovableIndex; _visibleIndex += 1) {
139
+ var _modelIndex = GridUtils.getModelIndex(_visibleIndex, movedColumns);
140
+ var _column = columns[_modelIndex];
141
+ elements.push(this.renderImmovableItem(_column.name));
142
+ }
143
+ if (firstMovableIndex !== null && firstMovableIndex > 0) {
144
+ elements.push( /*#__PURE__*/React.createElement("hr", {
145
+ key: "top-horizontal-divider"
146
+ }));
147
+ }
148
+ elements.push( /*#__PURE__*/React.createElement(SortableTree, {
149
+ key: "movable-items",
150
+ items: movableItems,
151
+ renderItem: this.renderItem,
152
+ onDragStart: this.handleDragStart,
153
+ onDragEnd: this.handleDragEnd
154
+ }));
155
+ if (lastMovableIndex != null && lastMovableIndex < columns.length - 1) {
156
+ elements.push( /*#__PURE__*/React.createElement("hr", {
157
+ key: "bottom-horizontal-divider"
158
+ }));
159
+ }
160
+ for (var _visibleIndex2 = lastMovableIndex + 1; _visibleIndex2 < columns.length; _visibleIndex2 += 1) {
161
+ var _modelIndex2 = GridUtils.getModelIndex(_visibleIndex2, movedColumns);
162
+ var _column2 = columns[_modelIndex2];
163
+ elements.push(this.renderImmovableItem(_column2.name));
164
+ }
165
+ return elements;
166
+ }));
167
+ _defineProperty(this, "renderImmovableItem", memoize(columnName => /*#__PURE__*/React.createElement("div", {
168
+ className: "visibility-ordering-list-item immovable",
169
+ key: columnName
170
+ }, /*#__PURE__*/React.createElement("div", {
171
+ className: "column-item"
172
+ }, /*#__PURE__*/React.createElement("span", {
173
+ className: "column-name"
174
+ }, columnName)))));
175
+ this.handleSearchInputChange = this.handleSearchInputChange.bind(this);
176
+ this.searchColumns = this.searchColumns.bind(this);
177
+ this.handleItemClick = this.handleItemClick.bind(this);
178
+ this.handleDragEnd = this.handleDragEnd.bind(this);
179
+ this.handleGroupDelete = this.handleGroupDelete.bind(this);
180
+ this.handleGroupNameChange = this.handleGroupNameChange.bind(this);
181
+ this.handleGroupCreate = this.handleGroupCreate.bind(this);
182
+ this.validateGroupName = this.validateGroupName.bind(this);
183
+ this.addColumnToSelected = this.addColumnToSelected.bind(this);
184
+ this.handleDragStart = this.handleDragStart.bind(this);
185
+ this.state = {
186
+ selectedColumns: new Set(),
187
+ lastSelectedColumn: '',
188
+ searchFilter: ''
189
+ };
190
+ this.list = null;
191
+ }
192
+ componentWillUnmount() {
193
+ this.debouncedSearchColumns.cancel();
194
+ }
195
+ resetVisibilityOrdering() {
196
+ var {
197
+ model,
198
+ onReset,
199
+ onMovedColumnsChanged,
200
+ onColumnHeaderGroupChanged
201
+ } = this.props;
202
+ this.setState({
203
+ selectedColumns: new Set(),
204
+ lastSelectedColumn: '',
205
+ searchFilter: ''
206
+ });
207
+ onReset();
208
+ onColumnHeaderGroupChanged(model.initialColumnHeaderGroups);
209
+ onMovedColumnsChanged(model.initialMovedColumns);
210
+ }
211
+ resetSelection() {
212
+ this.setState({
213
+ selectedColumns: new Set(),
214
+ lastSelectedColumn: ''
215
+ });
216
+ }
217
+ handleSearchInputChange(event) {
218
+ var searchFilter = event.target.value;
219
+ this.setState({
220
+ searchFilter
221
+ });
222
+ if (!searchFilter) {
223
+ this.debouncedSearchColumns.cancel();
224
+ this.resetSelection();
225
+ return;
226
+ }
227
+ this.debouncedSearchColumns(searchFilter);
228
+ }
229
+ searchColumns(searchFilter) {
230
+ var flattenedItems = flattenTree(this.getTreeItems());
231
+ var itemsMatch = flattenedItems.filter(_ref6 => {
232
+ var _data$group$isNew, _data$group;
233
+ var {
234
+ id,
235
+ data
236
+ } = _ref6;
237
+ return !((_data$group$isNew = (_data$group = data.group) === null || _data$group === void 0 ? void 0 : _data$group.isNew) !== null && _data$group$isNew !== void 0 ? _data$group$isNew : false) && id.toLowerCase().includes(searchFilter.toLowerCase());
238
+ });
239
+ var columnsMatch = itemsMatch.map(_ref7 => {
240
+ var {
241
+ id
242
+ } = _ref7;
243
+ return id;
244
+ });
245
+ var visibleIndexToFocus = flattenedItems.findIndex(_ref8 => {
246
+ var {
247
+ id
248
+ } = _ref8;
249
+ return id.toLowerCase().includes(searchFilter.toLowerCase());
250
+ });
251
+ this.addColumnToSelected(columnsMatch, false);
252
+ if (columnsMatch.length > 0) {
253
+ var _this$list;
254
+ var columnItemToFocus = (_this$list = this.list) === null || _this$list === void 0 ? void 0 : _this$list.querySelectorAll('.item-wrapper')[visibleIndexToFocus];
255
+ columnItemToFocus === null || columnItemToFocus === void 0 ? void 0 : columnItemToFocus.scrollIntoView({
256
+ block: 'center'
257
+ });
258
+ }
259
+ }
260
+
261
+ /**
262
+ * Moves the currently selected columns in the direction specified.
263
+ * Does not commit any changes to any state, just gets the required modifications.
264
+ *
265
+ * Items that are part of a selected group should not be moved separate from the group.
266
+ *
267
+ * Items moved to top or bottom should be removed from any groups they are within,
268
+ * unless part of a group that is also selected. The highest level selected group will
269
+ * be moved to the root level of the tree.
270
+ *
271
+ * Items moved up or down should move into and out of groups when applicable.
272
+ * They should never move more than 1 depth level at a time.
273
+ *
274
+ * Multiple selected items should move to the top or bottom in their existing order,
275
+ * but become one block of continuous columns.
276
+ *
277
+ * Multiple selected items moving up or down should move independently,
278
+ * unless they are at the same depth and contiguous. In that case, they should
279
+ * move in and out of groups together. I.e. if the 2 items above a group are selected,
280
+ * and the move down button is pressed, then both items should be moved into the group.
281
+ *
282
+ * @param option The movement option
283
+ * @returns A new copy of the movedColumns including moves required to perform the operation.
284
+ *
285
+ */
286
+ moveSelectedColumns(option) {
287
+ var {
288
+ columnHeaderGroups
289
+ } = this.props;
290
+ var {
291
+ selectedColumns
292
+ } = this.state;
293
+ var treeItems = flattenTree(this.getTreeItems());
294
+ var firstMovableIndex = this.getFirstMovableIndex();
295
+ var lastMovableIndex = this.getLastMovableIndex();
296
+ assertNotNull(firstMovableIndex);
297
+ assertNotNull(lastMovableIndex);
298
+ var selectedItems = this.getSelectedParentItems();
299
+ var isMovingUpward = option === VisibilityOrderingBuilder.MOVE_OPTIONS.UP || option === VisibilityOrderingBuilder.MOVE_OPTIONS.TOP;
300
+
301
+ // for moving up and to the top, move column(s) in visibility index order
302
+ // for moving down and to the bottom, move column(s) in reverse visibility index order
303
+ if (!isMovingUpward) {
304
+ selectedItems.reverse();
305
+ }
306
+ var newMoves = [];
307
+ var updatedGroups = columnHeaderGroups;
308
+ var _loop = function _loop() {
309
+ var {
310
+ id,
311
+ parentId,
312
+ depth,
313
+ data: {
314
+ visibleIndex
315
+ }
316
+ } = selectedItems[i];
317
+ switch (option) {
318
+ case VisibilityOrderingBuilder.MOVE_OPTIONS.TOP:
319
+ {
320
+ newMoves = GridUtils.moveItemOrRange(visibleIndex, firstMovableIndex, newMoves, true);
321
+ var size = Array.isArray(visibleIndex) ? visibleIndex[1] - visibleIndex[0] + 1 : 1;
322
+ firstMovableIndex += size;
323
+ // Moving items to top should move out of any groups
324
+ updatedGroups = moveToGroup(selectedItems[i], null, updatedGroups);
325
+ break;
326
+ }
327
+ case VisibilityOrderingBuilder.MOVE_OPTIONS.BOTTOM:
328
+ {
329
+ newMoves = GridUtils.moveItemOrRange(visibleIndex, lastMovableIndex, newMoves, true);
330
+ var _size = Array.isArray(visibleIndex) ? visibleIndex[1] - visibleIndex[0] + 1 : 1;
331
+ lastMovableIndex -= _size;
332
+ // Moving items to bottom should move out of any groups
333
+ updatedGroups = moveToGroup(selectedItems[i], null, updatedGroups);
334
+ break;
335
+ }
336
+ case VisibilityOrderingBuilder.MOVE_OPTIONS.UP:
337
+ {
338
+ var itemIndex = treeItems.findIndex(item => item.id === id);
339
+ // Array.findLast would be better here, but it's too new for our browser support
340
+ var prevItemIndex = treeItems.map((item, idx) => idx < itemIndex && !selectedColumns.has(item.id)).lastIndexOf(true);
341
+ var prevItem = treeItems[prevItemIndex];
342
+ if (prevItem != null && prevItem.parentId !== parentId) {
343
+ // Moving into a different parent
344
+ if (Math.abs(prevItem.depth - depth) > 1) {
345
+ // Prev item is more than 1 level away
346
+ // Find prev parent at same depth as current
347
+ // This way we only ever move 1 depth level per event
348
+ var newParentItemIndex = treeItems.map((item, idx) => idx < prevItemIndex && item.depth === depth).lastIndexOf(true);
349
+ var newParentItem = treeItems[newParentItemIndex];
350
+ updatedGroups = moveToGroup(selectedItems[i], newParentItem.id, updatedGroups);
351
+ } else {
352
+ updatedGroups = moveToGroup(selectedItems[i], prevItem.parentId, updatedGroups);
353
+ }
354
+ } else {
355
+ var toIndex = clamp(Array.isArray(visibleIndex) ? visibleIndex[0] - 1 : visibleIndex - 1, firstMovableIndex, lastMovableIndex);
356
+ newMoves = GridUtils.moveItemOrRange(visibleIndex, toIndex, newMoves, false);
357
+ var _size2 = Array.isArray(visibleIndex) ? visibleIndex[1] - visibleIndex[0] + 1 : 1;
358
+ firstMovableIndex += _size2;
359
+ }
360
+ break;
361
+ }
362
+ case VisibilityOrderingBuilder.MOVE_OPTIONS.DOWN:
363
+ {
364
+ var _itemIndex = treeItems.findIndex(item => item.id === id);
365
+ var nextItem = treeItems.find((item, idx) => idx > _itemIndex && !selectedColumns.has(item.id));
366
+ if ((nextItem === null || nextItem === void 0 ? void 0 : nextItem.parentId) !== parentId) {
367
+ var _parentItem$parentId;
368
+ // Moving out of our group
369
+ // Move to the parent of our parent
370
+ // That way we only ever move 1 level at a time
371
+ var parentItem = treeItems.find(item => item.id === parentId);
372
+ updatedGroups = moveToGroup(selectedItems[i], (_parentItem$parentId = parentItem === null || parentItem === void 0 ? void 0 : parentItem.parentId) !== null && _parentItem$parentId !== void 0 ? _parentItem$parentId : null, updatedGroups);
373
+ break;
374
+ } else if ((nextItem === null || nextItem === void 0 ? void 0 : nextItem.children.length) > 0) {
375
+ // Moving into a group as 1st item
376
+ updatedGroups = moveToGroup(selectedItems[i], nextItem.id, updatedGroups);
377
+ break;
378
+ }
379
+ var _toIndex = clamp(Array.isArray(visibleIndex) ? visibleIndex[0] + 1 : visibleIndex + 1, firstMovableIndex, lastMovableIndex);
380
+ newMoves = GridUtils.moveItemOrRange(visibleIndex, _toIndex, newMoves, false);
381
+ var _size3 = Array.isArray(visibleIndex) ? visibleIndex[1] - visibleIndex[0] + 1 : 1;
382
+ lastMovableIndex -= _size3;
383
+ break;
384
+ }
385
+ }
386
+ };
387
+ for (var i = 0; i < selectedItems.length; i += 1) {
388
+ _loop();
389
+ }
390
+ return {
391
+ newMoves,
392
+ groups: updatedGroups
393
+ };
394
+ }
395
+
396
+ /**
397
+ * Moves the selected columns according to the option.
398
+ * Commits changes to state and scrolls the list if moving to top or bottom.
399
+ *
400
+ * @param option The move operation
401
+ */
402
+ handleMoveColumns(option) {
403
+ var {
404
+ onMovedColumnsChanged,
405
+ movedColumns,
406
+ onColumnHeaderGroupChanged
407
+ } = this.props;
408
+ var {
409
+ newMoves,
410
+ groups
411
+ } = this.moveSelectedColumns(option);
412
+ var scrollListAfterMove;
413
+ if (option === VisibilityOrderingBuilder.MOVE_OPTIONS.TOP) {
414
+ scrollListAfterMove = () => {
415
+ var _this$list2, _this$list2$parentEle;
416
+ (_this$list2 = this.list) === null || _this$list2 === void 0 ? void 0 : (_this$list2$parentEle = _this$list2.parentElement) === null || _this$list2$parentEle === void 0 ? void 0 : _this$list2$parentEle.scroll({
417
+ top: 0
418
+ });
419
+ };
420
+ }
421
+ if (option === VisibilityOrderingBuilder.MOVE_OPTIONS.BOTTOM) {
422
+ scrollListAfterMove = () => {
423
+ var _this$list3, _this$list3$parentEle;
424
+ (_this$list3 = this.list) === null || _this$list3 === void 0 ? void 0 : (_this$list3$parentEle = _this$list3.parentElement) === null || _this$list3$parentEle === void 0 ? void 0 : _this$list3$parentEle.scroll({
425
+ top: this.list.parentElement.scrollHeight
426
+ });
427
+ };
428
+ }
429
+ onColumnHeaderGroupChanged(groups);
430
+ if (newMoves.length > 0) {
431
+ onMovedColumnsChanged(movedColumns.concat(newMoves), scrollListAfterMove);
432
+ }
433
+ }
434
+
435
+ /**
436
+ * Get the move operations required to recursively sort the grid
437
+ * Column header groups are sorted using their name
438
+ * Children of column header groups are then sorted within each group
439
+ *
440
+ * @param items The tree items to sort
441
+ * @param option Direction of the sort
442
+ * @param movedColumns The existing moved columns for the sort
443
+ * Grids may use an initial move list from the model (e.g. column header groups)
444
+ * Also used to recursively sort header groups
445
+ * @returns The moves required to sort the grid. Includes the starting movedColumns in the array
446
+ */
447
+ getSortMoves(itemsParam, option, movedColumns) {
448
+ var items = [...itemsParam];
449
+ // Sort all the movable columns
450
+ var isAscending = option === VisibilityOrderingBuilder.SORTING_OPTIONS.ASC;
451
+ items.sort((a, b) => {
452
+ var aName = a.id.toUpperCase();
453
+ var bName = b.id.toUpperCase();
454
+ return TextUtils.sort(aName, bName, isAscending);
455
+ });
456
+ var newMoves = [...movedColumns]; // Start with the base state moves by the model
457
+ var moveToIndex = Math.min(...items.flatMap(item => {
458
+ var {
459
+ modelIndex
460
+ } = item.data;
461
+ return Array.isArray(modelIndex) ? GridUtils.getVisibleIndexes(modelIndex, newMoves) : GridUtils.getVisibleIndex(modelIndex, newMoves);
462
+ }));
463
+ for (var i = 0; i < items.length; i += 1) {
464
+ var item = items[i];
465
+ var {
466
+ modelIndex
467
+ } = item.data;
468
+ var visibleIndex = Array.isArray(modelIndex) ? GridUtils.getVisibleIndexes(modelIndex, newMoves) : GridUtils.getVisibleIndex(modelIndex, newMoves);
469
+ newMoves = Array.isArray(visibleIndex) ? GridUtils.moveRange([Math.min(...visibleIndex), Math.max(...visibleIndex)], moveToIndex, newMoves, true) : GridUtils.moveItem(visibleIndex, moveToIndex, newMoves);
470
+ if (Array.isArray(visibleIndex)) {
471
+ // Recursively sort groups
472
+ newMoves = this.getSortMoves(item.children, option, newMoves);
473
+ }
474
+ moveToIndex += Array.isArray(modelIndex) ? modelIndex.length : 1;
475
+ }
476
+ return newMoves;
477
+ }
478
+ handleSortColumns(option) {
479
+ var {
480
+ model,
481
+ onMovedColumnsChanged
482
+ } = this.props;
483
+ var newMoves = this.getSortMoves(this.getTreeItems(), option, model.initialMovedColumns);
484
+ onMovedColumnsChanged(newMoves);
485
+ }
486
+ handleItemClick(name, event) {
487
+ event.stopPropagation();
488
+
489
+ // Click was triggered by an interactive element. Ignore select
490
+ if (event.target instanceof HTMLElement && (event.target.tagName === 'BUTTON' || event.target.tagName === 'INPUT')) {
491
+ return;
492
+ }
493
+ event.currentTarget.focus();
494
+ var {
495
+ selectedColumns,
496
+ lastSelectedColumn
497
+ } = this.state;
498
+ var isModifierKeyDown = GridUtils.isModifierKeyDown(event);
499
+ var isShiftKeyDown = event.shiftKey;
500
+ var isSelected = selectedColumns.has(name);
501
+ var columnsToBeAdded = [name];
502
+ if (isSelected && isModifierKeyDown) {
503
+ this.removeColumnFromSelected(name);
504
+ return;
505
+ }
506
+ var movableItems = flattenTree(this.getTreeItems());
507
+ if (isSelected && !isShiftKeyDown && lastSelectedColumn === name) {
508
+ var selectedItem = movableItems.find(_ref9 => {
509
+ var {
510
+ id
511
+ } = _ref9;
512
+ return id === name;
513
+ });
514
+ assertNotNull(selectedItem);
515
+ var childCount = flattenTree(selectedItem.children).length;
516
+ // If clicking on an item and it's the only thing selected, deselect it
517
+ if (childCount + 1 === selectedColumns.size) {
518
+ this.resetSelection();
519
+ return;
520
+ }
521
+ }
522
+ if (isShiftKeyDown) {
523
+ var selectedIndex = movableItems.findIndex(item => item.id === name);
524
+ var lastSelectedIndex = movableItems.findIndex(item => item.id === lastSelectedColumn);
525
+ columnsToBeAdded.push(...movableItems.slice(Math.min(lastSelectedIndex, selectedIndex), Math.max(lastSelectedIndex, selectedIndex) + 1).map(item => item.id));
526
+ }
527
+ this.addColumnToSelected(columnsToBeAdded, isModifierKeyDown || isShiftKeyDown);
528
+ this.setState({
529
+ lastSelectedColumn: name
530
+ });
531
+ }
532
+
533
+ /**
534
+ * Adds columns or groups to the selected column set
535
+ * Groups being added will add all of their children to the selection as well
536
+ *
537
+ * @param columnsToBeAdded Array of column or group names to add
538
+ * @param addToExisting If these should be added to the existing selection or overwrite it
539
+ */
540
+ addColumnToSelected(columnsToBeAdded, addToExisting) {
541
+ var {
542
+ selectedColumns
543
+ } = this.state;
544
+ var newSelectedColumns = new Set(addToExisting ? [...selectedColumns.values()].concat(columnsToBeAdded) : columnsToBeAdded);
545
+ var flattenedItems = flattenTree(this.getTreeItems());
546
+
547
+ // Add all children of selected groups to the selected columns
548
+ // The treeItems array will always be parent -> child in the order
549
+ // We don't need to recursively iterate because of this
550
+ // The parent will always be added before any children for nested selections
551
+ flattenedItems.forEach(_ref10 => {
552
+ var {
553
+ id,
554
+ children
555
+ } = _ref10;
556
+ if (newSelectedColumns.has(id)) {
557
+ children.forEach(child => newSelectedColumns.add(child.id));
558
+ }
559
+ });
560
+ this.setState({
561
+ selectedColumns: newSelectedColumns
562
+ });
563
+ }
564
+
565
+ /**
566
+ * Removes a column or group from selected columns set.
567
+ *
568
+ * Removing a group will deselect all of its children.
569
+ *
570
+ * Removing a child will deselect all parent groups.
571
+ * Other children in those parents will stay selected, just not the group item.
572
+ *
573
+ * @param name Name of the column to remove
574
+ */
575
+ removeColumnFromSelected(name) {
576
+ var {
577
+ selectedColumns
578
+ } = this.state;
579
+ var flattenedItems = flattenTree(this.getTreeItems());
580
+ var item = flattenedItems.find(_ref11 => {
581
+ var {
582
+ id
583
+ } = _ref11;
584
+ return id === name;
585
+ });
586
+ assertNotNull(item);
587
+ var parentItem = flattenedItems.find(_ref12 => {
588
+ var {
589
+ id
590
+ } = _ref12;
591
+ return id === item.parentId;
592
+ });
593
+
594
+ // Remove all children of deselected groups
595
+ flattenTree(item === null || item === void 0 ? void 0 : item.children).forEach(child => selectedColumns.delete(child.id));
596
+
597
+ // Remove all parents of the removed group since it is no longer fully selected
598
+ var _loop2 = function _loop2() {
599
+ selectedColumns.delete(parentItem.id);
600
+ var newParentId = parentItem.parentId;
601
+ parentItem = flattenedItems.find(_ref13 => {
602
+ var {
603
+ id
604
+ } = _ref13;
605
+ return id === newParentId;
606
+ });
607
+ };
608
+ while (parentItem != null) {
609
+ _loop2();
610
+ }
611
+ selectedColumns.delete(name);
612
+ this.setState({
613
+ selectedColumns: new Set(selectedColumns)
614
+ });
615
+ }
616
+ handleDragStart(id) {
617
+ var {
618
+ selectedColumns
619
+ } = this.state;
620
+ if (!selectedColumns.has(id)) {
621
+ this.addColumnToSelected([id], false);
622
+ }
623
+ }
624
+ handleDragEnd(from, to) {
625
+ var {
626
+ movedColumns,
627
+ onMovedColumnsChanged,
628
+ columnHeaderGroups,
629
+ onColumnHeaderGroupChanged
630
+ } = this.props;
631
+ var selectedParentItems = this.getSelectedParentItems();
632
+ var flattenedItems = flattenTree(this.getTreeItems()).map((item, i) => _objectSpread(_objectSpread({}, item), {}, {
633
+ index: i
634
+ }));
635
+ var firstMovableIndex = this.getFirstMovableIndex();
636
+ var lastMovableIndex = this.getLastMovableIndex();
637
+ assertNotNull(firstMovableIndex);
638
+ assertNotNull(lastMovableIndex);
639
+ var {
640
+ groups: newGroups,
641
+ movedColumns: newMoves
642
+ } = moveItemsFromDrop(from, to, movedColumns, columnHeaderGroups, flattenedItems, selectedParentItems, firstMovableIndex, lastMovableIndex);
643
+ onColumnHeaderGroupChanged(newGroups);
644
+ onMovedColumnsChanged(newMoves);
645
+ }
646
+ handleGroupNameChange(group, newName) {
647
+ var {
648
+ columnHeaderGroups,
649
+ onColumnHeaderGroupChanged
650
+ } = this.props;
651
+ var newGroups = [...columnHeaderGroups];
652
+ var oldName = group.name;
653
+ var groupIndex = newGroups.findIndex(_ref14 => {
654
+ var {
655
+ name
656
+ } = _ref14;
657
+ return name === oldName;
658
+ });
659
+ var oldGroup = newGroups[groupIndex];
660
+ assertNotNull(oldGroup); // Also means groupIndex >= 0
661
+
662
+ var newGroup = new ColumnHeaderGroup(oldGroup);
663
+ newGroup.name = newName;
664
+ newGroups.splice(groupIndex, 1, newGroup);
665
+ var parentIndex = newGroups.findIndex(_ref15 => {
666
+ var {
667
+ name
668
+ } = _ref15;
669
+ return name === newGroup.parent;
670
+ });
671
+ if (parentIndex >= 0) {
672
+ var newParent = new ColumnHeaderGroup(newGroups[parentIndex]);
673
+ newParent.removeChildren([oldName]);
674
+ newParent.addChildren([newName]);
675
+ newGroups.splice(parentIndex, 1, newParent);
676
+ }
677
+ onColumnHeaderGroupChanged(newGroups);
678
+ }
679
+ handleGroupDelete(group) {
680
+ var {
681
+ columnHeaderGroups,
682
+ onColumnHeaderGroupChanged
683
+ } = this.props;
684
+ var newGroups = columnHeaderGroups.filter(g => g.name !== group.name);
685
+ var parentIndex = newGroups.findIndex(g => g.name === group.parent);
686
+ if (parentIndex >= 0) {
687
+ var newParent = new ColumnHeaderGroup(newGroups[parentIndex]);
688
+ newParent.addChildren(group.children);
689
+ newParent.removeChildren([group.name]);
690
+ newGroups.splice(parentIndex, 1, newParent);
691
+ }
692
+ onColumnHeaderGroupChanged(newGroups);
693
+ }
694
+ handleGroupCreate() {
695
+ var {
696
+ movedColumns,
697
+ onMovedColumnsChanged,
698
+ onColumnHeaderGroupChanged
699
+ } = this.props;
700
+ var {
701
+ newMoves,
702
+ groups
703
+ } = this.moveSelectedColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.TOP);
704
+ var newGroups = groups.filter(group => !group.isNew);
705
+ var selectedItems = this.getSelectedParentItems();
706
+ var childIndexes = selectedItems.map(item => item.data.modelIndex).flat().filter(index => index >= 0);
707
+
708
+ // We don't care about this name really as long as it's unique
709
+ // The user must change it and we display a placeholder instead
710
+ var name = "".concat(ColumnHeaderGroup.NEW_GROUP_PREFIX, "-").concat(Date.now());
711
+ var newGroup = new ColumnHeaderGroup({
712
+ name,
713
+ children: selectedItems.map(_ref16 => {
714
+ var {
715
+ id
716
+ } = _ref16;
717
+ return id;
718
+ }),
719
+ depth: 0,
720
+ childIndexes: [...new Set(childIndexes)] // Remove any duplicates
721
+ });
722
+
723
+ onMovedColumnsChanged(movedColumns.concat(newMoves), () => {
724
+ var _this$list4, _this$list4$parentEle;
725
+ (_this$list4 = this.list) === null || _this$list4 === void 0 ? void 0 : (_this$list4$parentEle = _this$list4.parentElement) === null || _this$list4$parentEle === void 0 ? void 0 : _this$list4$parentEle.scroll({
726
+ top: 0
727
+ });
728
+ });
729
+ onColumnHeaderGroupChanged(newGroups.concat([newGroup]));
730
+ this.resetSelection();
731
+ }
732
+
733
+ /**
734
+ * Validates if a header group name is valid and not in use by any header groups or columns
735
+ * @param groupName The name to validate
736
+ * @returns Error message if invalid
737
+ */
738
+ validateGroupName(groupName) {
739
+ var {
740
+ model,
741
+ columnHeaderGroups
742
+ } = this.props;
743
+ var {
744
+ columns
745
+ } = model;
746
+ if (!DbNameValidator.isValidColumnName(groupName)) {
747
+ return 'Invalid name';
748
+ }
749
+ if (columns.some(_ref17 => {
750
+ var {
751
+ name
752
+ } = _ref17;
753
+ return name === groupName;
754
+ }) || columnHeaderGroups.some(_ref18 => {
755
+ var {
756
+ name
757
+ } = _ref18;
758
+ return name === groupName;
759
+ })) {
760
+ return 'Duplicate name';
761
+ }
762
+ return '';
763
+ }
764
+ /**
765
+ * Gets the first movable visible index
766
+ */
767
+ getFirstMovableIndex() {
768
+ var {
769
+ model,
770
+ movedColumns
771
+ } = this.props;
772
+ return this.getMemoizedFirstMovableIndex(model, model.columns, movedColumns);
773
+ }
774
+ /**
775
+ * Gets the last movable visible index
776
+ */
777
+ getLastMovableIndex() {
778
+ var {
779
+ model,
780
+ movedColumns
781
+ } = this.props;
782
+ return this.getMemoizedLastMovableIndex(model, model.columns, movedColumns);
783
+ }
784
+ /**
785
+ * Gets the tree of movable items in order. Memoized for efficiency
786
+ * Use flattenItems(this.getTreeItems()) if a flat list is needed
787
+ * @returns The movable tree items in order
788
+ */
789
+ getTreeItems() {
790
+ var {
791
+ model,
792
+ movedColumns,
793
+ hiddenColumns,
794
+ columnHeaderGroups
795
+ } = this.props;
796
+ var {
797
+ selectedColumns
798
+ } = this.state;
799
+ return this.memoizedGetTreeItems(model.columns, movedColumns, columnHeaderGroups, hiddenColumns, selectedColumns);
800
+ }
801
+
802
+ /**
803
+ * Gets the selected items that are movable.
804
+ * This is any item whose parent is not also selected.
805
+ *
806
+ * @returns The array of items whose parents are not selected
807
+ */
808
+ getSelectedParentItems() {
809
+ var {
810
+ selectedColumns
811
+ } = this.state;
812
+ var treeItems = flattenTree(this.getTreeItems());
813
+ return treeItems.filter(_ref19 => {
814
+ var {
815
+ id,
816
+ parentId
817
+ } = _ref19;
818
+ return (
819
+ // All items whose parents are not selected
820
+ selectedColumns.has(id) && !selectedColumns.has(parentId !== null && parentId !== void 0 ? parentId : '')
821
+ );
822
+ });
823
+ }
824
+ render() {
825
+ var {
826
+ model,
827
+ hiddenColumns,
828
+ onColumnVisibilityChanged
829
+ } = this.props;
830
+ var {
831
+ selectedColumns,
832
+ searchFilter
833
+ } = this.state;
834
+ var hasSelection = selectedColumns.size > 0;
835
+ var treeItems = this.getTreeItems();
836
+ var nameToIndexes = new Map(flattenTree(treeItems).map(item => [item.id, item.data.modelIndex]));
837
+ var hiddenColumnsSet = new Set(hiddenColumns);
838
+ var columnsToToggle = [
839
+ // Pass through Set to dedupe model indexes
840
+ ...new Set(hasSelection ? [...selectedColumns.values()].map(name => nameToIndexes.get(name)).filter(i => i != null).flat() : treeItems.map(item => item.data.modelIndex).flat())];
841
+ var areSomeVisible = columnsToToggle.some(column => !hiddenColumnsSet.has(column));
842
+ var allToggleText = areSomeVisible ? 'Hide All' : 'Show All';
843
+ var selectedToggleText = areSomeVisible ? 'Hide Selected' : 'Show Selected';
844
+ var visibilityOrderingList = this.makeVisibilityOrderingList(model.columns, treeItems);
845
+ return /*#__PURE__*/React.createElement("div", {
846
+ role: "menu",
847
+ className: "visibility-ordering-builder",
848
+ tabIndex: 0
849
+ }, /*#__PURE__*/React.createElement("div", {
850
+ className: "top-menu"
851
+ }, /*#__PURE__*/React.createElement(Button, {
852
+ kind: "ghost",
853
+ className: "toggle-visibility-btn",
854
+ onClick: () => {
855
+ onColumnVisibilityChanged(columnsToToggle, !areSomeVisible);
856
+ },
857
+ icon: areSomeVisible ? dhEye : dhEyeSlash,
858
+ tooltip: "Toggle column visibility"
859
+ }, !hasSelection ? allToggleText : selectedToggleText), /*#__PURE__*/React.createElement(SearchInput, {
860
+ className: "visibility-search",
861
+ value: searchFilter,
862
+ matchCount: searchFilter ? selectedColumns.size : undefined,
863
+ onChange: this.handleSearchInputChange
864
+ })), /*#__PURE__*/React.createElement("div", {
865
+ className: "top-menu"
866
+ }, /*#__PURE__*/React.createElement(Button, {
867
+ kind: "ghost",
868
+ icon: vsRefresh,
869
+ tooltip: "Reset to default",
870
+ onClick: () => {
871
+ this.resetVisibilityOrdering();
872
+ }
873
+ }, "Reset"), /*#__PURE__*/React.createElement("span", {
874
+ className: "vertical-divider"
875
+ }), /*#__PURE__*/React.createElement(Button, {
876
+ kind: "ghost",
877
+ icon: dhSortAlphaDown,
878
+ tooltip: "Sort ascending",
879
+ onClick: () => {
880
+ this.handleSortColumns(VisibilityOrderingBuilder.SORTING_OPTIONS.ASC);
881
+ }
882
+ }), /*#__PURE__*/React.createElement(Button, {
883
+ kind: "ghost",
884
+ icon: dhSortAlphaUp,
885
+ tooltip: "Sort descending",
886
+ onClick: () => {
887
+ this.handleSortColumns(VisibilityOrderingBuilder.SORTING_OPTIONS.DSC);
888
+ }
889
+ }), /*#__PURE__*/React.createElement("span", {
890
+ className: "vertical-divider"
891
+ }), /*#__PURE__*/React.createElement(Button, {
892
+ kind: "ghost",
893
+ tooltip: "Create group from selection",
894
+ disabled: !hasSelection,
895
+ onClick: this.handleGroupCreate
896
+ }, /*#__PURE__*/React.createElement("span", {
897
+ className: "fa-layers",
898
+ style: {
899
+ marginRight: '0.75rem'
900
+ }
901
+ }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
902
+ mask: vsSymbolStructure,
903
+ icon: vsCircleLargeFilled,
904
+ transform: "right-7 down-5 shrink-6"
905
+ }), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
906
+ icon: vsAdd,
907
+ transform: "right-8 down-6 shrink-8"
908
+ })), "Group"), /*#__PURE__*/React.createElement("span", {
909
+ className: "vertical-divider"
910
+ }), /*#__PURE__*/React.createElement(Button, {
911
+ kind: "ghost",
912
+ icon: vsChevronUp,
913
+ tooltip: "Move selection up",
914
+ onClick: () => {
915
+ this.handleMoveColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.UP);
916
+ },
917
+ disabled: !hasSelection
918
+ }), /*#__PURE__*/React.createElement(Button, {
919
+ kind: "ghost",
920
+ icon: vsChevronDown,
921
+ tooltip: "Move selection down",
922
+ onClick: () => {
923
+ this.handleMoveColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.DOWN);
924
+ },
925
+ disabled: !hasSelection
926
+ }), /*#__PURE__*/React.createElement(Button, {
927
+ kind: "ghost",
928
+ icon: dhArrowToTop,
929
+ tooltip: "Move selection to top",
930
+ onClick: () => {
931
+ this.handleMoveColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.TOP);
932
+ },
933
+ disabled: !hasSelection
934
+ }), /*#__PURE__*/React.createElement(Button, {
935
+ kind: "ghost",
936
+ icon: dhArrowToBottom,
937
+ tooltip: "Move selection to bottom",
938
+ onClick: () => {
939
+ this.handleMoveColumns(VisibilityOrderingBuilder.MOVE_OPTIONS.BOTTOM);
940
+ },
941
+ disabled: !hasSelection
942
+ })), /*#__PURE__*/React.createElement("div", {
943
+ role: "menu",
944
+ className: classNames('visibility-ordering-list')
945
+ }, /*#__PURE__*/React.createElement("div", {
946
+ className: "column-list",
947
+ ref: list => {
948
+ this.list = list;
949
+ }
950
+ }, visibilityOrderingList)));
951
+ }
952
+ }
953
+ _defineProperty(VisibilityOrderingBuilder, "SORTING_OPTIONS", {
954
+ DSC: 'DSC',
955
+ ASC: 'ASC'
956
+ });
957
+ _defineProperty(VisibilityOrderingBuilder, "MOVE_OPTIONS", {
958
+ TOP: 'TOP',
959
+ BOTTOM: 'BOTTOM',
960
+ UP: 'UP',
961
+ DOWN: 'DOWN'
962
+ });
963
+ export default VisibilityOrderingBuilder;
964
+ //# sourceMappingURL=VisibilityOrderingBuilder.js.map