@deephaven/dashboard-core-plugins 0.43.0 → 0.44.1-beta.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.
- package/dist/ChartBuilderPlugin.js +54 -0
- package/dist/ChartBuilderPlugin.js.map +1 -0
- package/dist/ChartPlugin.js +66 -0
- package/dist/ChartPlugin.js.map +1 -0
- package/dist/ConsolePlugin.js +396 -0
- package/dist/ConsolePlugin.js.map +1 -0
- package/dist/FilterPlugin.js +205 -0
- package/dist/FilterPlugin.js.map +1 -0
- package/dist/GridPlugin.js +74 -0
- package/dist/GridPlugin.js.map +1 -0
- package/dist/LinkerPlugin.js +18 -0
- package/dist/LinkerPlugin.js.map +1 -0
- package/dist/MarkdownPlugin.js +87 -0
- package/dist/MarkdownPlugin.js.map +1 -0
- package/dist/PandasPlugin.js +66 -0
- package/dist/PandasPlugin.js.map +1 -0
- package/dist/controls/ControlType.js +10 -0
- package/dist/controls/ControlType.js.map +1 -0
- package/dist/controls/dropdown-filter/DropdownFilter.css +86 -0
- package/dist/controls/dropdown-filter/DropdownFilter.css.map +1 -0
- package/dist/controls/dropdown-filter/DropdownFilter.js +417 -0
- package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -0
- package/dist/controls/input-filter/InputFilter.css +75 -0
- package/dist/controls/input-filter/InputFilter.css.map +1 -0
- package/dist/controls/input-filter/InputFilter.js +291 -0
- package/dist/controls/input-filter/InputFilter.js.map +1 -0
- package/dist/controls/markdown/MarkdownContainer.js +30 -0
- package/dist/controls/markdown/MarkdownContainer.js.map +1 -0
- package/dist/controls/markdown/MarkdownEditor.js +52 -0
- package/dist/controls/markdown/MarkdownEditor.js.map +1 -0
- package/dist/controls/markdown/MarkdownStartPage.js +109 -0
- package/dist/controls/markdown/MarkdownStartPage.js.map +1 -0
- package/dist/controls/markdown/MarkdownUtils.js +23 -0
- package/dist/controls/markdown/MarkdownUtils.js.map +1 -0
- package/dist/events/ChartEvent.js +9 -0
- package/dist/events/ChartEvent.js.map +1 -0
- package/dist/events/ConsoleEvent.js +11 -0
- package/dist/events/ConsoleEvent.js.map +1 -0
- package/dist/events/InputFilterEvent.js +14 -0
- package/dist/events/InputFilterEvent.js.map +1 -0
- package/dist/events/IrisGridEvent.js +12 -0
- package/dist/events/IrisGridEvent.js.map +1 -0
- package/dist/events/MarkdownEvent.js +4 -0
- package/dist/events/MarkdownEvent.js.map +1 -0
- package/dist/events/NotebookEvent.js +15 -0
- package/dist/events/NotebookEvent.js.map +1 -0
- package/dist/events/PQEvent.js +9 -0
- package/dist/events/PQEvent.js.map +1 -0
- package/dist/events/PandasEvent.js +8 -0
- package/dist/events/PandasEvent.js.map +1 -0
- package/dist/events/TabEvent.js +12 -0
- package/dist/events/TabEvent.js.map +1 -0
- package/dist/events/index.js +9 -0
- package/dist/events/index.js.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/linker/ColumnSelectionValidator.js +2 -0
- package/dist/linker/ColumnSelectionValidator.js.map +1 -0
- package/dist/linker/Linker.js +736 -0
- package/dist/linker/Linker.js.map +1 -0
- package/dist/linker/LinkerLink.css +142 -0
- package/dist/linker/LinkerLink.css.map +1 -0
- package/dist/linker/LinkerLink.js +314 -0
- package/dist/linker/LinkerLink.js.map +1 -0
- package/dist/linker/LinkerOverlayContent.css +63 -0
- package/dist/linker/LinkerOverlayContent.css.map +1 -0
- package/dist/linker/LinkerOverlayContent.js +343 -0
- package/dist/linker/LinkerOverlayContent.js.map +1 -0
- package/dist/linker/LinkerUtils.js +139 -0
- package/dist/linker/LinkerUtils.js.map +1 -0
- package/dist/linker/ToolType.js +5 -0
- package/dist/linker/ToolType.js.map +1 -0
- package/dist/linker/index.js +2 -0
- package/dist/linker/index.js.map +1 -0
- package/dist/panels/ChartColumnSelectorOverlay.css +11 -0
- package/dist/panels/ChartColumnSelectorOverlay.css.map +1 -0
- package/dist/panels/ChartColumnSelectorOverlay.js +38 -0
- package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -0
- package/dist/panels/ChartFilterOverlay.css +22 -0
- package/dist/panels/ChartFilterOverlay.css.map +1 -0
- package/dist/panels/ChartFilterOverlay.js +90 -0
- package/dist/panels/ChartFilterOverlay.js.map +1 -0
- package/dist/panels/ChartPanel.css +38 -0
- package/dist/panels/ChartPanel.css.map +1 -0
- package/dist/panels/ChartPanel.js +971 -0
- package/dist/panels/ChartPanel.js.map +1 -0
- package/dist/panels/ChartPanelUtils.js +5 -0
- package/dist/panels/ChartPanelUtils.js.map +1 -0
- package/dist/panels/CommandHistoryPanel.css +19 -0
- package/dist/panels/CommandHistoryPanel.css.map +1 -0
- package/dist/panels/CommandHistoryPanel.js +195 -0
- package/dist/panels/CommandHistoryPanel.js.map +1 -0
- package/dist/panels/ConsolePanel.css +19 -0
- package/dist/panels/ConsolePanel.css.map +1 -0
- package/dist/panels/ConsolePanel.js +365 -0
- package/dist/panels/ConsolePanel.js.map +1 -0
- package/dist/panels/DropdownFilterPanel.css +6 -0
- package/dist/panels/DropdownFilterPanel.css.map +1 -0
- package/dist/panels/DropdownFilterPanel.js +685 -0
- package/dist/panels/DropdownFilterPanel.js.map +1 -0
- package/dist/panels/FileExplorerPanel.css +6 -0
- package/dist/panels/FileExplorerPanel.css.map +1 -0
- package/dist/panels/FileExplorerPanel.js +252 -0
- package/dist/panels/FileExplorerPanel.js.map +1 -0
- package/dist/panels/FilterSetManager.css +112 -0
- package/dist/panels/FilterSetManager.css.map +1 -0
- package/dist/panels/FilterSetManager.js +689 -0
- package/dist/panels/FilterSetManager.js.map +1 -0
- package/dist/panels/FilterSetManagerPanel.css +34 -0
- package/dist/panels/FilterSetManagerPanel.css.map +1 -0
- package/dist/panels/FilterSetManagerPanel.js +345 -0
- package/dist/panels/FilterSetManagerPanel.js.map +1 -0
- package/dist/panels/InputFilterPanel.js +232 -0
- package/dist/panels/InputFilterPanel.js.map +1 -0
- package/dist/panels/IrisGridPanel.css +24 -0
- package/dist/panels/IrisGridPanel.css.map +1 -0
- package/dist/panels/IrisGridPanel.js +1018 -0
- package/dist/panels/IrisGridPanel.js.map +1 -0
- package/dist/panels/IrisGridPanelTooltip.js +39 -0
- package/dist/panels/IrisGridPanelTooltip.js.map +1 -0
- package/dist/panels/LogPanel.css +15 -0
- package/dist/panels/LogPanel.css.map +1 -0
- package/dist/panels/LogPanel.js +110 -0
- package/dist/panels/LogPanel.js.map +1 -0
- package/dist/panels/MarkdownNotebook.css +107 -0
- package/dist/panels/MarkdownNotebook.css.map +1 -0
- package/dist/panels/MarkdownNotebook.js +232 -0
- package/dist/panels/MarkdownNotebook.js.map +1 -0
- package/dist/panels/MarkdownPanel.css +90 -0
- package/dist/panels/MarkdownPanel.css.map +1 -0
- package/dist/panels/MarkdownPanel.js +202 -0
- package/dist/panels/MarkdownPanel.js.map +1 -0
- package/dist/panels/MockFileStorage.js +70 -0
- package/dist/panels/MockFileStorage.js.map +1 -0
- package/dist/panels/MockFileStorageTable.js +80 -0
- package/dist/panels/MockFileStorageTable.js.map +1 -0
- package/dist/panels/NotebookPanel.css +44 -0
- package/dist/panels/NotebookPanel.css.map +1 -0
- package/dist/panels/NotebookPanel.js +1224 -0
- package/dist/panels/NotebookPanel.js.map +1 -0
- package/dist/panels/PandasPanel.css +15 -0
- package/dist/panels/PandasPanel.css.map +1 -0
- package/dist/panels/PandasPanel.js +86 -0
- package/dist/panels/PandasPanel.js.map +1 -0
- package/dist/panels/Panel.js +314 -0
- package/dist/panels/Panel.js.map +1 -0
- package/dist/panels/PanelContextMenu.js +126 -0
- package/dist/panels/PanelContextMenu.js.map +1 -0
- package/dist/panels/RenameDialog.js +156 -0
- package/dist/panels/RenameDialog.js.map +1 -0
- package/dist/panels/WidgetPanel.css +17 -0
- package/dist/panels/WidgetPanel.css.map +1 -0
- package/dist/panels/WidgetPanel.js +189 -0
- package/dist/panels/WidgetPanel.js.map +1 -0
- package/dist/panels/WidgetPanelTooltip.css +40 -0
- package/dist/panels/WidgetPanelTooltip.css.map +1 -0
- package/dist/panels/WidgetPanelTooltip.js +49 -0
- package/dist/panels/WidgetPanelTooltip.js.map +1 -0
- package/dist/panels/index.js +22 -0
- package/dist/panels/index.js.map +1 -0
- package/dist/prop-types/CommonPropTypes.js +9 -0
- package/dist/prop-types/CommonPropTypes.js.map +1 -0
- package/dist/prop-types/UIPropTypes.js +42 -0
- package/dist/prop-types/UIPropTypes.js.map +1 -0
- package/dist/prop-types/index.js +3 -0
- package/dist/prop-types/index.js.map +1 -0
- package/dist/redux/actionTypes.js +3 -0
- package/dist/redux/actionTypes.js.map +1 -0
- package/dist/redux/actions.js +88 -0
- package/dist/redux/actions.js.map +1 -0
- package/dist/redux/index.js +10 -0
- package/dist/redux/index.js.map +1 -0
- package/dist/redux/reducers/connection.js +7 -0
- package/dist/redux/reducers/connection.js.map +1 -0
- package/dist/redux/reducers/index.js +5 -0
- package/dist/redux/reducers/index.js.map +1 -0
- package/dist/redux/reducers/sessionWrapper.js +7 -0
- package/dist/redux/reducers/sessionWrapper.js.map +1 -0
- package/dist/redux/selectors.js +92 -0
- package/dist/redux/selectors.js.map +1 -0
- package/package.json +22 -22
|
@@ -0,0 +1,343 @@
|
|
|
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 { Button, ContextActions, GLOBAL_SHORTCUTS, Tooltip } from '@deephaven/components';
|
|
9
|
+
import { LayoutUtils } from '@deephaven/dashboard';
|
|
10
|
+
import Log from '@deephaven/log';
|
|
11
|
+
import { vsGripper } from '@deephaven/icons';
|
|
12
|
+
import clamp from 'lodash.clamp';
|
|
13
|
+
import { isLinkableFromPanel } from "./LinkerUtils.js";
|
|
14
|
+
import LinkerLink from "./LinkerLink.js";
|
|
15
|
+
import "./LinkerOverlayContent.css";
|
|
16
|
+
var log = Log.module('LinkerOverlayContent');
|
|
17
|
+
export class LinkerOverlayContent extends Component {
|
|
18
|
+
constructor(props) {
|
|
19
|
+
super(props);
|
|
20
|
+
_defineProperty(this, "dialogRef", void 0);
|
|
21
|
+
this.handleBlur = this.handleBlur.bind(this);
|
|
22
|
+
this.handleResize = this.handleResize.bind(this);
|
|
23
|
+
this.handleMouseMove = this.handleMouseMove.bind(this);
|
|
24
|
+
this.handleMouseDown = this.handleMouseDown.bind(this);
|
|
25
|
+
this.handleMouseUp = this.handleMouseUp.bind(this);
|
|
26
|
+
this.handleKeyDown = this.handleKeyDown.bind(this);
|
|
27
|
+
this.handleKeyUp = this.handleKeyUp.bind(this);
|
|
28
|
+
this.handleEscapePressed = this.handleEscapePressed.bind(this);
|
|
29
|
+
this.handleOperatorChanged = this.handleOperatorChanged.bind(this);
|
|
30
|
+
this.dialogRef = /*#__PURE__*/React.createRef();
|
|
31
|
+
this.state = {
|
|
32
|
+
mouse: undefined,
|
|
33
|
+
dialog: undefined,
|
|
34
|
+
offset: {
|
|
35
|
+
x: 0,
|
|
36
|
+
y: 0
|
|
37
|
+
},
|
|
38
|
+
isDragging: false,
|
|
39
|
+
mode: 'select'
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
componentDidMount() {
|
|
43
|
+
window.addEventListener('blur', this.handleBlur, true);
|
|
44
|
+
window.addEventListener('mousemove', this.handleMouseMove, true);
|
|
45
|
+
window.addEventListener('mouseup', this.handleMouseUp, true);
|
|
46
|
+
window.addEventListener('keydown', this.handleKeyDown, true);
|
|
47
|
+
window.addEventListener('keyup', this.handleKeyUp, true);
|
|
48
|
+
window.addEventListener('resize', this.handleResize, true);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// eslint-disable-next-line react/sort-comp
|
|
52
|
+
componentDidCatch(error, info) {
|
|
53
|
+
log.error('componentDidCatch', error, info);
|
|
54
|
+
}
|
|
55
|
+
componentWillUnmount() {
|
|
56
|
+
window.removeEventListener('blur', this.handleBlur, true);
|
|
57
|
+
window.removeEventListener('mousemove', this.handleMouseMove, true);
|
|
58
|
+
window.removeEventListener('mouseup', this.handleMouseUp, true);
|
|
59
|
+
window.removeEventListener('keydown', this.handleKeyDown, true);
|
|
60
|
+
window.removeEventListener('keyup', this.handleKeyUp, true);
|
|
61
|
+
window.removeEventListener('resize', this.handleResize, true);
|
|
62
|
+
}
|
|
63
|
+
/** Gets the on screen points for a link start or end spec */
|
|
64
|
+
getPointFromLinkPoint(linkPoint) {
|
|
65
|
+
var {
|
|
66
|
+
panelManager
|
|
67
|
+
} = this.props;
|
|
68
|
+
var {
|
|
69
|
+
panelId,
|
|
70
|
+
columnName
|
|
71
|
+
} = linkPoint;
|
|
72
|
+
var panel = panelManager.getOpenedPanelById(panelId);
|
|
73
|
+
if (panel != null) {
|
|
74
|
+
if (!isLinkableFromPanel(panel)) {
|
|
75
|
+
throw new Error("Panel does not have getCoordinateForColumn method: ".concat(panelId));
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
// TODO: remove try/catch when IDS-7371 is fixed.
|
|
79
|
+
// getCoordinateForColumn throws an exception when accessing
|
|
80
|
+
// columns on a model while it reconnects
|
|
81
|
+
var coordinate = panel.getCoordinateForColumn(columnName);
|
|
82
|
+
if (coordinate != null) {
|
|
83
|
+
return coordinate;
|
|
84
|
+
}
|
|
85
|
+
} catch (e) {
|
|
86
|
+
log.error('Could not get coordinate for column', columnName, panel);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Fallback to panel container if the panel itself
|
|
90
|
+
// crashed, unmounted, and removed from openedPanelMap.
|
|
91
|
+
var glContainer = panelManager.getContainerByPanelId(panelId);
|
|
92
|
+
if (glContainer == null) {
|
|
93
|
+
throw new Error("Unable to find panel container for id: ".concat(panelId));
|
|
94
|
+
}
|
|
95
|
+
return LayoutUtils.getTabPoint(glContainer);
|
|
96
|
+
}
|
|
97
|
+
handleOperatorChanged(linkId, type) {
|
|
98
|
+
var {
|
|
99
|
+
links,
|
|
100
|
+
onLinksUpdated
|
|
101
|
+
} = this.props;
|
|
102
|
+
var newLinks = links.map(link => link.id === linkId ? _objectSpread(_objectSpread({}, link), {}, {
|
|
103
|
+
operator: type
|
|
104
|
+
}) : link);
|
|
105
|
+
onLinksUpdated(newLinks);
|
|
106
|
+
}
|
|
107
|
+
handleBlur() {
|
|
108
|
+
this.setState({
|
|
109
|
+
mode: 'select'
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
handleResize() {
|
|
113
|
+
var {
|
|
114
|
+
dialog
|
|
115
|
+
} = this.state;
|
|
116
|
+
if (dialog && this.dialogRef.current) {
|
|
117
|
+
var rect = this.dialogRef.current.getBoundingClientRect();
|
|
118
|
+
var dialogX = clamp(dialog.x, 0, window.innerWidth - rect.width);
|
|
119
|
+
var dialogY = clamp(dialog.y, 0, window.innerHeight - rect.height);
|
|
120
|
+
this.setState({
|
|
121
|
+
dialog: {
|
|
122
|
+
x: dialogX,
|
|
123
|
+
y: dialogY
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
handleMouseMove(event) {
|
|
129
|
+
var {
|
|
130
|
+
offset,
|
|
131
|
+
isDragging
|
|
132
|
+
} = this.state;
|
|
133
|
+
this.setState({
|
|
134
|
+
mouse: {
|
|
135
|
+
x: event.clientX,
|
|
136
|
+
y: event.clientY
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
if (isDragging && this.dialogRef.current) {
|
|
140
|
+
var rect = this.dialogRef.current.getBoundingClientRect();
|
|
141
|
+
var dialogX = clamp(window.innerWidth - (event.clientX + rect.width + offset.x), 0, window.innerWidth - rect.width);
|
|
142
|
+
var dialogY = clamp(window.innerHeight - (event.clientY + rect.height + offset.y), 0, window.innerHeight - rect.height);
|
|
143
|
+
this.setState({
|
|
144
|
+
dialog: {
|
|
145
|
+
x: dialogX,
|
|
146
|
+
y: dialogY
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
handleMouseDown(event) {
|
|
152
|
+
var offset = {
|
|
153
|
+
x: 0,
|
|
154
|
+
y: 0
|
|
155
|
+
};
|
|
156
|
+
if (this.dialogRef.current) {
|
|
157
|
+
var rect = this.dialogRef.current.getBoundingClientRect();
|
|
158
|
+
offset.x = rect.right - (rect.width + event.clientX);
|
|
159
|
+
offset.y = rect.bottom - (rect.height + event.clientY);
|
|
160
|
+
}
|
|
161
|
+
this.setState({
|
|
162
|
+
isDragging: true,
|
|
163
|
+
offset
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
handleMouseUp() {
|
|
167
|
+
this.setState({
|
|
168
|
+
isDragging: false
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
handleKeyDown(event) {
|
|
172
|
+
if (event.key === 'Alt') {
|
|
173
|
+
event.preventDefault();
|
|
174
|
+
this.setState({
|
|
175
|
+
mode: 'delete'
|
|
176
|
+
});
|
|
177
|
+
} else if (event.key === 'Delete' || event.key === 'Backspace') {
|
|
178
|
+
var {
|
|
179
|
+
selectedIds,
|
|
180
|
+
onLinkDeleted
|
|
181
|
+
} = this.props;
|
|
182
|
+
event.preventDefault();
|
|
183
|
+
selectedIds.forEach(id => onLinkDeleted(id));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
handleKeyUp(event) {
|
|
187
|
+
if (event.key === 'Alt') {
|
|
188
|
+
event.preventDefault();
|
|
189
|
+
this.setState({
|
|
190
|
+
mode: 'select'
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
handleEscapePressed() {
|
|
195
|
+
var {
|
|
196
|
+
onCancel
|
|
197
|
+
} = this.props;
|
|
198
|
+
onCancel();
|
|
199
|
+
}
|
|
200
|
+
render() {
|
|
201
|
+
var {
|
|
202
|
+
disabled,
|
|
203
|
+
links,
|
|
204
|
+
selectedIds,
|
|
205
|
+
messageText,
|
|
206
|
+
onLinkSelected,
|
|
207
|
+
onLinkDeleted,
|
|
208
|
+
onAllLinksDeleted,
|
|
209
|
+
onDone
|
|
210
|
+
} = this.props;
|
|
211
|
+
var {
|
|
212
|
+
mouse,
|
|
213
|
+
dialog,
|
|
214
|
+
isDragging,
|
|
215
|
+
mode
|
|
216
|
+
} = this.state;
|
|
217
|
+
var visibleLinks = links.map(link => {
|
|
218
|
+
try {
|
|
219
|
+
var _mouse$x, _mouse$y;
|
|
220
|
+
var {
|
|
221
|
+
id,
|
|
222
|
+
type,
|
|
223
|
+
isReversed,
|
|
224
|
+
start,
|
|
225
|
+
end,
|
|
226
|
+
operator
|
|
227
|
+
} = link;
|
|
228
|
+
var startColumnType = start.columnType;
|
|
229
|
+
var [x1, y1] = this.getPointFromLinkPoint(start);
|
|
230
|
+
var x2 = (_mouse$x = mouse === null || mouse === void 0 ? void 0 : mouse.x) !== null && _mouse$x !== void 0 ? _mouse$x : x1;
|
|
231
|
+
var y2 = (_mouse$y = mouse === null || mouse === void 0 ? void 0 : mouse.y) !== null && _mouse$y !== void 0 ? _mouse$y : y1;
|
|
232
|
+
if (end != null) {
|
|
233
|
+
[x2, y2] = this.getPointFromLinkPoint(end);
|
|
234
|
+
}
|
|
235
|
+
if (isReversed != null && isReversed) {
|
|
236
|
+
var [tmpX, tmpY] = [x1, y1];
|
|
237
|
+
[x1, y1] = [x2, y2];
|
|
238
|
+
[x2, y2] = [tmpX, tmpY];
|
|
239
|
+
}
|
|
240
|
+
var className = classNames('linker-link', {
|
|
241
|
+
disabled
|
|
242
|
+
}, {
|
|
243
|
+
'link-filter-source': type === 'filterSource'
|
|
244
|
+
}, {
|
|
245
|
+
'link-invalid': type === 'invalid'
|
|
246
|
+
}, {
|
|
247
|
+
interactive: link.end == null
|
|
248
|
+
}, {
|
|
249
|
+
'link-is-selected': selectedIds.has(id)
|
|
250
|
+
}, {
|
|
251
|
+
'danger-delete': mode === 'delete'
|
|
252
|
+
});
|
|
253
|
+
return {
|
|
254
|
+
x1,
|
|
255
|
+
y1,
|
|
256
|
+
x2,
|
|
257
|
+
y2,
|
|
258
|
+
id,
|
|
259
|
+
className,
|
|
260
|
+
operator,
|
|
261
|
+
startColumnType,
|
|
262
|
+
type
|
|
263
|
+
};
|
|
264
|
+
} catch (error) {
|
|
265
|
+
log.warn('Unable to get point for link', link, error);
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}).filter(item => item != null);
|
|
269
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
270
|
+
className: classNames('linker-overlay', {
|
|
271
|
+
'danger-delete': mode === 'delete'
|
|
272
|
+
})
|
|
273
|
+
}, visibleLinks.map(_ref => {
|
|
274
|
+
var {
|
|
275
|
+
x1,
|
|
276
|
+
y1,
|
|
277
|
+
x2,
|
|
278
|
+
y2,
|
|
279
|
+
id,
|
|
280
|
+
className,
|
|
281
|
+
operator,
|
|
282
|
+
startColumnType,
|
|
283
|
+
type
|
|
284
|
+
} = _ref;
|
|
285
|
+
return /*#__PURE__*/React.createElement(LinkerLink, {
|
|
286
|
+
className: className,
|
|
287
|
+
id: id,
|
|
288
|
+
x1: x1,
|
|
289
|
+
y1: y1,
|
|
290
|
+
x2: x2,
|
|
291
|
+
y2: y2,
|
|
292
|
+
key: id,
|
|
293
|
+
onClick: onLinkSelected,
|
|
294
|
+
onDelete: onLinkDeleted,
|
|
295
|
+
isSelected: selectedIds.has(id),
|
|
296
|
+
operator: operator,
|
|
297
|
+
startColumnType: startColumnType,
|
|
298
|
+
type: type,
|
|
299
|
+
onOperatorChanged: this.handleOperatorChanged
|
|
300
|
+
});
|
|
301
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
302
|
+
className: classNames('linker-toast-dialog', {
|
|
303
|
+
dragging: isDragging
|
|
304
|
+
}),
|
|
305
|
+
ref: this.dialogRef,
|
|
306
|
+
style: {
|
|
307
|
+
bottom: dialog === null || dialog === void 0 ? void 0 : dialog.y,
|
|
308
|
+
right: dialog === null || dialog === void 0 ? void 0 : dialog.x
|
|
309
|
+
},
|
|
310
|
+
"data-testid": "linker-toast-dialog"
|
|
311
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
312
|
+
draggable: true,
|
|
313
|
+
kind: "inline",
|
|
314
|
+
className: "btn-drag-handle",
|
|
315
|
+
icon: vsGripper,
|
|
316
|
+
onClick: () => {
|
|
317
|
+
// no-op
|
|
318
|
+
},
|
|
319
|
+
onMouseDown: this.handleMouseDown
|
|
320
|
+
}, !isDragging && /*#__PURE__*/React.createElement(Tooltip, null, "Drag to reposition")), /*#__PURE__*/React.createElement("div", {
|
|
321
|
+
className: "toast-body"
|
|
322
|
+
}, messageText), /*#__PURE__*/React.createElement("div", {
|
|
323
|
+
className: "toast-footer"
|
|
324
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
325
|
+
kind: "secondary",
|
|
326
|
+
onClick: onAllLinksDeleted
|
|
327
|
+
}, "Clear All"), /*#__PURE__*/React.createElement(Button, {
|
|
328
|
+
kind: "primary",
|
|
329
|
+
onClick: onDone
|
|
330
|
+
}, "Done"))), /*#__PURE__*/React.createElement(ContextActions, {
|
|
331
|
+
actions: [{
|
|
332
|
+
action: this.handleEscapePressed,
|
|
333
|
+
shortcut: GLOBAL_SHORTCUTS.LINKER_CLOSE,
|
|
334
|
+
isGlobal: true
|
|
335
|
+
}]
|
|
336
|
+
}));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
_defineProperty(LinkerOverlayContent, "defaultProps", {
|
|
340
|
+
disabled: 'false'
|
|
341
|
+
});
|
|
342
|
+
export default LinkerOverlayContent;
|
|
343
|
+
//# sourceMappingURL=LinkerOverlayContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkerOverlayContent.js","names":["React","Component","classNames","Button","ContextActions","GLOBAL_SHORTCUTS","Tooltip","LayoutUtils","Log","vsGripper","clamp","isLinkableFromPanel","LinkerLink","log","module","LinkerOverlayContent","constructor","props","handleBlur","bind","handleResize","handleMouseMove","handleMouseDown","handleMouseUp","handleKeyDown","handleKeyUp","handleEscapePressed","handleOperatorChanged","dialogRef","createRef","state","mouse","undefined","dialog","offset","x","y","isDragging","mode","componentDidMount","window","addEventListener","componentDidCatch","error","info","componentWillUnmount","removeEventListener","getPointFromLinkPoint","linkPoint","panelManager","panelId","columnName","panel","getOpenedPanelById","Error","coordinate","getCoordinateForColumn","e","glContainer","getContainerByPanelId","getTabPoint","linkId","type","links","onLinksUpdated","newLinks","map","link","id","operator","setState","current","rect","getBoundingClientRect","dialogX","innerWidth","width","dialogY","innerHeight","height","event","clientX","clientY","right","bottom","key","preventDefault","selectedIds","onLinkDeleted","forEach","onCancel","render","disabled","messageText","onLinkSelected","onAllLinksDeleted","onDone","visibleLinks","isReversed","start","end","startColumnType","columnType","x1","y1","x2","y2","tmpX","tmpY","className","interactive","has","warn","filter","item","dragging","action","shortcut","LINKER_CLOSE","isGlobal"],"sources":["../../src/linker/LinkerOverlayContent.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport classNames from 'classnames';\nimport {\n Button,\n ContextActions,\n GLOBAL_SHORTCUTS,\n Tooltip,\n} from '@deephaven/components';\nimport { LayoutUtils, PanelManager } from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport type { Container } from '@deephaven/golden-layout';\nimport { vsGripper } from '@deephaven/icons';\nimport { TypeValue as FilterTypeValue } from '@deephaven/filters';\nimport clamp from 'lodash.clamp';\nimport {\n isLinkableFromPanel,\n Link,\n LinkerCoordinate,\n LinkPoint,\n LinkType,\n} from './LinkerUtils';\nimport LinkerLink from './LinkerLink';\nimport './LinkerOverlayContent.scss';\n\nconst log = Log.module('LinkerOverlayContent');\n\nexport type VisibleLink = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n type: LinkType;\n operator: FilterTypeValue;\n startColumnType: string | null;\n};\n\nexport type LinkerOverlayContentProps = {\n disabled?: boolean;\n links: Link[];\n selectedIds: Set<string>;\n messageText: string;\n onLinkSelected: (linkId: string) => void;\n onLinkDeleted: (linkId: string) => void;\n onAllLinksDeleted: () => void;\n onLinksUpdated: (newLinks: Link[]) => void;\n onCancel: () => void;\n onDone: () => void;\n panelManager: PanelManager;\n};\n\ntype Point = { x: number; y: number };\n\nexport type LinkerOverlayContentState = {\n mouse?: Point;\n dialog?: Point;\n offset: Point;\n isDragging: boolean;\n mode: 'select' | 'delete';\n};\n\nexport class LinkerOverlayContent extends Component<\n LinkerOverlayContentProps,\n LinkerOverlayContentState\n> {\n static defaultProps = {\n disabled: 'false',\n };\n\n constructor(props: LinkerOverlayContentProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEscapePressed = this.handleEscapePressed.bind(this);\n this.handleOperatorChanged = this.handleOperatorChanged.bind(this);\n\n this.dialogRef = React.createRef();\n\n this.state = {\n mouse: undefined,\n dialog: undefined,\n offset: { x: 0, y: 0 },\n isDragging: false,\n mode: 'select',\n };\n }\n\n componentDidMount(): void {\n window.addEventListener('blur', this.handleBlur, true);\n window.addEventListener('mousemove', this.handleMouseMove, true);\n window.addEventListener('mouseup', this.handleMouseUp, true);\n window.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('keyup', this.handleKeyUp, true);\n window.addEventListener('resize', this.handleResize, true);\n }\n\n // eslint-disable-next-line react/sort-comp\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('blur', this.handleBlur, true);\n window.removeEventListener('mousemove', this.handleMouseMove, true);\n window.removeEventListener('mouseup', this.handleMouseUp, true);\n window.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('keyup', this.handleKeyUp, true);\n window.removeEventListener('resize', this.handleResize, true);\n }\n\n dialogRef: React.RefObject<HTMLInputElement>;\n\n /** Gets the on screen points for a link start or end spec */\n getPointFromLinkPoint(linkPoint: LinkPoint): LinkerCoordinate {\n const { panelManager } = this.props;\n const { panelId, columnName } = linkPoint;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (panel != null) {\n if (!isLinkableFromPanel(panel)) {\n throw new Error(\n `Panel does not have getCoordinateForColumn method: ${panelId}`\n );\n }\n try {\n // TODO: remove try/catch when IDS-7371 is fixed.\n // getCoordinateForColumn throws an exception when accessing\n // columns on a model while it reconnects\n const coordinate = panel.getCoordinateForColumn(columnName);\n if (coordinate != null) {\n return coordinate;\n }\n } catch (e) {\n log.error('Could not get coordinate for column', columnName, panel);\n }\n }\n // Fallback to panel container if the panel itself\n // crashed, unmounted, and removed from openedPanelMap.\n const glContainer = panelManager.getContainerByPanelId(panelId);\n if (glContainer == null) {\n throw new Error(`Unable to find panel container for id: ${panelId}`);\n }\n return LayoutUtils.getTabPoint((glContainer as unknown) as Container);\n }\n\n handleOperatorChanged(linkId: string, type: FilterTypeValue): void {\n const { links, onLinksUpdated } = this.props;\n const newLinks: Link[] = links.map(link =>\n link.id === linkId ? { ...link, operator: type } : link\n );\n onLinksUpdated(newLinks);\n }\n\n handleBlur(): void {\n this.setState({ mode: 'select' });\n }\n\n handleResize(): void {\n const { dialog } = this.state;\n if (dialog && this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n const dialogX = clamp(dialog.x, 0, window.innerWidth - rect.width);\n const dialogY = clamp(dialog.y, 0, window.innerHeight - rect.height);\n this.setState({\n dialog: { x: dialogX, y: dialogY },\n });\n }\n }\n\n handleMouseMove(event: MouseEvent): void {\n const { offset, isDragging } = this.state;\n this.setState({\n mouse: { x: event.clientX, y: event.clientY },\n });\n\n if (isDragging && this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n const dialogX = clamp(\n window.innerWidth - (event.clientX + rect.width + offset.x),\n 0,\n window.innerWidth - rect.width\n );\n\n const dialogY = clamp(\n window.innerHeight - (event.clientY + rect.height + offset.y),\n 0,\n window.innerHeight - rect.height\n );\n\n this.setState({\n dialog: { x: dialogX, y: dialogY },\n });\n }\n }\n\n handleMouseDown(event: React.MouseEvent): void {\n const offset: Point = { x: 0, y: 0 };\n if (this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n offset.x = rect.right - (rect.width + event.clientX);\n offset.y = rect.bottom - (rect.height + event.clientY);\n }\n this.setState({\n isDragging: true,\n offset,\n });\n }\n\n handleMouseUp(): void {\n this.setState({\n isDragging: false,\n });\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'delete',\n });\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n const { selectedIds, onLinkDeleted } = this.props;\n event.preventDefault();\n selectedIds.forEach(id => onLinkDeleted(id));\n }\n }\n\n handleKeyUp(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'select',\n });\n }\n }\n\n handleEscapePressed(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n render(): JSX.Element {\n const {\n disabled,\n links,\n selectedIds,\n messageText,\n onLinkSelected,\n onLinkDeleted,\n onAllLinksDeleted,\n onDone,\n } = this.props;\n\n const { mouse, dialog, isDragging, mode } = this.state;\n const visibleLinks = links\n .map(link => {\n try {\n const { id, type, isReversed, start, end, operator } = link;\n const startColumnType = start.columnType;\n let [x1, y1] = this.getPointFromLinkPoint(start);\n let x2 = mouse?.x ?? x1;\n let y2 = mouse?.y ?? y1;\n if (end != null) {\n [x2, y2] = this.getPointFromLinkPoint(end);\n }\n if (isReversed != null && isReversed) {\n const [tmpX, tmpY] = [x1, y1];\n [x1, y1] = [x2, y2];\n [x2, y2] = [tmpX, tmpY];\n }\n const className = classNames(\n 'linker-link',\n { disabled },\n { 'link-filter-source': type === 'filterSource' },\n { 'link-invalid': type === 'invalid' },\n { interactive: link.end == null },\n { 'link-is-selected': selectedIds.has(id) },\n { 'danger-delete': mode === 'delete' }\n );\n return {\n x1,\n y1,\n x2,\n y2,\n id,\n className,\n operator,\n startColumnType,\n type,\n };\n } catch (error) {\n log.warn('Unable to get point for link', link, error);\n return null;\n }\n })\n .filter(item => item != null) as VisibleLink[];\n\n return (\n <div\n className={classNames('linker-overlay', {\n 'danger-delete': mode === 'delete',\n })}\n >\n {visibleLinks.map(\n ({\n x1,\n y1,\n x2,\n y2,\n id,\n className,\n operator,\n startColumnType,\n type,\n }) => (\n <LinkerLink\n className={className}\n id={id}\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n key={id}\n onClick={onLinkSelected}\n onDelete={onLinkDeleted}\n isSelected={selectedIds.has(id)}\n operator={operator}\n startColumnType={startColumnType}\n type={type}\n onOperatorChanged={this.handleOperatorChanged}\n />\n )\n )}\n <div\n className={classNames('linker-toast-dialog', {\n dragging: isDragging,\n })}\n ref={this.dialogRef}\n style={{ bottom: dialog?.y, right: dialog?.x }}\n data-testid=\"linker-toast-dialog\"\n >\n <Button\n draggable\n kind=\"inline\"\n className=\"btn-drag-handle\"\n icon={vsGripper}\n onClick={() => {\n // no-op\n }}\n onMouseDown={this.handleMouseDown}\n >\n {!isDragging && <Tooltip>Drag to reposition</Tooltip>}\n </Button>\n <div className=\"toast-body\">{messageText}</div>\n <div className=\"toast-footer\">\n <Button kind=\"secondary\" onClick={onAllLinksDeleted}>\n Clear All\n </Button>\n <Button kind=\"primary\" onClick={onDone}>\n Done\n </Button>\n </div>\n </div>\n <ContextActions\n actions={[\n {\n action: this.handleEscapePressed,\n shortcut: GLOBAL_SHORTCUTS.LINKER_CLOSE,\n isGlobal: true,\n },\n ]}\n />\n </div>\n );\n }\n}\n\nexport default LinkerOverlayContent;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
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 shortid from 'shortid';
|
|
7
|
+
import { LayoutUtils } from '@deephaven/dashboard';
|
|
8
|
+
import { TableUtils } from '@deephaven/jsapi-utils';
|
|
9
|
+
import Log from '@deephaven/log';
|
|
10
|
+
import { ChartPanel, IrisGridPanel, DropdownFilterPanel } from "../panels/index.js";
|
|
11
|
+
export function isLinkableFromPanel(panel) {
|
|
12
|
+
var p = panel;
|
|
13
|
+
return typeof p.getCoordinateForColumn === 'function';
|
|
14
|
+
}
|
|
15
|
+
export function isLinkablePanel(panel) {
|
|
16
|
+
var p = panel;
|
|
17
|
+
return isLinkableFromPanel(panel) && typeof p.setFilterMap === 'function' && typeof p.unsetFilterValue === 'function';
|
|
18
|
+
}
|
|
19
|
+
export function isLinkableColumn(column) {
|
|
20
|
+
var _column$description;
|
|
21
|
+
// TODO: core/#3358 Use preview/original type property instead of checking description
|
|
22
|
+
return column.description === undefined || !((_column$description = column.description) !== null && _column$description !== void 0 && _column$description.startsWith('Preview of type: '));
|
|
23
|
+
}
|
|
24
|
+
var log = Log.module('LinkerUtils');
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Collection of utility functions for use with the Linker
|
|
28
|
+
*/
|
|
29
|
+
class LinkerUtils {
|
|
30
|
+
/**
|
|
31
|
+
* Retrieve the type of link given parameters.
|
|
32
|
+
* @param start The link start
|
|
33
|
+
* @param end The link end
|
|
34
|
+
* @param isolatedLinkerPanelId Whether there's an isolated linker
|
|
35
|
+
* @returns The type of link, or invalid if there's an error
|
|
36
|
+
*/
|
|
37
|
+
static getLinkType(start, end, isolatedLinkerPanelId) {
|
|
38
|
+
var _LinkerUtils$ALLOWED_;
|
|
39
|
+
// Panel compatibility checks:
|
|
40
|
+
// Link ends should point to different non-null panelIds
|
|
41
|
+
// For isolated linker one of the panels should match isolated panel id
|
|
42
|
+
if ((start === null || start === void 0 ? void 0 : start.panelId) == null || (end === null || end === void 0 ? void 0 : end.panelId) == null || start.panelId === end.panelId || isolatedLinkerPanelId != null && isolatedLinkerPanelId !== start.panelId && isolatedLinkerPanelId !== end.panelId) {
|
|
43
|
+
log.debug2('Incompatible panel ids', start, end, isolatedLinkerPanelId);
|
|
44
|
+
return 'invalid';
|
|
45
|
+
}
|
|
46
|
+
if (start.panelComponent == null || end.panelComponent == null) {
|
|
47
|
+
log.error('PanelComponent should not be null', start, end);
|
|
48
|
+
return 'invalid';
|
|
49
|
+
}
|
|
50
|
+
var isCompatibleComponent = (_LinkerUtils$ALLOWED_ = LinkerUtils.ALLOWED_LINKS.get(start.panelComponent)) === null || _LinkerUtils$ALLOWED_ === void 0 ? void 0 : _LinkerUtils$ALLOWED_.includes(end.panelComponent);
|
|
51
|
+
if (isCompatibleComponent === undefined || !isCompatibleComponent) {
|
|
52
|
+
log.debug2('Incompatible panel components', start, end);
|
|
53
|
+
return 'invalid';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Check column type compatibility
|
|
57
|
+
var {
|
|
58
|
+
columnType: startColumnType
|
|
59
|
+
} = start;
|
|
60
|
+
var {
|
|
61
|
+
columnType: endColumnType
|
|
62
|
+
} = end;
|
|
63
|
+
|
|
64
|
+
// Null columnType in ending link point allows linking to any type
|
|
65
|
+
var isCompatibleType = endColumnType === null || TableUtils.isCompatibleType(startColumnType, endColumnType);
|
|
66
|
+
if (!isCompatibleType) {
|
|
67
|
+
log.debug2('Incompatible type', startColumnType, endColumnType);
|
|
68
|
+
return 'invalid';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// If all checks pass, link type is determined by the target panel component
|
|
72
|
+
switch (end.panelComponent) {
|
|
73
|
+
case LayoutUtils.getComponentName(ChartPanel):
|
|
74
|
+
return 'chartLink';
|
|
75
|
+
case LayoutUtils.getComponentName(IrisGridPanel):
|
|
76
|
+
return 'tableLink';
|
|
77
|
+
case LayoutUtils.getComponentName(DropdownFilterPanel):
|
|
78
|
+
return 'filterSource';
|
|
79
|
+
default:
|
|
80
|
+
}
|
|
81
|
+
log.debug2('Incompatible target panel component', end.panelComponent);
|
|
82
|
+
return 'invalid';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Find column matching the link point
|
|
87
|
+
* @param columns Columns to search in
|
|
88
|
+
* @param linkPoint Link point to find column for
|
|
89
|
+
* @param linkPoint.columnName Column name to find
|
|
90
|
+
* @param linkPoint.columnType Column type to find
|
|
91
|
+
* @returns Column matching the link point, undefined if not found
|
|
92
|
+
*/
|
|
93
|
+
static findColumn(columns, _ref) {
|
|
94
|
+
var {
|
|
95
|
+
columnName,
|
|
96
|
+
columnType
|
|
97
|
+
} = _ref;
|
|
98
|
+
return columns.find(_ref2 => {
|
|
99
|
+
var {
|
|
100
|
+
name,
|
|
101
|
+
type
|
|
102
|
+
} = _ref2;
|
|
103
|
+
return name === columnName && type === columnType;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Clone links for a given panel id
|
|
109
|
+
* @param links Original links array
|
|
110
|
+
* @param panelId Original panel id
|
|
111
|
+
* @param cloneId Cloned panel id
|
|
112
|
+
* @returns Cloned links array or empty array if no new links added
|
|
113
|
+
*/
|
|
114
|
+
static cloneLinksForPanel(links, panelId, cloneId) {
|
|
115
|
+
var clonedLinks = [];
|
|
116
|
+
links.forEach(link => {
|
|
117
|
+
var _link$end;
|
|
118
|
+
if (link.start.panelId === panelId && link.type !== 'filterSource') {
|
|
119
|
+
clonedLinks.push(_objectSpread(_objectSpread({}, link), {}, {
|
|
120
|
+
id: shortid.generate(),
|
|
121
|
+
start: _objectSpread(_objectSpread({}, link.start), {}, {
|
|
122
|
+
panelId: cloneId
|
|
123
|
+
})
|
|
124
|
+
}));
|
|
125
|
+
} else if (((_link$end = link.end) === null || _link$end === void 0 ? void 0 : _link$end.panelId) === panelId) {
|
|
126
|
+
clonedLinks.push(_objectSpread(_objectSpread({}, link), {}, {
|
|
127
|
+
id: shortid.generate(),
|
|
128
|
+
end: _objectSpread(_objectSpread({}, link.end), {}, {
|
|
129
|
+
panelId: cloneId
|
|
130
|
+
})
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
return clonedLinks;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
_defineProperty(LinkerUtils, "ALLOWED_LINKS", new Map([[LayoutUtils.getComponentName(IrisGridPanel), [LayoutUtils.getComponentName(IrisGridPanel), LayoutUtils.getComponentName(ChartPanel), LayoutUtils.getComponentName(DropdownFilterPanel)]]]));
|
|
138
|
+
export default LinkerUtils;
|
|
139
|
+
//# sourceMappingURL=LinkerUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkerUtils.js","names":["shortid","LayoutUtils","TableUtils","Log","ChartPanel","IrisGridPanel","DropdownFilterPanel","isLinkableFromPanel","panel","p","getCoordinateForColumn","isLinkablePanel","setFilterMap","unsetFilterValue","isLinkableColumn","column","description","undefined","startsWith","log","module","LinkerUtils","getLinkType","start","end","isolatedLinkerPanelId","panelId","debug2","panelComponent","error","isCompatibleComponent","ALLOWED_LINKS","get","includes","columnType","startColumnType","endColumnType","isCompatibleType","getComponentName","findColumn","columns","columnName","find","name","type","cloneLinksForPanel","links","cloneId","clonedLinks","forEach","link","push","id","generate","Map"],"sources":["../../src/linker/LinkerUtils.ts"],"sourcesContent":["import shortid from 'shortid';\nimport { LayoutUtils, PanelComponent } from '@deephaven/dashboard';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport { TypeValue as FilterTypeValue } from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { ChartPanel, IrisGridPanel, DropdownFilterPanel } from '../panels';\n\nexport type LinkType = 'invalid' | 'filterSource' | 'tableLink' | 'chartLink';\n\nexport type LinkPoint = {\n panelId: string | string[];\n panelComponent?: string | null;\n columnName: string;\n columnType: string | null;\n};\n\nexport type Link = {\n start: LinkPoint;\n end?: LinkPoint;\n id: string;\n isReversed?: boolean;\n type: LinkType;\n operator?: FilterTypeValue;\n};\n\nexport type LinkColumn = {\n name: string;\n type: string | null;\n description?: string;\n};\n\nexport type LinkDataValue<T = unknown> = {\n operator: FilterTypeValue;\n text: string;\n value: T;\n startColumnIndex: number;\n};\n\nexport type LinkFilterMapValue<T = unknown> = {\n columnType: string;\n filterList: LinkDataValue<T>[];\n};\n\nexport type LinkFilterMap<T = unknown> = Map<string, LinkFilterMapValue<T>>;\n\n// [x,y] screen coordinates used by the Linker\nexport type LinkerCoordinate = [number, number];\n\nexport type LinkableFromPanel = PanelComponent & {\n getCoordinateForColumn: (name: string) => LinkerCoordinate;\n};\n\nexport type LinkablePanel = LinkableFromPanel & {\n setFilterMap: (filterMap: LinkFilterMap) => void;\n unsetFilterValue: (name: string, type: string | null) => void;\n};\n\nexport function isLinkableFromPanel(\n panel: PanelComponent\n): panel is LinkableFromPanel {\n const p = panel as LinkableFromPanel;\n return typeof p.getCoordinateForColumn === 'function';\n}\n\nexport function isLinkablePanel(panel: PanelComponent): panel is LinkablePanel {\n const p = panel as LinkablePanel;\n return (\n isLinkableFromPanel(panel) &&\n typeof p.setFilterMap === 'function' &&\n typeof p.unsetFilterValue === 'function'\n );\n}\n\nexport function isLinkableColumn(column: LinkColumn): boolean {\n // TODO: core/#3358 Use preview/original type property instead of checking description\n return (\n column.description === undefined ||\n !column.description?.startsWith('Preview of type: ')\n );\n}\n\nconst log = Log.module('LinkerUtils');\n\n/**\n * Collection of utility functions for use with the Linker\n */\nclass LinkerUtils {\n static ALLOWED_LINKS = new Map([\n [\n LayoutUtils.getComponentName(IrisGridPanel),\n [\n LayoutUtils.getComponentName(IrisGridPanel),\n LayoutUtils.getComponentName(ChartPanel),\n LayoutUtils.getComponentName(DropdownFilterPanel),\n ],\n ],\n ]);\n\n /**\n * Retrieve the type of link given parameters.\n * @param start The link start\n * @param end The link end\n * @param isolatedLinkerPanelId Whether there's an isolated linker\n * @returns The type of link, or invalid if there's an error\n */\n static getLinkType(\n start?: LinkPoint,\n end?: LinkPoint,\n isolatedLinkerPanelId?: string | string[]\n ): LinkType {\n // Panel compatibility checks:\n // Link ends should point to different non-null panelIds\n // For isolated linker one of the panels should match isolated panel id\n if (\n start?.panelId == null ||\n end?.panelId == null ||\n start.panelId === end.panelId ||\n (isolatedLinkerPanelId != null &&\n isolatedLinkerPanelId !== start.panelId &&\n isolatedLinkerPanelId !== end.panelId)\n ) {\n log.debug2('Incompatible panel ids', start, end, isolatedLinkerPanelId);\n return 'invalid';\n }\n\n if (start.panelComponent == null || end.panelComponent == null) {\n log.error('PanelComponent should not be null', start, end);\n return 'invalid';\n }\n\n const isCompatibleComponent = LinkerUtils.ALLOWED_LINKS.get(\n start.panelComponent\n )?.includes(end.panelComponent);\n\n if (isCompatibleComponent === undefined || !isCompatibleComponent) {\n log.debug2('Incompatible panel components', start, end);\n return 'invalid';\n }\n\n // Check column type compatibility\n const { columnType: startColumnType } = start;\n const { columnType: endColumnType } = end;\n\n // Null columnType in ending link point allows linking to any type\n const isCompatibleType =\n endColumnType === null ||\n TableUtils.isCompatibleType(startColumnType, endColumnType);\n\n if (!isCompatibleType) {\n log.debug2('Incompatible type', startColumnType, endColumnType);\n return 'invalid';\n }\n\n // If all checks pass, link type is determined by the target panel component\n switch (end.panelComponent) {\n case LayoutUtils.getComponentName(ChartPanel):\n return 'chartLink';\n case LayoutUtils.getComponentName(IrisGridPanel):\n return 'tableLink';\n case LayoutUtils.getComponentName(DropdownFilterPanel):\n return 'filterSource';\n default:\n }\n\n log.debug2('Incompatible target panel component', end.panelComponent);\n return 'invalid';\n }\n\n /**\n * Find column matching the link point\n * @param columns Columns to search in\n * @param linkPoint Link point to find column for\n * @param linkPoint.columnName Column name to find\n * @param linkPoint.columnType Column type to find\n * @returns Column matching the link point, undefined if not found\n */\n static findColumn(\n columns: LinkColumn[],\n { columnName, columnType }: LinkPoint\n ): LinkColumn | undefined {\n return columns.find(\n ({ name, type }) => name === columnName && type === columnType\n );\n }\n\n /**\n * Clone links for a given panel id\n * @param links Original links array\n * @param panelId Original panel id\n * @param cloneId Cloned panel id\n * @returns Cloned links array or empty array if no new links added\n */\n static cloneLinksForPanel(\n links: Link[],\n panelId: string | string[],\n cloneId: string\n ): Link[] {\n const clonedLinks: Link[] = [];\n links.forEach(link => {\n if (link.start.panelId === panelId && link.type !== 'filterSource') {\n clonedLinks.push({\n ...link,\n id: shortid.generate(),\n start: { ...link.start, panelId: cloneId },\n });\n } else if (link.end?.panelId === panelId) {\n clonedLinks.push({\n ...link,\n id: shortid.generate(),\n end: { ...link.end, panelId: cloneId },\n });\n }\n });\n return clonedLinks;\n }\n}\n\nexport default LinkerUtils;\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolType.js","names":["Object","freeze","DEFAULT","LINKER"],"sources":["../../src/linker/ToolType.ts"],"sourcesContent":["export default Object.freeze({\n DEFAULT: 'DEFAULT',\n LINKER: 'LINKER',\n});\n"],"mappings":"AAAA,eAAeA,MAAM,CAACC,MAAM,CAAC;EAC3BC,OAAO,EAAE,SAAS;EAClBC,MAAM,EAAE;AACV,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/linker/index.ts"],"sourcesContent":["export * from './ColumnSelectionValidator';\n"],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.chart-column-selector-overlay .chart-panel-overlay-content .waiting-column-select-list {
|
|
3
|
+
margin-top: 0.5rem;
|
|
4
|
+
margin-bottom: 1.5rem;
|
|
5
|
+
}
|
|
6
|
+
.chart-column-selector-overlay .chart-panel-overlay-content .waiting-column-select-list .btn-chart-column-selector {
|
|
7
|
+
margin-bottom: 1rem;
|
|
8
|
+
margin-right: 1rem;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/*# sourceMappingURL=ChartColumnSelectorOverlay.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/panels/ChartColumnSelectorOverlay.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss"],"names":[],"mappings":"AAAA;ACOI;EACE,YCLK;EDML,eCJK;;ADML;EACE,eCRG;EDSH,cCTG","file":"ChartColumnSelectorOverlay.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n$chart-filter-column-valid-color: $green;\n$chart-filter-column-invalid-color: $gray-400;\n\n.chart-column-selector-overlay {\n .chart-panel-overlay-content {\n .waiting-column-select-list {\n margin-top: $spacer-2;\n margin-bottom: $spacer-4;\n\n .btn-chart-column-selector {\n margin-bottom: $spacer-3;\n margin-right: $spacer-3;\n }\n }\n }\n}\n","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import classNames from 'classnames';
|
|
3
|
+
import { SocketedButton } from '@deephaven/components';
|
|
4
|
+
import "./ChartColumnSelectorOverlay.css";
|
|
5
|
+
function ChartColumnSelectorOverlay(_ref) {
|
|
6
|
+
var {
|
|
7
|
+
columns,
|
|
8
|
+
onColumnSelected,
|
|
9
|
+
onMouseEnter: _onMouseEnter,
|
|
10
|
+
onMouseLeave
|
|
11
|
+
} = _ref;
|
|
12
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
13
|
+
className: "chart-panel-overlay chart-column-selector-overlay"
|
|
14
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
15
|
+
className: classNames('chart-panel-overlay-content')
|
|
16
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
17
|
+
className: "info-message"
|
|
18
|
+
}, "This plot requires a filter control to be added to the layout or a table link to be created on the following columns:"), /*#__PURE__*/React.createElement("div", {
|
|
19
|
+
className: "waiting-column-select-list"
|
|
20
|
+
}, columns.map(column => /*#__PURE__*/React.createElement(SocketedButton, {
|
|
21
|
+
key: column.name,
|
|
22
|
+
className: classNames('btn-chart-column-selector', ChartColumnSelectorOverlay.makeButtonClassName(column.name)),
|
|
23
|
+
onClick: () => onColumnSelected(column.name),
|
|
24
|
+
onMouseEnter: () => {
|
|
25
|
+
if (_onMouseEnter) _onMouseEnter(column);
|
|
26
|
+
},
|
|
27
|
+
onMouseLeave: onMouseLeave,
|
|
28
|
+
disabled: !column.isValid,
|
|
29
|
+
isLinked: column.isActive
|
|
30
|
+
}, column.name)))));
|
|
31
|
+
}
|
|
32
|
+
ChartColumnSelectorOverlay.makeButtonClassName = columnName => "btn-chart-column-selector-".concat(columnName);
|
|
33
|
+
ChartColumnSelectorOverlay.defaultProps = {
|
|
34
|
+
onMouseEnter: () => undefined,
|
|
35
|
+
onMouseLeave: () => undefined
|
|
36
|
+
};
|
|
37
|
+
export default ChartColumnSelectorOverlay;
|
|
38
|
+
//# sourceMappingURL=ChartColumnSelectorOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartColumnSelectorOverlay.js","names":["React","classNames","SocketedButton","ChartColumnSelectorOverlay","columns","onColumnSelected","onMouseEnter","onMouseLeave","map","column","name","makeButtonClassName","isValid","isActive","columnName","defaultProps","undefined"],"sources":["../../src/panels/ChartColumnSelectorOverlay.tsx"],"sourcesContent":["import React, { MouseEventHandler, ReactElement } from 'react';\nimport classNames from 'classnames';\nimport { SocketedButton } from '@deephaven/components';\nimport './ChartColumnSelectorOverlay.scss';\n\nexport interface SelectorColumn {\n name: string;\n type: string;\n isValid: boolean;\n isActive: boolean;\n}\n\ninterface ChartColumnSelectorOverlayProps {\n columns: SelectorColumn[];\n onColumnSelected: (name: string) => void;\n onMouseEnter?: (column: SelectorColumn) => void;\n onMouseLeave?: MouseEventHandler<HTMLButtonElement>;\n}\n\nfunction ChartColumnSelectorOverlay({\n columns,\n onColumnSelected,\n onMouseEnter,\n onMouseLeave,\n}: ChartColumnSelectorOverlayProps): ReactElement {\n return (\n <div className=\"chart-panel-overlay chart-column-selector-overlay\">\n <div className={classNames('chart-panel-overlay-content')}>\n <div className=\"info-message\">\n This plot requires a filter control to be added to the layout or a\n table link to be created on the following columns:\n </div>\n <div className=\"waiting-column-select-list\">\n {columns.map(column => (\n <SocketedButton\n key={column.name}\n className={classNames(\n 'btn-chart-column-selector',\n ChartColumnSelectorOverlay.makeButtonClassName(column.name)\n )}\n onClick={() => onColumnSelected(column.name)}\n onMouseEnter={() => {\n if (onMouseEnter) onMouseEnter(column);\n }}\n onMouseLeave={onMouseLeave}\n disabled={!column.isValid}\n isLinked={column.isActive}\n >\n {column.name}\n </SocketedButton>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nChartColumnSelectorOverlay.makeButtonClassName = (columnName: string) =>\n `btn-chart-column-selector-${columnName}`;\n\nChartColumnSelectorOverlay.defaultProps = {\n onMouseEnter: (): void => undefined,\n onMouseLeave: (): void => undefined,\n};\n\nexport default ChartColumnSelectorOverlay;\n"],"mappings":"AAAA,OAAOA,KAAK,MAA2C,OAAO;AAC9D,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,cAAc,QAAQ,uBAAuB;AAAC;AAiBvD,SAASC,0BAA0B,OAKe;EAAA,IALd;IAClCC,OAAO;IACPC,gBAAgB;IAChBC,YAAY,EAAZA,aAAY;IACZC;EAC+B,CAAC;EAChC,oBACE;IAAK,SAAS,EAAC;EAAmD,gBAChE;IAAK,SAAS,EAAEN,UAAU,CAAC,6BAA6B;EAAE,gBACxD;IAAK,SAAS,EAAC;EAAc,GAAC,uHAG9B,CAAM,eACN;IAAK,SAAS,EAAC;EAA4B,GACxCG,OAAO,CAACI,GAAG,CAACC,MAAM,iBACjB,oBAAC,cAAc;IACb,GAAG,EAAEA,MAAM,CAACC,IAAK;IACjB,SAAS,EAAET,UAAU,CACnB,2BAA2B,EAC3BE,0BAA0B,CAACQ,mBAAmB,CAACF,MAAM,CAACC,IAAI,CAAC,CAC3D;IACF,OAAO,EAAE,MAAML,gBAAgB,CAACI,MAAM,CAACC,IAAI,CAAE;IAC7C,YAAY,EAAE,MAAM;MAClB,IAAIJ,aAAY,EAAEA,aAAY,CAACG,MAAM,CAAC;IACxC,CAAE;IACF,YAAY,EAAEF,YAAa;IAC3B,QAAQ,EAAE,CAACE,MAAM,CAACG,OAAQ;IAC1B,QAAQ,EAAEH,MAAM,CAACI;EAAS,GAEzBJ,MAAM,CAACC,IAAI,CAEf,CAAC,CACE,CACF,CACF;AAEV;AAEAP,0BAA0B,CAACQ,mBAAmB,GAAIG,UAAkB,wCACrCA,UAAU,CAAE;AAE3CX,0BAA0B,CAACY,YAAY,GAAG;EACxCT,YAAY,EAAE,MAAYU,SAAS;EACnCT,YAAY,EAAE,MAAYS;AAC5B,CAAC;AAED,eAAeb,0BAA0B"}
|