@deephaven/dashboard-core-plugins 1.0.1-beta.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/GridWidgetPlugin.d.ts.map +1 -1
  2. package/dist/GridWidgetPlugin.js +7 -6
  3. package/dist/GridWidgetPlugin.js.map +1 -1
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/linker/ColumnSelectionValidator.d.ts +2 -2
  9. package/dist/linker/ColumnSelectionValidator.d.ts.map +1 -1
  10. package/dist/linker/ColumnSelectionValidator.js.map +1 -1
  11. package/dist/linker/Linker.d.ts +14 -8
  12. package/dist/linker/Linker.d.ts.map +1 -1
  13. package/dist/linker/Linker.js +132 -75
  14. package/dist/linker/Linker.js.map +1 -1
  15. package/dist/linker/LinkerEvent.d.ts +52 -0
  16. package/dist/linker/LinkerEvent.d.ts.map +1 -0
  17. package/dist/linker/LinkerEvent.js +28 -0
  18. package/dist/linker/LinkerEvent.js.map +1 -0
  19. package/dist/linker/LinkerOverlayContent.d.ts +2 -0
  20. package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
  21. package/dist/linker/LinkerOverlayContent.js +13 -3
  22. package/dist/linker/LinkerOverlayContent.js.map +1 -1
  23. package/dist/linker/LinkerUtils.d.ts +9 -4
  24. package/dist/linker/LinkerUtils.d.ts.map +1 -1
  25. package/dist/linker/LinkerUtils.js +8 -31
  26. package/dist/linker/LinkerUtils.js.map +1 -1
  27. package/dist/panels/ChartPanel.d.ts +10 -2
  28. package/dist/panels/ChartPanel.d.ts.map +1 -1
  29. package/dist/panels/ChartPanel.js +20 -5
  30. package/dist/panels/ChartPanel.js.map +1 -1
  31. package/dist/panels/DropdownFilterPanel.d.ts +1 -1
  32. package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
  33. package/dist/panels/DropdownFilterPanel.js +12 -4
  34. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  35. package/dist/panels/FileExplorerPanel.d.ts +1 -1
  36. package/dist/panels/FilterSetManagerPanel.d.ts +2 -2
  37. package/dist/panels/IrisGridPanel.d.ts +6 -6
  38. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  39. package/dist/panels/IrisGridPanel.js +17 -5
  40. package/dist/panels/IrisGridPanel.js.map +1 -1
  41. package/dist/panels/LogPanel.d.ts +1 -1
  42. package/dist/panels/NotebookPanel.d.ts +1 -1
  43. package/dist/useChartLinker.d.ts +1 -0
  44. package/dist/useChartLinker.d.ts.map +1 -0
  45. package/dist/useChartLinker.js +2 -0
  46. package/dist/useChartLinker.js.map +1 -0
  47. package/dist/useDashboardColumnFilters.d.ts +4 -2
  48. package/dist/useDashboardColumnFilters.d.ts.map +1 -1
  49. package/dist/useDashboardColumnFilters.js +5 -3
  50. package/dist/useDashboardColumnFilters.js.map +1 -1
  51. package/dist/useGridLinker.d.ts +4 -0
  52. package/dist/useGridLinker.d.ts.map +1 -0
  53. package/dist/useGridLinker.js +107 -0
  54. package/dist/useGridLinker.js.map +1 -0
  55. package/package.json +25 -25
@@ -13,12 +13,14 @@ import { DateTimeColumnFormatter, DateUtils, TableUtils } from '@deephaven/jsapi
13
13
  import Log from '@deephaven/log';
14
14
  import { Type as FilterType } from '@deephaven/filters';
15
15
  import { getActiveTool, getApi, getTimeZone, setActiveTool as setActiveToolAction } from '@deephaven/redux';
16
+ import { assertNotNull } from '@deephaven/utils';
16
17
  import { getIsolatedLinkerPanelIdForDashboard, getLinksForDashboard, setDashboardLinks as setDashboardLinksAction, addDashboardLinks as addDashboardLinksAction, deleteDashboardLinks as deleteDashboardLinksAction, setDashboardIsolatedLinkerPanelId as setDashboardIsolatedLinkerPanelIdAction, setDashboardColumnSelectionValidator as setDashboardColumnSelectionValidatorAction } from "../redux/index.js";
17
18
  import ToolType from "./ToolType.js";
18
- import { ChartEvent, IrisGridEvent, InputFilterEvent } from "../events/index.js";
19
+ import { ChartEvent, IrisGridEvent } from "../events/index.js";
19
20
  import LinkerOverlayContent from "./LinkerOverlayContent.js";
20
21
  import LinkerUtils, { isLinkablePanel, isLinkableColumn } from "./LinkerUtils.js";
21
22
  import { listenForFilterColumnsChanged } from "../FilterEvents.js";
23
+ import { listenForLinkPointSelected, listenForLinkSourceDataSelected, listenForRegisterLinkTarget } from "./LinkerEvent.js";
22
24
  import { jsx as _jsx } from "react/jsx-runtime";
23
25
  var log = Log.module('Linker');
24
26
  var mapState = (state, ownProps) => ({
@@ -39,6 +41,7 @@ var connector = connect(mapState, {
39
41
  export class Linker extends Component {
40
42
  constructor(props) {
41
43
  super(props);
44
+ _defineProperty(this, "linkTargetPropMap", new Map());
42
45
  _defineProperty(this, "removerFns", []);
43
46
  _defineProperty(this, "getCachedLinks", memoize((links, linkInProgress, isolateForPanelId) => {
44
47
  var combinedLinks = [...links];
@@ -57,7 +60,6 @@ export class Linker extends Component {
57
60
  this.handleCancel = this.handleCancel.bind(this);
58
61
  this.handleDone = this.handleDone.bind(this);
59
62
  this.handlePanelCloned = this.handlePanelCloned.bind(this);
60
- this.handleFilterColumnSelect = this.handleFilterColumnSelect.bind(this);
61
63
  this.handleColumnsChanged = this.handleColumnsChanged.bind(this);
62
64
  this.handlePanelClosed = this.handlePanelClosed.bind(this);
63
65
  this.handleLayoutStateChanged = this.handleLayoutStateChanged.bind(this);
@@ -69,6 +71,8 @@ export class Linker extends Component {
69
71
  this.handleUpdateValues = this.handleUpdateValues.bind(this);
70
72
  this.handleStateChange = this.handleStateChange.bind(this);
71
73
  this.handleExited = this.handleExited.bind(this);
74
+ this.handleLinkPointSelected = this.handleLinkPointSelected.bind(this);
75
+ this.handleTargetRegistered = this.handleTargetRegistered.bind(this);
72
76
  this.handleLinkSelected = this.handleLinkSelected.bind(this);
73
77
  this.handlePanelDragging = this.handlePanelDragging.bind(this);
74
78
  this.handlePanelDropped = this.handlePanelDropped.bind(this);
@@ -121,8 +125,7 @@ export class Linker extends Component {
121
125
  eventHub.on(IrisGridEvent.STATE_CHANGED, this.handleStateChange);
122
126
  eventHub.on(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);
123
127
  eventHub.on(PanelEvent.CLONED, this.handlePanelCloned);
124
- eventHub.on(InputFilterEvent.COLUMN_SELECTED, this.handleFilterColumnSelect);
125
- this.removerFns.push(listenForFilterColumnsChanged(eventHub, this.handleColumnsChanged));
128
+ this.removerFns = [listenForFilterColumnsChanged(eventHub, this.handleColumnsChanged), listenForLinkPointSelected(eventHub, this.handleLinkPointSelected), listenForLinkSourceDataSelected(eventHub, this.handleUpdateValues), listenForRegisterLinkTarget(eventHub, this.handleTargetRegistered)];
126
129
  eventHub.on(PanelEvent.CLOSE, this.handlePanelClosed);
127
130
  eventHub.on(PanelEvent.CLOSED, this.handlePanelClosed);
128
131
  eventHub.on(PanelEvent.DRAGGING, this.handlePanelDragging);
@@ -138,7 +141,6 @@ export class Linker extends Component {
138
141
  eventHub.off(IrisGridEvent.STATE_CHANGED, this.handleStateChange);
139
142
  eventHub.off(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);
140
143
  eventHub.off(PanelEvent.CLONED, this.handlePanelCloned);
141
- eventHub.off(InputFilterEvent.COLUMN_SELECTED, this.handleFilterColumnSelect);
142
144
  eventHub.off(PanelEvent.CLOSE, this.handlePanelClosed);
143
145
  eventHub.off(PanelEvent.CLOSED, this.handlePanelClosed);
144
146
  eventHub.off(PanelEvent.DRAGGING, this.handlePanelDragging);
@@ -173,37 +175,9 @@ export class Linker extends Component {
173
175
  setActiveTool(ToolType.DEFAULT);
174
176
  }
175
177
  handleChartColumnSelect(panel, column) {
176
- this.columnSelected(panel, column, true);
177
- }
178
- handleFilterColumnSelect(panel, column) {
179
- log.debug('handleFilterColumnSelect', this.isOverlayShown());
180
- var {
181
- links,
182
- localDashboardId,
183
- setActiveTool,
184
- setDashboardIsolatedLinkerPanelId
185
- } = this.props;
186
178
  var panelId = LayoutUtils.getIdFromPanel(panel);
187
- var panelLinks = links.filter(link => {
188
- var _link$start2, _link$end2;
189
- return ((_link$start2 = link.start) === null || _link$start2 === void 0 ? void 0 : _link$start2.panelId) === panelId || ((_link$end2 = link.end) === null || _link$end2 === void 0 ? void 0 : _link$end2.panelId) === panelId;
190
- });
191
- if (!this.isOverlayShown() && panelId != null) {
192
- // Initial click on the filter source button with linker inactive
193
- // Show linker in isolated mode for panel
194
- setActiveTool(ToolType.LINKER);
195
- setDashboardIsolatedLinkerPanelId(localDashboardId, panelId);
196
- if (panelLinks.length === 0) {
197
- // Source not linked - start new link in isolated linker mode
198
- // Need to pass panelId for overrideIsolatedLinkerPanelId
199
- // as redux prop update at this point not yet propagated
200
- this.columnSelected(panel, column, true, panelId);
201
- }
202
- return;
203
- }
204
-
205
- // Filter source clicked with linker active
206
- this.columnSelected(panel, column, true);
179
+ assertNotNull(panelId);
180
+ this.columnSelected(panelId, column, 'chartLink', true);
207
181
  }
208
182
  handleColumnsChanged(sourceId, columns) {
209
183
  log.debug('handleColumnsChanged', sourceId, columns);
@@ -236,19 +210,56 @@ export class Linker extends Component {
236
210
  log.debug2('Column is not filterable');
237
211
  return;
238
212
  }
239
- this.columnSelected(panel, column);
213
+ var panelId = LayoutUtils.getIdFromPanel(panel);
214
+ assertNotNull(panelId);
215
+ this.columnSelected(panelId, column, 'tableLink');
216
+ }
217
+ handleLinkPointSelected(sourceId, column, options) {
218
+ var {
219
+ type
220
+ } = options;
221
+ var isIsolatedLinker = type === 'filterSource';
222
+ var isAlwaysEnd = type === 'chartLink' || type === 'filterSource';
223
+
224
+ // filterSource type should open in isolated linker mode
225
+ if (!this.isOverlayShown() && sourceId != null && isIsolatedLinker) {
226
+ var {
227
+ links,
228
+ localDashboardId,
229
+ setActiveTool,
230
+ setDashboardIsolatedLinkerPanelId
231
+ } = this.props;
232
+ var panelLinks = links.filter(link => {
233
+ var _link$start2, _link$end2;
234
+ return ((_link$start2 = link.start) === null || _link$start2 === void 0 ? void 0 : _link$start2.panelId) === sourceId || ((_link$end2 = link.end) === null || _link$end2 === void 0 ? void 0 : _link$end2.panelId) === sourceId;
235
+ });
236
+
237
+ // Initial click on the filter source button with linker inactive
238
+ // Show linker in isolated mode for panel
239
+ setActiveTool(ToolType.LINKER);
240
+ setDashboardIsolatedLinkerPanelId(localDashboardId, sourceId);
241
+ if (panelLinks.length === 0) {
242
+ // Source not linked - start new link in isolated linker mode
243
+ // Need to pass panelId for overrideIsolatedLinkerPanelId
244
+ // as redux prop update at this point not yet propagated
245
+ this.columnSelected(sourceId, column, type, isAlwaysEnd, sourceId);
246
+ }
247
+ return;
248
+ }
249
+ this.columnSelected(sourceId, column, type, isAlwaysEnd);
240
250
  }
241
251
 
242
252
  /**
243
253
  * Track a column selection and build the link from it.
244
- * @param panel The panel component that is the source for the column selection
254
+ * @param sourceId The ID of the source for the column selection
245
255
  * @param column The column that was selected
256
+ * @param type The type of the link point
246
257
  * @param isAlwaysEndPoint True if the selection is always the end point, even if it's the first column selected. Defaults to false.
247
258
  * @param overrideIsolatedLinkerPanelId isolatedLinkerPanelId to use when method is called before prop changes propagate
248
259
  */
249
- columnSelected(panel, column) {
250
- var isAlwaysEndPoint = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
251
- var overrideIsolatedLinkerPanelId = arguments.length > 3 ? arguments[3] : undefined;
260
+ columnSelected(sourceId, column, type) {
261
+ var isAlwaysEndPoint = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
262
+ var overrideIsolatedLinkerPanelId = arguments.length > 4 ? arguments[4] : undefined;
252
263
  if (overrideIsolatedLinkerPanelId === undefined && !this.isOverlayShown()) {
253
264
  return;
254
265
  }
@@ -258,11 +269,6 @@ export class Linker extends Component {
258
269
  var {
259
270
  linkInProgress
260
271
  } = this.state;
261
- var panelId = LayoutUtils.getIdFromPanel(panel);
262
- if (panelId == null) {
263
- return;
264
- }
265
- var panelComponent = LayoutUtils.getComponentNameFromPanel(panel);
266
272
  var {
267
273
  name: columnName,
268
274
  type: columnType
@@ -271,36 +277,47 @@ export class Linker extends Component {
271
277
  var newLink = {
272
278
  id: nanoid(),
273
279
  start: {
274
- panelId,
275
- panelComponent,
280
+ panelId: sourceId,
276
281
  columnName,
277
282
  columnType
278
283
  },
279
- // Link starts with type Invalid as linking a source to itself is not allowed
280
284
  type: 'invalid',
281
285
  isReversed: isAlwaysEndPoint
282
286
  };
287
+ if (isAlwaysEndPoint) {
288
+ newLink.endType = type;
289
+ }
283
290
  log.debug('starting link', newLink);
284
291
  this.setState({
285
292
  linkInProgress: newLink
286
293
  });
287
294
  } else {
295
+ var _linkInProgress$endTy;
288
296
  var {
289
297
  links
290
298
  } = this.props;
291
299
  var {
292
300
  start,
293
301
  id,
294
- isReversed
302
+ isReversed = false
295
303
  } = linkInProgress;
296
304
  var end = {
297
- panelId,
298
- panelComponent,
305
+ panelId: sourceId,
299
306
  columnName,
300
307
  columnType
301
308
  };
302
- var type = LinkerUtils.getLinkType(isReversed !== undefined && isReversed ? end : start, isReversed !== undefined && isReversed ? start : end, overrideIsolatedLinkerPanelId !== null && overrideIsolatedLinkerPanelId !== void 0 ? overrideIsolatedLinkerPanelId : isolatedLinkerPanelId);
303
- switch (type) {
309
+ var isValid = !(isReversed && isAlwaysEndPoint) &&
310
+ // Cannot add a point which is only an end when we already have an end
311
+ LinkerUtils.isLinkValid(isReversed ? end : start, isReversed ? start : end, overrideIsolatedLinkerPanelId !== null && overrideIsolatedLinkerPanelId !== void 0 ? overrideIsolatedLinkerPanelId : isolatedLinkerPanelId);
312
+ if (!isValid) {
313
+ log.debug('Ignore invalid link connection', linkInProgress, end);
314
+ return;
315
+ }
316
+
317
+ // The end point is what determines the type
318
+ // If the link is reversed, we already set the type on the linkInProgress
319
+ var finalType = (_linkInProgress$endTy = linkInProgress.endType) !== null && _linkInProgress$endTy !== void 0 ? _linkInProgress$endTy : type;
320
+ switch (finalType) {
304
321
  case 'invalid':
305
322
  log.debug('Ignore invalid link connection', linkInProgress, end);
306
323
  return;
@@ -347,10 +364,10 @@ export class Linker extends Component {
347
364
 
348
365
  // Create a completed link from link in progress
349
366
  var _newLink = {
350
- start: isReversed !== undefined && isReversed ? end : start,
351
- end: isReversed !== undefined && isReversed ? start : end,
367
+ start: isReversed ? end : start,
368
+ end: isReversed ? start : end,
352
369
  id,
353
- type,
370
+ type: finalType,
354
371
  operator: FilterType.eq
355
372
  };
356
373
  log.info('creating link', _newLink);
@@ -370,6 +387,7 @@ export class Linker extends Component {
370
387
  panelManager
371
388
  } = this.props;
372
389
  if (link.end) {
390
+ var _linkTargetPropMap$ge;
373
391
  var {
374
392
  end
375
393
  } = link;
@@ -378,9 +396,17 @@ export class Linker extends Component {
378
396
  columnName,
379
397
  columnType
380
398
  } = end;
399
+ var {
400
+ linkTargetPropMap
401
+ } = this;
402
+ var unsetFilterValue = (_linkTargetPropMap$ge = linkTargetPropMap.get(panelId)) === null || _linkTargetPropMap$ge === void 0 ? void 0 : _linkTargetPropMap$ge.unsetFilterValue;
403
+ if (unsetFilterValue) {
404
+ unsetFilterValue(columnName, columnType);
405
+ return;
406
+ }
381
407
  var endPanel = panelManager.getOpenedPanelById(panelId);
382
408
  if (!endPanel) {
383
- log.debug('endPanel no longer exists, ignoring unsetFilterValue', panelId);
409
+ log.debug('endPanel no longer exists or target is not a panel. Ignoring unsetFilterValue', panelId);
384
410
  } else if (isLinkablePanel(endPanel)) {
385
411
  endPanel.unsetFilterValue(columnName, columnType);
386
412
  } else {
@@ -395,13 +421,22 @@ export class Linker extends Component {
395
421
  * @param filterMap Map of column name to column type, text, and value
396
422
  */
397
423
  setPanelFilterMap(panelId, filterMap) {
424
+ var _linkTargetPropMap$ge2;
398
425
  log.debug('Set filter data for panel:', panelId, filterMap);
399
426
  var {
400
427
  panelManager
401
428
  } = this.props;
429
+ var {
430
+ linkTargetPropMap
431
+ } = this;
432
+ var setFilterValues = (_linkTargetPropMap$ge2 = linkTargetPropMap.get(panelId)) === null || _linkTargetPropMap$ge2 === void 0 ? void 0 : _linkTargetPropMap$ge2.setFilterValues;
433
+ if (setFilterValues) {
434
+ setFilterValues(filterMap);
435
+ return;
436
+ }
402
437
  var panel = panelManager.getOpenedPanelById(panelId);
403
438
  if (!panel) {
404
- log.debug('panel no longer exists, ignoring setFilterMap', panelId);
439
+ log.debug('panel no longer exists or target is not a panel. Ignoring setFilterMap', panelId);
405
440
  } else if (isLinkablePanel(panel)) {
406
441
  panel.setFilterMap(filterMap);
407
442
  } else {
@@ -465,8 +500,17 @@ export class Linker extends Component {
465
500
  log.error('Unable to find link to delete', linkId);
466
501
  }
467
502
  }
468
- handleUpdateValues(panel, dataMap) {
469
- var panelId = LayoutUtils.getIdFromPanel(panel);
503
+ handleTargetRegistered(sourceId, handlers) {
504
+ var {
505
+ linkTargetPropMap
506
+ } = this;
507
+ if (handlers == null) {
508
+ linkTargetPropMap.delete(sourceId);
509
+ } else {
510
+ linkTargetPropMap.set(sourceId, handlers);
511
+ }
512
+ }
513
+ handleUpdateValues(sourceId, dataMap) {
470
514
  var {
471
515
  dh,
472
516
  links,
@@ -482,15 +526,17 @@ export class Linker extends Component {
482
526
  end,
483
527
  operator
484
528
  } = links[i];
485
- if (start.panelId === panelId && end != null) {
529
+ if (start.panelId === sourceId && end != null && operator != null) {
530
+ var _filterMap$get$filter, _filterMap$get;
486
531
  var {
487
532
  panelId: endPanelId,
488
533
  columnName,
489
534
  columnType
490
535
  } = end;
491
536
  // Map of column name to column type and filter value
492
- var filterMap = panelFilterMap.has(endPanelId) ? panelFilterMap.get(endPanelId) : new Map();
493
- var filterList = filterMap.has(columnName) === true ? filterMap.get(columnName).filterList : [];
537
+ var existingFilterMap = panelFilterMap.get(endPanelId);
538
+ var filterMap = existingFilterMap !== null && existingFilterMap !== void 0 ? existingFilterMap : new Map();
539
+ var filterList = (_filterMap$get$filter = (_filterMap$get = filterMap.get(columnName)) === null || _filterMap$get === void 0 ? void 0 : _filterMap$get.filterList) !== null && _filterMap$get$filter !== void 0 ? _filterMap$get$filter : [];
494
540
  var {
495
541
  visibleIndex: startColumnIndex,
496
542
  isExpandable,
@@ -514,13 +560,12 @@ export class Linker extends Component {
514
560
  // The values are Dates for dateType values, not string like everything else
515
561
  text = dateFilterFormatter.format(value);
516
562
  }
517
- var filter = {
563
+ filterList.push({
518
564
  operator,
519
565
  text,
520
566
  value,
521
567
  startColumnIndex
522
- };
523
- filterList.push(filter);
568
+ });
524
569
  filterMap.set(columnName, {
525
570
  columnType,
526
571
  filterList
@@ -658,17 +703,23 @@ export class Linker extends Component {
658
703
  return null;
659
704
  });
660
705
  }
661
- isColumnSelectionValid(panel, tableColumn) {
706
+ isColumnSelectionValid(panelOrId, tableColumn, options) {
707
+ var _linkInProgress$endTy2;
662
708
  var {
663
709
  linkInProgress
664
710
  } = this.state;
665
711
  var {
666
712
  isolatedLinkerPanelId
667
713
  } = this.props;
714
+ // This is backwards compatibility for Grizzly Enterprise panels
715
+ // IrisGridPanel is the only allowed start point for a link
716
+ // The enterprise panels will not call this method with options
717
+ // They are also JS and removed in sanluis, so figure this is best for now
718
+ var isAlwaysEnd = typeof panelOrId === 'string' ? options.type === 'filterSource' || options.type === 'chartLink' : LayoutUtils.getComponentNameFromPanel(panelOrId) !== 'IrisGridPanel';
668
719
  if (tableColumn == null) {
669
720
  if ((linkInProgress === null || linkInProgress === void 0 ? void 0 : linkInProgress.start) != null) {
670
721
  // Link started, end point is not a valid target
671
- this.updateLinkInProgressType();
722
+ this.updateLinkInProgressType('invalid');
672
723
  }
673
724
  return false;
674
725
  }
@@ -687,22 +738,27 @@ export class Linker extends Component {
687
738
  return true;
688
739
  }
689
740
  var {
690
- isReversed,
741
+ isReversed = false,
691
742
  start
692
743
  } = linkInProgress;
693
- var panelId = LayoutUtils.getIdFromPanel(panel);
744
+ var panelId = typeof panelOrId === 'string' ? panelOrId : LayoutUtils.getIdFromPanel(panelOrId);
694
745
  if (panelId == null) {
695
746
  return false;
696
747
  }
748
+
749
+ // We've already selected an end point, so we can't select another one
750
+ if (isReversed && isAlwaysEnd) {
751
+ this.updateLinkInProgressType('invalid');
752
+ return false;
753
+ }
697
754
  var end = {
698
755
  panelId,
699
- panelComponent: LayoutUtils.getComponentNameFromPanel(panel),
700
756
  columnName: tableColumn.name,
701
757
  columnType: tableColumn.type
702
758
  };
703
- var type = isReversed !== undefined && isReversed ? LinkerUtils.getLinkType(end, start, isolatedLinkerPanelId) : LinkerUtils.getLinkType(start, end, isolatedLinkerPanelId);
704
- this.updateLinkInProgressType(type);
705
- return type !== 'invalid';
759
+ var isValid = isReversed ? LinkerUtils.isLinkValid(end, start, isolatedLinkerPanelId) : LinkerUtils.isLinkValid(start, end, isolatedLinkerPanelId);
760
+ this.updateLinkInProgressType(isValid ? (_linkInProgress$endTy2 = linkInProgress.endType) !== null && _linkInProgress$endTy2 !== void 0 ? _linkInProgress$endTy2 : options.type : 'invalid');
761
+ return isValid;
706
762
  }
707
763
  render() {
708
764
  var {
@@ -734,7 +790,8 @@ export class Linker extends Component {
734
790
  onAllLinksDeleted: this.handleAllLinksDeleted,
735
791
  onLinksUpdated: this.handleLinksUpdated,
736
792
  onDone: this.handleDone,
737
- onCancel: this.handleCancel
793
+ onCancel: this.handleCancel,
794
+ linkTargetPropMap: this.linkTargetPropMap
738
795
  })
739
796
  }) : null;
740
797
  }