@deephaven/dashboard-core-plugins 0.22.3-beta.18 → 0.22.3-beta.21

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 (166) hide show
  1. package/dist/ChartBuilderPlugin.d.ts +1 -1
  2. package/dist/ChartBuilderPlugin.d.ts.map +1 -1
  3. package/dist/ChartBuilderPlugin.js +6 -8
  4. package/dist/ChartBuilderPlugin.js.map +1 -1
  5. package/dist/ChartPlugin.d.ts +1 -1
  6. package/dist/ChartPlugin.d.ts.map +1 -1
  7. package/dist/ChartPlugin.js +4 -8
  8. package/dist/ChartPlugin.js.map +1 -1
  9. package/dist/ConsolePlugin.d.ts +1 -1
  10. package/dist/ConsolePlugin.d.ts.map +1 -1
  11. package/dist/ConsolePlugin.js +16 -62
  12. package/dist/ConsolePlugin.js.map +1 -1
  13. package/dist/FilterPlugin.d.ts +1 -1
  14. package/dist/FilterPlugin.d.ts.map +1 -1
  15. package/dist/FilterPlugin.js +6 -13
  16. package/dist/FilterPlugin.js.map +1 -1
  17. package/dist/GridPlugin.d.ts +1 -1
  18. package/dist/GridPlugin.d.ts.map +1 -1
  19. package/dist/GridPlugin.js +4 -8
  20. package/dist/GridPlugin.js.map +1 -1
  21. package/dist/LinkerPlugin.d.ts +1 -1
  22. package/dist/LinkerPlugin.d.ts.map +1 -1
  23. package/dist/LinkerPlugin.js +2 -2
  24. package/dist/LinkerPlugin.js.map +1 -1
  25. package/dist/MarkdownPlugin.d.ts +1 -1
  26. package/dist/MarkdownPlugin.d.ts.map +1 -1
  27. package/dist/MarkdownPlugin.js +4 -8
  28. package/dist/MarkdownPlugin.js.map +1 -1
  29. package/dist/PandasPlugin.d.ts +1 -1
  30. package/dist/PandasPlugin.d.ts.map +1 -1
  31. package/dist/PandasPlugin.js +4 -8
  32. package/dist/PandasPlugin.js.map +1 -1
  33. package/dist/controls/ControlType.js +0 -6
  34. package/dist/controls/ControlType.js.map +1 -1
  35. package/dist/controls/dropdown-filter/DropdownFilter.js +7 -51
  36. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
  37. package/dist/controls/input-filter/InputFilter.js +1 -31
  38. package/dist/controls/input-filter/InputFilter.js.map +1 -1
  39. package/dist/controls/markdown/MarkdownContainer.js +0 -3
  40. package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
  41. package/dist/controls/markdown/MarkdownEditor.d.ts +0 -2
  42. package/dist/controls/markdown/MarkdownEditor.d.ts.map +1 -1
  43. package/dist/controls/markdown/MarkdownEditor.js +13 -20
  44. package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
  45. package/dist/controls/markdown/MarkdownStartPage.js +0 -11
  46. package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
  47. package/dist/controls/markdown/MarkdownUtils.js +0 -7
  48. package/dist/controls/markdown/MarkdownUtils.js.map +1 -1
  49. package/dist/events/ChartEvent.js +0 -5
  50. package/dist/events/ChartEvent.js.map +1 -1
  51. package/dist/events/ConsoleEvent.js +0 -7
  52. package/dist/events/ConsoleEvent.js.map +1 -1
  53. package/dist/events/InputFilterEvent.js +0 -10
  54. package/dist/events/InputFilterEvent.js.map +1 -1
  55. package/dist/events/IrisGridEvent.js +0 -8
  56. package/dist/events/IrisGridEvent.js.map +1 -1
  57. package/dist/events/MarkdownEvent.js.map +1 -1
  58. package/dist/events/NotebookEvent.js +0 -10
  59. package/dist/events/NotebookEvent.js.map +1 -1
  60. package/dist/events/PQEvent.js +0 -5
  61. package/dist/events/PQEvent.js.map +1 -1
  62. package/dist/events/PandasEvent.js +0 -4
  63. package/dist/events/PandasEvent.js.map +1 -1
  64. package/dist/events/TabEvent.js +0 -8
  65. package/dist/events/TabEvent.js.map +1 -1
  66. package/dist/events/index.js.map +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/linker/Linker.d.ts +3 -0
  69. package/dist/linker/Linker.d.ts.map +1 -1
  70. package/dist/linker/Linker.js +70 -119
  71. package/dist/linker/Linker.js.map +1 -1
  72. package/dist/linker/LinkerLink.css +90 -25
  73. package/dist/linker/LinkerLink.css.map +1 -1
  74. package/dist/linker/LinkerLink.d.ts +20 -2
  75. package/dist/linker/LinkerLink.d.ts.map +1 -1
  76. package/dist/linker/LinkerLink.js +214 -23
  77. package/dist/linker/LinkerLink.js.map +1 -1
  78. package/dist/linker/LinkerOverlayContent.css +0 -4
  79. package/dist/linker/LinkerOverlayContent.css.map +1 -1
  80. package/dist/linker/LinkerOverlayContent.d.ts +11 -0
  81. package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
  82. package/dist/linker/LinkerOverlayContent.js +78 -33
  83. package/dist/linker/LinkerOverlayContent.js.map +1 -1
  84. package/dist/linker/LinkerUtils.d.ts +9 -2
  85. package/dist/linker/LinkerUtils.d.ts.map +1 -1
  86. package/dist/linker/LinkerUtils.js +9 -25
  87. package/dist/linker/LinkerUtils.js.map +1 -1
  88. package/dist/linker/ToolType.js.map +1 -1
  89. package/dist/panels/ChartColumnSelectorOverlay.d.ts +5 -5
  90. package/dist/panels/ChartColumnSelectorOverlay.d.ts.map +1 -1
  91. package/dist/panels/ChartColumnSelectorOverlay.js +4 -7
  92. package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
  93. package/dist/panels/ChartFilterOverlay.d.ts +4 -4
  94. package/dist/panels/ChartFilterOverlay.d.ts.map +1 -1
  95. package/dist/panels/ChartFilterOverlay.js +2 -7
  96. package/dist/panels/ChartFilterOverlay.js.map +1 -1
  97. package/dist/panels/ChartPanel.d.ts.map +1 -1
  98. package/dist/panels/ChartPanel.js +11 -150
  99. package/dist/panels/ChartPanel.js.map +1 -1
  100. package/dist/panels/CommandHistoryPanel.d.ts.map +1 -1
  101. package/dist/panels/CommandHistoryPanel.js +1 -26
  102. package/dist/panels/CommandHistoryPanel.js.map +1 -1
  103. package/dist/panels/ConsolePanel.d.ts.map +1 -1
  104. package/dist/panels/ConsolePanel.js +12 -57
  105. package/dist/panels/ConsolePanel.js.map +1 -1
  106. package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
  107. package/dist/panels/DropdownFilterPanel.js +16 -122
  108. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  109. package/dist/panels/FileExplorerPanel.js +4 -33
  110. package/dist/panels/FileExplorerPanel.js.map +1 -1
  111. package/dist/panels/FilterSetManager.d.ts.map +1 -1
  112. package/dist/panels/FilterSetManager.js +13 -86
  113. package/dist/panels/FilterSetManager.js.map +1 -1
  114. package/dist/panels/FilterSetManagerPanel.js +10 -64
  115. package/dist/panels/FilterSetManagerPanel.js.map +1 -1
  116. package/dist/panels/InputFilterPanel.d.ts.map +1 -1
  117. package/dist/panels/InputFilterPanel.js +8 -38
  118. package/dist/panels/InputFilterPanel.js.map +1 -1
  119. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  120. package/dist/panels/IrisGridPanel.js +24 -133
  121. package/dist/panels/IrisGridPanel.js.map +1 -1
  122. package/dist/panels/IrisGridPanelTooltip.d.ts +5 -5
  123. package/dist/panels/IrisGridPanelTooltip.d.ts.map +1 -1
  124. package/dist/panels/IrisGridPanelTooltip.js +2 -5
  125. package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
  126. package/dist/panels/LogPanel.js +4 -22
  127. package/dist/panels/LogPanel.js.map +1 -1
  128. package/dist/panels/MarkdownNotebook.js +3 -30
  129. package/dist/panels/MarkdownNotebook.js.map +1 -1
  130. package/dist/panels/MarkdownPanel.js +2 -30
  131. package/dist/panels/MarkdownPanel.js.map +1 -1
  132. package/dist/panels/MockFileStorage.js +1 -14
  133. package/dist/panels/MockFileStorage.js.map +1 -1
  134. package/dist/panels/MockFileStorageTable.js +11 -30
  135. package/dist/panels/MockFileStorageTable.js.map +1 -1
  136. package/dist/panels/NotebookPanel.js +24 -182
  137. package/dist/panels/NotebookPanel.js.map +1 -1
  138. package/dist/panels/PandasPanel.js +1 -20
  139. package/dist/panels/PandasPanel.js.map +1 -1
  140. package/dist/panels/Panel.js +2 -38
  141. package/dist/panels/Panel.js.map +1 -1
  142. package/dist/panels/PanelContextMenu.js +7 -29
  143. package/dist/panels/PanelContextMenu.js.map +1 -1
  144. package/dist/panels/RenameDialog.js +2 -17
  145. package/dist/panels/RenameDialog.js.map +1 -1
  146. package/dist/panels/WidgetPanel.js +2 -20
  147. package/dist/panels/WidgetPanel.js.map +1 -1
  148. package/dist/panels/WidgetPanelTooltip.d.ts +5 -5
  149. package/dist/panels/WidgetPanelTooltip.d.ts.map +1 -1
  150. package/dist/panels/WidgetPanelTooltip.js +2 -4
  151. package/dist/panels/WidgetPanelTooltip.js.map +1 -1
  152. package/dist/panels/index.js.map +1 -1
  153. package/dist/prop-types/CommonPropTypes.js +0 -3
  154. package/dist/prop-types/CommonPropTypes.js.map +1 -1
  155. package/dist/prop-types/UIPropTypes.js.map +1 -1
  156. package/dist/prop-types/index.js.map +1 -1
  157. package/dist/redux/actionTypes.js.map +1 -1
  158. package/dist/redux/actions.js +8 -9
  159. package/dist/redux/actions.js.map +1 -1
  160. package/dist/redux/index.js.map +1 -1
  161. package/dist/redux/reducers/connection.js.map +1 -1
  162. package/dist/redux/reducers/index.js.map +1 -1
  163. package/dist/redux/reducers/sessionWrapper.js.map +1 -1
  164. package/dist/redux/selectors.js +10 -15
  165. package/dist/redux/selectors.js.map +1 -1
  166. package/package.json +21 -20
@@ -1,9 +1,6 @@
1
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
-
3
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; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import React, { Component } from 'react';
8
5
  import { connect } from 'react-redux';
9
6
  import shortid from 'shortid';
@@ -13,6 +10,7 @@ import { ThemeExport } from '@deephaven/components';
13
10
  import { LayoutUtils, PanelEvent } from '@deephaven/dashboard';
14
11
  import { DateTimeColumnFormatter, DateUtils, TableUtils } from '@deephaven/jsapi-utils';
15
12
  import Log from '@deephaven/log';
13
+ import { Type as FilterType } from '@deephaven/filters';
16
14
  import { getActiveTool, getTimeZone, setActiveTool as setActiveToolAction } from '@deephaven/redux';
17
15
  import { getIsolatedLinkerPanelIdForDashboard, getLinksForDashboard, setDashboardLinks as setDashboardLinksAction, addDashboardLinks as addDashboardLinksAction, deleteDashboardLinks as deleteDashboardLinksAction, setDashboardIsolatedLinkerPanelId as setDashboardIsolatedLinkerPanelIdAction, setDashboardColumnSelectionValidator as setDashboardColumnSelectionValidatorAction } from "../redux/index.js";
18
16
  import ToolType from "./ToolType.js";
@@ -20,14 +18,12 @@ import { ChartEvent, IrisGridEvent, InputFilterEvent } from "../events/index.js"
20
18
  import LinkerOverlayContent from "./LinkerOverlayContent.js";
21
19
  import LinkerUtils, { isLinkablePanel } from "./LinkerUtils.js";
22
20
  var log = Log.module('Linker');
23
-
24
21
  var mapState = (state, ownProps) => ({
25
22
  activeTool: getActiveTool(state),
26
23
  isolatedLinkerPanelId: getIsolatedLinkerPanelIdForDashboard(state, ownProps.localDashboardId),
27
24
  links: getLinksForDashboard(state, ownProps.localDashboardId),
28
25
  timeZone: getTimeZone(state)
29
26
  });
30
-
31
27
  var connector = connect(mapState, {
32
28
  setActiveTool: setActiveToolAction,
33
29
  setDashboardLinks: setDashboardLinksAction,
@@ -39,26 +35,20 @@ var connector = connect(mapState, {
39
35
  export class Linker extends Component {
40
36
  constructor(props) {
41
37
  super(props);
42
-
43
38
  _defineProperty(this, "getCachedLinks", memoize((links, linkInProgress, isolateForPanelId) => {
44
39
  var combinedLinks = [...links];
45
-
46
40
  if (linkInProgress != null && linkInProgress.start != null) {
47
41
  combinedLinks.push(linkInProgress);
48
42
  }
49
-
50
43
  if (isolateForPanelId !== undefined) {
51
44
  return combinedLinks.filter(link => {
52
45
  var _link$start, _link$end;
53
-
54
46
  return (link === null || link === void 0 ? void 0 : (_link$start = link.start) === null || _link$start === void 0 ? void 0 : _link$start.panelId) === isolateForPanelId || (link === null || link === void 0 ? void 0 : (_link$end = link.end) === null || _link$end === void 0 ? void 0 : _link$end.panelId) === isolateForPanelId || (link === null || link === void 0 ? void 0 : link.end) == null;
55
47
  });
56
- } // Show all links in regular linker mode -- both isolated and not
57
-
58
-
48
+ }
49
+ // Show all links in regular linker mode -- both isolated and not
59
50
  return combinedLinks;
60
51
  }));
61
-
62
52
  this.handleCancel = this.handleCancel.bind(this);
63
53
  this.handleDone = this.handleDone.bind(this);
64
54
  this.handlePanelCloned = this.handlePanelCloned.bind(this);
@@ -68,17 +58,19 @@ export class Linker extends Component {
68
58
  this.handleLayoutStateChanged = this.handleLayoutStateChanged.bind(this);
69
59
  this.handleAllLinksDeleted = this.handleAllLinksDeleted.bind(this);
70
60
  this.handleLinkDeleted = this.handleLinkDeleted.bind(this);
61
+ this.handleLinksUpdated = this.handleLinksUpdated.bind(this);
71
62
  this.handleChartColumnSelect = this.handleChartColumnSelect.bind(this);
72
63
  this.handleGridColumnSelect = this.handleGridColumnSelect.bind(this);
73
64
  this.handleUpdateValues = this.handleUpdateValues.bind(this);
74
65
  this.handleStateChange = this.handleStateChange.bind(this);
75
66
  this.handleExited = this.handleExited.bind(this);
67
+ this.handleLinkSelected = this.handleLinkSelected.bind(this);
76
68
  this.isColumnSelectionValid = this.isColumnSelectionValid.bind(this);
77
69
  this.state = {
78
- linkInProgress: undefined
70
+ linkInProgress: undefined,
71
+ selectedIds: new Set()
79
72
  };
80
73
  }
81
-
82
74
  componentDidMount() {
83
75
  var {
84
76
  layout
@@ -86,34 +78,28 @@ export class Linker extends Component {
86
78
  this.startListening(layout);
87
79
  this.updateSelectionValidators();
88
80
  }
89
-
90
81
  componentDidUpdate(prevProps) {
91
82
  var {
92
83
  activeTool,
93
84
  layout
94
85
  } = this.props;
95
-
96
86
  if (layout !== prevProps.layout) {
97
87
  this.stopListening(prevProps.layout);
98
88
  this.startListening(layout);
99
89
  }
100
-
101
90
  if (activeTool !== prevProps.activeTool) {
102
91
  this.updateSelectionValidators();
103
92
  }
104
93
  }
105
-
106
94
  componentDidCatch(error, info) {
107
95
  log.error('componentDidCatch', error, info);
108
96
  }
109
-
110
97
  componentWillUnmount() {
111
98
  var {
112
99
  layout
113
100
  } = this.props;
114
101
  this.stopListening(layout);
115
102
  }
116
-
117
103
  startListening(layout) {
118
104
  layout.on('stateChanged', this.handleLayoutStateChanged);
119
105
  var {
@@ -128,7 +114,6 @@ export class Linker extends Component {
128
114
  eventHub.on(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);
129
115
  eventHub.on(PanelEvent.CLOSED, this.handlePanelClosed);
130
116
  }
131
-
132
117
  stopListening(layout) {
133
118
  layout.off('stateChanged', this.handleLayoutStateChanged);
134
119
  var {
@@ -143,38 +128,33 @@ export class Linker extends Component {
143
128
  eventHub.off(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);
144
129
  eventHub.off(PanelEvent.CLOSED, this.handlePanelClosed);
145
130
  }
146
-
147
131
  handleCancel() {
148
132
  var {
149
133
  linkInProgress
150
134
  } = this.state;
151
-
152
135
  if (linkInProgress == null) {
153
136
  var {
154
137
  setActiveTool
155
138
  } = this.props;
156
139
  setActiveTool(ToolType.DEFAULT);
157
140
  }
158
-
159
141
  this.setState({
160
142
  linkInProgress: undefined
161
143
  });
162
144
  }
163
-
164
145
  handleDone() {
165
146
  var {
166
147
  setActiveTool
167
148
  } = this.props;
168
149
  setActiveTool(ToolType.DEFAULT);
169
150
  this.setState({
170
- linkInProgress: undefined
151
+ linkInProgress: undefined,
152
+ selectedIds: new Set()
171
153
  });
172
154
  }
173
-
174
155
  handleChartColumnSelect(panel, column) {
175
156
  this.columnSelected(panel, column, true);
176
157
  }
177
-
178
158
  handleFilterColumnSelect(panel, column) {
179
159
  log.debug('handleFilterColumnSelect', this.isOverlayShown());
180
160
  var {
@@ -186,43 +166,36 @@ export class Linker extends Component {
186
166
  var panelId = LayoutUtils.getIdFromPanel(panel);
187
167
  var panelLinks = links.filter(link => {
188
168
  var _link$start2, _link$end2;
189
-
190
169
  return ((_link$start2 = link.start) === null || _link$start2 === void 0 ? void 0 : _link$start2.panelId) === panelId || ((_link$end2 = link.end) === null || _link$end2 === void 0 ? void 0 : _link$end2.panelId) === panelId;
191
170
  });
192
-
193
171
  if (!this.isOverlayShown() && panelId != null) {
194
172
  // Initial click on the filter source button with linker inactive
195
173
  // Show linker in isolated mode for panel
196
174
  setActiveTool(ToolType.LINKER);
197
175
  setDashboardIsolatedLinkerPanelId(localDashboardId, panelId);
198
-
199
176
  if (panelLinks.length === 0) {
200
177
  // Source not linked - start new link in isolated linker mode
201
178
  // Need to pass panelId for overrideIsolatedLinkerPanelId
202
179
  // as redux prop update at this point not yet propagated
203
180
  this.columnSelected(panel, column, true, panelId);
204
181
  }
205
-
206
182
  return;
207
- } // Filter source clicked with linker active
208
-
183
+ }
209
184
 
185
+ // Filter source clicked with linker active
210
186
  this.columnSelected(panel, column, true);
211
187
  }
212
-
213
188
  handleColumnsChanged(panel, columns) {
214
189
  log.debug('handleColumnsChanged', panel, columns);
215
190
  var {
216
191
  links
217
192
  } = this.props;
218
193
  var panelId = LayoutUtils.getIdFromPanel(panel);
219
-
220
194
  if (panelId == null) {
221
195
  log.error('Invalid panelId', panel);
222
196
  return;
223
- } // Delete links that start or end on non-existent column in the updated panel
224
-
225
-
197
+ }
198
+ // Delete links that start or end on non-existent column in the updated panel
226
199
  var linksToDelete = links.filter(_ref => {
227
200
  var {
228
201
  start,
@@ -232,10 +205,10 @@ export class Linker extends Component {
232
205
  });
233
206
  this.deleteLinks(linksToDelete);
234
207
  }
235
-
236
208
  handleGridColumnSelect(panel, column) {
237
209
  this.columnSelected(panel, column);
238
210
  }
211
+
239
212
  /**
240
213
  * Track a column selection and build the link from it.
241
214
  * @param panel The panel component that is the source for the column selection
@@ -243,16 +216,12 @@ export class Linker extends Component {
243
216
  * @param isAlwaysEndPoint True if the selection is always the end point, even if it's the first column selected. Defaults to false.
244
217
  * @param overrideIsolatedLinkerPanelId isolatedLinkerPanelId to use when method is called before prop changes propagate
245
218
  */
246
-
247
-
248
219
  columnSelected(panel, column) {
249
220
  var isAlwaysEndPoint = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
250
221
  var overrideIsolatedLinkerPanelId = arguments.length > 3 ? arguments[3] : undefined;
251
-
252
222
  if (overrideIsolatedLinkerPanelId === undefined && !this.isOverlayShown()) {
253
223
  return;
254
224
  }
255
-
256
225
  var {
257
226
  isolatedLinkerPanelId
258
227
  } = this.props;
@@ -260,17 +229,14 @@ export class Linker extends Component {
260
229
  linkInProgress
261
230
  } = this.state;
262
231
  var panelId = LayoutUtils.getIdFromPanel(panel);
263
-
264
232
  if (panelId == null) {
265
233
  return;
266
234
  }
267
-
268
235
  var panelComponent = LayoutUtils.getComponentNameFromPanel(panel);
269
236
  var {
270
237
  name: columnName,
271
238
  type: columnType
272
239
  } = column;
273
-
274
240
  if (linkInProgress == null || linkInProgress.start == null) {
275
241
  var newLink = {
276
242
  id: shortid.generate(),
@@ -289,6 +255,9 @@ export class Linker extends Component {
289
255
  linkInProgress: newLink
290
256
  });
291
257
  } else {
258
+ var {
259
+ links
260
+ } = this.props;
292
261
  var {
293
262
  start,
294
263
  id,
@@ -301,22 +270,17 @@ export class Linker extends Component {
301
270
  columnType
302
271
  };
303
272
  var type = LinkerUtils.getLinkType(isReversed !== undefined && isReversed ? end : start, isReversed !== undefined && isReversed ? start : end, overrideIsolatedLinkerPanelId !== null && overrideIsolatedLinkerPanelId !== void 0 ? overrideIsolatedLinkerPanelId : isolatedLinkerPanelId);
304
-
305
273
  switch (type) {
306
274
  case 'invalid':
307
275
  log.debug('Ignore invalid link connection', linkInProgress, end);
308
276
  return;
309
-
310
277
  case 'filterSource':
311
278
  {
312
279
  // filterSource links have a limit of 1 link per target
313
280
  // New link validation passed, delete existing links before adding the new one
314
- var {
315
- links
316
- } = this.props;
317
- var existingLinkPanelId = isReversed !== undefined && isReversed ? start.panelId : end.panelId; // In cases with multiple targets per panel (i.e. chart filters)
281
+ var existingLinkPanelId = isReversed !== undefined && isReversed ? start.panelId : end.panelId;
282
+ // In cases with multiple targets per panel (i.e. chart filters)
318
283
  // links would have to be filtered by panelId and columnName and columnType
319
-
320
284
  var linksToDelete = links.filter(_ref2 => {
321
285
  var {
322
286
  end: panelLinkEnd
@@ -326,22 +290,23 @@ export class Linker extends Component {
326
290
  this.deleteLinks(linksToDelete);
327
291
  break;
328
292
  }
329
-
330
293
  case 'tableLink':
331
294
  // No-op
332
295
  break;
333
- } // Create a completed link from link in progress
334
-
296
+ }
335
297
 
298
+ // Create a completed link from link in progress
336
299
  var _newLink = {
337
300
  start: isReversed !== undefined && isReversed ? end : start,
338
301
  end: isReversed !== undefined && isReversed ? start : end,
339
302
  id,
340
- type
303
+ type,
304
+ operator: FilterType.eq
341
305
  };
342
306
  log.info('creating link', _newLink);
343
307
  this.setState({
344
- linkInProgress: undefined
308
+ linkInProgress: undefined,
309
+ selectedIds: new Set([id])
345
310
  }, () => {
346
311
  // Adding link after updating state
347
312
  // otherwise both new link and linkInProgress could be rendered at the same time
@@ -350,12 +315,10 @@ export class Linker extends Component {
350
315
  });
351
316
  }
352
317
  }
353
-
354
318
  unsetFilterValueForLink(link) {
355
319
  var {
356
320
  panelManager
357
321
  } = this.props;
358
-
359
322
  if (link.end) {
360
323
  var {
361
324
  end
@@ -366,7 +329,6 @@ export class Linker extends Component {
366
329
  columnType
367
330
  } = end;
368
331
  var endPanel = panelManager.getOpenedPanelById(panelId);
369
-
370
332
  if (!endPanel) {
371
333
  log.debug('endPanel no longer exists, ignoring unsetFilterValue', panelId);
372
334
  } else if (isLinkablePanel(endPanel)) {
@@ -376,20 +338,18 @@ export class Linker extends Component {
376
338
  }
377
339
  }
378
340
  }
341
+
379
342
  /**
380
343
  * Set filters for a given panel ID
381
344
  * @param panelId ID of panel to set filters on
382
345
  * @param filterMap Map of column name to column type, text, and value
383
346
  */
384
-
385
-
386
347
  setPanelFilterMap(panelId, filterMap) {
387
348
  log.debug('Set filter data for panel:', panelId, filterMap);
388
349
  var {
389
350
  panelManager
390
351
  } = this.props;
391
352
  var panel = panelManager.getOpenedPanelById(panelId);
392
-
393
353
  if (!panel) {
394
354
  log.debug('panel no longer exists, ignoring setFilterMap', panelId);
395
355
  } else if (isLinkablePanel(panel)) {
@@ -398,7 +358,6 @@ export class Linker extends Component {
398
358
  log.debug('panel.setFilterMap not implemented', panelId, panel);
399
359
  }
400
360
  }
401
-
402
361
  addLinks(links) {
403
362
  var {
404
363
  addDashboardLinks,
@@ -406,14 +365,12 @@ export class Linker extends Component {
406
365
  } = this.props;
407
366
  addDashboardLinks(localDashboardId, links);
408
367
  }
409
-
410
368
  deleteLinks(links) {
411
369
  var clearAll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
412
370
  var {
413
371
  localDashboardId
414
372
  } = this.props;
415
373
  links.forEach(link => this.unsetFilterValueForLink(link));
416
-
417
374
  if (clearAll) {
418
375
  var {
419
376
  setDashboardLinks
@@ -431,67 +388,62 @@ export class Linker extends Component {
431
388
  }));
432
389
  }
433
390
  }
434
-
435
391
  handleAllLinksDeleted() {
436
392
  var {
437
393
  links,
438
394
  isolatedLinkerPanelId
439
395
  } = this.props;
440
-
441
396
  if (isolatedLinkerPanelId === undefined) {
442
397
  this.deleteLinks(links, true);
443
398
  } else {
444
399
  var isolatedLinks = links.filter(link => {
445
400
  var _link$start3, _link$end3;
446
-
447
401
  return (link === null || link === void 0 ? void 0 : (_link$start3 = link.start) === null || _link$start3 === void 0 ? void 0 : _link$start3.panelId) === isolatedLinkerPanelId || (link === null || link === void 0 ? void 0 : (_link$end3 = link.end) === null || _link$end3 === void 0 ? void 0 : _link$end3.panelId) === isolatedLinkerPanelId;
448
402
  });
449
403
  this.deleteLinks(isolatedLinks);
450
404
  }
451
-
452
405
  this.setState({
453
406
  linkInProgress: undefined
454
407
  });
455
408
  }
456
-
457
409
  handleLinkDeleted(linkId) {
458
410
  var {
459
411
  links
460
412
  } = this.props;
461
413
  var link = links.find(l => l.id === linkId);
462
-
463
414
  if (link) {
464
415
  this.deleteLinks([link]);
465
416
  } else {
466
417
  log.error('Unable to find link to delete', linkId);
467
418
  }
468
419
  }
469
-
470
420
  handleUpdateValues(panel, dataMap) {
471
421
  var panelId = LayoutUtils.getIdFromPanel(panel);
472
422
  var {
473
423
  links,
474
424
  timeZone
475
- } = this.props; // Map of panel ID to filterMap
476
-
477
- var panelFilterMap = new Map(); // Instead of setting filters one by one for each link,
425
+ } = this.props;
426
+ // Map of panel ID to filterMap
427
+ var panelFilterMap = new Map();
428
+ // Instead of setting filters one by one for each link,
478
429
  // combine them so they could be set in a single call per target panel
479
-
480
430
  for (var i = 0; i < links.length; i += 1) {
481
431
  var {
482
432
  start,
483
- end
433
+ end,
434
+ operator
484
435
  } = links[i];
485
-
486
436
  if (start.panelId === panelId && end != null) {
487
437
  var {
488
438
  panelId: endPanelId,
489
439
  columnName,
490
440
  columnType
491
- } = end; // Map of column name to column type and filter value
492
-
441
+ } = end;
442
+ // Map of column name to column type and filter value
493
443
  var filterMap = panelFilterMap.has(endPanelId) ? panelFilterMap.get(endPanelId) : new Map();
444
+ var filterList = filterMap.has(columnName) === true ? filterMap.get(columnName).filterList : [];
494
445
  var {
446
+ visibleIndex: startColumnIndex,
495
447
  isExpandable,
496
448
  isGrouped
497
449
  } = dataMap[start.columnName];
@@ -499,66 +451,75 @@ export class Linker extends Component {
499
451
  value
500
452
  } = dataMap[start.columnName];
501
453
  var text = "".concat(value);
502
-
503
454
  if (value === null && isExpandable && isGrouped) {
504
455
  // Clear filter on empty rollup grouping columns
505
456
  value = undefined;
506
457
  }
507
-
508
458
  if (columnType != null && TableUtils.isDateType(columnType)) {
509
459
  var dateFilterFormatter = new DateTimeColumnFormatter({
510
460
  timeZone,
511
461
  showTimeZone: false,
512
462
  showTSeparator: true,
513
463
  defaultDateTimeFormatString: DateUtils.FULL_DATE_FORMAT
514
- }); // The values are Dates for dateType values, not string like everything else
515
-
464
+ });
465
+ // The values are Dates for dateType values, not string like everything else
516
466
  text = dateFilterFormatter.format(value);
517
467
  }
518
-
468
+ var filter = {
469
+ operator,
470
+ text,
471
+ value,
472
+ startColumnIndex
473
+ };
474
+ filterList.push(filter);
519
475
  filterMap.set(columnName, {
520
476
  columnType,
521
- text,
522
- value
477
+ filterList
523
478
  });
524
479
  panelFilterMap.set(endPanelId, filterMap);
525
480
  }
526
- } // Apply combined filters to all target panels
527
-
481
+ }
528
482
 
483
+ // Apply combined filters to all target panels
529
484
  panelFilterMap.forEach((filterMap, endPanelId) => {
530
485
  this.setPanelFilterMap(endPanelId, filterMap);
531
486
  });
532
487
  }
533
-
534
488
  handlePanelCloned(panel, cloneConfig) {
535
489
  var {
536
490
  links
537
491
  } = this.props;
538
492
  var panelId = LayoutUtils.getIdFromPanel(panel);
539
493
  var cloneId = cloneConfig.id;
540
-
541
494
  if (panelId != null) {
542
495
  var linksToAdd = LinkerUtils.cloneLinksForPanel(links, panelId, cloneId);
543
496
  this.addLinks(linksToAdd);
544
497
  }
545
498
  }
546
-
547
499
  handlePanelClosed(panelId) {
548
500
  // Delete links on PanelEvent.CLOSED instead of UNMOUNT
549
501
  // because the panels can get unmounted on errors and we want to keep the links if that happens
550
502
  log.debug("Panel ".concat(panelId, " closed, deleting links."));
551
503
  this.deleteLinksForPanelId(panelId);
552
504
  }
553
-
505
+ handleLinkSelected(linkId) {
506
+ this.setState({
507
+ selectedIds: new Set([linkId])
508
+ });
509
+ }
510
+ handleLinksUpdated(newLinks) {
511
+ var {
512
+ localDashboardId,
513
+ setDashboardLinks
514
+ } = this.props;
515
+ setDashboardLinks(localDashboardId, newLinks);
516
+ }
554
517
  handleLayoutStateChanged() {
555
518
  this.forceUpdate();
556
519
  }
557
-
558
520
  handleStateChange() {
559
521
  this.forceUpdate();
560
522
  }
561
-
562
523
  handleExited() {
563
524
  // Has to be done after linker exit animation to avoid flashing non-isolated links
564
525
  var {
@@ -567,17 +528,15 @@ export class Linker extends Component {
567
528
  } = this.props;
568
529
  setDashboardIsolatedLinkerPanelId(localDashboardId, undefined);
569
530
  }
531
+
570
532
  /**
571
533
  * Delete all links for a provided panel ID. Needs to be done whenever a panel is closed or unmounted.
572
534
  * @param panelId The panel ID to delete links for
573
535
  */
574
-
575
-
576
536
  deleteLinksForPanelId(panelId) {
577
537
  var {
578
538
  links
579
539
  } = this.props;
580
-
581
540
  for (var i = 0; i < links.length; i += 1) {
582
541
  var link = links[i];
583
542
  var {
@@ -585,38 +544,32 @@ export class Linker extends Component {
585
544
  end,
586
545
  id
587
546
  } = link;
588
-
589
547
  if (start.panelId === panelId || (end === null || end === void 0 ? void 0 : end.panelId) === panelId) {
590
548
  this.handleLinkDeleted(id);
591
549
  }
592
550
  }
593
551
  }
594
-
595
552
  isOverlayShown() {
596
553
  var {
597
554
  activeTool
598
555
  } = this.props;
599
556
  return activeTool === ToolType.LINKER;
600
557
  }
601
-
602
558
  updateSelectionValidators() {
603
559
  var {
604
560
  activeTool,
605
561
  setDashboardColumnSelectionValidator,
606
562
  localDashboardId
607
563
  } = this.props;
608
-
609
564
  switch (activeTool) {
610
565
  case ToolType.LINKER:
611
566
  setDashboardColumnSelectionValidator(localDashboardId, this.isColumnSelectionValid);
612
567
  break;
613
-
614
568
  default:
615
569
  setDashboardColumnSelectionValidator(localDashboardId, undefined);
616
570
  break;
617
571
  }
618
572
  }
619
-
620
573
  updateLinkInProgressType(linkInProgress) {
621
574
  var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'invalid';
622
575
  this.setState({
@@ -625,35 +578,31 @@ export class Linker extends Component {
625
578
  })
626
579
  });
627
580
  }
628
-
629
581
  isColumnSelectionValid(panel, tableColumn) {
630
582
  var {
631
583
  linkInProgress
632
584
  } = this.state;
633
585
  var {
634
586
  isolatedLinkerPanelId
635
- } = this.props; // Link not started yet - no need to update type
587
+ } = this.props;
636
588
 
589
+ // Link not started yet - no need to update type
637
590
  if ((linkInProgress === null || linkInProgress === void 0 ? void 0 : linkInProgress.start) == null) {
638
591
  return true;
639
592
  }
640
-
641
593
  if (tableColumn == null) {
642
594
  // Link started, end point is not a valid target
643
595
  this.updateLinkInProgressType(linkInProgress);
644
596
  return false;
645
597
  }
646
-
647
598
  var {
648
599
  isReversed,
649
600
  start
650
601
  } = linkInProgress;
651
602
  var panelId = LayoutUtils.getIdFromPanel(panel);
652
-
653
603
  if (panelId == null) {
654
604
  return false;
655
605
  }
656
-
657
606
  var end = {
658
607
  panelId,
659
608
  panelComponent: LayoutUtils.getComponentNameFromPanel(panel),
@@ -664,7 +613,6 @@ export class Linker extends Component {
664
613
  this.updateLinkInProgressType(linkInProgress, type);
665
614
  return type !== 'invalid';
666
615
  }
667
-
668
616
  render() {
669
617
  var {
670
618
  links,
@@ -672,12 +620,13 @@ export class Linker extends Component {
672
620
  panelManager
673
621
  } = this.props;
674
622
  var {
675
- linkInProgress
623
+ linkInProgress,
624
+ selectedIds
676
625
  } = this.state;
677
626
  var isLinkOverlayShown = this.isOverlayShown();
678
627
  var disabled = linkInProgress != null && linkInProgress.start != null;
679
628
  var linkerOverlayMessage = isolatedLinkerPanelId === undefined ? 'Click a column source, then click a column target to create a filter link. Remove a filter link by clicking again to erase. Click done when finished.' : 'Create a link between the source column button and a table column by clicking on one, then the other. Remove the link by clicking it directly. Click done when finished.';
680
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(CSSTransition, {
629
+ return /*#__PURE__*/React.createElement(CSSTransition, {
681
630
  in: isLinkOverlayShown,
682
631
  timeout: ThemeExport.transitionMs,
683
632
  classNames: "fade",
@@ -688,14 +637,16 @@ export class Linker extends Component {
688
637
  disabled: disabled,
689
638
  panelManager: panelManager,
690
639
  links: this.getCachedLinks(links, linkInProgress, isolatedLinkerPanelId),
640
+ selectedIds: selectedIds,
691
641
  messageText: linkerOverlayMessage,
642
+ onLinkSelected: this.handleLinkSelected,
692
643
  onLinkDeleted: this.handleLinkDeleted,
693
644
  onAllLinksDeleted: this.handleAllLinksDeleted,
645
+ onLinksUpdated: this.handleLinksUpdated,
694
646
  onDone: this.handleDone,
695
647
  onCancel: this.handleCancel
696
- })));
648
+ }));
697
649
  }
698
-
699
650
  }
700
651
  export default connector(Linker);
701
652
  //# sourceMappingURL=Linker.js.map