@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
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { dh } from '@deephaven/jsapi-types';
|
|
2
|
+
import { type InputFilter } from '@deephaven/iris-grid';
|
|
3
|
+
/**
|
|
4
|
+
* Subscribes to the dashboard column filters (a.k.a. InputFilter) for the current panel or widget, and
|
|
5
|
+
* adds the columns provided to the filter options in the dashboard.
|
|
6
|
+
* @param columns The columns this source has available for filtering.
|
|
7
|
+
* These are used to populate filter options in the UI (InputFilter, DropdownFilter).
|
|
8
|
+
* null can be used to indicate the source is not yet ready which is useful
|
|
9
|
+
* to preserve
|
|
10
|
+
* @param table The table for this source if applicable.
|
|
11
|
+
* This is used to enable ChartBuilder from IrisGrid.
|
|
12
|
+
* @returns The dashboard column filters (InputFilter[]) that apply to the columns provided.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useDashboardColumnFilters(columns: readonly {
|
|
15
|
+
name: string;
|
|
16
|
+
type: string;
|
|
17
|
+
}[] | null, table?: dh.Table): InputFilter[];
|
|
18
|
+
export default useDashboardColumnFilters;
|
|
19
|
+
//# sourceMappingURL=useDashboardColumnFilters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDashboardColumnFilters.d.ts","sourceRoot":"","sources":["../src/useDashboardColumnFilters.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAevE;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,IAAI,EACzD,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GACf,WAAW,EAAE,CA+Df;AAED,eAAe,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo } from 'react';
|
|
2
|
+
import { IrisGridUtils } from '@deephaven/iris-grid';
|
|
3
|
+
import { useLayoutManager, useDashboardId, useAppSelector, useDhId } from '@deephaven/dashboard';
|
|
4
|
+
import { getInputFiltersForDashboard } from "./redux/index.js";
|
|
5
|
+
import { emitFilterColumnsChanged, emitFilterTableChanged } from "./FilterEvents.js";
|
|
6
|
+
/**
|
|
7
|
+
* Subscribes to the dashboard column filters (a.k.a. InputFilter) for the current panel or widget, and
|
|
8
|
+
* adds the columns provided to the filter options in the dashboard.
|
|
9
|
+
* @param columns The columns this source has available for filtering.
|
|
10
|
+
* These are used to populate filter options in the UI (InputFilter, DropdownFilter).
|
|
11
|
+
* null can be used to indicate the source is not yet ready which is useful
|
|
12
|
+
* to preserve
|
|
13
|
+
* @param table The table for this source if applicable.
|
|
14
|
+
* This is used to enable ChartBuilder from IrisGrid.
|
|
15
|
+
* @returns The dashboard column filters (InputFilter[]) that apply to the columns provided.
|
|
16
|
+
*/
|
|
17
|
+
export function useDashboardColumnFilters(columns, table) {
|
|
18
|
+
var {
|
|
19
|
+
eventHub
|
|
20
|
+
} = useLayoutManager();
|
|
21
|
+
var dashboardId = useDashboardId();
|
|
22
|
+
var panelId = useDhId();
|
|
23
|
+
useEffect(function columnsChanged() {
|
|
24
|
+
if (panelId == null || columns == null) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
emitFilterColumnsChanged(eventHub, panelId, columns);
|
|
28
|
+
}, [eventHub, panelId, columns]);
|
|
29
|
+
useEffect(function tableChanged() {
|
|
30
|
+
if (table == null || panelId == null) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
emitFilterTableChanged(eventHub, panelId, table);
|
|
34
|
+
}, [eventHub, panelId, table]);
|
|
35
|
+
|
|
36
|
+
// Cleanup separately because filtering the table or other operations can get a new columns array,
|
|
37
|
+
// and we are using null to indicate unmount, not change
|
|
38
|
+
useEffect(function cleanupOnUnmount() {
|
|
39
|
+
if (panelId == null) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
return () => {
|
|
43
|
+
emitFilterColumnsChanged(eventHub, panelId, null);
|
|
44
|
+
emitFilterTableChanged(eventHub, panelId, null);
|
|
45
|
+
};
|
|
46
|
+
}, [eventHub, panelId]);
|
|
47
|
+
var getInputFilters = useCallback(s => getInputFiltersForDashboard(s, dashboardId), [dashboardId]);
|
|
48
|
+
var reduxInputFilters = useAppSelector(getInputFilters);
|
|
49
|
+
var inputFilters = useMemo(() => IrisGridUtils.getInputFiltersForColumns(columns !== null && columns !== void 0 ? columns : [],
|
|
50
|
+
// They may have picked a column, but not actually entered a value yet. In that case, don't need to update.
|
|
51
|
+
reduxInputFilters.filter(_ref => {
|
|
52
|
+
var {
|
|
53
|
+
value,
|
|
54
|
+
excludePanelIds
|
|
55
|
+
} = _ref;
|
|
56
|
+
return value != null && (excludePanelIds == null || panelId != null && !excludePanelIds.includes(panelId));
|
|
57
|
+
})), [columns, panelId, reduxInputFilters]);
|
|
58
|
+
return inputFilters;
|
|
59
|
+
}
|
|
60
|
+
export default useDashboardColumnFilters;
|
|
61
|
+
//# sourceMappingURL=useDashboardColumnFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDashboardColumnFilters.js","names":["useCallback","useEffect","useMemo","IrisGridUtils","useLayoutManager","useDashboardId","useAppSelector","useDhId","getInputFiltersForDashboard","emitFilterColumnsChanged","emitFilterTableChanged","useDashboardColumnFilters","columns","table","eventHub","dashboardId","panelId","columnsChanged","tableChanged","cleanupOnUnmount","getInputFilters","s","reduxInputFilters","inputFilters","getInputFiltersForColumns","filter","_ref","value","excludePanelIds","includes"],"sources":["../src/useDashboardColumnFilters.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { IrisGridUtils, type InputFilter } from '@deephaven/iris-grid';\nimport {\n useLayoutManager,\n useDashboardId,\n useAppSelector,\n useDhId,\n} from '@deephaven/dashboard';\nimport { type RootState } from '@deephaven/redux';\nimport { getInputFiltersForDashboard } from './redux';\nimport {\n type FilterColumnSourceId,\n emitFilterColumnsChanged,\n emitFilterTableChanged,\n} from './FilterEvents';\n\n/**\n * Subscribes to the dashboard column filters (a.k.a. InputFilter) for the current panel or widget, and\n * adds the columns provided to the filter options in the dashboard.\n * @param columns The columns this source has available for filtering.\n * These are used to populate filter options in the UI (InputFilter, DropdownFilter).\n * null can be used to indicate the source is not yet ready which is useful\n * to preserve\n * @param table The table for this source if applicable.\n * This is used to enable ChartBuilder from IrisGrid.\n * @returns The dashboard column filters (InputFilter[]) that apply to the columns provided.\n */\nexport function useDashboardColumnFilters(\n columns: readonly { name: string; type: string }[] | null,\n table?: dh.Table\n): InputFilter[] {\n const { eventHub } = useLayoutManager();\n const dashboardId = useDashboardId();\n const panelId = useDhId() as FilterColumnSourceId | null;\n\n useEffect(\n function columnsChanged() {\n if (panelId == null || columns == null) {\n return;\n }\n emitFilterColumnsChanged(eventHub, panelId, columns);\n },\n [eventHub, panelId, columns]\n );\n\n useEffect(\n function tableChanged() {\n if (table == null || panelId == null) {\n return;\n }\n emitFilterTableChanged(eventHub, panelId, table);\n },\n [eventHub, panelId, table]\n );\n\n // Cleanup separately because filtering the table or other operations can get a new columns array,\n // and we are using null to indicate unmount, not change\n useEffect(\n function cleanupOnUnmount() {\n if (panelId == null) {\n return;\n }\n return () => {\n emitFilterColumnsChanged(eventHub, panelId, null);\n emitFilterTableChanged(eventHub, panelId, null);\n };\n },\n [eventHub, panelId]\n );\n\n const getInputFilters = useCallback(\n (s: RootState) => getInputFiltersForDashboard(s, dashboardId),\n [dashboardId]\n );\n\n const reduxInputFilters = useAppSelector(getInputFilters);\n\n const inputFilters = useMemo(\n () =>\n IrisGridUtils.getInputFiltersForColumns(\n columns ?? [],\n // They may have picked a column, but not actually entered a value yet. In that case, don't need to update.\n reduxInputFilters.filter(\n ({ value, excludePanelIds }) =>\n value != null &&\n (excludePanelIds == null ||\n (panelId != null && !excludePanelIds.includes(panelId)))\n )\n ),\n [columns, panelId, reduxInputFilters]\n );\n\n return inputFilters;\n}\n\nexport default useDashboardColumnFilters;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAEvD,SAASC,aAAa,QAA0B,sBAAsB;AACtE,SACEC,gBAAgB,EAChBC,cAAc,EACdC,cAAc,EACdC,OAAO,QACF,sBAAsB;AAAC,SAErBC,2BAA2B;AAAA,SAGlCC,wBAAwB,EACxBC,sBAAsB;AAGxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CACvCC,OAAyD,EACzDC,KAAgB,EACD;EACf,IAAM;IAAEC;EAAS,CAAC,GAAGV,gBAAgB,CAAC,CAAC;EACvC,IAAMW,WAAW,GAAGV,cAAc,CAAC,CAAC;EACpC,IAAMW,OAAO,GAAGT,OAAO,CAAC,CAAgC;EAExDN,SAAS,CACP,SAASgB,cAAcA,CAAA,EAAG;IACxB,IAAID,OAAO,IAAI,IAAI,IAAIJ,OAAO,IAAI,IAAI,EAAE;MACtC;IACF;IACAH,wBAAwB,CAACK,QAAQ,EAAEE,OAAO,EAAEJ,OAAO,CAAC;EACtD,CAAC,EACD,CAACE,QAAQ,EAAEE,OAAO,EAAEJ,OAAO,CAC7B,CAAC;EAEDX,SAAS,CACP,SAASiB,YAAYA,CAAA,EAAG;IACtB,IAAIL,KAAK,IAAI,IAAI,IAAIG,OAAO,IAAI,IAAI,EAAE;MACpC;IACF;IACAN,sBAAsB,CAACI,QAAQ,EAAEE,OAAO,EAAEH,KAAK,CAAC;EAClD,CAAC,EACD,CAACC,QAAQ,EAAEE,OAAO,EAAEH,KAAK,CAC3B,CAAC;;EAED;EACA;EACAZ,SAAS,CACP,SAASkB,gBAAgBA,CAAA,EAAG;IAC1B,IAAIH,OAAO,IAAI,IAAI,EAAE;MACnB;IACF;IACA,OAAO,MAAM;MACXP,wBAAwB,CAACK,QAAQ,EAAEE,OAAO,EAAE,IAAI,CAAC;MACjDN,sBAAsB,CAACI,QAAQ,EAAEE,OAAO,EAAE,IAAI,CAAC;IACjD,CAAC;EACH,CAAC,EACD,CAACF,QAAQ,EAAEE,OAAO,CACpB,CAAC;EAED,IAAMI,eAAe,GAAGpB,WAAW,CAChCqB,CAAY,IAAKb,2BAA2B,CAACa,CAAC,EAAEN,WAAW,CAAC,EAC7D,CAACA,WAAW,CACd,CAAC;EAED,IAAMO,iBAAiB,GAAGhB,cAAc,CAACc,eAAe,CAAC;EAEzD,IAAMG,YAAY,GAAGrB,OAAO,CAC1B,MACEC,aAAa,CAACqB,yBAAyB,CACrCZ,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,EAAE;EACb;EACAU,iBAAiB,CAACG,MAAM,CACtBC,IAAA;IAAA,IAAC;MAAEC,KAAK;MAAEC;IAAgB,CAAC,GAAAF,IAAA;IAAA,OACzBC,KAAK,IAAI,IAAI,KACZC,eAAe,IAAI,IAAI,IACrBZ,OAAO,IAAI,IAAI,IAAI,CAACY,eAAe,CAACC,QAAQ,CAACb,OAAO,CAAE,CAAC;EAAA,CAC9D,CACF,CAAC,EACH,CAACJ,OAAO,EAAEI,OAAO,EAAEM,iBAAiB,CACtC,CAAC;EAED,OAAOC,YAAY;AACrB;AAEA,eAAeZ,yBAAyB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type IrisGridProps, type IrisGridModel, type IrisGridType } from '@deephaven/iris-grid';
|
|
2
|
+
export declare function useGridLinker(model: IrisGridModel | null, irisGrid: IrisGridType | null): Pick<IrisGridProps, 'alwaysFetchColumns' | 'columnSelectionValidator' | 'isSelectingColumn' | 'onColumnSelected' | 'onDataSelected'>;
|
|
3
|
+
export default useGridLinker;
|
|
4
|
+
//# sourceMappingURL=useGridLinker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGridLinker.d.ts","sourceRoot":"","sources":["../src/useGridLinker.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAe9B,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,QAAQ,EAAE,YAAY,GAAG,IAAI,GAC5B,IAAI,CACL,aAAa,EACX,oBAAoB,GACpB,0BAA0B,GAC1B,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,CACnB,CAgIA;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo } from 'react';
|
|
2
|
+
import clamp from 'lodash.clamp';
|
|
3
|
+
import { useAppSelector, useDashboardId, useDhId, useLayoutManager, usePanelId } from '@deephaven/dashboard';
|
|
4
|
+
import { assertNotNull } from '@deephaven/utils';
|
|
5
|
+
import { emitLinkPointSelected, emitLinkSourceDataSelected, emitRegisterLinkTarget } from "./linker/LinkerEvent.js";
|
|
6
|
+
import { getColumnSelectionValidatorForDashboard, getLinksForDashboard } from "./redux/index.js";
|
|
7
|
+
export function useGridLinker(model, irisGrid) {
|
|
8
|
+
var {
|
|
9
|
+
eventHub
|
|
10
|
+
} = useLayoutManager();
|
|
11
|
+
var dashboardId = useDashboardId();
|
|
12
|
+
var dhId = useDhId();
|
|
13
|
+
var panelId = usePanelId();
|
|
14
|
+
var getLinks = useCallback(s => getLinksForDashboard(s, dashboardId), [dashboardId]);
|
|
15
|
+
var links = useAppSelector(getLinks);
|
|
16
|
+
var linkColumns = useMemo(() => {
|
|
17
|
+
var columnSet = new Set();
|
|
18
|
+
links.forEach(link => {
|
|
19
|
+
if (link.start.panelId === dhId) {
|
|
20
|
+
columnSet.add(link.start.columnName);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return [...columnSet];
|
|
24
|
+
}, [links, dhId]);
|
|
25
|
+
var getColumnSelectionValidator = useCallback(s => getColumnSelectionValidatorForDashboard(s, dashboardId), [dashboardId]);
|
|
26
|
+
var columnSelectionValidator = useAppSelector(getColumnSelectionValidator);
|
|
27
|
+
var isColumnSelectionValid = useCallback(column => {
|
|
28
|
+
if (columnSelectionValidator && column && dhId != null) {
|
|
29
|
+
return columnSelectionValidator(dhId, column, {
|
|
30
|
+
type: 'tableLink'
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}, [columnSelectionValidator, dhId]);
|
|
35
|
+
var isSelectingColumn = columnSelectionValidator != null;
|
|
36
|
+
var onDataSelected = useCallback((row, dataMap) => {
|
|
37
|
+
if (dhId == null) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
emitLinkSourceDataSelected(eventHub, dhId, dataMap);
|
|
41
|
+
}, [eventHub, dhId]);
|
|
42
|
+
var getCoordinates = useCallback(columnName => {
|
|
43
|
+
var _gridWrapper$getBound, _allColumnXs$get, _allColumnWidths$get;
|
|
44
|
+
if (!model || !irisGrid) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
var {
|
|
48
|
+
gridWrapper
|
|
49
|
+
} = irisGrid;
|
|
50
|
+
var rect = (_gridWrapper$getBound = gridWrapper === null || gridWrapper === void 0 ? void 0 : gridWrapper.getBoundingClientRect()) !== null && _gridWrapper$getBound !== void 0 ? _gridWrapper$getBound : null;
|
|
51
|
+
if (rect == null || rect.width <= 0 || rect.height <= 0) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
var {
|
|
55
|
+
metrics
|
|
56
|
+
} = irisGrid.state;
|
|
57
|
+
assertNotNull(metrics);
|
|
58
|
+
var {
|
|
59
|
+
columnHeaderHeight,
|
|
60
|
+
allColumnXs,
|
|
61
|
+
allColumnWidths,
|
|
62
|
+
right,
|
|
63
|
+
columnHeaderMaxDepth
|
|
64
|
+
} = metrics;
|
|
65
|
+
var columnIndex = model.getColumnIndexByName(columnName);
|
|
66
|
+
assertNotNull(columnIndex);
|
|
67
|
+
var visibleIndex = irisGrid.getVisibleColumn(columnIndex);
|
|
68
|
+
var columnX = (_allColumnXs$get = allColumnXs.get(visibleIndex)) !== null && _allColumnXs$get !== void 0 ? _allColumnXs$get : 0;
|
|
69
|
+
var columnWidth = (_allColumnWidths$get = allColumnWidths.get(visibleIndex)) !== null && _allColumnWidths$get !== void 0 ? _allColumnWidths$get : 0;
|
|
70
|
+
var x = clamp(visibleIndex > right ? rect.right : rect.left + columnX + columnWidth * 0.5, rect.left, rect.right);
|
|
71
|
+
var y = rect.top + columnHeaderHeight * columnHeaderMaxDepth;
|
|
72
|
+
return [x, y];
|
|
73
|
+
}, [model, irisGrid]);
|
|
74
|
+
var onColumnSelected = useCallback(column => {
|
|
75
|
+
if (dhId == null) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
emitLinkPointSelected(eventHub, dhId, column, {
|
|
79
|
+
type: 'tableLink'
|
|
80
|
+
});
|
|
81
|
+
}, [eventHub, dhId]);
|
|
82
|
+
useEffect(function registerTarget() {
|
|
83
|
+
if (!irisGrid || panelId == null || dhId == null) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
emitRegisterLinkTarget(eventHub, dhId, {
|
|
87
|
+
getCoordinates,
|
|
88
|
+
setFilterValues: irisGrid.setFilterMap,
|
|
89
|
+
unsetFilterValue: () => {
|
|
90
|
+
// No-op
|
|
91
|
+
},
|
|
92
|
+
panelId
|
|
93
|
+
});
|
|
94
|
+
return () => {
|
|
95
|
+
emitRegisterLinkTarget(eventHub, dhId, null);
|
|
96
|
+
};
|
|
97
|
+
}, [eventHub, dhId, getCoordinates, irisGrid, panelId]);
|
|
98
|
+
return {
|
|
99
|
+
alwaysFetchColumns: linkColumns,
|
|
100
|
+
columnSelectionValidator: isColumnSelectionValid,
|
|
101
|
+
isSelectingColumn,
|
|
102
|
+
onColumnSelected,
|
|
103
|
+
onDataSelected
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export default useGridLinker;
|
|
107
|
+
//# sourceMappingURL=useGridLinker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGridLinker.js","names":["useCallback","useEffect","useMemo","clamp","useAppSelector","useDashboardId","useDhId","useLayoutManager","usePanelId","assertNotNull","emitLinkPointSelected","emitLinkSourceDataSelected","emitRegisterLinkTarget","getColumnSelectionValidatorForDashboard","getLinksForDashboard","useGridLinker","model","irisGrid","eventHub","dashboardId","dhId","panelId","getLinks","s","links","linkColumns","columnSet","Set","forEach","link","start","add","columnName","getColumnSelectionValidator","columnSelectionValidator","isColumnSelectionValid","column","type","isSelectingColumn","onDataSelected","row","dataMap","getCoordinates","_gridWrapper$getBound","_allColumnXs$get","_allColumnWidths$get","gridWrapper","rect","getBoundingClientRect","width","height","metrics","state","columnHeaderHeight","allColumnXs","allColumnWidths","right","columnHeaderMaxDepth","columnIndex","getColumnIndexByName","visibleIndex","getVisibleColumn","columnX","get","columnWidth","x","left","y","top","onColumnSelected","registerTarget","setFilterValues","setFilterMap","unsetFilterValue","alwaysFetchColumns"],"sources":["../src/useGridLinker.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo } from 'react';\nimport clamp from 'lodash.clamp';\nimport {\n useAppSelector,\n useDashboardId,\n useDhId,\n useLayoutManager,\n usePanelId,\n} from '@deephaven/dashboard';\nimport { type RootState } from '@deephaven/redux';\nimport {\n type IrisGridProps,\n type IrisGridModel,\n type IrisGridType,\n} from '@deephaven/iris-grid';\nimport { type ModelIndex } from '@deephaven/grid';\nimport { type RowDataMap } from '@deephaven/jsapi-utils';\nimport { type dh } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport {\n emitLinkPointSelected,\n emitLinkSourceDataSelected,\n emitRegisterLinkTarget,\n} from './linker/LinkerEvent';\nimport {\n getColumnSelectionValidatorForDashboard,\n getLinksForDashboard,\n} from './redux';\n\nexport function useGridLinker(\n model: IrisGridModel | null,\n irisGrid: IrisGridType | null\n): Pick<\n IrisGridProps,\n | 'alwaysFetchColumns'\n | 'columnSelectionValidator'\n | 'isSelectingColumn'\n | 'onColumnSelected'\n | 'onDataSelected'\n> {\n const { eventHub } = useLayoutManager();\n const dashboardId = useDashboardId();\n const dhId = useDhId();\n const panelId = usePanelId();\n\n const getLinks = useCallback(\n (s: RootState) => getLinksForDashboard(s, dashboardId),\n [dashboardId]\n );\n\n const links = useAppSelector(getLinks);\n const linkColumns = useMemo(() => {\n const columnSet = new Set<string>();\n links.forEach(link => {\n if (link.start.panelId === dhId) {\n columnSet.add(link.start.columnName);\n }\n });\n return [...columnSet];\n }, [links, dhId]);\n\n const getColumnSelectionValidator = useCallback(\n (s: RootState) => getColumnSelectionValidatorForDashboard(s, dashboardId),\n [dashboardId]\n );\n const columnSelectionValidator = useAppSelector(getColumnSelectionValidator);\n\n const isColumnSelectionValid = useCallback(\n (column: dh.Column | null) => {\n if (columnSelectionValidator && column && dhId != null) {\n return columnSelectionValidator(dhId, column, { type: 'tableLink' });\n }\n return false;\n },\n [columnSelectionValidator, dhId]\n );\n const isSelectingColumn = columnSelectionValidator != null;\n\n const onDataSelected = useCallback(\n (row: ModelIndex, dataMap: RowDataMap) => {\n if (dhId == null) {\n return;\n }\n emitLinkSourceDataSelected(eventHub, dhId, dataMap);\n },\n [eventHub, dhId]\n );\n\n const getCoordinates = useCallback(\n (columnName: string): [number, number] | null => {\n if (!model || !irisGrid) {\n return null;\n }\n\n const { gridWrapper } = irisGrid;\n const rect = gridWrapper?.getBoundingClientRect() ?? null;\n if (rect == null || rect.width <= 0 || rect.height <= 0) {\n return null;\n }\n const { metrics } = irisGrid.state;\n assertNotNull(metrics);\n const {\n columnHeaderHeight,\n allColumnXs,\n allColumnWidths,\n right,\n columnHeaderMaxDepth,\n } = metrics;\n const columnIndex = model.getColumnIndexByName(columnName);\n assertNotNull(columnIndex);\n const visibleIndex = irisGrid.getVisibleColumn(columnIndex);\n const columnX = allColumnXs.get(visibleIndex) ?? 0;\n const columnWidth = allColumnWidths.get(visibleIndex) ?? 0;\n\n const x = clamp(\n visibleIndex > right\n ? rect.right\n : rect.left + columnX + columnWidth * 0.5,\n rect.left,\n rect.right\n );\n const y = rect.top + columnHeaderHeight * columnHeaderMaxDepth;\n\n return [x, y];\n },\n [model, irisGrid]\n );\n\n const onColumnSelected = useCallback(\n (column: dh.Column) => {\n if (dhId == null) {\n return;\n }\n emitLinkPointSelected(eventHub, dhId, column, {\n type: 'tableLink',\n });\n },\n [eventHub, dhId]\n );\n\n useEffect(\n function registerTarget() {\n if (!irisGrid || panelId == null || dhId == null) {\n return;\n }\n emitRegisterLinkTarget(eventHub, dhId, {\n getCoordinates,\n setFilterValues: irisGrid.setFilterMap,\n unsetFilterValue: () => {\n // No-op\n },\n panelId,\n });\n return () => {\n emitRegisterLinkTarget(eventHub, dhId, null);\n };\n },\n [eventHub, dhId, getCoordinates, irisGrid, panelId]\n );\n\n return {\n alwaysFetchColumns: linkColumns,\n columnSelectionValidator: isColumnSelectionValid,\n isSelectingColumn,\n onColumnSelected,\n onDataSelected,\n };\n}\n\nexport default useGridLinker;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/dashboard-core-plugins",
|
|
3
|
-
"version": "0.85.
|
|
3
|
+
"version": "0.85.31",
|
|
4
4
|
"description": "Deephaven Dashboard Core Plugins",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -22,26 +22,26 @@
|
|
|
22
22
|
"build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@deephaven/chart": "^0.85.
|
|
26
|
-
"@deephaven/components": "^0.85.
|
|
27
|
-
"@deephaven/console": "^0.85.
|
|
28
|
-
"@deephaven/dashboard": "^0.85.
|
|
29
|
-
"@deephaven/file-explorer": "^0.85.
|
|
25
|
+
"@deephaven/chart": "^0.85.31",
|
|
26
|
+
"@deephaven/components": "^0.85.31",
|
|
27
|
+
"@deephaven/console": "^0.85.31",
|
|
28
|
+
"@deephaven/dashboard": "^0.85.31",
|
|
29
|
+
"@deephaven/file-explorer": "^0.85.31",
|
|
30
30
|
"@deephaven/filters": "^0.85.0",
|
|
31
|
-
"@deephaven/golden-layout": "^0.85.
|
|
32
|
-
"@deephaven/grid": "^0.85.
|
|
31
|
+
"@deephaven/golden-layout": "^0.85.31",
|
|
32
|
+
"@deephaven/grid": "^0.85.31",
|
|
33
33
|
"@deephaven/icons": "^0.85.0",
|
|
34
|
-
"@deephaven/iris-grid": "^0.85.
|
|
35
|
-
"@deephaven/jsapi-bootstrap": "^0.85.
|
|
36
|
-
"@deephaven/jsapi-components": "^0.85.
|
|
37
|
-
"@deephaven/jsapi-types": "^1.0.0-dev0.
|
|
38
|
-
"@deephaven/jsapi-utils": "^0.85.
|
|
34
|
+
"@deephaven/iris-grid": "^0.85.31",
|
|
35
|
+
"@deephaven/jsapi-bootstrap": "^0.85.31",
|
|
36
|
+
"@deephaven/jsapi-components": "^0.85.31",
|
|
37
|
+
"@deephaven/jsapi-types": "^1.0.0-dev0.39.4",
|
|
38
|
+
"@deephaven/jsapi-utils": "^0.85.31",
|
|
39
39
|
"@deephaven/log": "^0.85.19",
|
|
40
|
-
"@deephaven/plugin": "^0.85.
|
|
41
|
-
"@deephaven/react-hooks": "^0.85.
|
|
42
|
-
"@deephaven/redux": "^0.85.
|
|
40
|
+
"@deephaven/plugin": "^0.85.31",
|
|
41
|
+
"@deephaven/react-hooks": "^0.85.31",
|
|
42
|
+
"@deephaven/redux": "^0.85.31",
|
|
43
43
|
"@deephaven/storage": "^0.85.19",
|
|
44
|
-
"@deephaven/utils": "^0.85.
|
|
44
|
+
"@deephaven/utils": "^0.85.31",
|
|
45
45
|
"@fortawesome/react-fontawesome": "^0.2.0",
|
|
46
46
|
"classnames": "^2.3.1",
|
|
47
47
|
"fast-deep-equal": "^3.1.3",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"react-redux": "^7.2.4"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@deephaven/jsapi-shim": "^0.85.
|
|
68
|
+
"@deephaven/jsapi-shim": "^0.85.31",
|
|
69
69
|
"@deephaven/mocks": "^0.85.0"
|
|
70
70
|
},
|
|
71
71
|
"files": [
|
|
@@ -78,5 +78,5 @@
|
|
|
78
78
|
"publishConfig": {
|
|
79
79
|
"access": "public"
|
|
80
80
|
},
|
|
81
|
-
"gitHead": "
|
|
81
|
+
"gitHead": "21a2dce09c51a5b2f68c5a8c1f7650b838c193b2"
|
|
82
82
|
}
|