@deephaven/dashboard-core-plugins 0.22.3-embed-pandas.11 → 0.23.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.d.ts +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +4 -4
- 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 +2 -2
- 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 +2 -2
- 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 +3 -3
- 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 +2 -2
- 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.d.ts +2 -2
- package/dist/controls/dropdown-filter/DropdownFilter.d.ts.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.d.ts +2 -2
- package/dist/controls/input-filter/InputFilter.d.ts.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.d.ts +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/ColumnSelectionValidator.d.ts +1 -1
- package/dist/linker/ColumnSelectionValidator.d.ts.map +1 -1
- package/dist/linker/Linker.d.ts +5 -2
- 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 +21 -3
- 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 +14 -3
- 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 +17 -10
- 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.d.ts +2 -2
- 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 +5 -5
- 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 +8 -8
- 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 +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 +9 -9
- package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
- package/dist/panels/DropdownFilterPanel.js +21 -127
- package/dist/panels/DropdownFilterPanel.js.map +1 -1
- package/dist/panels/FileExplorerPanel.d.ts +4 -4
- package/dist/panels/FileExplorerPanel.d.ts.map +1 -1
- package/dist/panels/FileExplorerPanel.js +4 -33
- package/dist/panels/FileExplorerPanel.js.map +1 -1
- package/dist/panels/FilterSetManager.d.ts +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 +13 -13
- 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 +7 -7
- 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.d.ts +1 -1
- package/dist/panels/Panel.d.ts.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.d.ts.map +1 -1
- package/dist/panels/WidgetPanel.js +5 -22
- package/dist/panels/WidgetPanel.js.map +1 -1
- package/dist/panels/WidgetPanelTooltip.d.ts +7 -7
- package/dist/panels/WidgetPanelTooltip.d.ts.map +1 -1
- package/dist/panels/WidgetPanelTooltip.js +7 -17
- 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.d.ts +2 -2
- 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 -19
|
@@ -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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"}
|