@deephaven/dashboard-core-plugins 0.85.30 → 0.85.31
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/FilterEvents.d.ts +86 -0
- package/dist/FilterEvents.d.ts.map +1 -0
- package/dist/FilterEvents.js +78 -0
- package/dist/FilterEvents.js.map +1 -0
- package/dist/FilterPlugin.d.ts +0 -9
- package/dist/FilterPlugin.d.ts.map +1 -1
- package/dist/FilterPlugin.js +37 -24
- package/dist/FilterPlugin.js.map +1 -1
- package/dist/GridWidgetPlugin.d.ts.map +1 -1
- package/dist/GridWidgetPlugin.js +23 -4
- package/dist/GridWidgetPlugin.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/linker/ColumnSelectionValidator.d.ts +3 -3
- package/dist/linker/ColumnSelectionValidator.d.ts.map +1 -1
- package/dist/linker/ColumnSelectionValidator.js.map +1 -1
- package/dist/linker/Linker.d.ts +17 -9
- package/dist/linker/Linker.d.ts.map +1 -1
- package/dist/linker/Linker.js +147 -81
- package/dist/linker/Linker.js.map +1 -1
- package/dist/linker/LinkerEvent.d.ts +52 -0
- package/dist/linker/LinkerEvent.d.ts.map +1 -0
- package/dist/linker/LinkerEvent.js +28 -0
- package/dist/linker/LinkerEvent.js.map +1 -0
- package/dist/linker/LinkerOverlayContent.d.ts +2 -0
- package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
- package/dist/linker/LinkerOverlayContent.js +13 -3
- package/dist/linker/LinkerOverlayContent.js.map +1 -1
- package/dist/linker/LinkerUtils.d.ts +12 -7
- package/dist/linker/LinkerUtils.d.ts.map +1 -1
- package/dist/linker/LinkerUtils.js +8 -30
- package/dist/linker/LinkerUtils.js.map +1 -1
- package/dist/panels/ChartPanel.d.ts +11 -3
- package/dist/panels/ChartPanel.d.ts.map +1 -1
- package/dist/panels/ChartPanel.js +24 -6
- package/dist/panels/ChartPanel.js.map +1 -1
- package/dist/panels/DropdownFilterPanel.d.ts +3 -3
- package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
- package/dist/panels/DropdownFilterPanel.js +19 -8
- package/dist/panels/DropdownFilterPanel.js.map +1 -1
- package/dist/panels/FileExplorerPanel.d.ts +1 -1
- package/dist/panels/FilterSetManagerPanel.js.map +1 -1
- package/dist/panels/InputFilterPanel.d.ts +1 -1
- package/dist/panels/InputFilterPanel.d.ts.map +1 -1
- package/dist/panels/InputFilterPanel.js +8 -4
- package/dist/panels/InputFilterPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.d.ts +5 -5
- package/dist/panels/IrisGridPanel.d.ts.map +1 -1
- package/dist/panels/IrisGridPanel.js +28 -9
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/WidgetPanelTypes.d.ts +22 -0
- package/dist/panels/WidgetPanelTypes.d.ts.map +1 -0
- package/dist/panels/WidgetPanelTypes.js +2 -0
- package/dist/panels/WidgetPanelTypes.js.map +1 -0
- package/dist/panels/index.d.ts +1 -0
- package/dist/panels/index.d.ts.map +1 -1
- package/dist/panels/index.js +1 -0
- package/dist/panels/index.js.map +1 -1
- package/dist/redux/selectors.d.ts +6 -6
- package/dist/redux/selectors.d.ts.map +1 -1
- package/dist/redux/selectors.js.map +1 -1
- package/dist/useDashboardColumnFilters.d.ts +19 -0
- package/dist/useDashboardColumnFilters.d.ts.map +1 -0
- package/dist/useDashboardColumnFilters.js +61 -0
- package/dist/useDashboardColumnFilters.js.map +1 -0
- package/dist/useGridLinker.d.ts +4 -0
- package/dist/useGridLinker.d.ts.map +1 -0
- package/dist/useGridLinker.js +107 -0
- package/dist/useGridLinker.js.map +1 -0
- package/package.json +19 -19
package/dist/linker/Linker.d.ts
CHANGED
|
@@ -4,7 +4,9 @@ import { PanelComponent, PanelManager } from '@deephaven/dashboard';
|
|
|
4
4
|
import type GoldenLayout from '@deephaven/golden-layout';
|
|
5
5
|
import { RowDataMap } from '@deephaven/jsapi-utils';
|
|
6
6
|
import type { dh as DhType } from '@deephaven/jsapi-types';
|
|
7
|
-
import { Link, LinkColumn, LinkFilterMap, LinkType } from './LinkerUtils';
|
|
7
|
+
import { Link, LinkColumn, LinkFilterMap, LinkType, type LinkPointOptions } from './LinkerUtils';
|
|
8
|
+
import { type FilterColumnSourceId } from '../FilterEvents';
|
|
9
|
+
import { type LinkTargetProps } from './LinkerEvent';
|
|
8
10
|
interface StateProps {
|
|
9
11
|
activeTool: string;
|
|
10
12
|
dh: typeof DhType;
|
|
@@ -27,7 +29,9 @@ declare const connector: import("react-redux").InferableComponentEnhancerWithPro
|
|
|
27
29
|
}, OwnProps>;
|
|
28
30
|
export type LinkerProps = OwnProps & StateProps & ConnectedProps<typeof connector>;
|
|
29
31
|
export type LinkerState = {
|
|
30
|
-
linkInProgress?: Link
|
|
32
|
+
linkInProgress?: Link & {
|
|
33
|
+
endType?: LinkType;
|
|
34
|
+
};
|
|
31
35
|
selectedIds: Set<string>;
|
|
32
36
|
isDraggingPanel: boolean;
|
|
33
37
|
};
|
|
@@ -37,23 +41,26 @@ export declare class Linker extends Component<LinkerProps, LinkerState> {
|
|
|
37
41
|
componentDidUpdate(prevProps: LinkerProps): void;
|
|
38
42
|
componentDidCatch(error: Error, info: ErrorInfo): void;
|
|
39
43
|
componentWillUnmount(): void;
|
|
44
|
+
private linkTargetPropMap;
|
|
45
|
+
private removerFns;
|
|
40
46
|
startListening(layout: GoldenLayout): void;
|
|
41
47
|
stopListening(layout: GoldenLayout): void;
|
|
42
48
|
reset(): void;
|
|
43
49
|
handleCancel(): void;
|
|
44
50
|
handleDone(): void;
|
|
45
51
|
handleChartColumnSelect(panel: PanelComponent, column: LinkColumn): void;
|
|
46
|
-
|
|
47
|
-
handleColumnsChanged(panel: PanelComponent, columns: LinkColumn[]): void;
|
|
52
|
+
handleColumnsChanged(sourceId: FilterColumnSourceId, columns: readonly LinkColumn[] | null): void;
|
|
48
53
|
handleGridColumnSelect(panel: PanelComponent, column: LinkColumn): void;
|
|
54
|
+
handleLinkPointSelected(sourceId: string, column: LinkColumn, options: LinkPointOptions): void;
|
|
49
55
|
/**
|
|
50
56
|
* Track a column selection and build the link from it.
|
|
51
|
-
* @param
|
|
57
|
+
* @param sourceId The ID of the source for the column selection
|
|
52
58
|
* @param column The column that was selected
|
|
59
|
+
* @param type The type of the link point
|
|
53
60
|
* @param isAlwaysEndPoint True if the selection is always the end point, even if it's the first column selected. Defaults to false.
|
|
54
61
|
* @param overrideIsolatedLinkerPanelId isolatedLinkerPanelId to use when method is called before prop changes propagate
|
|
55
62
|
*/
|
|
56
|
-
columnSelected(
|
|
63
|
+
columnSelected(sourceId: string, column: LinkColumn, type: LinkType, isAlwaysEndPoint?: boolean, overrideIsolatedLinkerPanelId?: string | string[]): void;
|
|
57
64
|
unsetFilterValueForLink(link: Link): void;
|
|
58
65
|
/**
|
|
59
66
|
* Set filters for a given panel ID
|
|
@@ -65,7 +72,8 @@ export declare class Linker extends Component<LinkerProps, LinkerState> {
|
|
|
65
72
|
deleteLinks(links: Link[], clearAll?: boolean): void;
|
|
66
73
|
handleAllLinksDeleted(): void;
|
|
67
74
|
handleLinkDeleted(linkId: string): void;
|
|
68
|
-
|
|
75
|
+
handleTargetRegistered(sourceId: string, handlers: LinkTargetProps | null): void;
|
|
76
|
+
handleUpdateValues(sourceId: string, dataMap: RowDataMap): void;
|
|
69
77
|
handlePanelCloned(panel: PanelComponent, cloneConfig: {
|
|
70
78
|
id: string;
|
|
71
79
|
}): void;
|
|
@@ -86,7 +94,7 @@ export declare class Linker extends Component<LinkerProps, LinkerState> {
|
|
|
86
94
|
isOverlayShown(): boolean;
|
|
87
95
|
updateSelectionValidators(): void;
|
|
88
96
|
updateLinkInProgressType(type?: LinkType): void;
|
|
89
|
-
isColumnSelectionValid(
|
|
97
|
+
isColumnSelectionValid(panelOrId: PanelComponent | string, tableColumn: LinkColumn | undefined, options: LinkPointOptions): boolean;
|
|
90
98
|
render(): JSX.Element | null;
|
|
91
99
|
}
|
|
92
100
|
declare const ConnectedLinker: import("react-redux").ConnectedComponent<typeof Linker, import("react-redux").Omit<React.ClassAttributes<Linker> & OwnProps & StateProps & {
|
|
@@ -96,6 +104,6 @@ declare const ConnectedLinker: import("react-redux").ConnectedComponent<typeof L
|
|
|
96
104
|
deleteDashboardLinks: (id: string, linkIds: string[]) => unknown;
|
|
97
105
|
setDashboardIsolatedLinkerPanelId: (id: string, isolatedLinkerPanelId: string | string[] | undefined) => unknown;
|
|
98
106
|
setDashboardColumnSelectionValidator: (id: string, columnSelectionValidator: import("./ColumnSelectionValidator").ColumnSelectionValidator | undefined) => unknown;
|
|
99
|
-
}, "links" | "setActiveTool" | "setDashboardIsolatedLinkerPanelId" | "
|
|
107
|
+
}, "links" | "setActiveTool" | "setDashboardIsolatedLinkerPanelId" | "dh" | "timeZone" | "activeTool" | "isolatedLinkerPanelId" | "setDashboardLinks" | "addDashboardLinks" | "deleteDashboardLinks" | "setDashboardColumnSelectionValidator"> & OwnProps>;
|
|
100
108
|
export default ConnectedLinker;
|
|
101
109
|
//# sourceMappingURL=Linker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Linker.d.ts","sourceRoot":"","sources":["../../src/linker/Linker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAW,cAAc,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,EAEL,cAAc,EAEd,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAGL,UAAU,EAEX,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"Linker.d.ts","sourceRoot":"","sources":["../../src/linker/Linker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAW,cAAc,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,EAEL,cAAc,EAEd,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAGL,UAAU,EAEX,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAuB3D,OAAoB,EAElB,IAAI,EACJ,UAAU,EACV,aAAa,EACb,QAAQ,EAER,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,eAAe,EAIrB,MAAM,eAAe,CAAC;AAIvB,UAAU,UAAU;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,QAAQ;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAaD,QAAA,MAAM,SAAS;;;;;;;YAQb,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAChC,UAAU,GACV,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC;AAEnC,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,CAAC,EAAE,IAAI,GAAG;QAAE,OAAO,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;IAC/C,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,qBAAa,MAAO,SAAQ,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;gBACjD,KAAK,EAAE,WAAW;IA+B9B,iBAAiB,IAAI,IAAI;IAMzB,kBAAkB,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAchD,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAItD,oBAAoB,IAAI,IAAI;IAK5B,OAAO,CAAC,iBAAiB,CAA2C;IAEpE,OAAO,CAAC,UAAU,CAAsB;IAExC,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAqB1C,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAiBzC,KAAK,IAAI,IAAI;IAOb,YAAY,IAAI,IAAI;IASpB,UAAU,IAAI,IAAI;IAKlB,uBAAuB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAMxE,oBAAoB,CAClB,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,GACpC,IAAI;IA0BP,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAUvE,uBAAuB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,gBAAgB,GACxB,IAAI;IAoCP;;;;;;;OAOG;IACH,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,QAAQ,EACd,gBAAgB,UAAQ,EACxB,6BAA6B,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAChD,IAAI;IAkHP,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IA0BzC;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI;IAuBlE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAK7B,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,UAAQ,GAAG,IAAI;IAelD,qBAAqB,IAAI,IAAI;IAe7B,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAUvC,sBAAsB,CACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,eAAe,GAAG,IAAI,GAC/B,IAAI;IASP,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAkD/D,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAc3E,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAY9C,kBAAkB,IAAI,IAAI;IAI1B,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOxC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIxC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI;IAK1C,wBAAwB,IAAI,IAAI;IAIhC,iBAAiB,IAAI,IAAI;IAIzB,YAAY,IAAI,IAAI;IAMpB;;;OAGG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAW5C,cAAc,UAEH,IAAI,EAAE,kBACG,IAAI,GAAG,SAAS,qBACb,MAAM,GAAG,SAAS,YAmBvC;IAEF,cAAc,IAAI,OAAO;IAKzB,yBAAyB,IAAI,IAAI;IAmBjC,wBAAwB,CAAC,IAAI,GAAE,QAAoB,GAAG,IAAI;IAc1D,sBAAsB,CACpB,SAAS,EAAE,cAAc,GAAG,MAAM,EAClC,WAAW,EAAE,UAAU,GAAG,SAAS,EACnC,OAAO,EAAE,gBAAgB,GACxB,OAAO;IAkEV,MAAM,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI;CAuC7B;AAED,QAAA,MAAM,eAAe;;;;;;;0PAAoB,CAAC;AAE1C,eAAe,eAAe,CAAC"}
|
package/dist/linker/Linker.js
CHANGED
|
@@ -13,11 +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
|
|
19
|
+
import { ChartEvent, IrisGridEvent } from "../events/index.js";
|
|
19
20
|
import LinkerOverlayContent from "./LinkerOverlayContent.js";
|
|
20
21
|
import LinkerUtils, { isLinkablePanel, isLinkableColumn } from "./LinkerUtils.js";
|
|
22
|
+
import { listenForFilterColumnsChanged } from "../FilterEvents.js";
|
|
23
|
+
import { listenForLinkPointSelected, listenForLinkSourceDataSelected, listenForRegisterLinkTarget } from "./LinkerEvent.js";
|
|
21
24
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
22
25
|
var log = Log.module('Linker');
|
|
23
26
|
var mapState = (state, ownProps) => ({
|
|
@@ -38,6 +41,8 @@ var connector = connect(mapState, {
|
|
|
38
41
|
export class Linker extends Component {
|
|
39
42
|
constructor(props) {
|
|
40
43
|
super(props);
|
|
44
|
+
_defineProperty(this, "linkTargetPropMap", new Map());
|
|
45
|
+
_defineProperty(this, "removerFns", []);
|
|
41
46
|
_defineProperty(this, "getCachedLinks", memoize((links, linkInProgress, isolateForPanelId) => {
|
|
42
47
|
var combinedLinks = [...links];
|
|
43
48
|
if (linkInProgress != null && linkInProgress.start != null) {
|
|
@@ -55,7 +60,6 @@ export class Linker extends Component {
|
|
|
55
60
|
this.handleCancel = this.handleCancel.bind(this);
|
|
56
61
|
this.handleDone = this.handleDone.bind(this);
|
|
57
62
|
this.handlePanelCloned = this.handlePanelCloned.bind(this);
|
|
58
|
-
this.handleFilterColumnSelect = this.handleFilterColumnSelect.bind(this);
|
|
59
63
|
this.handleColumnsChanged = this.handleColumnsChanged.bind(this);
|
|
60
64
|
this.handlePanelClosed = this.handlePanelClosed.bind(this);
|
|
61
65
|
this.handleLayoutStateChanged = this.handleLayoutStateChanged.bind(this);
|
|
@@ -67,6 +71,8 @@ export class Linker extends Component {
|
|
|
67
71
|
this.handleUpdateValues = this.handleUpdateValues.bind(this);
|
|
68
72
|
this.handleStateChange = this.handleStateChange.bind(this);
|
|
69
73
|
this.handleExited = this.handleExited.bind(this);
|
|
74
|
+
this.handleLinkPointSelected = this.handleLinkPointSelected.bind(this);
|
|
75
|
+
this.handleTargetRegistered = this.handleTargetRegistered.bind(this);
|
|
70
76
|
this.handleLinkSelected = this.handleLinkSelected.bind(this);
|
|
71
77
|
this.handlePanelDragging = this.handlePanelDragging.bind(this);
|
|
72
78
|
this.handlePanelDropped = this.handlePanelDropped.bind(this);
|
|
@@ -119,8 +125,7 @@ export class Linker extends Component {
|
|
|
119
125
|
eventHub.on(IrisGridEvent.STATE_CHANGED, this.handleStateChange);
|
|
120
126
|
eventHub.on(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);
|
|
121
127
|
eventHub.on(PanelEvent.CLONED, this.handlePanelCloned);
|
|
122
|
-
eventHub.
|
|
123
|
-
eventHub.on(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);
|
|
128
|
+
this.removerFns = [listenForFilterColumnsChanged(eventHub, this.handleColumnsChanged), listenForLinkPointSelected(eventHub, this.handleLinkPointSelected), listenForLinkSourceDataSelected(eventHub, this.handleUpdateValues), listenForRegisterLinkTarget(eventHub, this.handleTargetRegistered)];
|
|
124
129
|
eventHub.on(PanelEvent.CLOSE, this.handlePanelClosed);
|
|
125
130
|
eventHub.on(PanelEvent.CLOSED, this.handlePanelClosed);
|
|
126
131
|
eventHub.on(PanelEvent.DRAGGING, this.handlePanelDragging);
|
|
@@ -136,12 +141,12 @@ export class Linker extends Component {
|
|
|
136
141
|
eventHub.off(IrisGridEvent.STATE_CHANGED, this.handleStateChange);
|
|
137
142
|
eventHub.off(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);
|
|
138
143
|
eventHub.off(PanelEvent.CLONED, this.handlePanelCloned);
|
|
139
|
-
eventHub.off(InputFilterEvent.COLUMN_SELECTED, this.handleFilterColumnSelect);
|
|
140
|
-
eventHub.off(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);
|
|
141
144
|
eventHub.off(PanelEvent.CLOSE, this.handlePanelClosed);
|
|
142
145
|
eventHub.off(PanelEvent.CLOSED, this.handlePanelClosed);
|
|
143
146
|
eventHub.off(PanelEvent.DRAGGING, this.handlePanelDragging);
|
|
144
147
|
eventHub.off(PanelEvent.DROPPED, this.handlePanelDropped);
|
|
148
|
+
this.removerFns.forEach(remove => remove());
|
|
149
|
+
this.removerFns = [];
|
|
145
150
|
}
|
|
146
151
|
reset() {
|
|
147
152
|
this.setState({
|
|
@@ -170,55 +175,33 @@ export class Linker extends Component {
|
|
|
170
175
|
setActiveTool(ToolType.DEFAULT);
|
|
171
176
|
}
|
|
172
177
|
handleChartColumnSelect(panel, column) {
|
|
173
|
-
|
|
178
|
+
var panelId = LayoutUtils.getIdFromPanel(panel);
|
|
179
|
+
assertNotNull(panelId);
|
|
180
|
+
this.columnSelected(panelId, column, 'chartLink', true);
|
|
174
181
|
}
|
|
175
|
-
|
|
176
|
-
log.debug('
|
|
182
|
+
handleColumnsChanged(sourceId, columns) {
|
|
183
|
+
log.debug('handleColumnsChanged', sourceId, columns);
|
|
177
184
|
var {
|
|
178
|
-
links
|
|
179
|
-
localDashboardId,
|
|
180
|
-
setActiveTool,
|
|
181
|
-
setDashboardIsolatedLinkerPanelId
|
|
185
|
+
links
|
|
182
186
|
} = this.props;
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
var _link$start2, _link$end2;
|
|
186
|
-
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;
|
|
187
|
-
});
|
|
188
|
-
if (!this.isOverlayShown() && panelId != null) {
|
|
189
|
-
// Initial click on the filter source button with linker inactive
|
|
190
|
-
// Show linker in isolated mode for panel
|
|
191
|
-
setActiveTool(ToolType.LINKER);
|
|
192
|
-
setDashboardIsolatedLinkerPanelId(localDashboardId, panelId);
|
|
193
|
-
if (panelLinks.length === 0) {
|
|
194
|
-
// Source not linked - start new link in isolated linker mode
|
|
195
|
-
// Need to pass panelId for overrideIsolatedLinkerPanelId
|
|
196
|
-
// as redux prop update at this point not yet propagated
|
|
197
|
-
this.columnSelected(panel, column, true, panelId);
|
|
198
|
-
}
|
|
187
|
+
if (sourceId == null) {
|
|
188
|
+
log.error('Invalid filter columns source id', sourceId);
|
|
199
189
|
return;
|
|
200
190
|
}
|
|
201
191
|
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
handleColumnsChanged(panel, columns) {
|
|
206
|
-
log.debug('handleColumnsChanged', panel, columns);
|
|
207
|
-
var {
|
|
208
|
-
links
|
|
209
|
-
} = this.props;
|
|
210
|
-
var panelId = LayoutUtils.getIdFromPanel(panel);
|
|
211
|
-
if (panelId == null) {
|
|
212
|
-
log.error('Invalid panelId', panel);
|
|
192
|
+
// Columns is null when dh.ui widgets with linker capability are closed
|
|
193
|
+
if (columns == null) {
|
|
194
|
+
this.deleteLinksForPanelId(sourceId);
|
|
213
195
|
return;
|
|
214
196
|
}
|
|
197
|
+
// NOTE: links need to be updated to use sourceId instead of panelId. This will be done when we implement linker for dh.ui widgets DH-18840
|
|
215
198
|
// Delete links that start or end on non-existent column in the updated panel
|
|
216
199
|
var linksToDelete = links.filter(_ref => {
|
|
217
200
|
var {
|
|
218
201
|
start,
|
|
219
202
|
end
|
|
220
203
|
} = _ref;
|
|
221
|
-
return start.panelId ===
|
|
204
|
+
return start.panelId === sourceId && LinkerUtils.findColumn(columns, start) == null || end != null && end.panelId === sourceId && LinkerUtils.findColumn(columns, end) == null;
|
|
222
205
|
});
|
|
223
206
|
this.deleteLinks(linksToDelete);
|
|
224
207
|
}
|
|
@@ -227,19 +210,56 @@ export class Linker extends Component {
|
|
|
227
210
|
log.debug2('Column is not filterable');
|
|
228
211
|
return;
|
|
229
212
|
}
|
|
230
|
-
|
|
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);
|
|
231
250
|
}
|
|
232
251
|
|
|
233
252
|
/**
|
|
234
253
|
* Track a column selection and build the link from it.
|
|
235
|
-
* @param
|
|
254
|
+
* @param sourceId The ID of the source for the column selection
|
|
236
255
|
* @param column The column that was selected
|
|
256
|
+
* @param type The type of the link point
|
|
237
257
|
* @param isAlwaysEndPoint True if the selection is always the end point, even if it's the first column selected. Defaults to false.
|
|
238
258
|
* @param overrideIsolatedLinkerPanelId isolatedLinkerPanelId to use when method is called before prop changes propagate
|
|
239
259
|
*/
|
|
240
|
-
columnSelected(
|
|
241
|
-
var isAlwaysEndPoint = arguments.length >
|
|
242
|
-
var overrideIsolatedLinkerPanelId = arguments.length >
|
|
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;
|
|
243
263
|
if (overrideIsolatedLinkerPanelId === undefined && !this.isOverlayShown()) {
|
|
244
264
|
return;
|
|
245
265
|
}
|
|
@@ -249,11 +269,6 @@ export class Linker extends Component {
|
|
|
249
269
|
var {
|
|
250
270
|
linkInProgress
|
|
251
271
|
} = this.state;
|
|
252
|
-
var panelId = LayoutUtils.getIdFromPanel(panel);
|
|
253
|
-
if (panelId == null) {
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
var panelComponent = LayoutUtils.getComponentNameFromPanel(panel);
|
|
257
272
|
var {
|
|
258
273
|
name: columnName,
|
|
259
274
|
type: columnType
|
|
@@ -262,36 +277,47 @@ export class Linker extends Component {
|
|
|
262
277
|
var newLink = {
|
|
263
278
|
id: nanoid(),
|
|
264
279
|
start: {
|
|
265
|
-
panelId,
|
|
266
|
-
panelComponent,
|
|
280
|
+
panelId: sourceId,
|
|
267
281
|
columnName,
|
|
268
282
|
columnType
|
|
269
283
|
},
|
|
270
|
-
// Link starts with type Invalid as linking a source to itself is not allowed
|
|
271
284
|
type: 'invalid',
|
|
272
285
|
isReversed: isAlwaysEndPoint
|
|
273
286
|
};
|
|
287
|
+
if (isAlwaysEndPoint) {
|
|
288
|
+
newLink.endType = type;
|
|
289
|
+
}
|
|
274
290
|
log.debug('starting link', newLink);
|
|
275
291
|
this.setState({
|
|
276
292
|
linkInProgress: newLink
|
|
277
293
|
});
|
|
278
294
|
} else {
|
|
295
|
+
var _linkInProgress$endTy;
|
|
279
296
|
var {
|
|
280
297
|
links
|
|
281
298
|
} = this.props;
|
|
282
299
|
var {
|
|
283
300
|
start,
|
|
284
301
|
id,
|
|
285
|
-
isReversed
|
|
302
|
+
isReversed = false
|
|
286
303
|
} = linkInProgress;
|
|
287
304
|
var end = {
|
|
288
|
-
panelId,
|
|
289
|
-
panelComponent,
|
|
305
|
+
panelId: sourceId,
|
|
290
306
|
columnName,
|
|
291
307
|
columnType
|
|
292
308
|
};
|
|
293
|
-
var
|
|
294
|
-
|
|
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) {
|
|
295
321
|
case 'invalid':
|
|
296
322
|
log.debug('Ignore invalid link connection', linkInProgress, end);
|
|
297
323
|
return;
|
|
@@ -338,10 +364,10 @@ export class Linker extends Component {
|
|
|
338
364
|
|
|
339
365
|
// Create a completed link from link in progress
|
|
340
366
|
var _newLink = {
|
|
341
|
-
start: isReversed
|
|
342
|
-
end: isReversed
|
|
367
|
+
start: isReversed ? end : start,
|
|
368
|
+
end: isReversed ? start : end,
|
|
343
369
|
id,
|
|
344
|
-
type,
|
|
370
|
+
type: finalType,
|
|
345
371
|
operator: FilterType.eq
|
|
346
372
|
};
|
|
347
373
|
log.info('creating link', _newLink);
|
|
@@ -361,6 +387,7 @@ export class Linker extends Component {
|
|
|
361
387
|
panelManager
|
|
362
388
|
} = this.props;
|
|
363
389
|
if (link.end) {
|
|
390
|
+
var _linkTargetPropMap$ge;
|
|
364
391
|
var {
|
|
365
392
|
end
|
|
366
393
|
} = link;
|
|
@@ -369,9 +396,17 @@ export class Linker extends Component {
|
|
|
369
396
|
columnName,
|
|
370
397
|
columnType
|
|
371
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
|
+
}
|
|
372
407
|
var endPanel = panelManager.getOpenedPanelById(panelId);
|
|
373
408
|
if (!endPanel) {
|
|
374
|
-
log.debug('endPanel no longer exists
|
|
409
|
+
log.debug('endPanel no longer exists or target is not a panel. Ignoring unsetFilterValue', panelId);
|
|
375
410
|
} else if (isLinkablePanel(endPanel)) {
|
|
376
411
|
endPanel.unsetFilterValue(columnName, columnType);
|
|
377
412
|
} else {
|
|
@@ -386,13 +421,22 @@ export class Linker extends Component {
|
|
|
386
421
|
* @param filterMap Map of column name to column type, text, and value
|
|
387
422
|
*/
|
|
388
423
|
setPanelFilterMap(panelId, filterMap) {
|
|
424
|
+
var _linkTargetPropMap$ge2;
|
|
389
425
|
log.debug('Set filter data for panel:', panelId, filterMap);
|
|
390
426
|
var {
|
|
391
427
|
panelManager
|
|
392
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
|
+
}
|
|
393
437
|
var panel = panelManager.getOpenedPanelById(panelId);
|
|
394
438
|
if (!panel) {
|
|
395
|
-
log.debug('panel no longer exists
|
|
439
|
+
log.debug('panel no longer exists or target is not a panel. Ignoring setFilterMap', panelId);
|
|
396
440
|
} else if (isLinkablePanel(panel)) {
|
|
397
441
|
panel.setFilterMap(filterMap);
|
|
398
442
|
} else {
|
|
@@ -456,8 +500,17 @@ export class Linker extends Component {
|
|
|
456
500
|
log.error('Unable to find link to delete', linkId);
|
|
457
501
|
}
|
|
458
502
|
}
|
|
459
|
-
|
|
460
|
-
var
|
|
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) {
|
|
461
514
|
var {
|
|
462
515
|
dh,
|
|
463
516
|
links,
|
|
@@ -473,15 +526,17 @@ export class Linker extends Component {
|
|
|
473
526
|
end,
|
|
474
527
|
operator
|
|
475
528
|
} = links[i];
|
|
476
|
-
if (start.panelId ===
|
|
529
|
+
if (start.panelId === sourceId && end != null && operator != null) {
|
|
530
|
+
var _filterMap$get$filter, _filterMap$get;
|
|
477
531
|
var {
|
|
478
532
|
panelId: endPanelId,
|
|
479
533
|
columnName,
|
|
480
534
|
columnType
|
|
481
535
|
} = end;
|
|
482
536
|
// Map of column name to column type and filter value
|
|
483
|
-
var
|
|
484
|
-
var
|
|
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 : [];
|
|
485
540
|
var {
|
|
486
541
|
visibleIndex: startColumnIndex,
|
|
487
542
|
isExpandable,
|
|
@@ -505,13 +560,12 @@ export class Linker extends Component {
|
|
|
505
560
|
// The values are Dates for dateType values, not string like everything else
|
|
506
561
|
text = dateFilterFormatter.format(value);
|
|
507
562
|
}
|
|
508
|
-
|
|
563
|
+
filterList.push({
|
|
509
564
|
operator,
|
|
510
565
|
text,
|
|
511
566
|
value,
|
|
512
567
|
startColumnIndex
|
|
513
|
-
};
|
|
514
|
-
filterList.push(filter);
|
|
568
|
+
});
|
|
515
569
|
filterMap.set(columnName, {
|
|
516
570
|
columnType,
|
|
517
571
|
filterList
|
|
@@ -649,17 +703,23 @@ export class Linker extends Component {
|
|
|
649
703
|
return null;
|
|
650
704
|
});
|
|
651
705
|
}
|
|
652
|
-
isColumnSelectionValid(
|
|
706
|
+
isColumnSelectionValid(panelOrId, tableColumn, options) {
|
|
707
|
+
var _linkInProgress$endTy2;
|
|
653
708
|
var {
|
|
654
709
|
linkInProgress
|
|
655
710
|
} = this.state;
|
|
656
711
|
var {
|
|
657
712
|
isolatedLinkerPanelId
|
|
658
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';
|
|
659
719
|
if (tableColumn == null) {
|
|
660
720
|
if ((linkInProgress === null || linkInProgress === void 0 ? void 0 : linkInProgress.start) != null) {
|
|
661
721
|
// Link started, end point is not a valid target
|
|
662
|
-
this.updateLinkInProgressType();
|
|
722
|
+
this.updateLinkInProgressType('invalid');
|
|
663
723
|
}
|
|
664
724
|
return false;
|
|
665
725
|
}
|
|
@@ -678,22 +738,27 @@ export class Linker extends Component {
|
|
|
678
738
|
return true;
|
|
679
739
|
}
|
|
680
740
|
var {
|
|
681
|
-
isReversed,
|
|
741
|
+
isReversed = false,
|
|
682
742
|
start
|
|
683
743
|
} = linkInProgress;
|
|
684
|
-
var panelId = LayoutUtils.getIdFromPanel(
|
|
744
|
+
var panelId = typeof panelOrId === 'string' ? panelOrId : LayoutUtils.getIdFromPanel(panelOrId);
|
|
685
745
|
if (panelId == null) {
|
|
686
746
|
return false;
|
|
687
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
|
+
}
|
|
688
754
|
var end = {
|
|
689
755
|
panelId,
|
|
690
|
-
panelComponent: LayoutUtils.getComponentNameFromPanel(panel),
|
|
691
756
|
columnName: tableColumn.name,
|
|
692
757
|
columnType: tableColumn.type
|
|
693
758
|
};
|
|
694
|
-
var
|
|
695
|
-
this.updateLinkInProgressType(type);
|
|
696
|
-
return
|
|
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;
|
|
697
762
|
}
|
|
698
763
|
render() {
|
|
699
764
|
var {
|
|
@@ -725,7 +790,8 @@ export class Linker extends Component {
|
|
|
725
790
|
onAllLinksDeleted: this.handleAllLinksDeleted,
|
|
726
791
|
onLinksUpdated: this.handleLinksUpdated,
|
|
727
792
|
onDone: this.handleDone,
|
|
728
|
-
onCancel: this.handleCancel
|
|
793
|
+
onCancel: this.handleCancel,
|
|
794
|
+
linkTargetPropMap: this.linkTargetPropMap
|
|
729
795
|
})
|
|
730
796
|
}) : null;
|
|
731
797
|
}
|