@deephaven/iris-grid 0.42.1-beta.4 → 0.43.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 (277) hide show
  1. package/package.json +15 -15
  2. package/dist/AdvancedFilterCreator.css +0 -106
  3. package/dist/AdvancedFilterCreator.css.map +0 -1
  4. package/dist/AdvancedFilterCreator.js +0 -541
  5. package/dist/AdvancedFilterCreator.js.map +0 -1
  6. package/dist/AdvancedFilterCreatorFilterItem.css +0 -9
  7. package/dist/AdvancedFilterCreatorFilterItem.css.map +0 -1
  8. package/dist/AdvancedFilterCreatorFilterItem.js +0 -184
  9. package/dist/AdvancedFilterCreatorFilterItem.js.map +0 -1
  10. package/dist/AdvancedFilterCreatorSelectValue.css +0 -50
  11. package/dist/AdvancedFilterCreatorSelectValue.css.map +0 -1
  12. package/dist/AdvancedFilterCreatorSelectValue.js +0 -301
  13. package/dist/AdvancedFilterCreatorSelectValue.js.map +0 -1
  14. package/dist/AdvancedFilterCreatorSelectValueList.js +0 -272
  15. package/dist/AdvancedFilterCreatorSelectValueList.js.map +0 -1
  16. package/dist/ColumnHeaderGroup.js +0 -61
  17. package/dist/ColumnHeaderGroup.js.map +0 -1
  18. package/dist/ColumnStatistics.css +0 -76
  19. package/dist/ColumnStatistics.css.map +0 -1
  20. package/dist/ColumnStatistics.js +0 -202
  21. package/dist/ColumnStatistics.js.map +0 -1
  22. package/dist/CommonTypes.js +0 -2
  23. package/dist/CommonTypes.js.map +0 -1
  24. package/dist/CrossColumnSearch.css +0 -35
  25. package/dist/CrossColumnSearch.css.map +0 -1
  26. package/dist/CrossColumnSearch.js +0 -199
  27. package/dist/CrossColumnSearch.js.map +0 -1
  28. package/dist/FilterInputField.css +0 -56
  29. package/dist/FilterInputField.css.map +0 -1
  30. package/dist/FilterInputField.js +0 -232
  31. package/dist/FilterInputField.js.map +0 -1
  32. package/dist/GotoRow.css +0 -45
  33. package/dist/GotoRow.css.map +0 -1
  34. package/dist/GotoRow.js +0 -298
  35. package/dist/GotoRow.js.map +0 -1
  36. package/dist/IrisGrid.css +0 -359
  37. package/dist/IrisGrid.css.map +0 -1
  38. package/dist/IrisGrid.js +0 -3651
  39. package/dist/IrisGrid.js.map +0 -1
  40. package/dist/IrisGridBottomBar.css +0 -85
  41. package/dist/IrisGridBottomBar.css.map +0 -1
  42. package/dist/IrisGridBottomBar.js +0 -36
  43. package/dist/IrisGridBottomBar.js.map +0 -1
  44. package/dist/IrisGridCellOverflowModal.css +0 -17
  45. package/dist/IrisGridCellOverflowModal.css.map +0 -1
  46. package/dist/IrisGridCellOverflowModal.js +0 -157
  47. package/dist/IrisGridCellOverflowModal.js.map +0 -1
  48. package/dist/IrisGridCellRendererUtils.js +0 -20
  49. package/dist/IrisGridCellRendererUtils.js.map +0 -1
  50. package/dist/IrisGridCopyHandler.css +0 -64
  51. package/dist/IrisGridCopyHandler.css.map +0 -1
  52. package/dist/IrisGridCopyHandler.js +0 -331
  53. package/dist/IrisGridCopyHandler.js.map +0 -1
  54. package/dist/IrisGridDataBarCellRenderer.js +0 -10
  55. package/dist/IrisGridDataBarCellRenderer.js.map +0 -1
  56. package/dist/IrisGridIcons.js +0 -25
  57. package/dist/IrisGridIcons.js.map +0 -1
  58. package/dist/IrisGridMetricCalculator.js +0 -33
  59. package/dist/IrisGridMetricCalculator.js.map +0 -1
  60. package/dist/IrisGridModel.js +0 -263
  61. package/dist/IrisGridModel.js.map +0 -1
  62. package/dist/IrisGridModelFactory.js +0 -27
  63. package/dist/IrisGridModelFactory.js.map +0 -1
  64. package/dist/IrisGridModelUpdater.js +0 -96
  65. package/dist/IrisGridModelUpdater.js.map +0 -1
  66. package/dist/IrisGridPartitionSelector.css +0 -48
  67. package/dist/IrisGridPartitionSelector.css.map +0 -1
  68. package/dist/IrisGridPartitionSelector.js +0 -198
  69. package/dist/IrisGridPartitionSelector.js.map +0 -1
  70. package/dist/IrisGridProxyModel.js +0 -530
  71. package/dist/IrisGridProxyModel.js.map +0 -1
  72. package/dist/IrisGridRenderer.js +0 -779
  73. package/dist/IrisGridRenderer.js.map +0 -1
  74. package/dist/IrisGridShortcuts.js +0 -59
  75. package/dist/IrisGridShortcuts.js.map +0 -1
  76. package/dist/IrisGridTableModel.js +0 -273
  77. package/dist/IrisGridTableModel.js.map +0 -1
  78. package/dist/IrisGridTableModelTemplate.js +0 -1589
  79. package/dist/IrisGridTableModelTemplate.js.map +0 -1
  80. package/dist/IrisGridTestUtils.js +0 -121
  81. package/dist/IrisGridTestUtils.js.map +0 -1
  82. package/dist/IrisGridTextCellRenderer.js +0 -139
  83. package/dist/IrisGridTextCellRenderer.js.map +0 -1
  84. package/dist/IrisGridTheme.js +0 -96
  85. package/dist/IrisGridTheme.js.map +0 -1
  86. package/dist/IrisGridTheme.module.css +0 -69
  87. package/dist/IrisGridTheme.module.css.map +0 -1
  88. package/dist/IrisGridTreeTableModel.js +0 -145
  89. package/dist/IrisGridTreeTableModel.js.map +0 -1
  90. package/dist/IrisGridUtils.js +0 -1279
  91. package/dist/IrisGridUtils.js.map +0 -1
  92. package/dist/MissingKeyError.js +0 -15
  93. package/dist/MissingKeyError.js.map +0 -1
  94. package/dist/PartitionSelectorSearch.css +0 -22
  95. package/dist/PartitionSelectorSearch.css.map +0 -1
  96. package/dist/PartitionSelectorSearch.js +0 -317
  97. package/dist/PartitionSelectorSearch.js.map +0 -1
  98. package/dist/PendingDataBottomBar.css +0 -13
  99. package/dist/PendingDataBottomBar.css.map +0 -1
  100. package/dist/PendingDataBottomBar.js +0 -98
  101. package/dist/PendingDataBottomBar.js.map +0 -1
  102. package/dist/TableViewportUpdater.js +0 -156
  103. package/dist/TableViewportUpdater.js.map +0 -1
  104. package/dist/ToastBottomBar.js +0 -42
  105. package/dist/ToastBottomBar.js.map +0 -1
  106. package/dist/TreeTableViewportUpdater.js +0 -96
  107. package/dist/TreeTableViewportUpdater.js.map +0 -1
  108. package/dist/declaration.d.js +0 -2
  109. package/dist/declaration.d.js.map +0 -1
  110. package/dist/format-context-menus/CustomFormatAction.css +0 -25
  111. package/dist/format-context-menus/CustomFormatAction.css.map +0 -1
  112. package/dist/format-context-menus/CustomFormatAction.js +0 -132
  113. package/dist/format-context-menus/CustomFormatAction.js.map +0 -1
  114. package/dist/format-context-menus/DateTimeFormatContextMenu.js +0 -53
  115. package/dist/format-context-menus/DateTimeFormatContextMenu.js.map +0 -1
  116. package/dist/format-context-menus/DecimalFormatContextMenu.js +0 -59
  117. package/dist/format-context-menus/DecimalFormatContextMenu.js.map +0 -1
  118. package/dist/format-context-menus/FormatContextMenuUtils.js +0 -63
  119. package/dist/format-context-menus/FormatContextMenuUtils.js.map +0 -1
  120. package/dist/format-context-menus/IntegerFormatContextMenu.js +0 -43
  121. package/dist/format-context-menus/IntegerFormatContextMenu.js.map +0 -1
  122. package/dist/format-context-menus/index.js +0 -4
  123. package/dist/format-context-menus/index.js.map +0 -1
  124. package/dist/index.js +0 -24
  125. package/dist/index.js.map +0 -1
  126. package/dist/key-handlers/ClearFilterKeyHandler.js +0 -21
  127. package/dist/key-handlers/ClearFilterKeyHandler.js.map +0 -1
  128. package/dist/key-handlers/CopyKeyHandler.js +0 -31
  129. package/dist/key-handlers/CopyKeyHandler.js.map +0 -1
  130. package/dist/key-handlers/ReverseKeyHandler.js +0 -32
  131. package/dist/key-handlers/ReverseKeyHandler.js.map +0 -1
  132. package/dist/key-handlers/index.js +0 -4
  133. package/dist/key-handlers/index.js.map +0 -1
  134. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +0 -175
  135. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +0 -1
  136. package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js +0 -139
  137. package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js.map +0 -1
  138. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js +0 -83
  139. package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js.map +0 -1
  140. package/dist/mousehandlers/IrisGridContextMenuHandler.css +0 -19
  141. package/dist/mousehandlers/IrisGridContextMenuHandler.css.map +0 -1
  142. package/dist/mousehandlers/IrisGridContextMenuHandler.js +0 -1220
  143. package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +0 -1
  144. package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js +0 -28
  145. package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js.map +0 -1
  146. package/dist/mousehandlers/IrisGridFilterMouseHandler.js +0 -80
  147. package/dist/mousehandlers/IrisGridFilterMouseHandler.js.map +0 -1
  148. package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js +0 -126
  149. package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js.map +0 -1
  150. package/dist/mousehandlers/IrisGridSortMouseHandler.js +0 -46
  151. package/dist/mousehandlers/IrisGridSortMouseHandler.js.map +0 -1
  152. package/dist/mousehandlers/IrisGridTokenMouseHandler.js +0 -151
  153. package/dist/mousehandlers/IrisGridTokenMouseHandler.js.map +0 -1
  154. package/dist/mousehandlers/PendingMouseHandler.js +0 -39
  155. package/dist/mousehandlers/PendingMouseHandler.js.map +0 -1
  156. package/dist/mousehandlers/index.js +0 -11
  157. package/dist/mousehandlers/index.js.map +0 -1
  158. package/dist/sidebar/AdvancedSettings.js +0 -6
  159. package/dist/sidebar/AdvancedSettings.js.map +0 -1
  160. package/dist/sidebar/AdvancedSettingsMenu.js +0 -29
  161. package/dist/sidebar/AdvancedSettingsMenu.js.map +0 -1
  162. package/dist/sidebar/AdvancedSettingsType.js +0 -7
  163. package/dist/sidebar/AdvancedSettingsType.js.map +0 -1
  164. package/dist/sidebar/ChartBuilder.css +0 -56
  165. package/dist/sidebar/ChartBuilder.css.map +0 -1
  166. package/dist/sidebar/ChartBuilder.js +0 -443
  167. package/dist/sidebar/ChartBuilder.js.map +0 -1
  168. package/dist/sidebar/CustomColumnBuilder.css +0 -58
  169. package/dist/sidebar/CustomColumnBuilder.css.map +0 -1
  170. package/dist/sidebar/CustomColumnBuilder.js +0 -384
  171. package/dist/sidebar/CustomColumnBuilder.js.map +0 -1
  172. package/dist/sidebar/CustomColumnInput.js +0 -90
  173. package/dist/sidebar/CustomColumnInput.js.map +0 -1
  174. package/dist/sidebar/InputEditor.css +0 -35
  175. package/dist/sidebar/InputEditor.css.map +0 -1
  176. package/dist/sidebar/InputEditor.js +0 -177
  177. package/dist/sidebar/InputEditor.js.map +0 -1
  178. package/dist/sidebar/OptionType.js +0 -19
  179. package/dist/sidebar/OptionType.js.map +0 -1
  180. package/dist/sidebar/RollupRows.css +0 -120
  181. package/dist/sidebar/RollupRows.css.map +0 -1
  182. package/dist/sidebar/RollupRows.js +0 -519
  183. package/dist/sidebar/RollupRows.js.map +0 -1
  184. package/dist/sidebar/SelectDistinctBuilder.css +0 -41
  185. package/dist/sidebar/SelectDistinctBuilder.css.map +0 -1
  186. package/dist/sidebar/SelectDistinctBuilder.js +0 -155
  187. package/dist/sidebar/SelectDistinctBuilder.js.map +0 -1
  188. package/dist/sidebar/TableCsvExporter.css +0 -32
  189. package/dist/sidebar/TableCsvExporter.css.map +0 -1
  190. package/dist/sidebar/TableCsvExporter.js +0 -399
  191. package/dist/sidebar/TableCsvExporter.js.map +0 -1
  192. package/dist/sidebar/TableSaver.js +0 -487
  193. package/dist/sidebar/TableSaver.js.map +0 -1
  194. package/dist/sidebar/aggregations/AggregationEdit.css +0 -61
  195. package/dist/sidebar/aggregations/AggregationEdit.css.map +0 -1
  196. package/dist/sidebar/aggregations/AggregationEdit.js +0 -155
  197. package/dist/sidebar/aggregations/AggregationEdit.js.map +0 -1
  198. package/dist/sidebar/aggregations/AggregationOperation.js +0 -19
  199. package/dist/sidebar/aggregations/AggregationOperation.js.map +0 -1
  200. package/dist/sidebar/aggregations/AggregationUtils.js +0 -59
  201. package/dist/sidebar/aggregations/AggregationUtils.js.map +0 -1
  202. package/dist/sidebar/aggregations/Aggregations.css +0 -43
  203. package/dist/sidebar/aggregations/Aggregations.css.map +0 -1
  204. package/dist/sidebar/aggregations/Aggregations.js +0 -178
  205. package/dist/sidebar/aggregations/Aggregations.js.map +0 -1
  206. package/dist/sidebar/aggregations/index.js +0 -2
  207. package/dist/sidebar/aggregations/index.js.map +0 -1
  208. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +0 -123
  209. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +0 -1
  210. package/dist/sidebar/conditional-formatting/ConditionEditor.js +0 -243
  211. package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +0 -1
  212. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css +0 -22
  213. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css.map +0 -1
  214. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +0 -109
  215. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +0 -1
  216. package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js +0 -18
  217. package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js.map +0 -1
  218. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css +0 -57
  219. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css.map +0 -1
  220. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +0 -150
  221. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +0 -1
  222. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +0 -635
  223. package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +0 -1
  224. package/dist/sidebar/conditional-formatting/RowFormatEditor.js +0 -122
  225. package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +0 -1
  226. package/dist/sidebar/conditional-formatting/StyleEditor.css +0 -55
  227. package/dist/sidebar/conditional-formatting/StyleEditor.css.map +0 -1
  228. package/dist/sidebar/conditional-formatting/StyleEditor.js +0 -150
  229. package/dist/sidebar/conditional-formatting/StyleEditor.js.map +0 -1
  230. package/dist/sidebar/icons/BarIcon.js +0 -24
  231. package/dist/sidebar/icons/BarIcon.js.map +0 -1
  232. package/dist/sidebar/icons/FormatColumnWhereIcon.js +0 -42
  233. package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +0 -1
  234. package/dist/sidebar/icons/FormatRowWhereIcon.js +0 -36
  235. package/dist/sidebar/icons/FormatRowWhereIcon.js.map +0 -1
  236. package/dist/sidebar/icons/HistogramIcon.js +0 -24
  237. package/dist/sidebar/icons/HistogramIcon.js.map +0 -1
  238. package/dist/sidebar/icons/LineIcon.js +0 -27
  239. package/dist/sidebar/icons/LineIcon.js.map +0 -1
  240. package/dist/sidebar/icons/PieIcon.js +0 -24
  241. package/dist/sidebar/icons/PieIcon.js.map +0 -1
  242. package/dist/sidebar/icons/ScatterIcon.js +0 -74
  243. package/dist/sidebar/icons/ScatterIcon.js.map +0 -1
  244. package/dist/sidebar/icons/index.js +0 -8
  245. package/dist/sidebar/icons/index.js.map +0 -1
  246. package/dist/sidebar/index.js +0 -18
  247. package/dist/sidebar/index.js.map +0 -1
  248. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css +0 -68
  249. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css.map +0 -1
  250. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +0 -964
  251. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +0 -1
  252. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js +0 -132
  253. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js.map +0 -1
  254. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css +0 -29
  255. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css.map +0 -1
  256. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js +0 -188
  257. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +0 -1
  258. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +0 -81
  259. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +0 -1
  260. package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js +0 -30
  261. package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js.map +0 -1
  262. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +0 -158
  263. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +0 -1
  264. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +0 -146
  265. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +0 -1
  266. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +0 -59
  267. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +0 -1
  268. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +0 -139
  269. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +0 -1
  270. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +0 -44
  271. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +0 -1
  272. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +0 -129
  273. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +0 -1
  274. package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js +0 -4
  275. package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js.map +0 -1
  276. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +0 -261
  277. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +0 -1
@@ -1,202 +0,0 @@
1
- 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; }
2
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
- 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); }
4
- import React, { Component } from 'react';
5
- import classNames from 'classnames';
6
- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
7
- import { Button, CopyButton, LoadingSpinner } from '@deephaven/components';
8
- import { dhFreeze, dhRefresh, dhSortSlash, vsLock } from '@deephaven/icons';
9
- import Log from '@deephaven/log';
10
- import { PromiseUtils } from '@deephaven/utils';
11
- import { isExpandableGridModel } from '@deephaven/grid';
12
- import "./ColumnStatistics.css";
13
- var log = Log.module('ColumnStatistics');
14
- var STATS_LABEL_OVERRIDES = {
15
- SIZE: 'Number of Rows'
16
- };
17
- class ColumnStatistics extends Component {
18
- /** Automatically generate the statistics when the row count is below this threshold */
19
-
20
- static getStatsLabel(operation) {
21
- var _STATS_LABEL_OVERRIDE;
22
- return (_STATS_LABEL_OVERRIDE = STATS_LABEL_OVERRIDES[operation]) !== null && _STATS_LABEL_OVERRIDE !== void 0 ? _STATS_LABEL_OVERRIDE : operation.split(' ').map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()).join(' ');
23
- }
24
- constructor(props) {
25
- super(props);
26
- _defineProperty(this, "cancelablePromise", void 0);
27
- this.handleError = this.handleError.bind(this);
28
- this.handleGenerateStatistics = this.handleGenerateStatistics.bind(this);
29
- this.handleStatistics = this.handleStatistics.bind(this);
30
- this.cancelablePromise = null;
31
- this.state = {
32
- error: null,
33
- loading: false,
34
- statistics: null,
35
- numRows: 0
36
- };
37
- }
38
- componentDidMount() {
39
- this.maybeGenerateStatistics();
40
- }
41
- componentWillUnmount() {
42
- if (this.cancelablePromise) {
43
- this.cancelablePromise.cancel();
44
- }
45
- }
46
- maybeGenerateStatistics() {
47
- var {
48
- model
49
- } = this.props;
50
- var numRows = model.rowCount - model.pendingRowCount;
51
- this.setState({
52
- numRows
53
- });
54
- if (!model.isColumnStatisticsAvailable) {
55
- this.setState({
56
- loading: false
57
- });
58
- } else if (numRows < ColumnStatistics.AUTO_GENERATE_LIMIT) {
59
- this.handleGenerateStatistics();
60
- }
61
- }
62
- handleGenerateStatistics() {
63
- this.setState({
64
- loading: true
65
- });
66
- var {
67
- column,
68
- model
69
- } = this.props;
70
- this.cancelablePromise = PromiseUtils.makeCancelable(model.columnStatistics(column));
71
- this.cancelablePromise.then(this.handleStatistics).catch(this.handleError);
72
- }
73
- handleStatistics(stats) {
74
- log.debug('Received statistics', stats);
75
- var {
76
- model,
77
- onStatistics
78
- } = this.props;
79
- var statistics = [];
80
- stats.statisticsMap.forEach((value, operation) => {
81
- statistics.push({
82
- operation: ColumnStatistics.getStatsLabel(operation),
83
- value,
84
- type: stats.getType(operation)
85
- });
86
- });
87
- stats.uniqueValues.forEach((value, operation) => {
88
- statistics.push({
89
- operation,
90
- className: 'column-statistics-unique-value',
91
- value,
92
- type: 'long'
93
- });
94
- });
95
- this.setState({
96
- loading: false,
97
- statistics,
98
- numRows: model.rowCount - model.pendingRowCount
99
- });
100
- onStatistics();
101
- }
102
- handleError(error) {
103
- if (error != null && PromiseUtils.isCanceled(error)) {
104
- log.debug('Called handleError on a cancelled promise result');
105
- return;
106
- }
107
- log.error('Error generating statistics', error);
108
- this.setState({
109
- error,
110
- loading: false,
111
- statistics: null
112
- });
113
- }
114
- render() {
115
- var {
116
- column,
117
- model
118
- } = this.props;
119
- var {
120
- error,
121
- loading,
122
- statistics,
123
- numRows
124
- } = this.state;
125
- var showGenerateStatistics = !loading && error == null && statistics == null && model.isColumnStatisticsAvailable;
126
- var statisticElements = [];
127
- var columnType = column.type.substring(column.type.lastIndexOf('.') + 1);
128
- var description = column.description === null ? null : column.description;
129
- if (statistics != null) {
130
- for (var i = 0; i < statistics.length; i += 1) {
131
- var {
132
- operation,
133
- className,
134
- value,
135
- type
136
- } = statistics[i];
137
- var formattedValue = !type ? model.displayString(value, column.type, column.name) : model.displayString(value, type);
138
- var statisticElement = /*#__PURE__*/React.createElement(React.Fragment, {
139
- key: operation
140
- }, /*#__PURE__*/React.createElement("div", {
141
- className: classNames('column-statistic-operation', className)
142
- }, operation), /*#__PURE__*/React.createElement("div", {
143
- className: "column-statistic-value"
144
- }, formattedValue));
145
- statisticElements.push(statisticElement);
146
- }
147
- }
148
- var rowCountLabel = isExpandableGridModel(model) && model.hasExpandableRows ? 'Expanded Rows' : 'Number of Rows';
149
- var formattedRowCount = model.displayString(numRows, 'long');
150
- var columnIndex = model.getColumnIndexByName(column.name);
151
- return /*#__PURE__*/React.createElement("div", {
152
- className: "column-statistics"
153
- }, /*#__PURE__*/React.createElement("div", {
154
- className: "column-statistics-title"
155
- }, column.name, /*#__PURE__*/React.createElement("span", {
156
- className: "column-statistics-type"
157
- }, "\xA0(", columnType, ")"), /*#__PURE__*/React.createElement(CopyButton, {
158
- className: "column-statistics-copy",
159
- tooltip: "Copy column name",
160
- copy: column.name
161
- })), description != null && /*#__PURE__*/React.createElement("div", {
162
- className: "column-statistics-description"
163
- }, description), columnIndex != null && !model.isColumnSortable(columnIndex) && /*#__PURE__*/React.createElement("div", {
164
- className: "column-statistics-status"
165
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
166
- icon: dhSortSlash,
167
- className: "mr-1"
168
- }), "Not sortable"), columnIndex != null && !model.isColumnMovable(columnIndex) && /*#__PURE__*/React.createElement("div", {
169
- className: "column-statistics-status"
170
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
171
- icon: model.isColumnFrozen(columnIndex) ? dhFreeze : vsLock,
172
- className: "mr-1"
173
- }), model.isColumnFrozen(columnIndex) ? 'Frozen' : 'Not movable'), /*#__PURE__*/React.createElement("div", {
174
- className: "column-statistics-grid"
175
- }, statistics == null && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
176
- className: "column-statistic-operation"
177
- }, rowCountLabel), /*#__PURE__*/React.createElement("div", {
178
- className: "column-statistic-value"
179
- }, formattedRowCount)), statisticElements), showGenerateStatistics && /*#__PURE__*/React.createElement(Button, {
180
- kind: "ghost",
181
- className: "px-0",
182
- onClick: this.handleGenerateStatistics
183
- }, "Generate Stats"), error != null && /*#__PURE__*/React.createElement("div", {
184
- className: "error-message"
185
- }, "".concat(error)), statistics && !loading && /*#__PURE__*/React.createElement(Button, {
186
- kind: "ghost",
187
- className: "px-0",
188
- onClick: this.handleGenerateStatistics,
189
- icon: /*#__PURE__*/React.createElement(FontAwesomeIcon, {
190
- icon: dhRefresh,
191
- className: "mr-1"
192
- })
193
- }, "Refresh"), loading && /*#__PURE__*/React.createElement("div", {
194
- className: "column-statistics-loading"
195
- }, /*#__PURE__*/React.createElement(LoadingSpinner, {
196
- className: "mr-2"
197
- }), "Calculating Stats..."));
198
- }
199
- }
200
- _defineProperty(ColumnStatistics, "AUTO_GENERATE_LIMIT", 100000);
201
- export default ColumnStatistics;
202
- //# sourceMappingURL=ColumnStatistics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ColumnStatistics.js","names":["React","Component","classNames","FontAwesomeIcon","Button","CopyButton","LoadingSpinner","dhFreeze","dhRefresh","dhSortSlash","vsLock","Log","PromiseUtils","isExpandableGridModel","log","module","STATS_LABEL_OVERRIDES","SIZE","ColumnStatistics","getStatsLabel","operation","split","map","w","toUpperCase","substr","toLowerCase","join","constructor","props","handleError","bind","handleGenerateStatistics","handleStatistics","cancelablePromise","state","error","loading","statistics","numRows","componentDidMount","maybeGenerateStatistics","componentWillUnmount","cancel","model","rowCount","pendingRowCount","setState","isColumnStatisticsAvailable","AUTO_GENERATE_LIMIT","column","makeCancelable","columnStatistics","then","catch","stats","debug","onStatistics","statisticsMap","forEach","value","push","type","getType","uniqueValues","className","isCanceled","render","showGenerateStatistics","statisticElements","columnType","substring","lastIndexOf","description","i","length","formattedValue","displayString","name","statisticElement","rowCountLabel","hasExpandableRows","formattedRowCount","columnIndex","getColumnIndexByName","isColumnSortable","isColumnMovable","isColumnFrozen"],"sources":["../src/ColumnStatistics.tsx"],"sourcesContent":["import React, { Component, Key } from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, CopyButton, LoadingSpinner } from '@deephaven/components';\nimport { dhFreeze, dhRefresh, dhSortSlash, vsLock } from '@deephaven/icons';\nimport type {\n Column,\n ColumnStatistics as APIColumnStatistics,\n} from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { CancelablePromise, PromiseUtils } from '@deephaven/utils';\nimport { isExpandableGridModel } from '@deephaven/grid';\nimport './ColumnStatistics.scss';\nimport IrisGridModel from './IrisGridModel';\n\nconst log = Log.module('ColumnStatistics');\nconst STATS_LABEL_OVERRIDES: Record<string, string> = {\n SIZE: 'Number of Rows',\n};\n\ninterface Statistic {\n operation: Key;\n className?: string;\n value: unknown;\n type: string;\n}\n\ninterface ColumnStatisticsProps {\n column: Column;\n model: IrisGridModel;\n onStatistics: () => void;\n}\ninterface ColumnStatisticsState {\n error: unknown;\n loading: boolean;\n statistics: Statistic[] | null;\n numRows: number;\n}\n\nclass ColumnStatistics extends Component<\n ColumnStatisticsProps,\n ColumnStatisticsState\n> {\n /** Automatically generate the statistics when the row count is below this threshold */\n static AUTO_GENERATE_LIMIT = 100000;\n\n static getStatsLabel(operation: string): string {\n return (\n STATS_LABEL_OVERRIDES[operation] ??\n operation\n .split(' ')\n .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())\n .join(' ')\n );\n }\n\n constructor(props: ColumnStatisticsProps) {\n super(props);\n\n this.handleError = this.handleError.bind(this);\n this.handleGenerateStatistics = this.handleGenerateStatistics.bind(this);\n this.handleStatistics = this.handleStatistics.bind(this);\n\n this.cancelablePromise = null;\n\n this.state = {\n error: null,\n loading: false,\n statistics: null,\n numRows: 0,\n };\n }\n\n componentDidMount(): void {\n this.maybeGenerateStatistics();\n }\n\n componentWillUnmount(): void {\n if (this.cancelablePromise) {\n this.cancelablePromise.cancel();\n }\n }\n\n cancelablePromise: CancelablePromise<APIColumnStatistics> | null;\n\n maybeGenerateStatistics(): void {\n const { model } = this.props;\n\n const numRows = model.rowCount - model.pendingRowCount;\n this.setState({ numRows });\n if (!model.isColumnStatisticsAvailable) {\n this.setState({ loading: false });\n } else if (numRows < ColumnStatistics.AUTO_GENERATE_LIMIT) {\n this.handleGenerateStatistics();\n }\n }\n\n handleGenerateStatistics(): void {\n this.setState({ loading: true });\n\n const { column, model } = this.props;\n\n this.cancelablePromise = PromiseUtils.makeCancelable(\n model.columnStatistics(column)\n );\n\n this.cancelablePromise.then(this.handleStatistics).catch(this.handleError);\n }\n\n handleStatistics(stats: APIColumnStatistics): void {\n log.debug('Received statistics', stats);\n\n const { model, onStatistics } = this.props;\n const statistics: Statistic[] = [];\n\n stats.statisticsMap.forEach((value, operation) => {\n statistics.push({\n operation: ColumnStatistics.getStatsLabel(operation),\n value,\n type: stats.getType(operation),\n });\n });\n\n stats.uniqueValues.forEach((value, operation) => {\n statistics.push({\n operation,\n className: 'column-statistics-unique-value',\n value,\n type: 'long',\n });\n });\n\n this.setState({\n loading: false,\n statistics,\n numRows: model.rowCount - model.pendingRowCount,\n });\n\n onStatistics();\n }\n\n handleError(error: Error): void {\n if (error != null && PromiseUtils.isCanceled(error)) {\n log.debug('Called handleError on a cancelled promise result');\n return;\n }\n\n log.error('Error generating statistics', error);\n this.setState({\n error,\n loading: false,\n statistics: null,\n });\n }\n\n render(): React.ReactElement {\n const { column, model } = this.props;\n const { error, loading, statistics, numRows } = this.state;\n const showGenerateStatistics =\n !loading &&\n error == null &&\n statistics == null &&\n model.isColumnStatisticsAvailable;\n const statisticElements = [];\n const columnType = column.type.substring(column.type.lastIndexOf('.') + 1);\n const description = column.description === null ? null : column.description;\n if (statistics != null) {\n for (let i = 0; i < statistics.length; i += 1) {\n const { operation, className, value, type } = statistics[i];\n const formattedValue = !type\n ? model.displayString(value, column.type, column.name)\n : model.displayString(value, type);\n const statisticElement = (\n <React.Fragment key={operation}>\n <div\n className={classNames('column-statistic-operation', className)}\n >\n {operation}\n </div>\n <div className=\"column-statistic-value\">{formattedValue}</div>\n </React.Fragment>\n );\n statisticElements.push(statisticElement);\n }\n }\n const rowCountLabel =\n isExpandableGridModel(model) && model.hasExpandableRows\n ? 'Expanded Rows'\n : 'Number of Rows';\n const formattedRowCount = model.displayString(numRows, 'long');\n const columnIndex = model.getColumnIndexByName(column.name);\n return (\n <div className=\"column-statistics\">\n <div className=\"column-statistics-title\">\n {column.name}\n <span className=\"column-statistics-type\">&nbsp;({columnType})</span>\n <CopyButton\n className=\"column-statistics-copy\"\n tooltip=\"Copy column name\"\n copy={column.name}\n />\n </div>\n {description != null && (\n <div className=\"column-statistics-description\">{description}</div>\n )}\n {columnIndex != null && !model.isColumnSortable(columnIndex) && (\n <div className=\"column-statistics-status\">\n <FontAwesomeIcon icon={dhSortSlash} className=\"mr-1\" />\n Not sortable\n </div>\n )}\n {columnIndex != null && !model.isColumnMovable(columnIndex) && (\n <div className=\"column-statistics-status\">\n <FontAwesomeIcon\n icon={model.isColumnFrozen(columnIndex) ? dhFreeze : vsLock}\n className=\"mr-1\"\n />\n {model.isColumnFrozen(columnIndex) ? 'Frozen' : 'Not movable'}\n </div>\n )}\n <div className=\"column-statistics-grid\">\n {statistics == null && (\n <>\n <div className=\"column-statistic-operation\">{rowCountLabel}</div>\n <div className=\"column-statistic-value\">{formattedRowCount}</div>\n </>\n )}\n\n {statisticElements}\n </div>\n {showGenerateStatistics && (\n <Button\n kind=\"ghost\"\n className=\"px-0\"\n onClick={this.handleGenerateStatistics}\n >\n Generate Stats\n </Button>\n )}\n {error != null && <div className=\"error-message\">{`${error}`}</div>}\n {statistics && !loading && (\n <Button\n kind=\"ghost\"\n className=\"px-0\"\n onClick={this.handleGenerateStatistics}\n icon={<FontAwesomeIcon icon={dhRefresh} className=\"mr-1\" />}\n >\n Refresh\n </Button>\n )}\n {loading && (\n <div className=\"column-statistics-loading\">\n <LoadingSpinner className=\"mr-2\" />\n Calculating Stats...\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default ColumnStatistics;\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=CommonTypes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommonTypes.js","names":[],"sources":["../src/CommonTypes.tsx"],"sourcesContent":["import { AdvancedFilterOptions } from '@deephaven/jsapi-utils';\nimport { ModelIndex } from '@deephaven/grid';\nimport type {\n TotalsTableConfig,\n FilterCondition,\n Format,\n} from '@deephaven/jsapi-types';\nimport { Shortcut } from '@deephaven/components';\nimport { IconDefinition } from '@deephaven/icons';\nimport AggregationOperation from './sidebar/aggregations/AggregationOperation';\nimport { OptionType } from './sidebar';\n\nexport type RowIndex = ModelIndex;\n\nexport type { AdvancedFilterOptions };\nexport type ColumnName = string;\nexport type AdvancedFilterMap = Map<ModelIndex, AdvancedFilter>;\nexport type QuickFilterMap = Map<ModelIndex, QuickFilter>;\nexport type ReadonlyAdvancedFilterMap = ReadonlyMap<ModelIndex, AdvancedFilter>;\nexport type ReadonlyQuickFilterMap = ReadonlyMap<ModelIndex, QuickFilter>;\nexport type ReadonlyAggregationMap = Readonly<\n Record<AggregationOperation, readonly ColumnName[]>\n>;\nexport type OperationMap = Record<ColumnName, readonly AggregationOperation[]>;\nexport type ReadonlyOperationMap = Readonly<\n Record<ColumnName, readonly AggregationOperation[]>\n>;\n\nexport type QuickFilter = {\n text: string;\n filter: FilterCondition | null;\n};\n\nexport type AdvancedFilter = {\n filter: FilterCondition | null;\n options: AdvancedFilterOptions;\n};\n\nexport type Action = {\n action: () => void;\n shortcut: Shortcut;\n};\n\nexport type OptionItem = {\n type: OptionType;\n title: string;\n subtitle?: string;\n icon?: IconDefinition;\n isOn?: boolean;\n onChange?: () => void;\n};\n\nexport interface UITotalsTableConfig extends TotalsTableConfig {\n operationOrder: AggregationOperation[];\n showOnTop: boolean;\n}\n\nexport type InputFilter = {\n name: string;\n type: string;\n value: string;\n excludePanelIds?: (string | string[])[];\n};\n\nexport interface UIRow {\n data: Map<ModelIndex, CellData>;\n}\n\nexport type UIViewportData<R extends UIRow = UIRow> = {\n offset: number;\n rows: R[];\n};\nexport type RowData<T = unknown> = Map<number, { value: T }>;\n\nexport type CellData = {\n value: unknown;\n format?: Format;\n};\nexport type PendingDataMap<R extends UIRow = UIRow> = ReadonlyMap<RowIndex, R>;\n\n/** Maps from a row index to the errors for that row */\nexport type PendingDataErrorMap<T extends Error = Error> = ReadonlyMap<\n RowIndex,\n readonly T[]\n>;\n"],"mappings":""}
@@ -1,35 +0,0 @@
1
- /* stylelint-disable scss/at-import-no-partial-leading-underscore */
2
- .cross-column-container {
3
- display: flex;
4
- flex-direction: row;
5
- margin: 0.25rem;
6
- align-items: stretch;
7
- flex: 0 1 auto;
8
- }
9
- .cross-column-container .cross-column-search {
10
- flex: 1;
11
- margin-right: 0.25rem;
12
- }
13
-
14
- .cross-column-popup {
15
- padding: 0.5rem 1rem 0.1rem;
16
- }
17
- .cross-column-popup .cross-column-scroll {
18
- display: grid;
19
- grid-template-columns: max-content auto;
20
- grid-column-gap: 0.5rem;
21
- grid-row-gap: 0;
22
- overflow-y: auto;
23
- max-height: 15rem;
24
- padding: 0.2rem 0.5rem;
25
- border: 1px solid #929192;
26
- }
27
-
28
- .cross-column-button-bar {
29
- display: flex;
30
- }
31
- .cross-column-button-bar :last-child {
32
- margin-left: auto;
33
- }
34
-
35
- /*# sourceMappingURL=CrossColumnSearch.css.map */
@@ -1 +0,0 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../src/CrossColumnSearch.scss","../../../node_modules/@deephaven/components/scss/new_variables.scss"],"names":[],"mappings":"AAAA;ACEA;EACE;EACA;EACA,QCHS;EDIT;EACA;;AACA;EACE;EACA,cCRO;;;ADYX;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;;AACA;EACE","file":"CrossColumnSearch.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n.cross-column-container {\n display: flex;\n flex-direction: row;\n margin: $spacer-1;\n align-items: stretch;\n flex: 0 1 auto;\n .cross-column-search {\n flex: 1;\n margin-right: $spacer-1;\n }\n}\n\n.cross-column-popup {\n padding: 0.5rem 1rem 0.1rem;\n\n .cross-column-scroll {\n display: grid;\n grid-template-columns: max-content auto;\n grid-column-gap: 0.5rem;\n grid-row-gap: 0;\n overflow-y: auto;\n max-height: 15rem;\n padding: 0.2rem 0.5rem;\n border: $input-border-width solid $input-border-color;\n }\n}\n\n.cross-column-button-bar {\n display: flex;\n :last-child {\n margin-left: auto;\n }\n}\n","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n"]}
@@ -1,199 +0,0 @@
1
- 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; }
2
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
- 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); }
4
- import React, { PureComponent } from 'react';
5
- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
6
- import { Checkbox, Popper, SearchInput, Tooltip } from '@deephaven/components';
7
- import { dhGearFilled, dhCheckSquare, dhSquareFilled, dhRemoveSquareFilled, dhWarningCircleFilled, vsCircleLargeFilled } from '@deephaven/icons';
8
- import { TableUtils } from '@deephaven/jsapi-utils';
9
- import "./CrossColumnSearch.css";
10
- class CrossColumnSearch extends PureComponent {
11
- static createSearchFilter(dh, searchValue, selectedColumns, columns, invertSelection) {
12
- var filterColumns = invertSelection ? columns.filter(column => !selectedColumns.includes(column.name)).map(column => column.name) : selectedColumns;
13
- if (searchValue && filterColumns.length > 0) {
14
- var filterValue = dh.FilterValue.ofString(searchValue);
15
- var searchFilter = filterColumns.length === columns.length ? dh.FilterCondition.search(filterValue) : dh.FilterCondition.search(filterValue, columns.filter(column => filterColumns.includes(column.name)).map(column => column.filter()));
16
- return searchFilter;
17
- }
18
- return undefined;
19
- }
20
- constructor(props) {
21
- super(props);
22
- _defineProperty(this, "searchField", void 0);
23
- this.handleSearchValueChange = this.handleSearchValueChange.bind(this);
24
- this.toggleColumn = this.toggleColumn.bind(this);
25
- this.selectAll = this.selectAll.bind(this);
26
- this.clear = this.clear.bind(this);
27
- this.selectNumbers = this.selectNumbers.bind(this);
28
- this.searchField = /*#__PURE__*/React.createRef();
29
- this.state = {
30
- isConfigureColumnsShown: false
31
- };
32
- }
33
- focus() {
34
- var _this$searchField$cur;
35
- (_this$searchField$cur = this.searchField.current) === null || _this$searchField$cur === void 0 ? void 0 : _this$searchField$cur.focus();
36
- }
37
- handleSearchValueChange(event) {
38
- var {
39
- onChange,
40
- selectedColumns,
41
- invertSelection
42
- } = this.props;
43
- onChange(event.target.value, selectedColumns, invertSelection);
44
- }
45
- sendColumnChange(selectedColumns, invertSelection) {
46
- var {
47
- onChange,
48
- value
49
- } = this.props;
50
- onChange(value, selectedColumns, invertSelection);
51
- }
52
- setInvertSelection(invertSelection) {
53
- var {
54
- onChange,
55
- value
56
- } = this.props;
57
- onChange(value, [], invertSelection);
58
- }
59
- toggleColumn(name) {
60
- var {
61
- selectedColumns,
62
- invertSelection
63
- } = this.props;
64
- if (selectedColumns.includes(name)) {
65
- this.sendColumnChange(selectedColumns.filter(c => c !== name), invertSelection);
66
- } else {
67
- var update = selectedColumns.slice();
68
- update.push(name);
69
- this.sendColumnChange(update, invertSelection);
70
- }
71
- }
72
- selectAll() {
73
- this.setInvertSelection(true);
74
- }
75
- clear() {
76
- this.setInvertSelection(false);
77
- }
78
- selectNumbers() {
79
- var {
80
- columns
81
- } = this.props;
82
- this.sendColumnChange(columns.filter(c => TableUtils.isNumberType(c.type)).map(column => column.name), false);
83
- }
84
- render() {
85
- var {
86
- value,
87
- selectedColumns,
88
- invertSelection,
89
- columns
90
- } = this.props;
91
- var {
92
- isConfigureColumnsShown
93
- } = this.state;
94
- var hasAllColumnsSelected = selectedColumns.length === 0 && invertSelection === true || selectedColumns.length === columns.length && invertSelection === false;
95
- var hasNoColumnsSelected = selectedColumns.length === 0 && invertSelection === false || selectedColumns.length === columns.length && invertSelection === true;
96
-
97
- // set icon layers
98
- var icon;
99
- if (hasAllColumnsSelected) {
100
- // icon if all columns selected for search
101
- icon = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
102
- icon: dhSquareFilled,
103
- mask: dhGearFilled,
104
- transform: "shrink-2 down-5 right-7"
105
- }), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
106
- icon: dhCheckSquare,
107
- className: "text-primary",
108
- transform: "shrink-4 down-5 right-7"
109
- }));
110
- } else if (hasNoColumnsSelected) {
111
- // icon error, no columns selected for searching
112
- icon = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
113
- icon: vsCircleLargeFilled,
114
- mask: dhGearFilled,
115
- transform: "shrink-1 down-5 right-7"
116
- }), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
117
- icon: dhWarningCircleFilled,
118
- className: "text-danger",
119
- transform: "shrink-4 down-5 right-7"
120
- }));
121
- } else {
122
- // icon if some columns selected, but not all
123
- icon = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
124
- icon: dhSquareFilled,
125
- mask: dhGearFilled,
126
- transform: "shrink-2 down-5 right-7"
127
- }), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
128
- icon: dhRemoveSquareFilled,
129
- className: "text-primary",
130
- transform: "shrink-4 down-5 right-7"
131
- }));
132
- }
133
- return /*#__PURE__*/React.createElement("div", {
134
- className: "cross-column-container"
135
- }, /*#__PURE__*/React.createElement(SearchInput, {
136
- className: "cross-column-search",
137
- placeholder: "Search Data...",
138
- value: value,
139
- onChange: this.handleSearchValueChange,
140
- ref: this.searchField
141
- }), /*#__PURE__*/React.createElement("button", {
142
- type: "button",
143
- className: "btn btn-link btn-link-icon px-2",
144
- onClick: () => {
145
- if (isConfigureColumnsShown) {
146
- this.setState({
147
- isConfigureColumnsShown: false
148
- });
149
- } else {
150
- this.setState({
151
- isConfigureColumnsShown: true
152
- });
153
- }
154
- }
155
- }, /*#__PURE__*/React.createElement("div", {
156
- className: "fa-layers"
157
- }, icon), /*#__PURE__*/React.createElement(Tooltip, null, "Configure Columns"), /*#__PURE__*/React.createElement(Popper, {
158
- isShown: isConfigureColumnsShown,
159
- className: "cross-column-popper",
160
- onExited: () => {
161
- this.setState({
162
- isConfigureColumnsShown: false
163
- });
164
- },
165
- closeOnBlur: true,
166
- interactive: true
167
- }, /*#__PURE__*/React.createElement("div", {
168
- className: "cross-column-popup"
169
- }, "Searched Columns", /*#__PURE__*/React.createElement("div", {
170
- className: "cross-column-scroll"
171
- }, columns.map(column => /*#__PURE__*/React.createElement(React.Fragment, {
172
- key: column.name
173
- }, /*#__PURE__*/React.createElement(Checkbox, {
174
- className: "cross-column-checkbox",
175
- checked: invertSelection ? !selectedColumns.includes(column.name) : selectedColumns.includes(column.name),
176
- onChange: () => this.toggleColumn(column.name)
177
- }, column.name), column.type.substring(column.type.lastIndexOf('.') + 1)))), /*#__PURE__*/React.createElement("div", {
178
- className: "cross-column-button-bar"
179
- }, /*#__PURE__*/React.createElement("button", {
180
- type: "button",
181
- className: "btn btn-link",
182
- onClick: this.selectAll
183
- }, "Select All"), /*#__PURE__*/React.createElement("button", {
184
- type: "button",
185
- className: "btn btn-link",
186
- onClick: this.clear
187
- }, "Clear"), /*#__PURE__*/React.createElement("button", {
188
- type: "button",
189
- className: "btn btn-link",
190
- onClick: this.selectNumbers
191
- }, "Numbers Only")), hasNoColumnsSelected && /*#__PURE__*/React.createElement("p", {
192
- className: "text-danger"
193
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
194
- icon: dhWarningCircleFilled
195
- }), " Select at least one column to search.")))));
196
- }
197
- }
198
- export default CrossColumnSearch;
199
- //# sourceMappingURL=CrossColumnSearch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CrossColumnSearch.js","names":["React","PureComponent","FontAwesomeIcon","Checkbox","Popper","SearchInput","Tooltip","dhGearFilled","dhCheckSquare","dhSquareFilled","dhRemoveSquareFilled","dhWarningCircleFilled","vsCircleLargeFilled","TableUtils","CrossColumnSearch","createSearchFilter","dh","searchValue","selectedColumns","columns","invertSelection","filterColumns","filter","column","includes","name","map","length","filterValue","FilterValue","ofString","searchFilter","FilterCondition","search","undefined","constructor","props","handleSearchValueChange","bind","toggleColumn","selectAll","clear","selectNumbers","searchField","createRef","state","isConfigureColumnsShown","focus","current","event","onChange","target","value","sendColumnChange","setInvertSelection","c","update","slice","push","isNumberType","type","render","hasAllColumnsSelected","hasNoColumnsSelected","icon","setState","substring","lastIndexOf"],"sources":["../src/CrossColumnSearch.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Checkbox, Popper, SearchInput, Tooltip } from '@deephaven/components';\nimport {\n dhGearFilled,\n dhCheckSquare,\n dhSquareFilled,\n dhRemoveSquareFilled,\n dhWarningCircleFilled,\n vsCircleLargeFilled,\n} from '@deephaven/icons';\nimport type {\n Column,\n dh as DhType,\n FilterCondition,\n} from '@deephaven/jsapi-types';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport './CrossColumnSearch.scss';\nimport { ColumnName } from './CommonTypes';\n\ninterface CrossColumnSearchProps {\n value: string;\n selectedColumns: readonly ColumnName[];\n invertSelection: boolean;\n onChange: (\n value: string,\n selectedColumns: readonly ColumnName[],\n invertSelection: boolean\n ) => void;\n columns: readonly Column[];\n}\n\ninterface CrossColumnSearchState {\n isConfigureColumnsShown: boolean;\n}\nclass CrossColumnSearch extends PureComponent<\n CrossColumnSearchProps,\n CrossColumnSearchState\n> {\n static createSearchFilter(\n dh: DhType,\n searchValue: string,\n selectedColumns: readonly ColumnName[],\n columns: readonly Column[],\n invertSelection: boolean\n ): FilterCondition | undefined {\n const filterColumns = invertSelection\n ? columns\n .filter(column => !selectedColumns.includes(column.name))\n .map(column => column.name)\n : selectedColumns;\n if (searchValue && filterColumns.length > 0) {\n const filterValue = dh.FilterValue.ofString(searchValue);\n const searchFilter =\n filterColumns.length === columns.length\n ? dh.FilterCondition.search(filterValue)\n : dh.FilterCondition.search(\n filterValue,\n columns\n .filter(column => filterColumns.includes(column.name))\n .map(column => column.filter())\n );\n return searchFilter;\n }\n return undefined;\n }\n\n constructor(props: CrossColumnSearchProps) {\n super(props);\n this.handleSearchValueChange = this.handleSearchValueChange.bind(this);\n this.toggleColumn = this.toggleColumn.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n this.selectNumbers = this.selectNumbers.bind(this);\n\n this.searchField = React.createRef();\n\n this.state = {\n isConfigureColumnsShown: false,\n };\n }\n\n searchField: React.RefObject<SearchInput>;\n\n focus(): void {\n this.searchField.current?.focus();\n }\n\n handleSearchValueChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const { onChange, selectedColumns, invertSelection } = this.props;\n onChange(event.target.value, selectedColumns, invertSelection);\n }\n\n sendColumnChange(\n selectedColumns: readonly ColumnName[],\n invertSelection: boolean\n ): void {\n const { onChange, value } = this.props;\n onChange(value, selectedColumns, invertSelection);\n }\n\n setInvertSelection(invertSelection: boolean): void {\n const { onChange, value } = this.props;\n onChange(value, [], invertSelection);\n }\n\n toggleColumn(name: string): void {\n const { selectedColumns, invertSelection } = this.props;\n if (selectedColumns.includes(name)) {\n this.sendColumnChange(\n selectedColumns.filter(c => c !== name),\n invertSelection\n );\n } else {\n const update = selectedColumns.slice();\n update.push(name);\n this.sendColumnChange(update, invertSelection);\n }\n }\n\n selectAll(): void {\n this.setInvertSelection(true);\n }\n\n clear(): void {\n this.setInvertSelection(false);\n }\n\n selectNumbers(): void {\n const { columns } = this.props;\n this.sendColumnChange(\n columns\n .filter(c => TableUtils.isNumberType(c.type))\n .map(column => column.name),\n false\n );\n }\n\n render(): React.ReactElement {\n const { value, selectedColumns, invertSelection, columns } = this.props;\n const { isConfigureColumnsShown } = this.state;\n const hasAllColumnsSelected =\n (selectedColumns.length === 0 && invertSelection === true) ||\n (selectedColumns.length === columns.length && invertSelection === false);\n const hasNoColumnsSelected =\n (selectedColumns.length === 0 && invertSelection === false) ||\n (selectedColumns.length === columns.length && invertSelection === true);\n\n // set icon layers\n let icon;\n if (hasAllColumnsSelected) {\n // icon if all columns selected for search\n icon = (\n <>\n <FontAwesomeIcon\n icon={dhSquareFilled}\n mask={dhGearFilled}\n transform=\"shrink-2 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhCheckSquare}\n className=\"text-primary\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n } else if (hasNoColumnsSelected) {\n // icon error, no columns selected for searching\n icon = (\n <>\n <FontAwesomeIcon\n icon={vsCircleLargeFilled}\n mask={dhGearFilled}\n transform=\"shrink-1 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhWarningCircleFilled}\n className=\"text-danger\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n } else {\n // icon if some columns selected, but not all\n icon = (\n <>\n <FontAwesomeIcon\n icon={dhSquareFilled}\n mask={dhGearFilled}\n transform=\"shrink-2 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhRemoveSquareFilled}\n className=\"text-primary\"\n transform=\"shrink-4 down-5 right-7\"\n />\n </>\n );\n }\n\n return (\n <div className=\"cross-column-container\">\n <SearchInput\n className=\"cross-column-search\"\n placeholder=\"Search Data...\"\n value={value}\n onChange={this.handleSearchValueChange}\n ref={this.searchField}\n />\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon px-2\"\n onClick={() => {\n if (isConfigureColumnsShown) {\n this.setState({ isConfigureColumnsShown: false });\n } else {\n this.setState({ isConfigureColumnsShown: true });\n }\n }}\n >\n <div className=\"fa-layers\">{icon}</div>\n <Tooltip>Configure Columns</Tooltip>\n <Popper\n isShown={isConfigureColumnsShown}\n className=\"cross-column-popper\"\n onExited={() => {\n this.setState({ isConfigureColumnsShown: false });\n }}\n closeOnBlur\n interactive\n >\n <div className=\"cross-column-popup\">\n Searched Columns\n <div className=\"cross-column-scroll\">\n {columns.map(column => (\n <React.Fragment key={column.name}>\n <Checkbox\n className=\"cross-column-checkbox\"\n checked={\n invertSelection\n ? !selectedColumns.includes(column.name)\n : selectedColumns.includes(column.name)\n }\n onChange={() => this.toggleColumn(column.name)}\n >\n {column.name}\n </Checkbox>\n\n {column.type.substring(column.type.lastIndexOf('.') + 1)}\n </React.Fragment>\n ))}\n </div>\n <div className=\"cross-column-button-bar\">\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.selectAll}\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.clear}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.selectNumbers}\n >\n Numbers Only\n </button>\n </div>\n {hasNoColumnsSelected && (\n <p className=\"text-danger\">\n <FontAwesomeIcon icon={dhWarningCircleFilled} /> Select at\n least one column to search.\n </p>\n )}\n </div>\n </Popper>\n </button>\n </div>\n );\n }\n}\n\nexport default CrossColumnSearch;\n"],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- /* stylelint-disable scss/at-import-no-partial-leading-underscore */
2
- .iris-grid-input-autosized-wrapper {
3
- position: absolute;
4
- display: inline-grid;
5
- height: 100%;
6
- align-items: center;
7
- z-index: 1;
8
- }
9
- .iris-grid-input-autosized-wrapper .advanced-filter-button {
10
- position: absolute;
11
- top: 2px;
12
- right: 0.25rem;
13
- height: 23px;
14
- margin: 0;
15
- }
16
- .iris-grid-input-autosized-wrapper::after {
17
- content: attr(data-value) " ";
18
- width: auto;
19
- height: 100%;
20
- border: 1px solid;
21
- padding: 6px 2px 3px 3px;
22
- margin-right: 24px;
23
- overflow: hidden;
24
- visibility: hidden;
25
- white-space: nowrap;
26
- grid-area: 1/1;
27
- }
28
- .iris-grid-input-autosized-wrapper .iris-grid-input-field {
29
- position: absolute;
30
- color: #f0f0ee;
31
- background: #373438;
32
- border: 1px solid #929192;
33
- width: 100%;
34
- height: 100%;
35
- padding: 3px 2px 3px 3px;
36
- border-radius: 1px;
37
- }
38
- .iris-grid-input-autosized-wrapper .iris-grid-input-field.iris-grid-has-filter {
39
- background: #313849;
40
- }
41
- .iris-grid-input-autosized-wrapper .iris-grid-input-field.active {
42
- background: #374d80;
43
- }
44
- .iris-grid-input-autosized-wrapper .iris-grid-input-field:focus {
45
- outline: 0;
46
- border: 1px solid rgba(72, 120, 234, 0.85);
47
- box-shadow: 0 0 0 0.2rem rgba(72, 120, 234, 0.35);
48
- }
49
- .iris-grid-input-autosized-wrapper .iris-grid-input-field.error {
50
- color: #f95d84;
51
- }
52
- .iris-grid-input-autosized-wrapper .iris-grid-input-field.error:focus {
53
- box-shadow: inset 0 0 0 2px #f95d84, 0 0 0 0.2rem rgba(72, 120, 234, 0.35);
54
- }
55
-
56
- /*# sourceMappingURL=FilterInputField.css.map */
@@ -1 +0,0 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../src/FilterInputField.scss","../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACEA;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA,OCVO;EDWP;EACA;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA,OEpBa;EFqBb,YETO;EFUP;EACA;EACA;EACA;EACA;;AAEA;EAEE;;AAGF;EAEE;;AAGF;EACE;EACA;EACA,YEwFuB;;AFrFzB;EACE,OEvDA;;AFwDA;EACE","file":"FilterInputField.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n.iris-grid-input-autosized-wrapper {\n position: absolute;\n display: inline-grid;\n height: 100%;\n align-items: center;\n z-index: 1; // appear above adjacent cell buttons\n\n .advanced-filter-button {\n position: absolute;\n top: 2px;\n right: $spacer-1;\n height: 23px;\n margin: 0;\n }\n\n // hidden element to set width\n &::after {\n content: attr(data-value) ' ';\n width: auto;\n height: 100%;\n border: $input-border-width solid;\n padding: 6px 2px 3px 3px;\n margin-right: 24px; // leave space for filter-button\n overflow: hidden;\n visibility: hidden;\n white-space: nowrap;\n grid-area: 1 / 1;\n }\n\n .iris-grid-input-field {\n position: absolute;\n color: $gray-200;\n background: $gray-800; // same as filter-bar-expanded-bg\n border: 1px solid $input-border-color;\n width: 100%;\n height: 100%;\n padding: 3px 2px 3px 3px;\n border-radius: 1px;\n\n &.iris-grid-has-filter {\n // same as filter-bar-expanded-active-bg\n background: scale-color($primary, $saturation: -75%, $lightness: -60%);\n }\n\n &.active {\n //same as filter-bar-expanded-active-cell-bg\n background: scale-color($primary, $saturation: -50%, $lightness: -40%);\n }\n\n &:focus {\n outline: 0;\n border: 1px solid $input-focus-border-color;\n box-shadow: $input-focus-box-shadow;\n }\n\n &.error {\n color: $danger;\n &:focus {\n box-shadow: inset 0 0 0 2px $danger, $input-focus-box-shadow;\n }\n }\n }\n}\n","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}