@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.
Files changed (166) hide show
  1. package/dist/ChartBuilderPlugin.d.ts +1 -1
  2. package/dist/ChartBuilderPlugin.d.ts.map +1 -1
  3. package/dist/ChartBuilderPlugin.js +6 -8
  4. package/dist/ChartBuilderPlugin.js.map +1 -1
  5. package/dist/ChartPlugin.d.ts +1 -1
  6. package/dist/ChartPlugin.d.ts.map +1 -1
  7. package/dist/ChartPlugin.js +4 -8
  8. package/dist/ChartPlugin.js.map +1 -1
  9. package/dist/ConsolePlugin.d.ts +1 -1
  10. package/dist/ConsolePlugin.d.ts.map +1 -1
  11. package/dist/ConsolePlugin.js +16 -62
  12. package/dist/ConsolePlugin.js.map +1 -1
  13. package/dist/FilterPlugin.d.ts +1 -1
  14. package/dist/FilterPlugin.d.ts.map +1 -1
  15. package/dist/FilterPlugin.js +6 -13
  16. package/dist/FilterPlugin.js.map +1 -1
  17. package/dist/GridPlugin.d.ts +1 -1
  18. package/dist/GridPlugin.d.ts.map +1 -1
  19. package/dist/GridPlugin.js +4 -8
  20. package/dist/GridPlugin.js.map +1 -1
  21. package/dist/LinkerPlugin.d.ts +1 -1
  22. package/dist/LinkerPlugin.d.ts.map +1 -1
  23. package/dist/LinkerPlugin.js +2 -2
  24. package/dist/LinkerPlugin.js.map +1 -1
  25. package/dist/MarkdownPlugin.d.ts +1 -1
  26. package/dist/MarkdownPlugin.d.ts.map +1 -1
  27. package/dist/MarkdownPlugin.js +4 -8
  28. package/dist/MarkdownPlugin.js.map +1 -1
  29. package/dist/PandasPlugin.d.ts +1 -1
  30. package/dist/PandasPlugin.d.ts.map +1 -1
  31. package/dist/PandasPlugin.js +4 -8
  32. package/dist/PandasPlugin.js.map +1 -1
  33. package/dist/controls/ControlType.js +0 -6
  34. package/dist/controls/ControlType.js.map +1 -1
  35. package/dist/controls/dropdown-filter/DropdownFilter.js +7 -51
  36. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
  37. package/dist/controls/input-filter/InputFilter.js +1 -31
  38. package/dist/controls/input-filter/InputFilter.js.map +1 -1
  39. package/dist/controls/markdown/MarkdownContainer.js +0 -3
  40. package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
  41. package/dist/controls/markdown/MarkdownEditor.d.ts +0 -2
  42. package/dist/controls/markdown/MarkdownEditor.d.ts.map +1 -1
  43. package/dist/controls/markdown/MarkdownEditor.js +13 -20
  44. package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
  45. package/dist/controls/markdown/MarkdownStartPage.js +0 -11
  46. package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
  47. package/dist/controls/markdown/MarkdownUtils.js +0 -7
  48. package/dist/controls/markdown/MarkdownUtils.js.map +1 -1
  49. package/dist/events/ChartEvent.js +0 -5
  50. package/dist/events/ChartEvent.js.map +1 -1
  51. package/dist/events/ConsoleEvent.js +0 -7
  52. package/dist/events/ConsoleEvent.js.map +1 -1
  53. package/dist/events/InputFilterEvent.js +0 -10
  54. package/dist/events/InputFilterEvent.js.map +1 -1
  55. package/dist/events/IrisGridEvent.js +0 -8
  56. package/dist/events/IrisGridEvent.js.map +1 -1
  57. package/dist/events/MarkdownEvent.js.map +1 -1
  58. package/dist/events/NotebookEvent.js +0 -10
  59. package/dist/events/NotebookEvent.js.map +1 -1
  60. package/dist/events/PQEvent.js +0 -5
  61. package/dist/events/PQEvent.js.map +1 -1
  62. package/dist/events/PandasEvent.js +0 -4
  63. package/dist/events/PandasEvent.js.map +1 -1
  64. package/dist/events/TabEvent.js +0 -8
  65. package/dist/events/TabEvent.js.map +1 -1
  66. package/dist/events/index.js.map +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/linker/Linker.d.ts +3 -0
  69. package/dist/linker/Linker.d.ts.map +1 -1
  70. package/dist/linker/Linker.js +70 -119
  71. package/dist/linker/Linker.js.map +1 -1
  72. package/dist/linker/LinkerLink.css +90 -25
  73. package/dist/linker/LinkerLink.css.map +1 -1
  74. package/dist/linker/LinkerLink.d.ts +20 -2
  75. package/dist/linker/LinkerLink.d.ts.map +1 -1
  76. package/dist/linker/LinkerLink.js +214 -23
  77. package/dist/linker/LinkerLink.js.map +1 -1
  78. package/dist/linker/LinkerOverlayContent.css +0 -4
  79. package/dist/linker/LinkerOverlayContent.css.map +1 -1
  80. package/dist/linker/LinkerOverlayContent.d.ts +11 -0
  81. package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
  82. package/dist/linker/LinkerOverlayContent.js +78 -33
  83. package/dist/linker/LinkerOverlayContent.js.map +1 -1
  84. package/dist/linker/LinkerUtils.d.ts +9 -2
  85. package/dist/linker/LinkerUtils.d.ts.map +1 -1
  86. package/dist/linker/LinkerUtils.js +9 -25
  87. package/dist/linker/LinkerUtils.js.map +1 -1
  88. package/dist/linker/ToolType.js.map +1 -1
  89. package/dist/panels/ChartColumnSelectorOverlay.d.ts +5 -5
  90. package/dist/panels/ChartColumnSelectorOverlay.d.ts.map +1 -1
  91. package/dist/panels/ChartColumnSelectorOverlay.js +4 -7
  92. package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
  93. package/dist/panels/ChartFilterOverlay.d.ts +4 -4
  94. package/dist/panels/ChartFilterOverlay.d.ts.map +1 -1
  95. package/dist/panels/ChartFilterOverlay.js +2 -7
  96. package/dist/panels/ChartFilterOverlay.js.map +1 -1
  97. package/dist/panels/ChartPanel.d.ts.map +1 -1
  98. package/dist/panels/ChartPanel.js +11 -150
  99. package/dist/panels/ChartPanel.js.map +1 -1
  100. package/dist/panels/CommandHistoryPanel.d.ts.map +1 -1
  101. package/dist/panels/CommandHistoryPanel.js +1 -26
  102. package/dist/panels/CommandHistoryPanel.js.map +1 -1
  103. package/dist/panels/ConsolePanel.d.ts.map +1 -1
  104. package/dist/panels/ConsolePanel.js +12 -57
  105. package/dist/panels/ConsolePanel.js.map +1 -1
  106. package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
  107. package/dist/panels/DropdownFilterPanel.js +16 -122
  108. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  109. package/dist/panels/FileExplorerPanel.js +4 -33
  110. package/dist/panels/FileExplorerPanel.js.map +1 -1
  111. package/dist/panels/FilterSetManager.d.ts.map +1 -1
  112. package/dist/panels/FilterSetManager.js +13 -86
  113. package/dist/panels/FilterSetManager.js.map +1 -1
  114. package/dist/panels/FilterSetManagerPanel.js +10 -64
  115. package/dist/panels/FilterSetManagerPanel.js.map +1 -1
  116. package/dist/panels/InputFilterPanel.d.ts.map +1 -1
  117. package/dist/panels/InputFilterPanel.js +8 -38
  118. package/dist/panels/InputFilterPanel.js.map +1 -1
  119. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  120. package/dist/panels/IrisGridPanel.js +24 -133
  121. package/dist/panels/IrisGridPanel.js.map +1 -1
  122. package/dist/panels/IrisGridPanelTooltip.d.ts +5 -5
  123. package/dist/panels/IrisGridPanelTooltip.d.ts.map +1 -1
  124. package/dist/panels/IrisGridPanelTooltip.js +2 -5
  125. package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
  126. package/dist/panels/LogPanel.js +4 -22
  127. package/dist/panels/LogPanel.js.map +1 -1
  128. package/dist/panels/MarkdownNotebook.js +3 -30
  129. package/dist/panels/MarkdownNotebook.js.map +1 -1
  130. package/dist/panels/MarkdownPanel.js +2 -30
  131. package/dist/panels/MarkdownPanel.js.map +1 -1
  132. package/dist/panels/MockFileStorage.js +1 -14
  133. package/dist/panels/MockFileStorage.js.map +1 -1
  134. package/dist/panels/MockFileStorageTable.js +11 -30
  135. package/dist/panels/MockFileStorageTable.js.map +1 -1
  136. package/dist/panels/NotebookPanel.js +24 -182
  137. package/dist/panels/NotebookPanel.js.map +1 -1
  138. package/dist/panels/PandasPanel.js +1 -20
  139. package/dist/panels/PandasPanel.js.map +1 -1
  140. package/dist/panels/Panel.js +2 -38
  141. package/dist/panels/Panel.js.map +1 -1
  142. package/dist/panels/PanelContextMenu.js +7 -29
  143. package/dist/panels/PanelContextMenu.js.map +1 -1
  144. package/dist/panels/RenameDialog.js +2 -17
  145. package/dist/panels/RenameDialog.js.map +1 -1
  146. package/dist/panels/WidgetPanel.js +2 -20
  147. package/dist/panels/WidgetPanel.js.map +1 -1
  148. package/dist/panels/WidgetPanelTooltip.d.ts +5 -5
  149. package/dist/panels/WidgetPanelTooltip.d.ts.map +1 -1
  150. package/dist/panels/WidgetPanelTooltip.js +2 -4
  151. package/dist/panels/WidgetPanelTooltip.js.map +1 -1
  152. package/dist/panels/index.js.map +1 -1
  153. package/dist/prop-types/CommonPropTypes.js +0 -3
  154. package/dist/prop-types/CommonPropTypes.js.map +1 -1
  155. package/dist/prop-types/UIPropTypes.js.map +1 -1
  156. package/dist/prop-types/index.js.map +1 -1
  157. package/dist/redux/actionTypes.js.map +1 -1
  158. package/dist/redux/actions.js +8 -9
  159. package/dist/redux/actions.js.map +1 -1
  160. package/dist/redux/index.js.map +1 -1
  161. package/dist/redux/reducers/connection.js.map +1 -1
  162. package/dist/redux/reducers/index.js.map +1 -1
  163. package/dist/redux/reducers/sessionWrapper.js.map +1 -1
  164. package/dist/redux/selectors.js +10 -15
  165. package/dist/redux/selectors.js.map +1 -1
  166. 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 React, { PureComponent } from 'react';
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
- /** The constant for how droopy the links are. Increase for more droopiness. */
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
- export class LinkerLink extends PureComponent {
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
- onClick(id);
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
- } = this.props; // Path between the two points
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); // path for a 100%, 100% rect, then two paths for circles at point
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); // Calculate location of the end triangle
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
- return /*#__PURE__*/React.createElement("svg", {
79
- className: className
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() {// no-op
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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"}
@@ -8,10 +8,6 @@
8
8
  bottom: 0;
9
9
  pointer-events: none;
10
10
  }
11
- .linker-overlay svg {
12
- width: 100%;
13
- height: 100%;
14
- }
15
11
  .linker-overlay .linker-toast-dialog {
16
12
  position: absolute;
17
13
  right: 1rem;