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