@deephaven/dashboard-core-plugins 0.22.3-beta.18 → 0.22.3-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChartBuilderPlugin.d.ts +1 -1
- package/dist/ChartBuilderPlugin.d.ts.map +1 -1
- package/dist/ChartBuilderPlugin.js +6 -8
- package/dist/ChartBuilderPlugin.js.map +1 -1
- package/dist/ChartPlugin.d.ts +1 -1
- package/dist/ChartPlugin.d.ts.map +1 -1
- package/dist/ChartPlugin.js +4 -8
- package/dist/ChartPlugin.js.map +1 -1
- package/dist/ConsolePlugin.d.ts +1 -1
- package/dist/ConsolePlugin.d.ts.map +1 -1
- package/dist/ConsolePlugin.js +16 -62
- package/dist/ConsolePlugin.js.map +1 -1
- package/dist/FilterPlugin.d.ts +1 -1
- package/dist/FilterPlugin.d.ts.map +1 -1
- package/dist/FilterPlugin.js +6 -13
- package/dist/FilterPlugin.js.map +1 -1
- package/dist/GridPlugin.d.ts +1 -1
- package/dist/GridPlugin.d.ts.map +1 -1
- package/dist/GridPlugin.js +4 -8
- package/dist/GridPlugin.js.map +1 -1
- package/dist/LinkerPlugin.d.ts +1 -1
- package/dist/LinkerPlugin.d.ts.map +1 -1
- package/dist/LinkerPlugin.js +2 -2
- package/dist/LinkerPlugin.js.map +1 -1
- package/dist/MarkdownPlugin.d.ts +1 -1
- package/dist/MarkdownPlugin.d.ts.map +1 -1
- package/dist/MarkdownPlugin.js +4 -8
- package/dist/MarkdownPlugin.js.map +1 -1
- package/dist/PandasPlugin.d.ts +1 -1
- package/dist/PandasPlugin.d.ts.map +1 -1
- package/dist/PandasPlugin.js +4 -8
- package/dist/PandasPlugin.js.map +1 -1
- package/dist/controls/ControlType.js +0 -6
- package/dist/controls/ControlType.js.map +1 -1
- package/dist/controls/dropdown-filter/DropdownFilter.js +7 -51
- package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
- package/dist/controls/input-filter/InputFilter.js +1 -31
- package/dist/controls/input-filter/InputFilter.js.map +1 -1
- package/dist/controls/markdown/MarkdownContainer.js +0 -3
- package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
- package/dist/controls/markdown/MarkdownEditor.d.ts +0 -2
- package/dist/controls/markdown/MarkdownEditor.d.ts.map +1 -1
- package/dist/controls/markdown/MarkdownEditor.js +13 -20
- package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
- package/dist/controls/markdown/MarkdownStartPage.js +0 -11
- package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
- package/dist/controls/markdown/MarkdownUtils.js +0 -7
- package/dist/controls/markdown/MarkdownUtils.js.map +1 -1
- package/dist/events/ChartEvent.js +0 -5
- package/dist/events/ChartEvent.js.map +1 -1
- package/dist/events/ConsoleEvent.js +0 -7
- package/dist/events/ConsoleEvent.js.map +1 -1
- package/dist/events/InputFilterEvent.js +0 -10
- package/dist/events/InputFilterEvent.js.map +1 -1
- package/dist/events/IrisGridEvent.js +0 -8
- package/dist/events/IrisGridEvent.js.map +1 -1
- package/dist/events/MarkdownEvent.js.map +1 -1
- package/dist/events/NotebookEvent.js +0 -10
- package/dist/events/NotebookEvent.js.map +1 -1
- package/dist/events/PQEvent.js +0 -5
- package/dist/events/PQEvent.js.map +1 -1
- package/dist/events/PandasEvent.js +0 -4
- package/dist/events/PandasEvent.js.map +1 -1
- package/dist/events/TabEvent.js +0 -8
- package/dist/events/TabEvent.js.map +1 -1
- package/dist/events/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/linker/Linker.d.ts +3 -0
- package/dist/linker/Linker.d.ts.map +1 -1
- package/dist/linker/Linker.js +70 -119
- package/dist/linker/Linker.js.map +1 -1
- package/dist/linker/LinkerLink.css +90 -25
- package/dist/linker/LinkerLink.css.map +1 -1
- package/dist/linker/LinkerLink.d.ts +20 -2
- package/dist/linker/LinkerLink.d.ts.map +1 -1
- package/dist/linker/LinkerLink.js +214 -23
- package/dist/linker/LinkerLink.js.map +1 -1
- package/dist/linker/LinkerOverlayContent.css +0 -4
- package/dist/linker/LinkerOverlayContent.css.map +1 -1
- package/dist/linker/LinkerOverlayContent.d.ts +11 -0
- package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
- package/dist/linker/LinkerOverlayContent.js +78 -33
- package/dist/linker/LinkerOverlayContent.js.map +1 -1
- package/dist/linker/LinkerUtils.d.ts +9 -2
- package/dist/linker/LinkerUtils.d.ts.map +1 -1
- package/dist/linker/LinkerUtils.js +9 -25
- package/dist/linker/LinkerUtils.js.map +1 -1
- package/dist/linker/ToolType.js.map +1 -1
- package/dist/panels/ChartColumnSelectorOverlay.d.ts +5 -5
- package/dist/panels/ChartColumnSelectorOverlay.d.ts.map +1 -1
- package/dist/panels/ChartColumnSelectorOverlay.js +4 -7
- package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
- package/dist/panels/ChartFilterOverlay.d.ts +4 -4
- package/dist/panels/ChartFilterOverlay.d.ts.map +1 -1
- package/dist/panels/ChartFilterOverlay.js +2 -7
- package/dist/panels/ChartFilterOverlay.js.map +1 -1
- package/dist/panels/ChartPanel.d.ts.map +1 -1
- package/dist/panels/ChartPanel.js +11 -150
- package/dist/panels/ChartPanel.js.map +1 -1
- package/dist/panels/CommandHistoryPanel.d.ts.map +1 -1
- package/dist/panels/CommandHistoryPanel.js +1 -26
- package/dist/panels/CommandHistoryPanel.js.map +1 -1
- package/dist/panels/ConsolePanel.d.ts.map +1 -1
- package/dist/panels/ConsolePanel.js +12 -57
- package/dist/panels/ConsolePanel.js.map +1 -1
- package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
- package/dist/panels/DropdownFilterPanel.js +16 -122
- package/dist/panels/DropdownFilterPanel.js.map +1 -1
- package/dist/panels/FileExplorerPanel.js +4 -33
- package/dist/panels/FileExplorerPanel.js.map +1 -1
- package/dist/panels/FilterSetManager.d.ts.map +1 -1
- package/dist/panels/FilterSetManager.js +13 -86
- package/dist/panels/FilterSetManager.js.map +1 -1
- package/dist/panels/FilterSetManagerPanel.js +10 -64
- package/dist/panels/FilterSetManagerPanel.js.map +1 -1
- package/dist/panels/InputFilterPanel.d.ts.map +1 -1
- package/dist/panels/InputFilterPanel.js +8 -38
- package/dist/panels/InputFilterPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.d.ts.map +1 -1
- package/dist/panels/IrisGridPanel.js +24 -133
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/IrisGridPanelTooltip.d.ts +5 -5
- package/dist/panels/IrisGridPanelTooltip.d.ts.map +1 -1
- package/dist/panels/IrisGridPanelTooltip.js +2 -5
- package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
- package/dist/panels/LogPanel.js +4 -22
- package/dist/panels/LogPanel.js.map +1 -1
- package/dist/panels/MarkdownNotebook.js +3 -30
- package/dist/panels/MarkdownNotebook.js.map +1 -1
- package/dist/panels/MarkdownPanel.js +2 -30
- package/dist/panels/MarkdownPanel.js.map +1 -1
- package/dist/panels/MockFileStorage.js +1 -14
- package/dist/panels/MockFileStorage.js.map +1 -1
- package/dist/panels/MockFileStorageTable.js +11 -30
- package/dist/panels/MockFileStorageTable.js.map +1 -1
- package/dist/panels/NotebookPanel.js +24 -182
- package/dist/panels/NotebookPanel.js.map +1 -1
- package/dist/panels/PandasPanel.js +1 -20
- package/dist/panels/PandasPanel.js.map +1 -1
- package/dist/panels/Panel.js +2 -38
- package/dist/panels/Panel.js.map +1 -1
- package/dist/panels/PanelContextMenu.js +7 -29
- package/dist/panels/PanelContextMenu.js.map +1 -1
- package/dist/panels/RenameDialog.js +2 -17
- package/dist/panels/RenameDialog.js.map +1 -1
- package/dist/panels/WidgetPanel.js +2 -20
- package/dist/panels/WidgetPanel.js.map +1 -1
- package/dist/panels/WidgetPanelTooltip.d.ts +5 -5
- package/dist/panels/WidgetPanelTooltip.d.ts.map +1 -1
- package/dist/panels/WidgetPanelTooltip.js +2 -4
- package/dist/panels/WidgetPanelTooltip.js.map +1 -1
- package/dist/panels/index.js.map +1 -1
- package/dist/prop-types/CommonPropTypes.js +0 -3
- package/dist/prop-types/CommonPropTypes.js.map +1 -1
- package/dist/prop-types/UIPropTypes.js.map +1 -1
- package/dist/prop-types/index.js.map +1 -1
- package/dist/redux/actionTypes.js.map +1 -1
- package/dist/redux/actions.js +8 -9
- package/dist/redux/actions.js.map +1 -1
- package/dist/redux/index.js.map +1 -1
- package/dist/redux/reducers/connection.js.map +1 -1
- package/dist/redux/reducers/index.js.map +1 -1
- package/dist/redux/reducers/sessionWrapper.js.map +1 -1
- package/dist/redux/selectors.js +10 -15
- package/dist/redux/selectors.js.map +1 -1
- package/package.json +21 -20
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
-
|
|
3
|
-
import
|
|
2
|
+
import React, { Component } from 'react';
|
|
3
|
+
import memoize from 'memoize-one';
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
import { Button, DropdownMenu } from '@deephaven/components';
|
|
6
|
+
import { vsTrash, vsTriangleDown } from '@deephaven/icons';
|
|
7
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
8
|
+
import { Type as FilterType, getLabelForNumberFilter, getLabelForTextFilter, getLabelForDateFilter } from '@deephaven/filters';
|
|
9
|
+
import Log from '@deephaven/log';
|
|
10
|
+
import { TableUtils } from '@deephaven/jsapi-utils';
|
|
4
11
|
import "./LinkerLink.css";
|
|
5
|
-
|
|
12
|
+
var log = Log.module('LinkerLink');
|
|
6
13
|
|
|
14
|
+
/** The constant for how droopy the links are. Increase for more droopiness. */
|
|
7
15
|
var DROOP = 0.015;
|
|
8
16
|
var DROOP_EXPONENT = 1.5;
|
|
9
17
|
var TRIANGLE_HEIGHT = 12;
|
|
@@ -12,7 +20,8 @@ var TRIANGLE_TIP = 2;
|
|
|
12
20
|
var TRIANGLE_HYPOTENUSE = Math.sqrt((TRIANGLE_BASE * 0.5) ** 2 + TRIANGLE_HEIGHT ** 2);
|
|
13
21
|
var TRIANGLE_THETA = Math.asin(TRIANGLE_BASE * 0.5 / TRIANGLE_HEIGHT);
|
|
14
22
|
var CLIP_RADIUS = 15;
|
|
15
|
-
|
|
23
|
+
var HALF_PI = Math.PI * 0.5;
|
|
24
|
+
export class LinkerLink extends Component {
|
|
16
25
|
/**
|
|
17
26
|
* Make an SVG path for a circle at the specified coordinates.
|
|
18
27
|
* @param x The x coordinate for the centre of the circle
|
|
@@ -23,32 +32,129 @@ export class LinkerLink extends PureComponent {
|
|
|
23
32
|
static makeCirclePath(x, y, r) {
|
|
24
33
|
return "M ".concat(x, " ").concat(y, " m -").concat(r, ",0 a ").concat(r, ",").concat(r, " 0 1,0 ").concat(r * 2, ",0 a ").concat(r, ",").concat(r, " 0 1,0 -").concat(r * 2, ",0 z");
|
|
25
34
|
}
|
|
26
|
-
|
|
35
|
+
static getLabelForLinkFilter(columnType, filterType) {
|
|
36
|
+
try {
|
|
37
|
+
if (TableUtils.isNumberType(columnType) || TableUtils.isCharType(columnType)) {
|
|
38
|
+
return getLabelForNumberFilter(filterType);
|
|
39
|
+
}
|
|
40
|
+
if (TableUtils.isTextType(columnType)) {
|
|
41
|
+
return getLabelForTextFilter(filterType);
|
|
42
|
+
}
|
|
43
|
+
if (TableUtils.isDateType(columnType)) {
|
|
44
|
+
return getLabelForDateFilter(filterType);
|
|
45
|
+
}
|
|
46
|
+
if (TableUtils.isBooleanType(columnType)) {
|
|
47
|
+
if (filterType === FilterType.eq) {
|
|
48
|
+
return 'is equal to';
|
|
49
|
+
}
|
|
50
|
+
if (filterType === FilterType.notEq) {
|
|
51
|
+
return 'is not equal to';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw new Error("Unrecognized column type: ".concat(columnType));
|
|
55
|
+
} catch (e) {
|
|
56
|
+
log.warn(e);
|
|
57
|
+
return '';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
27
60
|
constructor(props) {
|
|
28
61
|
super(props);
|
|
62
|
+
_defineProperty(this, "getOperators", memoize((linkId, columnType) => {
|
|
63
|
+
var {
|
|
64
|
+
onOperatorChanged
|
|
65
|
+
} = this.props;
|
|
66
|
+
var filterTypes = TableUtils.getFilterTypes(columnType);
|
|
67
|
+
if (TableUtils.isBooleanType(columnType)) {
|
|
68
|
+
filterTypes = [FilterType.eq, FilterType.notEq];
|
|
69
|
+
}
|
|
70
|
+
return filterTypes.flatMap((type, index) => {
|
|
71
|
+
// Remove case-insensitive string comparisons
|
|
72
|
+
if (type === 'eqIgnoreCase' || type === "notEqIgnoreCase") {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
var symbol = '';
|
|
76
|
+
if (type === 'startsWith') {
|
|
77
|
+
symbol = 'a*';
|
|
78
|
+
} else if (type === 'endsWith') {
|
|
79
|
+
symbol = '*z';
|
|
80
|
+
} else {
|
|
81
|
+
symbol = TableUtils.getFilterOperatorString(type);
|
|
82
|
+
}
|
|
83
|
+
return [{
|
|
84
|
+
title: LinkerLink.getLabelForLinkFilter(columnType, type),
|
|
85
|
+
icon: /*#__PURE__*/React.createElement("b", null, symbol),
|
|
86
|
+
action: () => onOperatorChanged(linkId, type),
|
|
87
|
+
order: index
|
|
88
|
+
}];
|
|
89
|
+
});
|
|
90
|
+
}));
|
|
29
91
|
this.handleClick = this.handleClick.bind(this);
|
|
92
|
+
this.handleMouseEnter = this.handleMouseEnter.bind(this);
|
|
93
|
+
this.handleMouseLeave = this.handleMouseLeave.bind(this);
|
|
94
|
+
this.handleDelete = this.handleDelete.bind(this);
|
|
95
|
+
this.getDropdownActions = this.getDropdownActions.bind(this);
|
|
96
|
+
this.state = {
|
|
97
|
+
isHovering: undefined
|
|
98
|
+
};
|
|
30
99
|
}
|
|
31
|
-
|
|
32
100
|
handleClick(event) {
|
|
33
101
|
event.stopPropagation();
|
|
34
102
|
event.preventDefault();
|
|
35
103
|
var {
|
|
36
104
|
id,
|
|
37
|
-
onClick
|
|
105
|
+
onClick,
|
|
106
|
+
onDelete
|
|
38
107
|
} = this.props;
|
|
39
|
-
|
|
108
|
+
if (event.altKey) {
|
|
109
|
+
onDelete(id);
|
|
110
|
+
} else {
|
|
111
|
+
onClick(id);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
handleMouseEnter() {
|
|
115
|
+
this.setState({
|
|
116
|
+
isHovering: true
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
handleMouseLeave() {
|
|
120
|
+
this.setState({
|
|
121
|
+
isHovering: false
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
handleDelete() {
|
|
125
|
+
var {
|
|
126
|
+
id,
|
|
127
|
+
onDelete
|
|
128
|
+
} = this.props;
|
|
129
|
+
onDelete(id);
|
|
130
|
+
}
|
|
131
|
+
getDropdownActions() {
|
|
132
|
+
var {
|
|
133
|
+
id,
|
|
134
|
+
startColumnType
|
|
135
|
+
} = this.props;
|
|
136
|
+
if (startColumnType != null) {
|
|
137
|
+
return this.getOperators(id, startColumnType);
|
|
138
|
+
}
|
|
139
|
+
return [];
|
|
40
140
|
}
|
|
41
|
-
|
|
42
141
|
render() {
|
|
43
142
|
var {
|
|
44
143
|
className,
|
|
144
|
+
operator,
|
|
145
|
+
isSelected,
|
|
45
146
|
x1,
|
|
46
147
|
y1,
|
|
47
148
|
x2,
|
|
48
149
|
y2,
|
|
49
|
-
id
|
|
50
|
-
|
|
150
|
+
id,
|
|
151
|
+
startColumnType
|
|
152
|
+
} = this.props;
|
|
153
|
+
var {
|
|
154
|
+
isHovering
|
|
155
|
+
} = this.state;
|
|
51
156
|
|
|
157
|
+
// Path between the two points
|
|
52
158
|
var len = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);
|
|
53
159
|
var theta = Math.atan2(y2 - y1, x2 - x1);
|
|
54
160
|
var xMult = Math.sin(theta);
|
|
@@ -59,12 +165,14 @@ export class LinkerLink extends PureComponent {
|
|
|
59
165
|
var minY = 0;
|
|
60
166
|
var qx = Math.max(minX, Math.min(x1 + (x2 - x1) / 2 + xMult * (len * DROOP) ** DROOP_EXPONENT, maxX));
|
|
61
167
|
var qy = Math.max(minY, Math.min(y1 + (y2 - y1) / 2 + yMult * (len * DROOP) ** DROOP_EXPONENT, maxY));
|
|
62
|
-
var path = "M ".concat(x1, " ").concat(y1, " Q ").concat(qx, " ").concat(qy, " ").concat(x2, " ").concat(y2);
|
|
168
|
+
var path = "M ".concat(x1, " ").concat(y1, " Q ").concat(qx, " ").concat(qy, " ").concat(x2, " ").concat(y2);
|
|
63
169
|
|
|
170
|
+
// path for a 100%, 100% rect, then two paths for circles at point
|
|
64
171
|
var selectClipPath = "M ".concat(minX, " ").concat(minY, " L ").concat(minX, " ").concat(maxY, " L ").concat(maxX, " ").concat(maxY, " L ").concat(maxX, " ").concat(minY, " z\n ").concat(LinkerLink.makeCirclePath(x1, y1, CLIP_RADIUS), "\n ").concat(LinkerLink.makeCirclePath(x2, y2, CLIP_RADIUS));
|
|
65
|
-
var clipPathId = "link-select-clip-".concat(id);
|
|
66
|
-
// We draw it instead of using markers to allow for transitions in the style
|
|
172
|
+
var clipPathId = "link-select-clip-".concat(id);
|
|
67
173
|
|
|
174
|
+
// Calculate location of the end triangle
|
|
175
|
+
// We draw it instead of using markers to allow for transitions in the style
|
|
68
176
|
var endTheta = Math.atan2(y2 - qy, x2 - qx);
|
|
69
177
|
var t2theta = endTheta - TRIANGLE_THETA + Math.PI;
|
|
70
178
|
var t3theta = endTheta + TRIANGLE_THETA + Math.PI;
|
|
@@ -75,8 +183,57 @@ export class LinkerLink extends PureComponent {
|
|
|
75
183
|
var tx3 = tx1 + Math.cos(t3theta) * TRIANGLE_HYPOTENUSE;
|
|
76
184
|
var ty3 = ty1 + Math.sin(t3theta) * TRIANGLE_HYPOTENUSE;
|
|
77
185
|
var points = "".concat(tx1, ",").concat(ty1, " ").concat(tx2, ",").concat(ty2, " ").concat(tx3, ",").concat(ty3);
|
|
78
|
-
|
|
79
|
-
|
|
186
|
+
|
|
187
|
+
// Button offset calculations
|
|
188
|
+
var midX = 0.25 * x1 + 0.5 * qx + 0.25 * x2;
|
|
189
|
+
var midY = 0.25 * y1 + 0.5 * qy + 0.25 * y2;
|
|
190
|
+
var dMidX = qx - x1 + (x2 - qx);
|
|
191
|
+
var dMidY = qy - y1 + (y2 - qy);
|
|
192
|
+
var slopeAtMid = dMidY / dMidX;
|
|
193
|
+
var DISTANCE_FROM_MID = 20;
|
|
194
|
+
var topOffsetX = DISTANCE_FROM_MID / Math.sqrt(1 + slopeAtMid ** 2);
|
|
195
|
+
var topOffsetY = topOffsetX * slopeAtMid;
|
|
196
|
+
var bottomOffsetX = topOffsetX * -1;
|
|
197
|
+
var bottomOffsetY = topOffsetY * -1;
|
|
198
|
+
if (!Number.isFinite(slopeAtMid)) {
|
|
199
|
+
bottomOffsetX = 10;
|
|
200
|
+
bottomOffsetY = 5;
|
|
201
|
+
topOffsetX = 10;
|
|
202
|
+
topOffsetY = -35;
|
|
203
|
+
} else if (slopeAtMid > 0) {
|
|
204
|
+
topOffsetX *= -1;
|
|
205
|
+
topOffsetY *= -1;
|
|
206
|
+
bottomOffsetX *= -1;
|
|
207
|
+
bottomOffsetY *= -1;
|
|
208
|
+
bottomOffsetX -= 50 - 10 * (Math.abs(theta) % HALF_PI);
|
|
209
|
+
bottomOffsetY += 10 * (Math.abs(theta) % HALF_PI);
|
|
210
|
+
topOffsetX -= 50 - 10 * (Math.abs(theta) % HALF_PI);
|
|
211
|
+
topOffsetY += 10 * (Math.abs(theta) % HALF_PI);
|
|
212
|
+
} else if (slopeAtMid < 0) {
|
|
213
|
+
bottomOffsetX += 10 * (Math.abs(theta) % HALF_PI);
|
|
214
|
+
bottomOffsetY += 10 * (Math.abs(theta) % HALF_PI);
|
|
215
|
+
topOffsetX += 10 * (Math.abs(theta) % HALF_PI);
|
|
216
|
+
topOffsetY += 10 * (Math.abs(theta) % HALF_PI);
|
|
217
|
+
} else {
|
|
218
|
+
bottomOffsetX = 15;
|
|
219
|
+
bottomOffsetY = 10;
|
|
220
|
+
topOffsetX = -25;
|
|
221
|
+
topOffsetY = 10;
|
|
222
|
+
}
|
|
223
|
+
var symbol = '';
|
|
224
|
+
if (operator !== undefined) {
|
|
225
|
+
if (operator === 'startsWith') {
|
|
226
|
+
symbol = 'a*';
|
|
227
|
+
} else if (operator === 'endsWith') {
|
|
228
|
+
symbol = '*z';
|
|
229
|
+
} else {
|
|
230
|
+
symbol = TableUtils.getFilterOperatorString(operator);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("svg", {
|
|
234
|
+
className: classNames(className, {
|
|
235
|
+
hovering: isHovering
|
|
236
|
+
})
|
|
80
237
|
}, /*#__PURE__*/React.createElement("clipPath", {
|
|
81
238
|
id: clipPathId
|
|
82
239
|
}, /*#__PURE__*/React.createElement("path", {
|
|
@@ -86,6 +243,8 @@ export class LinkerLink extends PureComponent {
|
|
|
86
243
|
className: "link-select",
|
|
87
244
|
d: path,
|
|
88
245
|
onClick: this.handleClick,
|
|
246
|
+
onMouseEnter: this.handleMouseEnter,
|
|
247
|
+
onMouseLeave: this.handleMouseLeave,
|
|
89
248
|
clipPath: "url(#".concat(clipPathId, ")")
|
|
90
249
|
}), /*#__PURE__*/React.createElement("path", {
|
|
91
250
|
className: "link-background",
|
|
@@ -101,18 +260,50 @@ export class LinkerLink extends PureComponent {
|
|
|
101
260
|
}), /*#__PURE__*/React.createElement("polygon", {
|
|
102
261
|
className: "link-triangle",
|
|
103
262
|
points: points
|
|
104
|
-
}))
|
|
263
|
+
})), startColumnType != null && isSelected && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
|
|
264
|
+
kind: "primary",
|
|
265
|
+
className: "btn-fab btn-operator",
|
|
266
|
+
style: {
|
|
267
|
+
top: midY + (slopeAtMid >= 0 ? topOffsetY : bottomOffsetY),
|
|
268
|
+
left: midX + (slopeAtMid >= 0 ? topOffsetX : bottomOffsetX)
|
|
269
|
+
},
|
|
270
|
+
onClick: () => {
|
|
271
|
+
// no-op: click is handled in `DropdownMenu'
|
|
272
|
+
},
|
|
273
|
+
icon: /*#__PURE__*/React.createElement("div", {
|
|
274
|
+
className: "fa-md fa-layers"
|
|
275
|
+
}, /*#__PURE__*/React.createElement("b", null, symbol), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
276
|
+
icon: vsTriangleDown,
|
|
277
|
+
transform: "right-8 down-9 shrink-5"
|
|
278
|
+
})),
|
|
279
|
+
tooltip: "Change comparison operator"
|
|
280
|
+
}, /*#__PURE__*/React.createElement(DropdownMenu, {
|
|
281
|
+
actions: this.getDropdownActions,
|
|
282
|
+
popperOptions: {
|
|
283
|
+
placement: 'bottom-start'
|
|
284
|
+
}
|
|
285
|
+
})), /*#__PURE__*/React.createElement(Button, {
|
|
286
|
+
kind: "primary",
|
|
287
|
+
className: "btn-fab btn-delete",
|
|
288
|
+
style: {
|
|
289
|
+
top: midY + (slopeAtMid < 0 ? topOffsetY : bottomOffsetY),
|
|
290
|
+
left: midX + (slopeAtMid < 0 ? topOffsetX : bottomOffsetX)
|
|
291
|
+
},
|
|
292
|
+
onClick: this.handleDelete,
|
|
293
|
+
icon: vsTrash,
|
|
294
|
+
tooltip: "Delete"
|
|
295
|
+
})));
|
|
105
296
|
}
|
|
106
|
-
|
|
107
297
|
}
|
|
108
|
-
|
|
109
298
|
_defineProperty(LinkerLink, "defaultProps", {
|
|
110
299
|
className: '',
|
|
111
|
-
|
|
112
|
-
onClick() {
|
|
300
|
+
isSelected: false,
|
|
301
|
+
onClick() {
|
|
302
|
+
// no-op
|
|
303
|
+
},
|
|
304
|
+
onDelete() {
|
|
305
|
+
// no-op
|
|
113
306
|
}
|
|
114
|
-
|
|
115
307
|
});
|
|
116
|
-
|
|
117
308
|
export default LinkerLink;
|
|
118
309
|
//# sourceMappingURL=LinkerLink.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkerLink.js","names":["React","PureComponent","DROOP","DROOP_EXPONENT","TRIANGLE_HEIGHT","TRIANGLE_BASE","TRIANGLE_TIP","TRIANGLE_HYPOTENUSE","Math","sqrt","TRIANGLE_THETA","asin","CLIP_RADIUS","LinkerLink","makeCirclePath","x","y","r","constructor","props","handleClick","bind","event","stopPropagation","preventDefault","id","onClick","render","className","x1","y1","x2","y2","len","theta","atan2","xMult","sin","yMult","cos","maxX","window","innerWidth","maxY","innerHeight","minX","minY","qx","max","min","qy","path","selectClipPath","clipPathId","endTheta","t2theta","PI","t3theta","tx1","ty1","tx2","ty2","tx3","ty3","points"],"sources":["../../src/linker/LinkerLink.tsx"],"sourcesContent":["import React, { MouseEvent, PureComponent } from 'react';\n\nimport './LinkerLink.scss';\n\n/** The constant for how droopy the links are. Increase for more droopiness. */\nconst DROOP = 0.015;\nconst DROOP_EXPONENT = 1.5;\nconst TRIANGLE_HEIGHT = 12;\nconst TRIANGLE_BASE = 12;\nconst TRIANGLE_TIP = 2;\nconst TRIANGLE_HYPOTENUSE = Math.sqrt(\n (TRIANGLE_BASE * 0.5) ** 2 + TRIANGLE_HEIGHT ** 2\n);\nconst TRIANGLE_THETA = Math.asin((TRIANGLE_BASE * 0.5) / TRIANGLE_HEIGHT);\nconst CLIP_RADIUS = 15;\n\nexport type LinkerLinkProps = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n onClick: (id: string) => void;\n};\n\nexport class LinkerLink extends PureComponent<LinkerLinkProps> {\n static defaultProps = {\n className: '',\n onClick(): void {\n // no-op\n },\n };\n\n /**\n * Make an SVG path for a circle at the specified coordinates.\n * @param x The x coordinate for the centre of the circle\n * @param y The y coordinate for the centre of the circle\n * @param r Radius of the circle\n * @returns The SVG string path\n */\n static makeCirclePath(x: number, y: number, r: number): string {\n return `M ${x} ${y} m -${r},0 a ${r},${r} 0 1,0 ${\n r * 2\n },0 a ${r},${r} 0 1,0 -${r * 2},0 z`;\n }\n\n constructor(props: LinkerLinkProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(event: MouseEvent<SVGPathElement>): void {\n event.stopPropagation();\n event.preventDefault();\n\n const { id, onClick } = this.props;\n onClick(id);\n }\n\n render(): JSX.Element {\n const { className, x1, y1, x2, y2, id } = this.props;\n\n // Path between the two points\n const len = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);\n const theta = Math.atan2(y2 - y1, x2 - x1);\n const xMult = Math.sin(theta);\n const yMult = Math.cos(theta) + 2;\n const maxX = window.innerWidth;\n const maxY = window.innerHeight;\n const minX = 0;\n const minY = 0;\n const qx = Math.max(\n minX,\n Math.min(\n x1 + (x2 - x1) / 2 + xMult * (len * DROOP) ** DROOP_EXPONENT,\n maxX\n )\n );\n const qy = Math.max(\n minY,\n Math.min(\n y1 + (y2 - y1) / 2 + yMult * (len * DROOP) ** DROOP_EXPONENT,\n maxY\n )\n );\n const path = `M ${x1} ${y1} Q ${qx} ${qy} ${x2} ${y2}`;\n\n // path for a 100%, 100% rect, then two paths for circles at point\n const selectClipPath = `M ${minX} ${minY} L ${minX} ${maxY} L ${maxX} ${maxY} L ${maxX} ${minY} z\n ${LinkerLink.makeCirclePath(x1, y1, CLIP_RADIUS)}\n ${LinkerLink.makeCirclePath(x2, y2, CLIP_RADIUS)}`;\n const clipPathId = `link-select-clip-${id}`;\n\n // Calculate location of the end triangle\n // We draw it instead of using markers to allow for transitions in the style\n const endTheta = Math.atan2(y2 - qy, x2 - qx);\n const t2theta = endTheta - TRIANGLE_THETA + Math.PI;\n const t3theta = endTheta + TRIANGLE_THETA + Math.PI;\n const tx1 = x2 + Math.cos(endTheta) * TRIANGLE_TIP;\n const ty1 = y2 + Math.sin(endTheta) * TRIANGLE_TIP;\n const tx2 = tx1 + Math.cos(t2theta) * TRIANGLE_HYPOTENUSE;\n const ty2 = ty1 + Math.sin(t2theta) * TRIANGLE_HYPOTENUSE;\n const tx3 = tx1 + Math.cos(t3theta) * TRIANGLE_HYPOTENUSE;\n const ty3 = ty1 + Math.sin(t3theta) * TRIANGLE_HYPOTENUSE;\n const points = `${tx1},${ty1} ${tx2},${ty2} ${tx3},${ty3}`;\n\n return (\n <svg className={className}>\n <clipPath id={clipPathId}>\n <path d={selectClipPath} clipRule=\"evenodd\" />\n </clipPath>\n <path\n className=\"link-select\"\n d={path}\n onClick={this.handleClick}\n clipPath={`url(#${clipPathId})`}\n />\n <path className=\"link-background\" d={path} />\n <path className=\"link-foreground\" d={path} />\n <circle className=\"link-dot\" cx={x1} cy={y1} r=\"5\" />\n <polygon className=\"link-triangle\" points={points} />\n </svg>\n );\n }\n}\n\nexport default LinkerLink;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LinkerLink.js","names":["React","Component","memoize","classNames","Button","DropdownMenu","vsTrash","vsTriangleDown","FontAwesomeIcon","Type","FilterType","getLabelForNumberFilter","getLabelForTextFilter","getLabelForDateFilter","Log","TableUtils","log","module","DROOP","DROOP_EXPONENT","TRIANGLE_HEIGHT","TRIANGLE_BASE","TRIANGLE_TIP","TRIANGLE_HYPOTENUSE","Math","sqrt","TRIANGLE_THETA","asin","CLIP_RADIUS","HALF_PI","PI","LinkerLink","makeCirclePath","x","y","r","getLabelForLinkFilter","columnType","filterType","isNumberType","isCharType","isTextType","isDateType","isBooleanType","eq","notEq","Error","e","warn","constructor","props","linkId","onOperatorChanged","filterTypes","getFilterTypes","flatMap","type","index","symbol","getFilterOperatorString","title","icon","action","order","handleClick","bind","handleMouseEnter","handleMouseLeave","handleDelete","getDropdownActions","state","isHovering","undefined","event","stopPropagation","preventDefault","id","onClick","onDelete","altKey","setState","startColumnType","getOperators","render","className","operator","isSelected","x1","y1","x2","y2","len","theta","atan2","xMult","sin","yMult","cos","maxX","window","innerWidth","maxY","innerHeight","minX","minY","qx","max","min","qy","path","selectClipPath","clipPathId","endTheta","t2theta","t3theta","tx1","ty1","tx2","ty2","tx3","ty3","points","midX","midY","dMidX","dMidY","slopeAtMid","DISTANCE_FROM_MID","topOffsetX","topOffsetY","bottomOffsetX","bottomOffsetY","Number","isFinite","abs","hovering","top","left","placement"],"sources":["../../src/linker/LinkerLink.tsx"],"sourcesContent":["import React, { Component, MouseEvent } from 'react';\nimport memoize from 'memoize-one';\nimport classNames from 'classnames';\nimport { Button, DropdownAction, DropdownMenu } from '@deephaven/components';\nimport { vsTrash, vsTriangleDown } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n Type as FilterType,\n TypeValue as FilterTypeValue,\n getLabelForNumberFilter,\n getLabelForTextFilter,\n getLabelForDateFilter,\n} from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport './LinkerLink.scss';\n\nconst log = Log.module('LinkerLink');\n\n/** The constant for how droopy the links are. Increase for more droopiness. */\nconst DROOP = 0.015;\nconst DROOP_EXPONENT = 1.5;\nconst TRIANGLE_HEIGHT = 12;\nconst TRIANGLE_BASE = 12;\nconst TRIANGLE_TIP = 2;\nconst TRIANGLE_HYPOTENUSE = Math.sqrt(\n (TRIANGLE_BASE * 0.5) ** 2 + TRIANGLE_HEIGHT ** 2\n);\nconst TRIANGLE_THETA = Math.asin((TRIANGLE_BASE * 0.5) / TRIANGLE_HEIGHT);\nconst CLIP_RADIUS = 15;\nconst HALF_PI = Math.PI * 0.5;\n\nexport type LinkerLinkProps = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n operator: FilterTypeValue;\n isSelected: boolean;\n startColumnType: string | null;\n onClick: (id: string) => void;\n onDelete: (id: string) => void;\n onOperatorChanged: (id: string, type: FilterTypeValue) => void;\n};\n\nexport type LinkerLinkState = {\n isHovering?: boolean;\n};\n\nexport class LinkerLink extends Component<LinkerLinkProps, LinkerLinkState> {\n static defaultProps = {\n className: '',\n isSelected: false,\n onClick(): void {\n // no-op\n },\n onDelete(): void {\n // no-op\n },\n };\n\n /**\n * Make an SVG path for a circle at the specified coordinates.\n * @param x The x coordinate for the centre of the circle\n * @param y The y coordinate for the centre of the circle\n * @param r Radius of the circle\n * @returns The SVG string path\n */\n static makeCirclePath(x: number, y: number, r: number): string {\n return `M ${x} ${y} m -${r},0 a ${r},${r} 0 1,0 ${\n r * 2\n },0 a ${r},${r} 0 1,0 -${r * 2},0 z`;\n }\n\n static getLabelForLinkFilter(\n columnType: string,\n filterType: FilterTypeValue\n ): string {\n try {\n if (\n TableUtils.isNumberType(columnType) ||\n TableUtils.isCharType(columnType)\n ) {\n return getLabelForNumberFilter(filterType);\n }\n if (TableUtils.isTextType(columnType)) {\n return getLabelForTextFilter(filterType);\n }\n if (TableUtils.isDateType(columnType)) {\n return getLabelForDateFilter(filterType);\n }\n if (TableUtils.isBooleanType(columnType)) {\n if (filterType === FilterType.eq) {\n return 'is equal to';\n }\n if (filterType === FilterType.notEq) {\n return 'is not equal to';\n }\n }\n throw new Error(`Unrecognized column type: ${columnType}`);\n } catch (e) {\n log.warn(e);\n return '';\n }\n }\n\n constructor(props: LinkerLinkProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleMouseEnter = this.handleMouseEnter.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleDelete = this.handleDelete.bind(this);\n this.getDropdownActions = this.getDropdownActions.bind(this);\n\n this.state = {\n isHovering: undefined,\n };\n }\n\n getOperators = memoize(\n (linkId: string, columnType: string): DropdownAction[] => {\n const { onOperatorChanged } = this.props;\n let filterTypes = TableUtils.getFilterTypes(columnType);\n if (TableUtils.isBooleanType(columnType)) {\n filterTypes = [FilterType.eq, FilterType.notEq];\n }\n return filterTypes.flatMap((type, index) => {\n // Remove case-insensitive string comparisons\n if (type === 'eqIgnoreCase' || type === `notEqIgnoreCase`) {\n return [];\n }\n let symbol = '';\n\n if (type === 'startsWith') {\n symbol = 'a*';\n } else if (type === 'endsWith') {\n symbol = '*z';\n } else {\n symbol = TableUtils.getFilterOperatorString(type);\n }\n\n return [\n {\n title: LinkerLink.getLabelForLinkFilter(columnType, type),\n icon: <b>{symbol}</b>,\n action: () => onOperatorChanged(linkId, type),\n order: index,\n },\n ];\n });\n }\n );\n\n handleClick(event: MouseEvent<SVGPathElement>): void {\n event.stopPropagation();\n event.preventDefault();\n\n const { id, onClick, onDelete } = this.props;\n if (event.altKey) {\n onDelete(id);\n } else {\n onClick(id);\n }\n }\n\n handleMouseEnter(): void {\n this.setState({\n isHovering: true,\n });\n }\n\n handleMouseLeave(): void {\n this.setState({\n isHovering: false,\n });\n }\n\n handleDelete(): void {\n const { id, onDelete } = this.props;\n onDelete(id);\n }\n\n getDropdownActions(): DropdownAction[] {\n const { id, startColumnType } = this.props;\n if (startColumnType != null) {\n return this.getOperators(id, startColumnType);\n }\n return [];\n }\n\n render(): JSX.Element {\n const {\n className,\n operator,\n isSelected,\n x1,\n y1,\n x2,\n y2,\n id,\n startColumnType,\n } = this.props;\n const { isHovering } = this.state;\n\n // Path between the two points\n const len = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);\n const theta = Math.atan2(y2 - y1, x2 - x1);\n const xMult = Math.sin(theta);\n const yMult = Math.cos(theta) + 2;\n const maxX = window.innerWidth;\n const maxY = window.innerHeight;\n const minX = 0;\n const minY = 0;\n const qx = Math.max(\n minX,\n Math.min(\n x1 + (x2 - x1) / 2 + xMult * (len * DROOP) ** DROOP_EXPONENT,\n maxX\n )\n );\n const qy = Math.max(\n minY,\n Math.min(\n y1 + (y2 - y1) / 2 + yMult * (len * DROOP) ** DROOP_EXPONENT,\n maxY\n )\n );\n const path = `M ${x1} ${y1} Q ${qx} ${qy} ${x2} ${y2}`;\n\n // path for a 100%, 100% rect, then two paths for circles at point\n const selectClipPath = `M ${minX} ${minY} L ${minX} ${maxY} L ${maxX} ${maxY} L ${maxX} ${minY} z\n ${LinkerLink.makeCirclePath(x1, y1, CLIP_RADIUS)}\n ${LinkerLink.makeCirclePath(x2, y2, CLIP_RADIUS)}`;\n const clipPathId = `link-select-clip-${id}`;\n\n // Calculate location of the end triangle\n // We draw it instead of using markers to allow for transitions in the style\n const endTheta = Math.atan2(y2 - qy, x2 - qx);\n const t2theta = endTheta - TRIANGLE_THETA + Math.PI;\n const t3theta = endTheta + TRIANGLE_THETA + Math.PI;\n const tx1 = x2 + Math.cos(endTheta) * TRIANGLE_TIP;\n const ty1 = y2 + Math.sin(endTheta) * TRIANGLE_TIP;\n const tx2 = tx1 + Math.cos(t2theta) * TRIANGLE_HYPOTENUSE;\n const ty2 = ty1 + Math.sin(t2theta) * TRIANGLE_HYPOTENUSE;\n const tx3 = tx1 + Math.cos(t3theta) * TRIANGLE_HYPOTENUSE;\n const ty3 = ty1 + Math.sin(t3theta) * TRIANGLE_HYPOTENUSE;\n const points = `${tx1},${ty1} ${tx2},${ty2} ${tx3},${ty3}`;\n\n // Button offset calculations\n const midX = 0.25 * x1 + 0.5 * qx + 0.25 * x2;\n const midY = 0.25 * y1 + 0.5 * qy + 0.25 * y2;\n const dMidX = qx - x1 + (x2 - qx);\n const dMidY = qy - y1 + (y2 - qy);\n const slopeAtMid = dMidY / dMidX;\n const DISTANCE_FROM_MID = 20;\n let topOffsetX = DISTANCE_FROM_MID / Math.sqrt(1 + slopeAtMid ** 2);\n let topOffsetY = topOffsetX * slopeAtMid;\n let bottomOffsetX = topOffsetX * -1;\n let bottomOffsetY = topOffsetY * -1;\n if (!Number.isFinite(slopeAtMid)) {\n bottomOffsetX = 10;\n bottomOffsetY = 5;\n topOffsetX = 10;\n topOffsetY = -35;\n } else if (slopeAtMid > 0) {\n topOffsetX *= -1;\n topOffsetY *= -1;\n bottomOffsetX *= -1;\n bottomOffsetY *= -1;\n bottomOffsetX -= 50 - 10 * (Math.abs(theta) % HALF_PI);\n bottomOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetX -= 50 - 10 * (Math.abs(theta) % HALF_PI);\n topOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n } else if (slopeAtMid < 0) {\n bottomOffsetX += 10 * (Math.abs(theta) % HALF_PI);\n bottomOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetX += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n } else {\n bottomOffsetX = 15;\n bottomOffsetY = 10;\n topOffsetX = -25;\n topOffsetY = 10;\n }\n\n let symbol = '';\n if (operator !== undefined) {\n if (operator === 'startsWith') {\n symbol = 'a*';\n } else if (operator === 'endsWith') {\n symbol = '*z';\n } else {\n symbol = TableUtils.getFilterOperatorString(operator);\n }\n }\n\n return (\n <>\n <svg\n className={classNames(className, {\n hovering: isHovering,\n })}\n >\n <clipPath id={clipPathId}>\n <path d={selectClipPath} clipRule=\"evenodd\" />\n </clipPath>\n <path\n className=\"link-select\"\n d={path}\n onClick={this.handleClick}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n clipPath={`url(#${clipPathId})`}\n />\n <path className=\"link-background\" d={path} />\n <path className=\"link-foreground\" d={path} />\n <circle className=\"link-dot\" cx={x1} cy={y1} r=\"5\" />\n <polygon className=\"link-triangle\" points={points} />\n </svg>\n {startColumnType != null && isSelected && (\n <>\n <Button\n kind=\"primary\"\n className=\"btn-fab btn-operator\"\n style={{\n top: midY + (slopeAtMid >= 0 ? topOffsetY : bottomOffsetY),\n left: midX + (slopeAtMid >= 0 ? topOffsetX : bottomOffsetX),\n }}\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n icon={\n <div className=\"fa-md fa-layers\">\n <b>{symbol}</b>\n <FontAwesomeIcon\n icon={vsTriangleDown}\n transform=\"right-8 down-9 shrink-5\"\n />\n </div>\n }\n tooltip=\"Change comparison operator\"\n >\n <DropdownMenu\n actions={this.getDropdownActions}\n popperOptions={{ placement: 'bottom-start' }}\n />\n </Button>\n <Button\n kind=\"primary\"\n className=\"btn-fab btn-delete\"\n style={{\n top: midY + (slopeAtMid < 0 ? topOffsetY : bottomOffsetY),\n left: midX + (slopeAtMid < 0 ? topOffsetX : bottomOffsetX),\n }}\n onClick={this.handleDelete}\n icon={vsTrash}\n tooltip=\"Delete\"\n />\n </>\n )}\n </>\n );\n }\n}\n\nexport default LinkerLink;\n"],"mappings":"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"}
|