11import React , { useCallback , useEffect , useMemo , useState } from 'react' ;
2- import { nanoid } from 'nanoid' ;
32import {
43 DashboardPluginComponentProps ,
54 LayoutManagerContext ,
65 LayoutUtils ,
76 PanelEvent ,
87 useListener ,
98 useDashboardPluginData ,
10- emitCreateDashboard ,
119 WidgetDescriptor ,
12- PanelOpenEventDetail ,
1310 DEFAULT_DASHBOARD_ID ,
1411 useDashboardPanel ,
1512} from '@deephaven/dashboard' ;
1613import Log from '@deephaven/log' ;
1714import { DeferredApiBootstrap } from '@deephaven/jsapi-bootstrap' ;
18- import { dh } from '@deephaven/jsapi-types' ;
1915import { ErrorBoundary } from '@deephaven/components' ;
2016import { useDebouncedCallback } from '@deephaven/react-hooks' ;
21- import styles from './styles.scss?inline' ;
2217import {
2318 ReadonlyWidgetData ,
2419 WidgetDataUpdate ,
@@ -27,11 +22,6 @@ import {
2722import PortalPanel from './layout/PortalPanel' ;
2823import PortalPanelManager from './layout/PortalPanelManager' ;
2924import DashboardWidgetHandler from './widget/DashboardWidgetHandler' ;
30- import {
31- getPreservedData ,
32- DASHBOARD_ELEMENT ,
33- WIDGET_ELEMENT ,
34- } from './widget/WidgetUtils' ;
3525import { usePanelId } from './layout/ReactPanelContext' ;
3626
3727const PLUGIN_NAME = '@deephaven/js-plugin-ui.DashboardPlugin' ;
@@ -63,6 +53,13 @@ interface WidgetWrapper {
6353 data ?: ReadonlyWidgetData ;
6454}
6555
56+ /**
57+ * Handle legacy behaviour of an open widget being saved with the dashboard.
58+ *
59+ * Now UIWidgetPlugin is responsible for opening widgets in the dashboard.
60+ * @param props Dashboard plugin props
61+ * @returns Dashboard plugin content, which is responsible for handling legacy behaviour of an open widget being saved with the dashboard
62+ */
6663function InnerDashboardPlugin (
6764 props : DashboardPluginComponentProps
6865) : JSX . Element | null {
@@ -78,66 +75,6 @@ function InnerDashboardPlugin(
7875 ReadonlyMap < WidgetId , WidgetWrapper >
7976 > ( new Map ( ) ) ;
8077
81- const handleWidgetOpen = useCallback (
82- ( { widgetId, widget } : { widgetId : string ; widget : WidgetDescriptor } ) => {
83- log . debug ( 'Opening widget with ID' , widgetId , widget ) ;
84- setWidgetMap ( prevWidgetMap => {
85- const newWidgetMap = new Map ( prevWidgetMap ) ;
86- const oldWidget = newWidgetMap . get ( widgetId ) ;
87- newWidgetMap . set ( widgetId , {
88- id : widgetId ,
89- widget,
90- data : getPreservedData ( oldWidget ?. data ) ,
91- } ) ;
92- return newWidgetMap ;
93- } ) ;
94- } ,
95- [ ]
96- ) ;
97-
98- const handleDashboardOpen = useCallback (
99- ( {
100- widget,
101- dashboardId,
102- } : {
103- widget : WidgetDescriptor ;
104- dashboardId : string ;
105- } ) => {
106- const { name : title } = widget ;
107- log . debug ( 'Emitting create dashboard event for' , dashboardId , widget ) ;
108- emitCreateDashboard ( layout . eventHub , {
109- pluginId : PLUGIN_NAME ,
110- title : title ?? 'Untitled' ,
111- data : { openWidgets : { [ dashboardId ] : { descriptor : widget } } } ,
112- } ) ;
113- } ,
114- [ layout . eventHub ]
115- ) ;
116-
117- const handlePanelOpen = useCallback (
118- ( {
119- panelId : widgetId = nanoid ( ) ,
120- widget,
121- } : PanelOpenEventDetail < dh . Widget > ) => {
122- const { type } = widget ;
123-
124- switch ( type ) {
125- case WIDGET_ELEMENT : {
126- handleWidgetOpen ( { widgetId, widget } ) ;
127- break ;
128- }
129- case DASHBOARD_ELEMENT : {
130- handleDashboardOpen ( { widget, dashboardId : widgetId } ) ;
131- break ;
132- }
133- default : {
134- break ;
135- }
136- }
137- } ,
138- [ handleDashboardOpen , handleWidgetOpen ]
139- ) ;
140-
14178 useEffect (
14279 function loadInitialPluginData ( ) {
14380 if ( initialPluginData == null ) {
@@ -203,8 +140,6 @@ function InnerDashboardPlugin(
203140 } ) ;
204141 } , [ ] ) ;
205142
206- // TODO: We need to change up the event system for how objects are opened, since in this case it could be opening multiple panels
207- useListener ( layout . eventHub , PanelEvent . OPEN , handlePanelOpen ) ;
208143 useListener ( layout . eventHub , PanelEvent . CLOSE , handlePanelClose ) ;
209144
210145 const sendPluginDataUpdate = useCallback (
@@ -282,12 +217,18 @@ function InnerDashboardPlugin(
282217
283218 return (
284219 < LayoutManagerContext . Provider value = { layout } >
285- < style > { styles } </ style >
286220 < PortalPanelManager > { widgetHandlers } </ PortalPanelManager >
287221 </ LayoutManagerContext . Provider >
288222 ) ;
289223}
290224
225+ /**
226+ * Dashboard plugin that registers the PortalPanel type for deephaven.ui
227+ *
228+ * It's also responsible for handling legacy behaviour, for old dashboards that may have opened a deephaven.ui widget previously.
229+ * @param props Dashboard plugin props
230+ * @returns Dashboard plugin
231+ */
291232export function DashboardPlugin (
292233 props : DashboardPluginComponentProps
293234) : JSX . Element | null {
0 commit comments