@deephaven/dashboard-core-plugins 0.85.30 → 0.85.32

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 (72) hide show
  1. package/dist/FilterEvents.d.ts +86 -0
  2. package/dist/FilterEvents.d.ts.map +1 -0
  3. package/dist/FilterEvents.js +78 -0
  4. package/dist/FilterEvents.js.map +1 -0
  5. package/dist/FilterPlugin.d.ts +0 -9
  6. package/dist/FilterPlugin.d.ts.map +1 -1
  7. package/dist/FilterPlugin.js +37 -24
  8. package/dist/FilterPlugin.js.map +1 -1
  9. package/dist/GridWidgetPlugin.d.ts.map +1 -1
  10. package/dist/GridWidgetPlugin.js +23 -4
  11. package/dist/GridWidgetPlugin.js.map +1 -1
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/linker/ColumnSelectionValidator.d.ts +3 -3
  17. package/dist/linker/ColumnSelectionValidator.d.ts.map +1 -1
  18. package/dist/linker/ColumnSelectionValidator.js.map +1 -1
  19. package/dist/linker/Linker.d.ts +17 -9
  20. package/dist/linker/Linker.d.ts.map +1 -1
  21. package/dist/linker/Linker.js +147 -81
  22. package/dist/linker/Linker.js.map +1 -1
  23. package/dist/linker/LinkerEvent.d.ts +52 -0
  24. package/dist/linker/LinkerEvent.d.ts.map +1 -0
  25. package/dist/linker/LinkerEvent.js +28 -0
  26. package/dist/linker/LinkerEvent.js.map +1 -0
  27. package/dist/linker/LinkerOverlayContent.d.ts +2 -0
  28. package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
  29. package/dist/linker/LinkerOverlayContent.js +13 -3
  30. package/dist/linker/LinkerOverlayContent.js.map +1 -1
  31. package/dist/linker/LinkerUtils.d.ts +12 -7
  32. package/dist/linker/LinkerUtils.d.ts.map +1 -1
  33. package/dist/linker/LinkerUtils.js +8 -30
  34. package/dist/linker/LinkerUtils.js.map +1 -1
  35. package/dist/panels/ChartPanel.d.ts +11 -3
  36. package/dist/panels/ChartPanel.d.ts.map +1 -1
  37. package/dist/panels/ChartPanel.js +24 -6
  38. package/dist/panels/ChartPanel.js.map +1 -1
  39. package/dist/panels/DropdownFilterPanel.d.ts +3 -3
  40. package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
  41. package/dist/panels/DropdownFilterPanel.js +19 -8
  42. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  43. package/dist/panels/FileExplorerPanel.d.ts +1 -1
  44. package/dist/panels/FilterSetManagerPanel.js.map +1 -1
  45. package/dist/panels/InputFilterPanel.d.ts +1 -1
  46. package/dist/panels/InputFilterPanel.d.ts.map +1 -1
  47. package/dist/panels/InputFilterPanel.js +8 -4
  48. package/dist/panels/InputFilterPanel.js.map +1 -1
  49. package/dist/panels/IrisGridPanel.d.ts +5 -5
  50. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  51. package/dist/panels/IrisGridPanel.js +28 -9
  52. package/dist/panels/IrisGridPanel.js.map +1 -1
  53. package/dist/panels/WidgetPanelTypes.d.ts +22 -0
  54. package/dist/panels/WidgetPanelTypes.d.ts.map +1 -0
  55. package/dist/panels/WidgetPanelTypes.js +2 -0
  56. package/dist/panels/WidgetPanelTypes.js.map +1 -0
  57. package/dist/panels/index.d.ts +1 -0
  58. package/dist/panels/index.d.ts.map +1 -1
  59. package/dist/panels/index.js +1 -0
  60. package/dist/panels/index.js.map +1 -1
  61. package/dist/redux/selectors.d.ts +6 -6
  62. package/dist/redux/selectors.d.ts.map +1 -1
  63. package/dist/redux/selectors.js.map +1 -1
  64. package/dist/useDashboardColumnFilters.d.ts +19 -0
  65. package/dist/useDashboardColumnFilters.d.ts.map +1 -0
  66. package/dist/useDashboardColumnFilters.js +61 -0
  67. package/dist/useDashboardColumnFilters.js.map +1 -0
  68. package/dist/useGridLinker.d.ts +4 -0
  69. package/dist/useGridLinker.d.ts.map +1 -0
  70. package/dist/useGridLinker.js +107 -0
  71. package/dist/useGridLinker.js.map +1 -0
  72. 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.30",
3
+ "version": "0.85.32",
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.30",
26
- "@deephaven/components": "^0.85.30",
27
- "@deephaven/console": "^0.85.30",
28
- "@deephaven/dashboard": "^0.85.30",
29
- "@deephaven/file-explorer": "^0.85.30",
25
+ "@deephaven/chart": "^0.85.32",
26
+ "@deephaven/components": "^0.85.31",
27
+ "@deephaven/console": "^0.85.32",
28
+ "@deephaven/dashboard": "^0.85.32",
29
+ "@deephaven/file-explorer": "^0.85.31",
30
30
  "@deephaven/filters": "^0.85.0",
31
- "@deephaven/golden-layout": "^0.85.30",
32
- "@deephaven/grid": "^0.85.28",
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.30",
35
- "@deephaven/jsapi-bootstrap": "^0.85.30",
36
- "@deephaven/jsapi-components": "^0.85.30",
37
- "@deephaven/jsapi-types": "^1.0.0-dev0.34.0",
38
- "@deephaven/jsapi-utils": "^0.85.20",
34
+ "@deephaven/iris-grid": "^0.85.32",
35
+ "@deephaven/jsapi-bootstrap": "^0.85.31",
36
+ "@deephaven/jsapi-components": "^0.85.32",
37
+ "@deephaven/jsapi-types": "^1.0.0-dev0.39.4",
38
+ "@deephaven/jsapi-utils": "^0.85.32",
39
39
  "@deephaven/log": "^0.85.19",
40
- "@deephaven/plugin": "^0.85.30",
41
- "@deephaven/react-hooks": "^0.85.23",
42
- "@deephaven/redux": "^0.85.30",
40
+ "@deephaven/plugin": "^0.85.32",
41
+ "@deephaven/react-hooks": "^0.85.31",
42
+ "@deephaven/redux": "^0.85.32",
43
43
  "@deephaven/storage": "^0.85.19",
44
- "@deephaven/utils": "^0.85.20",
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.1",
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": "e7c1b1a572e58925cfd0306033fab1b80aae127b"
81
+ "gitHead": "0f6a016a53249d8229cf0aea6fff1f3456b9f63f"
82
82
  }