@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,971 +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 classNames from 'classnames';
8
- import memoize from 'memoize-one';
9
- import { connect } from 'react-redux';
10
- import { CSSTransition } from 'react-transition-group';
11
- import debounce from 'lodash.debounce';
12
- import { Chart, ChartUtils, isFigureChartModel } from '@deephaven/chart';
13
- import { getOpenedPanelMapForDashboard, LayoutUtils } from '@deephaven/dashboard';
14
- import { IrisGridUtils } from '@deephaven/iris-grid';
15
- import { ThemeExport } from '@deephaven/components';
16
- import Log from '@deephaven/log';
17
- import { getActiveTool, getSettings, setActiveTool as setActiveToolAction } from '@deephaven/redux';
18
- import { assertNotNull, Pending, PromiseUtils, TextUtils } from '@deephaven/utils';
19
- import WidgetPanel from "./WidgetPanel.js";
20
- import ToolType from "../linker/ToolType.js";
21
- import { InputFilterEvent, ChartEvent } from "../events/index.js";
22
- import { getColumnSelectionValidatorForDashboard, getInputFiltersForDashboard, getIsolatedLinkerPanelIdForDashboard, getLinksForDashboard, getTableMapForDashboard, setDashboardIsolatedLinkerPanelId as setDashboardIsolatedLinkerPanelIdAction } from "../redux/index.js";
23
- import ChartFilterOverlay from "./ChartFilterOverlay.js";
24
- import ChartColumnSelectorOverlay from "./ChartColumnSelectorOverlay.js";
25
- import "./ChartPanel.css";
26
- import { isChartPanelTableMetadata } from "./ChartPanelUtils.js";
27
- var log = Log.module('ChartPanel');
28
- var UPDATE_MODEL_DEBOUNCE = 150;
29
- function hasInputFilter(panel) {
30
- return panel.inputFilters != null;
31
- }
32
- function hasPanelState(panel) {
33
- return panel.panelState != null;
34
- }
35
- export class ChartPanel extends Component {
36
- constructor(props) {
37
- super(props);
38
- _defineProperty(this, "panelContainer", void 0);
39
- _defineProperty(this, "chart", void 0);
40
- _defineProperty(this, "pending", void 0);
41
- _defineProperty(this, "getWaitingInputMap", memoize((isFilterRequired, columnMap, filterMap) => {
42
- if (!isFilterRequired) {
43
- return new Map();
44
- }
45
- var waitingInputMap = new Map(columnMap);
46
- filterMap.forEach((filter, name) => {
47
- waitingInputMap.delete(name);
48
- });
49
- return waitingInputMap;
50
- }));
51
- _defineProperty(this, "getWaitingFilterMap", memoize((isFilterRequired, columnMap, filterMap, linkedColumnMap, inputFilterMap) => {
52
- if (!isFilterRequired) {
53
- return new Map();
54
- }
55
- var waitingFilterMap = new Map(columnMap);
56
- filterMap.forEach((filter, name) => {
57
- waitingFilterMap.delete(name);
58
- });
59
- inputFilterMap.forEach((value, name) => {
60
- waitingFilterMap.delete(name);
61
- });
62
- linkedColumnMap.forEach((column, name) => {
63
- waitingFilterMap.delete(name);
64
- });
65
- return waitingFilterMap;
66
- }));
67
- _defineProperty(this, "getInputFilterColumnMap", memoize((columnMap, inputFilters) => {
68
- var inputFilterMap = new Map();
69
- for (var i = 0; i < inputFilters.length; i += 1) {
70
- var inputFilter = inputFilters[i];
71
- var {
72
- name,
73
- type
74
- } = inputFilter;
75
- var column = columnMap.get(name);
76
- if (column != null && column.type === type) {
77
- inputFilterMap.set(name, inputFilter);
78
- }
79
- }
80
- return inputFilterMap;
81
- }));
82
- _defineProperty(this, "getLinkedColumnMap", memoize((columnMap, links) => {
83
- var linkedColumnMap = new Map();
84
- var panelId = LayoutUtils.getIdFromPanel(this);
85
- for (var i = 0; i < links.length; i += 1) {
86
- var link = links[i];
87
- var columnName = null;
88
- if (link.start != null && link.start.panelId === panelId && columnMap.has(link.start.columnName)) {
89
- columnName = link.start.columnName;
90
- } else if (link.end && link.end.panelId === panelId && columnMap.has(link.end.columnName)) {
91
- columnName = link.end.columnName;
92
- }
93
- if (columnName != null && columnMap.has(columnName)) {
94
- var column = columnMap.get(columnName);
95
- assertNotNull(column);
96
- linkedColumnMap.set(columnName, column);
97
- }
98
- }
99
- return linkedColumnMap;
100
- }));
101
- _defineProperty(this, "getSelectorColumns", memoize((columnMap, linkedColumnMap, columnSelectionValidator) => Array.from(columnMap.values()).map(column => ({
102
- name: column.name,
103
- type: column.type,
104
- isValid: columnSelectionValidator ? columnSelectionValidator(this, column) : false,
105
- isActive: linkedColumnMap.has(column.name)
106
- }))));
107
- this.handleColumnSelected = this.handleColumnSelected.bind(this);
108
- this.handleColumnMouseEnter = this.handleColumnMouseEnter.bind(this);
109
- this.handleColumnMouseLeave = this.handleColumnMouseLeave.bind(this);
110
- this.handleDisconnect = this.handleDisconnect.bind(this);
111
- this.handleReconnect = this.handleReconnect.bind(this);
112
- this.handleFilterAdd = this.handleFilterAdd.bind(this);
113
- this.handleHide = this.handleHide.bind(this);
114
- this.handleError = this.handleError.bind(this);
115
- this.handleLoadError = this.handleLoadError.bind(this);
116
- this.handleLoadSuccess = this.handleLoadSuccess.bind(this);
117
- this.handleResize = this.handleResize.bind(this);
118
- this.handleSettingsChanged = this.handleSettingsChanged.bind(this);
119
- this.handleOpenLinker = this.handleOpenLinker.bind(this);
120
- this.handleShow = this.handleShow.bind(this);
121
- this.handleSourceColumnChange = this.handleSourceColumnChange.bind(this);
122
- this.handleSourceFilterChange = this.handleSourceFilterChange.bind(this);
123
- this.handleSourceSortChange = this.handleSourceSortChange.bind(this);
124
- this.handleTabBlur = this.handleTabBlur.bind(this);
125
- this.handleTabFocus = this.handleTabFocus.bind(this);
126
- this.handleUpdate = this.handleUpdate.bind(this);
127
- this.updateModelFromSource = debounce(this.updateModelFromSource.bind(this), UPDATE_MODEL_DEBOUNCE);
128
- this.handleClearAllFilters = this.handleClearAllFilters.bind(this);
129
- this.panelContainer = /*#__PURE__*/React.createRef();
130
- this.chart = /*#__PURE__*/React.createRef();
131
- this.pending = new Pending();
132
- var {
133
- metadata,
134
- panelState
135
- } = props;
136
- var {
137
- filterValueMap = [],
138
- settings = {}
139
- } = panelState !== null && panelState !== void 0 ? panelState : {};
140
- this.state = {
141
- settings,
142
- error: undefined,
143
- isActive: false,
144
- isDisconnected: false,
145
- isLoading: false,
146
- isLoaded: false,
147
- isLinked: metadata != null && isChartPanelTableMetadata(metadata) && metadata.settings.isLinked,
148
- // Map of all non-empty filters applied to the chart.
149
- // Initialize the filter map to the previously stored values; input filters will be applied after load.
150
- filterMap: new Map(filterValueMap),
151
- // Map of filter values set from links, stored in panelState.
152
- // Combined with inputFilters to get applied filters (filterMap).
153
- filterValueMap: new Map(filterValueMap),
154
- model: undefined,
155
- columnMap: new Map(),
156
- // eslint-disable-next-line react/no-unused-state
157
- panelState
158
- };
159
- }
160
- componentDidMount() {
161
- if (!this.isHidden()) {
162
- this.setState({
163
- isActive: true
164
- });
165
- this.initModel();
166
- }
167
- }
168
- componentDidUpdate(prevProps, prevState) {
169
- var {
170
- inputFilters,
171
- source
172
- } = this.props;
173
- var {
174
- columnMap,
175
- model,
176
- filterMap,
177
- filterValueMap,
178
- isLinked,
179
- settings
180
- } = this.state;
181
- if (!model) {
182
- return;
183
- }
184
- if (columnMap !== prevState.columnMap) {
185
- this.pruneFilterMaps();
186
- }
187
- if (inputFilters !== prevProps.inputFilters) {
188
- this.updateChangedInputFilters(inputFilters, prevProps.inputFilters);
189
- }
190
- if (filterMap !== prevState.filterMap) {
191
- this.updateFilters();
192
- } else if (filterValueMap !== prevState.filterValueMap) {
193
- this.updatePanelState();
194
- }
195
- if (settings !== prevState.settings && isFigureChartModel(model)) {
196
- model.updateSettings(settings);
197
- this.updatePanelState();
198
- }
199
- if (isLinked !== prevState.isLinked) {
200
- if (source) {
201
- if (isLinked) {
202
- this.startListeningToSource(source);
203
- this.updateModelFromSource();
204
- } else {
205
- this.stopListeningToSource(source);
206
- }
207
- }
208
- } else if (isLinked && source !== prevProps.source) {
209
- if (prevProps.source) {
210
- this.stopListeningToSource(prevProps.source);
211
- }
212
- if (source) {
213
- this.startListeningToSource(source);
214
- this.updateModelFromSource();
215
- }
216
- }
217
- }
218
- componentWillUnmount() {
219
- this.pending.cancel();
220
- var {
221
- model
222
- } = this.state;
223
- var {
224
- source
225
- } = this.props;
226
- if (model != null && source) {
227
- this.stopListeningToSource(source);
228
- }
229
- }
230
- initModel() {
231
- this.setState({
232
- isLoading: true,
233
- isLoaded: false,
234
- error: undefined
235
- });
236
- var {
237
- makeModel
238
- } = this.props;
239
- this.pending.add(makeModel(), resolved => {
240
- resolved.close();
241
- }).then(this.handleLoadSuccess, this.handleLoadError);
242
- }
243
- startListeningToSource(table) {
244
- log.debug('startListeningToSource', table);
245
- var {
246
- model
247
- } = this.state;
248
- assertNotNull(model);
249
- var {
250
- dh
251
- } = model;
252
- table.addEventListener(dh.Table.EVENT_CUSTOMCOLUMNSCHANGED, this.handleSourceColumnChange);
253
- table.addEventListener(dh.Table.EVENT_FILTERCHANGED, this.handleSourceFilterChange);
254
- table.addEventListener(dh.Table.EVENT_SORTCHANGED, this.handleSourceSortChange);
255
- }
256
- stopListeningToSource(table) {
257
- log.debug('stopListeningToSource', table);
258
- var {
259
- model
260
- } = this.state;
261
- assertNotNull(model);
262
- var {
263
- dh
264
- } = model;
265
- table.removeEventListener(dh.Table.EVENT_CUSTOMCOLUMNSCHANGED, this.handleSourceColumnChange);
266
- table.removeEventListener(dh.Table.EVENT_FILTERCHANGED, this.handleSourceFilterChange);
267
- table.removeEventListener(dh.Table.EVENT_SORTCHANGED, this.handleSourceSortChange);
268
- }
269
- loadModelIfNecessary() {
270
- var {
271
- isActive,
272
- isLoaded,
273
- isLoading
274
- } = this.state;
275
- if (isActive && !isLoaded && !isLoading) {
276
- this.initModel();
277
- }
278
- }
279
- isHidden() {
280
- var {
281
- glContainer
282
- } = this.props;
283
- var {
284
- isHidden
285
- } = glContainer;
286
- return isHidden;
287
- }
288
- handleColumnSelected(columnName) {
289
- var {
290
- glEventHub
291
- } = this.props;
292
- var {
293
- columnMap
294
- } = this.state;
295
- glEventHub.emit(ChartEvent.COLUMN_SELECTED, this, columnMap.get(columnName));
296
- }
297
- handleColumnMouseEnter(_ref) {
298
- var {
299
- type,
300
- name
301
- } = _ref;
302
- var {
303
- columnSelectionValidator
304
- } = this.props;
305
- log.debug('handleColumnMouseEnter', columnSelectionValidator, type, name);
306
- if (!columnSelectionValidator) {
307
- return;
308
- }
309
- columnSelectionValidator(this, {
310
- type,
311
- name
312
- });
313
- }
314
- handleColumnMouseLeave() {
315
- var {
316
- columnSelectionValidator
317
- } = this.props;
318
- log.debug('handleColumnMouseLeave', columnSelectionValidator);
319
- if (!columnSelectionValidator) {
320
- return;
321
- }
322
- columnSelectionValidator(this, undefined);
323
- }
324
- handleDisconnect() {
325
- this.setState({
326
- error: new Error('Figure disconnected'),
327
- isDisconnected: true
328
- });
329
- }
330
- handleFilterAdd(columns) {
331
- for (var i = 0; i < columns.length; i += 1) {
332
- this.openInputFilter(columns[i]);
333
- }
334
- }
335
- handleOpenLinker() {
336
- var {
337
- localDashboardId,
338
- setActiveTool,
339
- setDashboardIsolatedLinkerPanelId
340
- } = this.props;
341
- setDashboardIsolatedLinkerPanelId(localDashboardId, undefined);
342
- setActiveTool(ToolType.LINKER);
343
- }
344
- handleReconnect() {
345
- this.setState({
346
- isDisconnected: false,
347
- error: undefined
348
- });
349
- this.sendColumnChange();
350
- this.updateColumnFilters();
351
- }
352
- handleLoadSuccess(model) {
353
- log.debug('handleLoadSuccess');
354
- var {
355
- model: prevModel
356
- } = this.state;
357
- this.setState({
358
- model,
359
- isLoaded: true
360
- }, () => {
361
- var {
362
- inputFilters,
363
- source
364
- } = this.props;
365
- var {
366
- filterMap,
367
- isLinked
368
- } = this.state;
369
- if (model !== prevModel) {
370
- this.sendColumnChange();
371
- this.updateColumnFilters();
372
- this.updateInputFilters(inputFilters, filterMap.size > 0 || model.isFilterRequired());
373
- if (source && isLinked) {
374
- this.startListeningToSource(source);
375
- this.updateModelFromSource();
376
- }
377
- }
378
- });
379
- }
380
- handleLoadError(error) {
381
- if (PromiseUtils.isCanceled(error)) {
382
- return;
383
- }
384
- log.error('handleLoadError', error);
385
- this.setState({
386
- error,
387
- isLoading: false
388
- });
389
- }
390
- handleSourceColumnChange() {
391
- this.updateModelFromSource();
392
- }
393
- handleSourceFilterChange() {
394
- this.updateModelFromSource();
395
- }
396
- handleSourceSortChange() {
397
- this.updateModelFromSource();
398
- }
399
- updateModelFromSource() {
400
- var {
401
- metadata,
402
- source
403
- } = this.props;
404
- var {
405
- isLinked,
406
- model
407
- } = this.state;
408
- if (!isLinked || !model || !source) {
409
- log.debug2('updateModelFromSource ignoring', isLinked, model, source);
410
- return;
411
- }
412
- var {
413
- dh
414
- } = model;
415
- // By now the model has already been loaded, which is the only other cancelable thing in pending
416
- this.pending.cancel();
417
- if (isChartPanelTableMetadata(metadata)) {
418
- var {
419
- settings
420
- } = metadata;
421
- this.pending.add(dh.plot.Figure.create(new ChartUtils(dh).makeFigureSettings(settings, source))).then(figure => {
422
- if (isFigureChartModel(model)) {
423
- model.setFigure(figure);
424
- }
425
- }).catch(this.handleLoadError);
426
- }
427
- this.updatePanelState();
428
- }
429
- updatePanelState() {
430
- var {
431
- sourcePanel
432
- } = this.props;
433
- var {
434
- panelState,
435
- filterValueMap,
436
- settings
437
- } = this.state;
438
- var {
439
- tableSettings
440
- } = panelState !== null && panelState !== void 0 ? panelState : {};
441
- if (sourcePanel) {
442
- // Right now just update the panel state from the source
443
- // If the source isn't available, just keep the state that's already saved
444
- if (hasInputFilter(sourcePanel.props) && hasPanelState(sourcePanel.state)) {
445
- var {
446
- inputFilters
447
- } = sourcePanel.props;
448
- var {
449
- panelState: sourcePanelState
450
- } = sourcePanel.state;
451
- if (sourcePanelState != null) {
452
- tableSettings = IrisGridUtils.extractTableSettings(sourcePanelState, inputFilters);
453
- }
454
- }
455
- }
456
-
457
- // eslint-disable-next-line react/no-unused-state
458
- this.setState({
459
- panelState: {
460
- settings,
461
- tableSettings,
462
- filterValueMap: Array.from(filterValueMap)
463
- }
464
- });
465
- }
466
- handleError() {
467
- // Don't want to set an error state, because the user can fix a chart error within the chart itself.
468
- // We're not loading anymore either so stop showing the spinner so the user can actually click those buttons.
469
- this.setState({
470
- isLoading: false
471
- });
472
- }
473
- handleResize() {
474
- this.updateChart();
475
- }
476
- handleSettingsChanged(update) {
477
- this.setState(_ref2 => {
478
- var {
479
- settings: prevSettings
480
- } = _ref2;
481
- var settings = _objectSpread(_objectSpread({}, prevSettings), update);
482
- log.debug('Updated settings', settings);
483
- return {
484
- settings
485
- };
486
- });
487
- }
488
- handleHide() {
489
- this.setActive(false);
490
- }
491
- handleShow() {
492
- this.setActive(true);
493
- }
494
- handleTabBlur() {
495
- this.setActive(false);
496
- }
497
- handleTabFocus() {
498
- var isHidden = this.isHidden();
499
- this.setActive(!isHidden);
500
- }
501
- handleUpdate() {
502
- this.setState({
503
- isLoading: false
504
- });
505
- }
506
- handleClearAllFilters() {
507
- // nuke link filter and input filter map
508
- // input filters only clear themselves if they are not yet empty
509
- this.setState({
510
- filterValueMap: new Map(),
511
- filterMap: new Map()
512
- });
513
- this.updatePanelState();
514
- }
515
-
516
- /**
517
- * Create an input filter panel for the provided column
518
- * @param column The column to create the input filter for
519
- */
520
- openInputFilter(column) {
521
- var {
522
- glEventHub
523
- } = this.props;
524
- var {
525
- name,
526
- type
527
- } = column;
528
- glEventHub.emit(InputFilterEvent.OPEN_INPUT, {
529
- title: "".concat(name, " Filter"),
530
- panelState: {
531
- name,
532
- type,
533
- isValueShown: true
534
- },
535
- createNewStack: true,
536
- focusElement: 'input'
537
- });
538
- }
539
- setActive(isActive) {
540
- this.setState({
541
- isActive
542
- }, () => {
543
- if (isActive) {
544
- this.loadModelIfNecessary();
545
- this.updateChart();
546
- }
547
- });
548
- }
549
- sendColumnChange() {
550
- var {
551
- model
552
- } = this.state;
553
- if (!model) {
554
- return;
555
- }
556
- var {
557
- glEventHub
558
- } = this.props;
559
- glEventHub.emit(InputFilterEvent.COLUMNS_CHANGED, this, Array.from(model.getFilterColumnMap().values()));
560
- }
561
- getCoordinateForColumn(columnName) {
562
- var _element$getBoundingC;
563
- var className = ChartColumnSelectorOverlay.makeButtonClassName(columnName);
564
- if (!this.panelContainer.current) {
565
- return null;
566
- }
567
- var element = this.panelContainer.current.querySelector(".".concat(className));
568
- var rect = (_element$getBoundingC = element === null || element === void 0 ? void 0 : element.getBoundingClientRect()) !== null && _element$getBoundingC !== void 0 ? _element$getBoundingC : null;
569
- if (rect == null || rect.width <= 0 || rect.height <= 0) {
570
- return null;
571
- }
572
- var x = rect.left + rect.width / 2;
573
- var y = rect.bottom;
574
- return [x, y];
575
- }
576
-
577
- /**
578
- * Set chart filters based on the filter map
579
- * @param filterMapParam Filter map
580
- */
581
- setFilterMap(filterMapParam) {
582
- log.debug('setFilterMap', filterMapParam);
583
- this.setState(state => {
584
- var _updatedFilterMap;
585
- var {
586
- columnMap,
587
- filterMap
588
- } = state;
589
- var updatedFilterMap = null;
590
- var filterValueMap = new Map(state.filterValueMap);
591
- filterMapParam.forEach((_ref3, columnName) => {
592
- var {
593
- columnType,
594
- filterList
595
- } = _ref3;
596
- var column = columnMap.get(columnName);
597
- if (column == null || column.type !== columnType) {
598
- return;
599
- }
600
- if (filterList.length < 1) {
601
- log.debug('Ignoring empty filterList for column', columnName);
602
- return;
603
- }
604
- var {
605
- value
606
- } = filterList[0];
607
- filterValueMap.set(columnName, value);
608
- if (filterMap.get(columnName) !== value) {
609
- if (updatedFilterMap === null) {
610
- updatedFilterMap = new Map(filterMap);
611
- }
612
- updatedFilterMap.set(columnName, value);
613
- }
614
- });
615
-
616
- // Don't update filterMap unless the filters actually changed.
617
- // Otherwise the chart gets stuck on a spinner
618
- // because it never gets an update event for unchanged filters.
619
- return {
620
- filterValueMap,
621
- filterMap: (_updatedFilterMap = updatedFilterMap) !== null && _updatedFilterMap !== void 0 ? _updatedFilterMap : filterMap
622
- };
623
- });
624
- }
625
- unsetFilterValue(columnName) {
626
- this.setState(state => {
627
- // We want to unset a value unless there's an input filter for it
628
- // If there's an input filter, then we want to just set it to that value
629
- // This way if the user has an input filter and a link, when they delete the link the input filter value takes effect
630
- var {
631
- inputFilters
632
- } = this.props;
633
- var {
634
- columnMap
635
- } = state;
636
- var {
637
- filterMap,
638
- filterValueMap
639
- } = state;
640
- if (!filterValueMap.has(columnName)) {
641
- return null;
642
- }
643
- filterValueMap = new Map(state.filterValueMap);
644
- filterValueMap.delete(columnName);
645
- var inputFilterMap = this.getInputFilterColumnMap(columnMap, inputFilters);
646
- if (inputFilterMap.has(columnName)) {
647
- var _inputFilterMap$get;
648
- var filterValue = filterMap.get(columnName);
649
- var inputFilterValue = (_inputFilterMap$get = inputFilterMap.get(columnName)) === null || _inputFilterMap$get === void 0 ? void 0 : _inputFilterMap$get.value;
650
- if (inputFilterValue != null && filterValue !== inputFilterValue) {
651
- filterMap = new Map(state.filterMap);
652
- if (inputFilterValue.length > 0) {
653
- filterMap.set(columnName, inputFilterValue);
654
- } else {
655
- filterMap.delete(columnName);
656
- }
657
- }
658
- } else {
659
- filterMap = new Map(state.filterMap);
660
- filterMap.delete(columnName);
661
- }
662
- return {
663
- filterMap,
664
- filterValueMap
665
- };
666
- });
667
- }
668
- updateChangedInputFilters(inputFilters, prevInputFilters) {
669
- var deletedInputFilters = prevInputFilters.filter(prevInputFilter => inputFilters.find(inputFilter => inputFilter.name === prevInputFilter.name && inputFilter.type === prevInputFilter.type) === undefined);
670
- if (deletedInputFilters.length > 0) {
671
- this.deleteInputFilters(deletedInputFilters);
672
- }
673
- var changedInputFilters = inputFilters.filter(inputFilter => !prevInputFilters.includes(inputFilter));
674
- if (changedInputFilters.length > 0) {
675
- this.updateInputFilters(changedInputFilters);
676
- }
677
- }
678
- updateInputFilters(inputFilters) {
679
- var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
680
- this.setState(state => {
681
- var {
682
- columnMap
683
- } = state;
684
- var filterValueMap = new Map(state.filterValueMap);
685
- var filterMap = new Map(state.filterMap);
686
- var update = forceUpdate ? {
687
- filterMap,
688
- filterValueMap
689
- } : {};
690
- for (var i = 0; i < inputFilters.length; i += 1) {
691
- var {
692
- name,
693
- type,
694
- value
695
- } = inputFilters[i];
696
- var column = columnMap.get(name);
697
- if (column != null && column.type === type) {
698
- if (value != null && filterMap.get(name) !== value) {
699
- if (value === '') {
700
- filterMap.delete(name);
701
- } else {
702
- filterMap.set(name, value);
703
- }
704
- update.filterMap = filterMap;
705
- }
706
- if (filterValueMap.has(name)) {
707
- // Need to unset whatever the linked value was - if they want that value again, they need to double click the link again
708
- filterValueMap.delete(name);
709
- update.filterValueMap = filterValueMap;
710
- }
711
- }
712
- }
713
- log.debug('updateInputFilters', update);
714
- return update;
715
- });
716
- }
717
- deleteInputFilters(inputFilters) {
718
- var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
719
- this.setState(state => {
720
- var {
721
- columnMap,
722
- filterValueMap
723
- } = state;
724
- var filterMap = new Map(state.filterMap);
725
- var needsUpdate = forceUpdate;
726
- for (var i = 0; i < inputFilters.length; i += 1) {
727
- var {
728
- name,
729
- type
730
- } = inputFilters[i];
731
- var column = columnMap.get(name);
732
- if (column != null && column.type === type) {
733
- if (filterMap.has(name)) {
734
- var filterValue = filterMap.get(name);
735
- if (filterValueMap.has(name)) {
736
- var linkValue = filterValueMap.get(name);
737
- if (linkValue !== filterValue && linkValue != null) {
738
- needsUpdate = true;
739
- filterMap.set(name, linkValue);
740
- }
741
- } else {
742
- needsUpdate = true;
743
- filterMap.delete(name);
744
- }
745
- }
746
- }
747
- }
748
- log.debug('deleteInputFilters', needsUpdate);
749
- return needsUpdate ? {
750
- filterMap
751
- } : null;
752
- });
753
- }
754
- updateColumnFilters() {
755
- this.setState(_ref4 => {
756
- var {
757
- model
758
- } = _ref4;
759
- if (!model) {
760
- return null;
761
- }
762
- return {
763
- columnMap: model.getFilterColumnMap()
764
- };
765
- });
766
- }
767
- updateFilters() {
768
- var {
769
- columnMap,
770
- filterMap,
771
- model
772
- } = this.state;
773
- assertNotNull(model);
774
- var waitingInputMap = this.getWaitingInputMap(model.isFilterRequired(), columnMap, filterMap);
775
- model.setFilter(filterMap);
776
- if (filterMap.size > 0 && waitingInputMap.size === 0) {
777
- var defaultTitle = model.getDefaultTitle();
778
- var filterTitle = TextUtils.join(Array.from(filterMap.entries()).map(_ref5 => {
779
- var [name, value] = _ref5;
780
- return "".concat(name, ": ").concat(value);
781
- }));
782
- if (defaultTitle) {
783
- model.setTitle("".concat(defaultTitle, "<br><span style=\"font-size: smaller\">").concat(filterTitle, "</span>"));
784
- } else {
785
- model.setTitle(filterTitle);
786
- }
787
- log.debug2('updateFilters filters set', filterMap);
788
- this.setState({
789
- isLoading: true
790
- });
791
- } else {
792
- log.debug2('updateFilters waiting on inputs', waitingInputMap);
793
- model.setTitle(model.getDefaultTitle());
794
- this.setState({
795
- isLoading: false
796
- });
797
- }
798
- this.updatePanelState();
799
- }
800
-
801
- /**
802
- * Removes any set filter values that are no longer part of the model
803
- */
804
- pruneFilterMaps() {
805
- this.setState(state => {
806
- var {
807
- columnMap
808
- } = state;
809
- var filterMap = new Map(state.filterMap);
810
- var filterValueMap = new Map(state.filterValueMap);
811
- var newState = {};
812
- state.filterValueMap.forEach((value, name) => {
813
- if (!columnMap.has(name)) {
814
- filterValueMap.delete(name);
815
- newState.filterValueMap = filterValueMap;
816
- }
817
- });
818
- state.filterMap.forEach((value, name) => {
819
- if (!columnMap.has(name)) {
820
- filterMap.delete(name);
821
- newState.filterMap = filterMap;
822
- }
823
- });
824
- return newState;
825
- });
826
- }
827
- updateChart() {
828
- if (this.chart.current) {
829
- this.chart.current.updateDimensions();
830
- }
831
- }
832
- render() {
833
- var {
834
- columnSelectionValidator,
835
- glContainer,
836
- glEventHub,
837
- inputFilters,
838
- isLinkerActive,
839
- links,
840
- metadata,
841
- settings,
842
- Plotly
843
- } = this.props;
844
- var {
845
- columnMap,
846
- filterMap,
847
- error,
848
- model,
849
- isActive,
850
- isDisconnected,
851
- isLoaded,
852
- isLoading
853
- } = this.state;
854
- var name;
855
- if (isChartPanelTableMetadata(metadata)) {
856
- name = metadata.table;
857
- } else {
858
- name = metadata.figure;
859
- }
860
- var inputFilterMap = this.getInputFilterColumnMap(columnMap, inputFilters);
861
- var linkedColumnMap = this.getLinkedColumnMap(columnMap, links);
862
- var waitingInputMap = model != null ? this.getWaitingInputMap(model.isFilterRequired(), columnMap, filterMap) : new Map();
863
- var waitingFilterMap = model != null ? this.getWaitingFilterMap(model.isFilterRequired(), columnMap, filterMap, linkedColumnMap, inputFilterMap) : new Map();
864
- var errorMessage = error != null ? "Unable to open chart. ".concat(error) : undefined;
865
- var isWaitingForFilter = waitingInputMap.size > 0;
866
- var isSelectingColumn = columnMap.size > 0 && isLinkerActive;
867
- return /*#__PURE__*/React.createElement(WidgetPanel, {
868
- className: classNames('iris-chart-panel', {
869
- 'input-required': isWaitingForFilter
870
- }),
871
- componentPanel: this,
872
- glContainer: glContainer,
873
- glEventHub: glEventHub,
874
- onHide: this.handleHide,
875
- onClearAllFilters: this.handleClearAllFilters,
876
- onResize: this.handleResize,
877
- onShow: this.handleShow,
878
- onTabBlur: this.handleTabBlur,
879
- onTabFocus: this.handleTabFocus,
880
- errorMessage: errorMessage,
881
- isDisconnected: isDisconnected,
882
- isLoading: isLoading,
883
- isLoaded: isLoaded,
884
- widgetName: name,
885
- widgetType: "Chart"
886
- }, /*#__PURE__*/React.createElement("div", {
887
- ref: this.panelContainer,
888
- className: "chart-panel-container h-100 w-100"
889
- }, /*#__PURE__*/React.createElement("div", {
890
- className: "chart-container h-100 w-100"
891
- }, isLoaded && model && /*#__PURE__*/React.createElement(Chart, {
892
- isActive: isActive,
893
- model: model,
894
- settings: settings,
895
- ref: this.chart,
896
- onDisconnect: this.handleDisconnect,
897
- onReconnect: this.handleReconnect,
898
- onUpdate: this.handleUpdate,
899
- onError: this.handleError,
900
- onSettingsChanged: this.handleSettingsChanged,
901
- Plotly: Plotly
902
- })), /*#__PURE__*/React.createElement(CSSTransition, {
903
- in: isWaitingForFilter && !isSelectingColumn && !isLoading,
904
- timeout: ThemeExport.transitionMs,
905
- classNames: "fade",
906
- mountOnEnter: true,
907
- unmountOnExit: true
908
- }, /*#__PURE__*/React.createElement(ChartFilterOverlay, {
909
- inputFilterMap: inputFilterMap,
910
- linkedColumnMap: linkedColumnMap,
911
- onAdd: this.handleFilterAdd,
912
- onOpenLinker: this.handleOpenLinker,
913
- columnMap: columnMap,
914
- waitingFilterMap: waitingFilterMap,
915
- waitingInputMap: waitingInputMap
916
- })), /*#__PURE__*/React.createElement(CSSTransition, {
917
- in: isSelectingColumn,
918
- timeout: ThemeExport.transitionMs,
919
- classNames: "fade",
920
- mountOnEnter: true,
921
- unmountOnExit: true
922
- }, /*#__PURE__*/React.createElement(ChartColumnSelectorOverlay, {
923
- columns: this.getSelectorColumns(columnMap, linkedColumnMap, columnSelectionValidator),
924
- onColumnSelected: this.handleColumnSelected,
925
- onMouseEnter: this.handleColumnMouseEnter,
926
- onMouseLeave: this.handleColumnMouseLeave
927
- }))));
928
- }
929
- }
930
- _defineProperty(ChartPanel, "defaultProps", {
931
- columnSelectionValidator: null,
932
- isLinkerActive: false,
933
- source: null,
934
- sourcePanel: null,
935
- panelState: null,
936
- settings: {}
937
- });
938
- _defineProperty(ChartPanel, "displayName", 'ChartPanel');
939
- _defineProperty(ChartPanel, "COMPONENT", 'ChartPanel');
940
- var mapStateToProps = (state, ownProps) => {
941
- var {
942
- localDashboardId,
943
- metadata
944
- } = ownProps;
945
- var sourcePanelId;
946
- if (metadata != null) {
947
- sourcePanelId = metadata.sourcePanelId;
948
- }
949
- var panelTableMap = getTableMapForDashboard(state, localDashboardId);
950
- var openedPanelMap = getOpenedPanelMapForDashboard(state, localDashboardId);
951
- var activeTool = getActiveTool(state);
952
- var isolatedLinkerPanelId = getIsolatedLinkerPanelIdForDashboard(state, localDashboardId);
953
- var isLinkerActive = activeTool === ToolType.LINKER && isolatedLinkerPanelId === undefined;
954
- return {
955
- columnSelectionValidator: getColumnSelectionValidatorForDashboard(state, localDashboardId),
956
- isLinkerActive,
957
- inputFilters: getInputFiltersForDashboard(state, localDashboardId),
958
- links: getLinksForDashboard(state, localDashboardId),
959
- source: sourcePanelId != null ? panelTableMap.get(sourcePanelId) : undefined,
960
- sourcePanel: sourcePanelId != null ? openedPanelMap.get(sourcePanelId) : undefined,
961
- settings: getSettings(state)
962
- };
963
- };
964
- var ConnectedChartPanel = connect(mapStateToProps, {
965
- setActiveTool: setActiveToolAction,
966
- setDashboardIsolatedLinkerPanelId: setDashboardIsolatedLinkerPanelIdAction
967
- }, null, {
968
- forwardRef: true
969
- })(ChartPanel);
970
- export default ConnectedChartPanel;
971
- //# sourceMappingURL=ChartPanel.js.map