@deephaven/dashboard-core-plugins 0.43.0 → 0.44.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 (181) hide show
  1. package/dist/ChartBuilderPlugin.js +54 -0
  2. package/dist/ChartBuilderPlugin.js.map +1 -0
  3. package/dist/ChartPlugin.js +66 -0
  4. package/dist/ChartPlugin.js.map +1 -0
  5. package/dist/ConsolePlugin.js +396 -0
  6. package/dist/ConsolePlugin.js.map +1 -0
  7. package/dist/FilterPlugin.js +205 -0
  8. package/dist/FilterPlugin.js.map +1 -0
  9. package/dist/GridPlugin.js +74 -0
  10. package/dist/GridPlugin.js.map +1 -0
  11. package/dist/LinkerPlugin.js +18 -0
  12. package/dist/LinkerPlugin.js.map +1 -0
  13. package/dist/MarkdownPlugin.js +87 -0
  14. package/dist/MarkdownPlugin.js.map +1 -0
  15. package/dist/PandasPlugin.js +66 -0
  16. package/dist/PandasPlugin.js.map +1 -0
  17. package/dist/controls/ControlType.js +10 -0
  18. package/dist/controls/ControlType.js.map +1 -0
  19. package/dist/controls/dropdown-filter/DropdownFilter.css +86 -0
  20. package/dist/controls/dropdown-filter/DropdownFilter.css.map +1 -0
  21. package/dist/controls/dropdown-filter/DropdownFilter.js +417 -0
  22. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -0
  23. package/dist/controls/input-filter/InputFilter.css +75 -0
  24. package/dist/controls/input-filter/InputFilter.css.map +1 -0
  25. package/dist/controls/input-filter/InputFilter.js +291 -0
  26. package/dist/controls/input-filter/InputFilter.js.map +1 -0
  27. package/dist/controls/markdown/MarkdownContainer.js +30 -0
  28. package/dist/controls/markdown/MarkdownContainer.js.map +1 -0
  29. package/dist/controls/markdown/MarkdownEditor.js +52 -0
  30. package/dist/controls/markdown/MarkdownEditor.js.map +1 -0
  31. package/dist/controls/markdown/MarkdownStartPage.js +109 -0
  32. package/dist/controls/markdown/MarkdownStartPage.js.map +1 -0
  33. package/dist/controls/markdown/MarkdownUtils.js +23 -0
  34. package/dist/controls/markdown/MarkdownUtils.js.map +1 -0
  35. package/dist/events/ChartEvent.js +9 -0
  36. package/dist/events/ChartEvent.js.map +1 -0
  37. package/dist/events/ConsoleEvent.js +11 -0
  38. package/dist/events/ConsoleEvent.js.map +1 -0
  39. package/dist/events/InputFilterEvent.js +14 -0
  40. package/dist/events/InputFilterEvent.js.map +1 -0
  41. package/dist/events/IrisGridEvent.js +12 -0
  42. package/dist/events/IrisGridEvent.js.map +1 -0
  43. package/dist/events/MarkdownEvent.js +4 -0
  44. package/dist/events/MarkdownEvent.js.map +1 -0
  45. package/dist/events/NotebookEvent.js +15 -0
  46. package/dist/events/NotebookEvent.js.map +1 -0
  47. package/dist/events/PQEvent.js +9 -0
  48. package/dist/events/PQEvent.js.map +1 -0
  49. package/dist/events/PandasEvent.js +8 -0
  50. package/dist/events/PandasEvent.js.map +1 -0
  51. package/dist/events/TabEvent.js +12 -0
  52. package/dist/events/TabEvent.js.map +1 -0
  53. package/dist/events/index.js +9 -0
  54. package/dist/events/index.js.map +1 -0
  55. package/dist/index.js +17 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/linker/ColumnSelectionValidator.js +2 -0
  58. package/dist/linker/ColumnSelectionValidator.js.map +1 -0
  59. package/dist/linker/Linker.js +736 -0
  60. package/dist/linker/Linker.js.map +1 -0
  61. package/dist/linker/LinkerLink.css +142 -0
  62. package/dist/linker/LinkerLink.css.map +1 -0
  63. package/dist/linker/LinkerLink.js +314 -0
  64. package/dist/linker/LinkerLink.js.map +1 -0
  65. package/dist/linker/LinkerOverlayContent.css +63 -0
  66. package/dist/linker/LinkerOverlayContent.css.map +1 -0
  67. package/dist/linker/LinkerOverlayContent.js +343 -0
  68. package/dist/linker/LinkerOverlayContent.js.map +1 -0
  69. package/dist/linker/LinkerUtils.js +139 -0
  70. package/dist/linker/LinkerUtils.js.map +1 -0
  71. package/dist/linker/ToolType.js +5 -0
  72. package/dist/linker/ToolType.js.map +1 -0
  73. package/dist/linker/index.js +2 -0
  74. package/dist/linker/index.js.map +1 -0
  75. package/dist/panels/ChartColumnSelectorOverlay.css +11 -0
  76. package/dist/panels/ChartColumnSelectorOverlay.css.map +1 -0
  77. package/dist/panels/ChartColumnSelectorOverlay.js +38 -0
  78. package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -0
  79. package/dist/panels/ChartFilterOverlay.css +22 -0
  80. package/dist/panels/ChartFilterOverlay.css.map +1 -0
  81. package/dist/panels/ChartFilterOverlay.js +90 -0
  82. package/dist/panels/ChartFilterOverlay.js.map +1 -0
  83. package/dist/panels/ChartPanel.css +38 -0
  84. package/dist/panels/ChartPanel.css.map +1 -0
  85. package/dist/panels/ChartPanel.js +971 -0
  86. package/dist/panels/ChartPanel.js.map +1 -0
  87. package/dist/panels/ChartPanelUtils.js +5 -0
  88. package/dist/panels/ChartPanelUtils.js.map +1 -0
  89. package/dist/panels/CommandHistoryPanel.css +19 -0
  90. package/dist/panels/CommandHistoryPanel.css.map +1 -0
  91. package/dist/panels/CommandHistoryPanel.js +195 -0
  92. package/dist/panels/CommandHistoryPanel.js.map +1 -0
  93. package/dist/panels/ConsolePanel.css +19 -0
  94. package/dist/panels/ConsolePanel.css.map +1 -0
  95. package/dist/panels/ConsolePanel.js +365 -0
  96. package/dist/panels/ConsolePanel.js.map +1 -0
  97. package/dist/panels/DropdownFilterPanel.css +6 -0
  98. package/dist/panels/DropdownFilterPanel.css.map +1 -0
  99. package/dist/panels/DropdownFilterPanel.js +685 -0
  100. package/dist/panels/DropdownFilterPanel.js.map +1 -0
  101. package/dist/panels/FileExplorerPanel.css +6 -0
  102. package/dist/panels/FileExplorerPanel.css.map +1 -0
  103. package/dist/panels/FileExplorerPanel.js +252 -0
  104. package/dist/panels/FileExplorerPanel.js.map +1 -0
  105. package/dist/panels/FilterSetManager.css +112 -0
  106. package/dist/panels/FilterSetManager.css.map +1 -0
  107. package/dist/panels/FilterSetManager.js +689 -0
  108. package/dist/panels/FilterSetManager.js.map +1 -0
  109. package/dist/panels/FilterSetManagerPanel.css +34 -0
  110. package/dist/panels/FilterSetManagerPanel.css.map +1 -0
  111. package/dist/panels/FilterSetManagerPanel.js +345 -0
  112. package/dist/panels/FilterSetManagerPanel.js.map +1 -0
  113. package/dist/panels/InputFilterPanel.js +232 -0
  114. package/dist/panels/InputFilterPanel.js.map +1 -0
  115. package/dist/panels/IrisGridPanel.css +24 -0
  116. package/dist/panels/IrisGridPanel.css.map +1 -0
  117. package/dist/panels/IrisGridPanel.js +1018 -0
  118. package/dist/panels/IrisGridPanel.js.map +1 -0
  119. package/dist/panels/IrisGridPanelTooltip.js +39 -0
  120. package/dist/panels/IrisGridPanelTooltip.js.map +1 -0
  121. package/dist/panels/LogPanel.css +15 -0
  122. package/dist/panels/LogPanel.css.map +1 -0
  123. package/dist/panels/LogPanel.js +110 -0
  124. package/dist/panels/LogPanel.js.map +1 -0
  125. package/dist/panels/MarkdownNotebook.css +107 -0
  126. package/dist/panels/MarkdownNotebook.css.map +1 -0
  127. package/dist/panels/MarkdownNotebook.js +232 -0
  128. package/dist/panels/MarkdownNotebook.js.map +1 -0
  129. package/dist/panels/MarkdownPanel.css +90 -0
  130. package/dist/panels/MarkdownPanel.css.map +1 -0
  131. package/dist/panels/MarkdownPanel.js +202 -0
  132. package/dist/panels/MarkdownPanel.js.map +1 -0
  133. package/dist/panels/MockFileStorage.js +70 -0
  134. package/dist/panels/MockFileStorage.js.map +1 -0
  135. package/dist/panels/MockFileStorageTable.js +80 -0
  136. package/dist/panels/MockFileStorageTable.js.map +1 -0
  137. package/dist/panels/NotebookPanel.css +44 -0
  138. package/dist/panels/NotebookPanel.css.map +1 -0
  139. package/dist/panels/NotebookPanel.js +1224 -0
  140. package/dist/panels/NotebookPanel.js.map +1 -0
  141. package/dist/panels/PandasPanel.css +15 -0
  142. package/dist/panels/PandasPanel.css.map +1 -0
  143. package/dist/panels/PandasPanel.js +86 -0
  144. package/dist/panels/PandasPanel.js.map +1 -0
  145. package/dist/panels/Panel.js +314 -0
  146. package/dist/panels/Panel.js.map +1 -0
  147. package/dist/panels/PanelContextMenu.js +126 -0
  148. package/dist/panels/PanelContextMenu.js.map +1 -0
  149. package/dist/panels/RenameDialog.js +156 -0
  150. package/dist/panels/RenameDialog.js.map +1 -0
  151. package/dist/panels/WidgetPanel.css +17 -0
  152. package/dist/panels/WidgetPanel.css.map +1 -0
  153. package/dist/panels/WidgetPanel.js +189 -0
  154. package/dist/panels/WidgetPanel.js.map +1 -0
  155. package/dist/panels/WidgetPanelTooltip.css +40 -0
  156. package/dist/panels/WidgetPanelTooltip.css.map +1 -0
  157. package/dist/panels/WidgetPanelTooltip.js +49 -0
  158. package/dist/panels/WidgetPanelTooltip.js.map +1 -0
  159. package/dist/panels/index.js +22 -0
  160. package/dist/panels/index.js.map +1 -0
  161. package/dist/prop-types/CommonPropTypes.js +9 -0
  162. package/dist/prop-types/CommonPropTypes.js.map +1 -0
  163. package/dist/prop-types/UIPropTypes.js +42 -0
  164. package/dist/prop-types/UIPropTypes.js.map +1 -0
  165. package/dist/prop-types/index.js +3 -0
  166. package/dist/prop-types/index.js.map +1 -0
  167. package/dist/redux/actionTypes.js +3 -0
  168. package/dist/redux/actionTypes.js.map +1 -0
  169. package/dist/redux/actions.js +88 -0
  170. package/dist/redux/actions.js.map +1 -0
  171. package/dist/redux/index.js +10 -0
  172. package/dist/redux/index.js.map +1 -0
  173. package/dist/redux/reducers/connection.js +7 -0
  174. package/dist/redux/reducers/connection.js.map +1 -0
  175. package/dist/redux/reducers/index.js +5 -0
  176. package/dist/redux/reducers/index.js.map +1 -0
  177. package/dist/redux/reducers/sessionWrapper.js +7 -0
  178. package/dist/redux/reducers/sessionWrapper.js.map +1 -0
  179. package/dist/redux/selectors.js +92 -0
  180. package/dist/redux/selectors.js.map +1 -0
  181. package/package.json +22 -22
@@ -0,0 +1,689 @@
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
+ /* eslint-disable jsx-a11y/click-events-have-key-events */
7
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
8
+ // background click is just a convenience method, not an actual a11y issue
9
+
10
+ import React, { Component } from 'react';
11
+ import memoizeOne from 'memoize-one';
12
+ import shortid from 'shortid';
13
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
14
+ import { vsEdit, vsGear, vsSave, vsCircleSlash, vsTrash, vsDeviceCamera, dhRefresh, dhNewCircleLargeFilled, vsCircleLargeFilled, vsArrowSmallUp } from '@deephaven/icons';
15
+ import Log from '@deephaven/log';
16
+ import { Button, CardFlip, RadioGroup, RadioItem } from '@deephaven/components';
17
+ import "./FilterSetManager.css";
18
+ var log = Log.module('FilterSetManager');
19
+ var NAME_INPUT_PLACEHOLDER = 'Enter name...';
20
+ var EMPTY_LIST_PLACEHOLDER = 'No Available Filter Sets';
21
+ class FilterSetManager extends Component {
22
+ static animateScreenFlash() {
23
+ var _document$querySelect;
24
+ var overlay = document.createElement('div');
25
+ overlay.classList.add('screen-flash-overlay');
26
+ overlay.addEventListener('animationend', () => {
27
+ // Removing the element removes its event listeners
28
+ overlay.remove();
29
+ });
30
+ (_document$querySelect = document.querySelector('body')) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.appendChild(overlay);
31
+ }
32
+ constructor(props) {
33
+ super(props);
34
+ _defineProperty(this, "renameInputRef", /*#__PURE__*/React.createRef());
35
+ _defineProperty(this, "dropdownRef", /*#__PURE__*/React.createRef());
36
+ _defineProperty(this, "editDropdownRef", /*#__PURE__*/React.createRef());
37
+ _defineProperty(this, "isRenamingExistingSet", memoizeOne((filterSets, renameSet) => renameSet !== undefined && filterSets.some(_ref => {
38
+ var {
39
+ id
40
+ } = _ref;
41
+ return id === renameSet.id;
42
+ })));
43
+ this.handleSettingsCancel = this.handleSettingsCancel.bind(this);
44
+ this.handleSettingsClick = this.handleSettingsClick.bind(this);
45
+ this.handleSettingsSave = this.handleSettingsSave.bind(this);
46
+ this.handleBackgroundClick = this.handleBackgroundClick.bind(this);
47
+ this.handleEditDropdownChange = this.handleEditDropdownChange.bind(this);
48
+ this.handleFilterChange = this.handleFilterChange.bind(this);
49
+ this.handleFilterApply = this.handleFilterApply.bind(this);
50
+ this.handleCaptureNewSet = this.handleCaptureNewSet.bind(this);
51
+ this.handleNameInputChange = this.handleNameInputChange.bind(this);
52
+ this.handleNameInputKeyPress = this.handleNameInputKeyPress.bind(this);
53
+ this.handleRenameConfirm = this.handleRenameConfirm.bind(this);
54
+ this.handleRenameCancel = this.handleRenameCancel.bind(this);
55
+ this.handleRestoreFullStateChange = this.handleRestoreFullStateChange.bind(this);
56
+ this.handleSetDelete = this.handleSetDelete.bind(this);
57
+ this.handleSetEdit = this.handleSetEdit.bind(this);
58
+ this.handleSetUpdate = this.handleSetUpdate.bind(this);
59
+ this.state = {
60
+ editId: undefined,
61
+ renameSet: undefined,
62
+ nameInputValue: '',
63
+ nameInputError: undefined,
64
+ modifiedFilterSets: [],
65
+ restoreFullState: false
66
+ };
67
+ }
68
+ componentDidMount() {
69
+ var {
70
+ isValueShown
71
+ } = this.props;
72
+ if (isValueShown) {
73
+ this.updateSelectedId();
74
+ } else {
75
+ this.initSettingsScreen();
76
+ }
77
+ }
78
+ componentDidUpdate(prevProps, prevState) {
79
+ var {
80
+ isValueShown,
81
+ filterSets
82
+ } = this.props;
83
+ var {
84
+ modifiedFilterSets
85
+ } = this.state;
86
+ if (prevProps.isValueShown && !isValueShown) {
87
+ this.initSettingsScreen();
88
+ }
89
+ if (this.isNameInputScreen() && !this.isNameInputScreen(prevState)) {
90
+ this.focusRenameInput();
91
+ }
92
+ if (filterSets !== prevProps.filterSets) {
93
+ if (!isValueShown && filterSets.length > 0 && prevProps.filterSets.length === 0 && modifiedFilterSets.length === 0) {
94
+ // Filter set added from another panel, flip from the settings side/initial screen to the value side
95
+ var {
96
+ onChange: _onChange
97
+ } = this.props;
98
+ _onChange({
99
+ isValueShown: true,
100
+ selectedId: filterSets[0].id
101
+ });
102
+ } else {
103
+ this.updateSelectedId();
104
+ }
105
+ }
106
+ }
107
+ initSettingsScreen() {
108
+ var {
109
+ filterSets,
110
+ selectedId
111
+ } = this.props;
112
+ log.debug('initSettingsScreen', filterSets, selectedId);
113
+ this.setState({
114
+ modifiedFilterSets: [...filterSets],
115
+ editId: selectedId
116
+ });
117
+ }
118
+
119
+ // Update selected id without applying the new set on filterSets change
120
+ updateSelectedId() {
121
+ var {
122
+ isValueShown,
123
+ filterSets,
124
+ selectedId,
125
+ onChange
126
+ } = this.props;
127
+ log.debug('updateSelectedId', filterSets, selectedId);
128
+ if (!isValueShown) {
129
+ return;
130
+ }
131
+ if (!filterSets.some(_ref2 => {
132
+ var {
133
+ id
134
+ } = _ref2;
135
+ return id === selectedId;
136
+ })) {
137
+ // Update the selection if selectedId doesn't exist in the list
138
+ // Flip to the settings side for empty list to show the initial screen
139
+ var isEmptyList = filterSets.length === 0;
140
+ onChange({
141
+ isValueShown: !isEmptyList,
142
+ selectedId: isEmptyList ? undefined : filterSets[0].id
143
+ });
144
+ }
145
+ }
146
+ handleEditDropdownChange(event) {
147
+ var {
148
+ value: editId
149
+ } = event.target;
150
+ this.setState({
151
+ editId
152
+ });
153
+ }
154
+ handleFilterChange(event) {
155
+ var {
156
+ value: selectedId
157
+ } = event.target;
158
+ var {
159
+ isValueShown,
160
+ onChange
161
+ } = this.props;
162
+ this.applyFilterSet(selectedId);
163
+ onChange({
164
+ isValueShown,
165
+ selectedId
166
+ });
167
+ }
168
+ handleFilterApply() {
169
+ var {
170
+ selectedId
171
+ } = this.props;
172
+ this.applyFilterSet(selectedId);
173
+ }
174
+ handleSettingsCancel() {
175
+ var {
176
+ onChange,
177
+ selectedId,
178
+ filterSets
179
+ } = this.props;
180
+ this.setState({
181
+ modifiedFilterSets: []
182
+ });
183
+ // Flip the card to the filter set selection screen if the sets list isn't empty
184
+ // Otherwise show the initial screen
185
+ if (filterSets.length > 0) {
186
+ onChange({
187
+ isValueShown: true,
188
+ selectedId
189
+ });
190
+ }
191
+ }
192
+ handleSettingsSave() {
193
+ var {
194
+ onChange,
195
+ onUpdateSets
196
+ } = this.props;
197
+ var {
198
+ modifiedFilterSets,
199
+ editId
200
+ } = this.state;
201
+ this.setState({
202
+ modifiedFilterSets: []
203
+ });
204
+ log.debug('Update sets', modifiedFilterSets, editId);
205
+ onUpdateSets(modifiedFilterSets);
206
+ // Don't flip the card to the filter set selection screen if the updated sets list is empty
207
+ if (modifiedFilterSets.length > 0) {
208
+ onChange({
209
+ isValueShown: true,
210
+ selectedId: editId
211
+ });
212
+ }
213
+ }
214
+ handleCaptureNewSet() {
215
+ var {
216
+ getFilterState
217
+ } = this.props;
218
+ FilterSetManager.animateScreenFlash();
219
+ var id = shortid();
220
+ var panels = getFilterState();
221
+ var renameSet = {
222
+ id,
223
+ title: '',
224
+ panels
225
+ };
226
+ log.debug('handleSetCreate', renameSet);
227
+ this.setState({
228
+ nameInputValue: '',
229
+ nameInputError: undefined,
230
+ renameSet
231
+ });
232
+ }
233
+ handleRenameCancel() {
234
+ this.setState({
235
+ renameSet: undefined
236
+ });
237
+ }
238
+ handleRestoreFullStateChange(event) {
239
+ this.setState({
240
+ restoreFullState: event.target.value === 'true'
241
+ });
242
+ }
243
+ getNameError(nameInputValue) {
244
+ var _nameInputValue$trim;
245
+ var {
246
+ renameSet,
247
+ modifiedFilterSets
248
+ } = this.state;
249
+ var trimmedName = (_nameInputValue$trim = nameInputValue === null || nameInputValue === void 0 ? void 0 : nameInputValue.trim()) !== null && _nameInputValue$trim !== void 0 ? _nameInputValue$trim : '';
250
+ if (trimmedName.length === 0) {
251
+ log.debug('Name cannot be empty', trimmedName);
252
+ return 'Name cannot be empty';
253
+ }
254
+ if (renameSet !== undefined && modifiedFilterSets.some(_ref3 => {
255
+ var {
256
+ title,
257
+ id
258
+ } = _ref3;
259
+ return title === trimmedName && id !== renameSet.id;
260
+ })) {
261
+ log.debug('Set with this name already exists', trimmedName);
262
+ return 'Set with this name already exists';
263
+ }
264
+ return undefined;
265
+ }
266
+ handleRenameConfirm() {
267
+ var _nameInputValue$trim2;
268
+ var {
269
+ nameInputValue,
270
+ renameSet,
271
+ modifiedFilterSets,
272
+ restoreFullState
273
+ } = this.state;
274
+ if (renameSet === undefined) {
275
+ log.error('Renamed set undefined.');
276
+ return;
277
+ }
278
+ var nameInputError = this.getNameError(nameInputValue);
279
+ log.debug('handleRenameConfirm', nameInputValue, nameInputError);
280
+ if (nameInputError !== undefined) {
281
+ this.setState({
282
+ nameInputError
283
+ });
284
+ return;
285
+ }
286
+ var trimmedName = (_nameInputValue$trim2 = nameInputValue === null || nameInputValue === void 0 ? void 0 : nameInputValue.trim()) !== null && _nameInputValue$trim2 !== void 0 ? _nameInputValue$trim2 : '';
287
+ var namedFilterSet = _objectSpread(_objectSpread({}, renameSet), {}, {
288
+ title: trimmedName,
289
+ restoreFullState
290
+ });
291
+ var selectedIndex = modifiedFilterSets.findIndex(_ref4 => {
292
+ var {
293
+ id
294
+ } = _ref4;
295
+ return id === renameSet.id;
296
+ });
297
+ var updatedModifiedFilterSets = [...modifiedFilterSets];
298
+ if (selectedIndex >= 0) {
299
+ updatedModifiedFilterSets[selectedIndex] = namedFilterSet;
300
+ log.debug('Renamed existing set', updatedModifiedFilterSets);
301
+ } else {
302
+ updatedModifiedFilterSets.push(namedFilterSet);
303
+ log.debug('Added new set to modified sets', updatedModifiedFilterSets);
304
+ }
305
+ this.setState({
306
+ editId: namedFilterSet.id,
307
+ modifiedFilterSets: updatedModifiedFilterSets,
308
+ renameSet: undefined
309
+ });
310
+ }
311
+ handleSetDelete() {
312
+ this.setState(state => {
313
+ var {
314
+ editId,
315
+ modifiedFilterSets: prevFilterSets
316
+ } = state;
317
+ var selectedIndex = prevFilterSets.findIndex(_ref5 => {
318
+ var {
319
+ id
320
+ } = _ref5;
321
+ return id === editId;
322
+ });
323
+ if (selectedIndex < 0) {
324
+ log.error('Unable to find selected filterSet index', prevFilterSets, editId);
325
+ return null;
326
+ }
327
+ var modifiedFilterSets = prevFilterSets.filter(_ref6 => {
328
+ var {
329
+ id
330
+ } = _ref6;
331
+ return id !== editId;
332
+ });
333
+ var newSelectedIndex = Math.max(0, Math.min(modifiedFilterSets.length - 1, selectedIndex - 1));
334
+ var newSelectedId = modifiedFilterSets.length > 0 ? modifiedFilterSets[newSelectedIndex].id : undefined;
335
+ log.debug('Deleted selected set', editId, prevFilterSets, modifiedFilterSets);
336
+ log.debug('New selection', newSelectedIndex, newSelectedId);
337
+ return {
338
+ modifiedFilterSets,
339
+ editId: newSelectedId
340
+ };
341
+ });
342
+ }
343
+ handleSetUpdate() {
344
+ var {
345
+ getFilterState
346
+ } = this.props;
347
+ FilterSetManager.animateScreenFlash();
348
+ var panels = getFilterState();
349
+ this.setState(_ref7 => {
350
+ var {
351
+ modifiedFilterSets: prevFilterSets,
352
+ editId
353
+ } = _ref7;
354
+ if (editId === undefined) {
355
+ log.error('Filter for update not selected.');
356
+ return null;
357
+ }
358
+ var modifiedFilterSets = [...prevFilterSets];
359
+ var selectedSetIndex = modifiedFilterSets.findIndex(_ref8 => {
360
+ var {
361
+ id
362
+ } = _ref8;
363
+ return id === editId;
364
+ });
365
+ if (selectedSetIndex < 0) {
366
+ log.error('Selected set for update not found.');
367
+ return null;
368
+ }
369
+ // Clone selected set to avoid mutation of the props
370
+ modifiedFilterSets[selectedSetIndex] = _objectSpread(_objectSpread({}, modifiedFilterSets[selectedSetIndex]), {}, {
371
+ panels
372
+ });
373
+ log.debug('Update set', modifiedFilterSets, panels);
374
+ return {
375
+ modifiedFilterSets
376
+ };
377
+ });
378
+ }
379
+ handleSetEdit() {
380
+ this.setState(_ref9 => {
381
+ var {
382
+ editId,
383
+ modifiedFilterSets
384
+ } = _ref9;
385
+ var selectedSet = modifiedFilterSets.find(_ref10 => {
386
+ var {
387
+ id
388
+ } = _ref10;
389
+ return id === editId;
390
+ });
391
+ if (selectedSet === undefined) {
392
+ log.error('Could not find selected set', editId, modifiedFilterSets);
393
+ return null;
394
+ }
395
+ var {
396
+ title,
397
+ restoreFullState = false
398
+ } = selectedSet;
399
+ return {
400
+ nameInputValue: title,
401
+ nameInputError: undefined,
402
+ renameSet: selectedSet,
403
+ restoreFullState
404
+ };
405
+ });
406
+ }
407
+ handleSettingsClick(event) {
408
+ event.stopPropagation();
409
+ var {
410
+ onChange,
411
+ selectedId
412
+ } = this.props;
413
+ onChange({
414
+ isValueShown: false,
415
+ selectedId
416
+ });
417
+ }
418
+ handleBackgroundClick(event) {
419
+ log.debug('handleBackgroundClick');
420
+ // allow clicking anywhere in the background to select and focus the input
421
+ if (event.target !== this.dropdownRef.current) {
422
+ this.focusInput();
423
+ }
424
+ }
425
+ handleNameInputChange(event) {
426
+ var {
427
+ value: nameInputValue
428
+ } = event.target;
429
+ var nameInputError = this.getNameError(nameInputValue);
430
+ this.setState({
431
+ nameInputValue,
432
+ nameInputError
433
+ });
434
+ }
435
+ handleNameInputKeyPress(event) {
436
+ var {
437
+ key
438
+ } = event;
439
+ if (key === 'Enter') {
440
+ event.preventDefault();
441
+ this.handleRenameConfirm();
442
+ }
443
+ }
444
+ isNameInputScreen() {
445
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state;
446
+ var {
447
+ renameSet
448
+ } = state;
449
+ return renameSet !== undefined;
450
+ }
451
+ applyFilterSet(selectedId) {
452
+ var {
453
+ onApply,
454
+ filterSets
455
+ } = this.props;
456
+ if (selectedId === undefined) {
457
+ log.debug('No filter selected');
458
+ return;
459
+ }
460
+ var filterSet = filterSets.find(_ref11 => {
461
+ var {
462
+ id
463
+ } = _ref11;
464
+ return id === selectedId;
465
+ });
466
+ if (filterSet === undefined) {
467
+ log.debug('Selected id not found in filterSets', selectedId, filterSets);
468
+ return;
469
+ }
470
+ log.debug('Apply filterSet', filterSet);
471
+ onApply(filterSet);
472
+ }
473
+ focusInput() {
474
+ var _this$dropdownRef$cur;
475
+ (_this$dropdownRef$cur = this.dropdownRef.current) === null || _this$dropdownRef$cur === void 0 ? void 0 : _this$dropdownRef$cur.focus();
476
+ }
477
+ focusRenameInput() {
478
+ var _this$renameInputRef$;
479
+ (_this$renameInputRef$ = this.renameInputRef.current) === null || _this$renameInputRef$ === void 0 ? void 0 : _this$renameInputRef$.focus();
480
+ }
481
+ render() {
482
+ var {
483
+ nameInputValue,
484
+ nameInputError,
485
+ editId,
486
+ renameSet,
487
+ modifiedFilterSets,
488
+ restoreFullState
489
+ } = this.state;
490
+ var {
491
+ isValueShown,
492
+ filterSets,
493
+ selectedId
494
+ } = this.props;
495
+ var isNameInputScreen = this.isNameInputScreen();
496
+ var isRenamingExistingSet = this.isRenamingExistingSet(modifiedFilterSets, renameSet);
497
+ var isEmptyEditList = modifiedFilterSets.length === 0;
498
+ var isInitialScreen = !isNameInputScreen && isEmptyEditList && filterSets.length === 0;
499
+ var isEditListScreen = !isNameInputScreen && !isInitialScreen;
500
+ var captureSetIcon = /*#__PURE__*/React.createElement("div", {
501
+ className: "fa-layers mr-3"
502
+ }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
503
+ icon: vsCircleLargeFilled,
504
+ mask: vsDeviceCamera,
505
+ transform: "shrink-1 down-5 right-7"
506
+ }), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
507
+ icon: dhNewCircleLargeFilled,
508
+ className: "text-primary",
509
+ transform: "shrink-6 down-5 right-7"
510
+ }));
511
+ var updateSetIcon = /*#__PURE__*/React.createElement("div", {
512
+ className: "fa-layers"
513
+ }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
514
+ icon: vsCircleLargeFilled,
515
+ mask: vsDeviceCamera,
516
+ transform: "shrink-1 down-5 right-7"
517
+ }), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
518
+ icon: vsArrowSmallUp,
519
+ transform: "shrink-1 down-5 right-7"
520
+ }));
521
+ return /*#__PURE__*/React.createElement("div", {
522
+ className: "filter-set-manager fill-parent-absolute"
523
+ }, /*#__PURE__*/React.createElement(CardFlip, {
524
+ className: "w-100 h-100",
525
+ isFlipped: isValueShown
526
+ }, /*#__PURE__*/React.createElement("div", {
527
+ className: "filter-set-manager-settings-card fill-parent-absolute",
528
+ key: "front"
529
+ }, /*#__PURE__*/React.createElement("div", {
530
+ className: "filter-set-manager-card-content"
531
+ }, isInitialScreen && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Button, {
532
+ kind: "ghost",
533
+ className: "btn btn-link no-underline",
534
+ onClick: this.handleCaptureNewSet,
535
+ icon: captureSetIcon
536
+ }, "Capture filter set"), /*#__PURE__*/React.createElement("div", {
537
+ className: "py-3 text-muted small"
538
+ }, "Takes a snapshot of the currently applied filters on all panels, allowing you to restore saved filter sets later.")), isNameInputScreen && /*#__PURE__*/React.createElement("div", {
539
+ className: "d-flex flex-column justify-content-center",
540
+ "data-testid": "edit-filter-set-container"
541
+ }, /*#__PURE__*/React.createElement("div", {
542
+ className: "form-group"
543
+ }, /*#__PURE__*/React.createElement("label", null, isRenamingExistingSet ? 'Edit set' : 'Name captured set'), /*#__PURE__*/React.createElement("div", {
544
+ className: "name-input-container"
545
+ }, /*#__PURE__*/React.createElement("input", {
546
+ type: "text",
547
+ className: "input-set-name form-control",
548
+ placeholder: NAME_INPUT_PLACEHOLDER,
549
+ value: nameInputValue,
550
+ ref: this.renameInputRef,
551
+ onChange: this.handleNameInputChange,
552
+ onKeyPress: this.handleNameInputKeyPress,
553
+ spellCheck: "false"
554
+ }), /*#__PURE__*/React.createElement(Button, {
555
+ "data-testid": "rename-confirm-button",
556
+ kind: "ghost",
557
+ className: "btn btn-link no-underline pt-2 pb-2",
558
+ onClick: this.handleRenameConfirm,
559
+ tooltip: "Save",
560
+ "test-id": "button-save",
561
+ icon: vsSave
562
+ }), /*#__PURE__*/React.createElement(Button, {
563
+ "data-testid": "rename-cancel-button",
564
+ kind: "ghost",
565
+ className: "btn btn-link no-underline pt-2 pb-2",
566
+ onClick: this.handleRenameCancel,
567
+ tooltip: "Cancel",
568
+ icon: vsCircleSlash
569
+ })), nameInputError !== undefined && /*#__PURE__*/React.createElement("div", {
570
+ className: "error-message"
571
+ }, nameInputError)), /*#__PURE__*/React.createElement("div", {
572
+ className: "form-group"
573
+ }, /*#__PURE__*/React.createElement(RadioGroup, {
574
+ onChange: this.handleRestoreFullStateChange,
575
+ value: "".concat(restoreFullState)
576
+ }, /*#__PURE__*/React.createElement(RadioItem, {
577
+ value: "false"
578
+ }, "Restore only filters"), /*#__PURE__*/React.createElement(RadioItem, {
579
+ value: "true"
580
+ }, "Restore full table state")))), isEditListScreen && /*#__PURE__*/React.createElement("div", {
581
+ className: "filter-set-manager-settings-grid-1"
582
+ }, /*#__PURE__*/React.createElement("div", {
583
+ className: "form-group"
584
+ }, /*#__PURE__*/React.createElement("label", null, "Edit filter sets"), /*#__PURE__*/React.createElement("div", {
585
+ className: "filter-select-container"
586
+ }, /*#__PURE__*/React.createElement("select", {
587
+ "data-testid": "settings-card-filter-select",
588
+ ref: this.editDropdownRef,
589
+ value: editId !== null && editId !== void 0 ? editId : '-1',
590
+ className: "custom-select filter-value-select",
591
+ onChange: this.handleEditDropdownChange,
592
+ disabled: isEmptyEditList
593
+ }, isEmptyEditList && /*#__PURE__*/React.createElement("option", {
594
+ value: "-1",
595
+ disabled: true
596
+ }, EMPTY_LIST_PLACEHOLDER), modifiedFilterSets.map(_ref12 => {
597
+ var {
598
+ id,
599
+ title
600
+ } = _ref12;
601
+ return /*#__PURE__*/React.createElement("option", {
602
+ key: id,
603
+ value: id
604
+ }, title);
605
+ })), /*#__PURE__*/React.createElement(Button, {
606
+ kind: "ghost",
607
+ onClick: this.handleSetUpdate,
608
+ disabled: isEmptyEditList,
609
+ icon: updateSetIcon,
610
+ tooltip: "Update"
611
+ }), /*#__PURE__*/React.createElement(Button, {
612
+ kind: "ghost",
613
+ onClick: this.handleSetEdit,
614
+ disabled: isEmptyEditList,
615
+ icon: vsEdit,
616
+ tooltip: "Edit"
617
+ }), /*#__PURE__*/React.createElement(Button, {
618
+ kind: "ghost",
619
+ onClick: this.handleSetDelete,
620
+ disabled: isEmptyEditList,
621
+ icon: vsTrash,
622
+ tooltip: "Delete"
623
+ }))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Button, {
624
+ kind: "ghost",
625
+ className: "btn btn-link no-underline",
626
+ onClick: this.handleCaptureNewSet,
627
+ icon: captureSetIcon
628
+ }, "Capture new filter set")), /*#__PURE__*/React.createElement("div", {
629
+ className: "py-3 text-right"
630
+ }, /*#__PURE__*/React.createElement(Button, {
631
+ kind: "secondary",
632
+ onClick: this.handleSettingsCancel
633
+ }, "Cancel"), "\xA0", /*#__PURE__*/React.createElement(Button, {
634
+ kind: "primary",
635
+ onClick: this.handleSettingsSave
636
+ }, "Save"))))), /*#__PURE__*/React.createElement("div", {
637
+ className: "filter-set-manager-value-card fill-parent-absolute",
638
+ key: "back",
639
+ onClick: this.handleBackgroundClick
640
+ }, /*#__PURE__*/React.createElement("div", {
641
+ className: "filter-set-manager-column"
642
+ }, /*#__PURE__*/React.createElement("div", {
643
+ className: "filter-set-manager-column-title"
644
+ }, "Filter sets")), /*#__PURE__*/React.createElement("div", {
645
+ className: "filter-set-manager-card-content"
646
+ }, /*#__PURE__*/React.createElement("div", {
647
+ className: "filter-set-manager-value-input"
648
+ }, /*#__PURE__*/React.createElement("div", {
649
+ className: "filter-select-container"
650
+ }, /*#__PURE__*/React.createElement("select", {
651
+ "data-testid": "value-card-filter-select",
652
+ ref: this.dropdownRef,
653
+ value: selectedId,
654
+ className: "custom-select filter-value-select",
655
+ onChange: this.handleFilterChange
656
+ }, filterSets.length === 0 && /*#__PURE__*/React.createElement("option", {
657
+ value: "-1",
658
+ disabled: true
659
+ }, EMPTY_LIST_PLACEHOLDER), filterSets.map(_ref13 => {
660
+ var {
661
+ id,
662
+ title
663
+ } = _ref13;
664
+ return /*#__PURE__*/React.createElement("option", {
665
+ key: id,
666
+ value: id
667
+ }, title);
668
+ })), /*#__PURE__*/React.createElement(Button, {
669
+ "data-testid": "filter-apply-button",
670
+ kind: "ghost",
671
+ onClick: this.handleFilterApply,
672
+ icon: dhRefresh,
673
+ tooltip: "Apply Filter Set"
674
+ })))), /*#__PURE__*/React.createElement("div", {
675
+ className: "filter-set-manager-menu"
676
+ }, /*#__PURE__*/React.createElement(Button, {
677
+ kind: "ghost",
678
+ className: "btn btn-link btn-link-icon m-2 px-2",
679
+ onClick: this.handleSettingsClick,
680
+ tooltip: "Settings",
681
+ icon: /*#__PURE__*/React.createElement(FontAwesomeIcon, {
682
+ icon: vsGear,
683
+ transform: "grow-4"
684
+ })
685
+ })))));
686
+ }
687
+ }
688
+ export default FilterSetManager;
689
+ //# sourceMappingURL=FilterSetManager.js.map