@deephaven/dashboard 1.16.0 → 1.16.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardLayout.d.ts","sourceRoot":"","sources":["../src/DashboardLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,KAAK,aAAa,EAMnB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAEV,UAAU,EAGX,MAAM,0BAA0B,CAAC;AAMlC,OAAqB,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAWjE,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAEhB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,MAAM,qBAAqB,GAAG,UAAU,EAAE,CAAC;AAejD,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,KAAK,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IAClD,EAAE,EAAE,MAAM,CAAC;IAGX,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,cAAc,CAAC,EAAE,CAAC,gBAAgB,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACnE,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEjC,wCAAwC;IACxC,YAAY,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;CACnE,CAAC,CAAC;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,EAAE,EACF,QAAQ,EACR,cAA2E,EAC3E,MAAM,EACN,YAAoC,EACpC,cAAiC,EACjC,mBAAsC,EACtC,OAAwB,EACxB,SAA4B,EAC5B,YAAY,GACb,EAAE,oBAAoB,GAAG,GAAG,CAAC,OAAO,CAqSpC;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"DashboardLayout.d.ts","sourceRoot":"","sources":["../src/DashboardLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EACZ,KAAK,aAAa,EAMnB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAEV,UAAU,EAGX,MAAM,0BAA0B,CAAC;AAMlC,OAAqB,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAWjE,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAEhB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,MAAM,qBAAqB,GAAG,UAAU,EAAE,CAAC;AAejD,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,KAAK,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IAClD,EAAE,EAAE,MAAM,CAAC;IAGX,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,cAAc,CAAC,EAAE,CAAC,gBAAgB,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACnE,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEjC,wCAAwC;IACxC,YAAY,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;CACnE,CAAC,CAAC;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,EAAE,EACF,QAAQ,EACR,cAA2E,EAC3E,MAAM,EACN,YAAoC,EACpC,cAAiC,EACjC,mBAAsC,EACtC,OAAwB,EACxB,SAA4B,EAC5B,YAAY,GACb,EAAE,oBAAoB,GAAG,GAAG,CAAC,OAAO,CAqTpC;AAED,eAAe,eAAe,CAAC"}
@@ -133,6 +133,7 @@ export function DashboardLayout(_ref) {
133
133
  var hasChanged = lastConfig == null || !LayoutUtils.isEqual(lastConfig, dehydratedLayoutConfig);
134
134
  log.debug('handleLayoutStateChanged', hasChanged, dehydratedLayoutConfig);
135
135
  if (hasChanged) {
136
+ log.debug('Layout config has changed', 'lastConfig', lastConfig, 'dehydratedLayoutConfig', dehydratedLayoutConfig);
136
137
  setIsDashboardEmpty(layout.root.contentItems.length === 0);
137
138
  setLastConfig(dehydratedLayoutConfig);
138
139
  onLayoutChange(dehydratedLayoutConfig);
@@ -182,6 +183,7 @@ export function DashboardLayout(_ref) {
182
183
  var previousLayoutConfig = usePrevious(layoutConfig);
183
184
  useEffect(function loadNewConfig() {
184
185
  if (previousLayoutConfig !== layoutConfig && layoutConfig !== lastConfig) {
186
+ log.debug('loadNewConfig effect triggered. previousLayoutConfig', previousLayoutConfig, 'layoutConfig', layoutConfig, 'lastConfig', lastConfig);
185
187
  log.debug('Setting new layout content...');
186
188
  var content = LayoutUtils.hydrateLayoutConfig(layoutConfig, hydrateComponent);
187
189
  // Remove the old layout before add the new one
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardLayout.js","names":["React","useCallback","useEffect","useMemo","useState","Log","usePrevious","useThrottledCallback","ErrorBoundary","useDispatch","useSelector","PanelManager","PanelErrorBoundary","LayoutUtils","isReactComponentConfig","canHaveRef","dehydrate","dehydrateDefault","hydrate","hydrateDefault","PanelEvent","useListener","getDashboardData","updateDashboardData","DashboardPanelWrapper","PanelIdContext","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","EMPTY_OBJECT","Object","freeze","DEFAULT_LAYOUT_CONFIG","DEFAULT_CALLBACK","undefined","STATE_CHANGE_THROTTLE_MS","FALLBACK_CALLBACK","props","DashboardLayout","_ref","_useSelector","_closed","id","children","emptyDashboard","className","layout","layoutConfig","onLayoutChange","onLayoutInitialized","panelWrapper","dispatch","data","state","isDashboardEmpty","setIsDashboardEmpty","isItemDragging","setIsItemDragging","lastConfig","setLastConfig","initialClosedPanels","closed","layoutChildren","setLayoutChildren","getReactChildren","hydrateMap","Map","dehydrateMap","registerComponent","name","componentType","_componentType$displa","componentHydrate","arguments","length","componentDehydrate","debug2","wrappedComponent","ref","CType","PanelWrapperType","hasRef","innerElem","_objectSpread","glContainer","glEventHub","panelId","getIdFromContainer","Provider","value","displayName","concat","cleanup","forwardRef","set","hydrateComponent","_hydrateMap$get","get","dehydrateComponent","config","_dehydrateMap$get","panelManager","_ref2","openedMap","throttledProcessDehydratedLayoutConfig","dehydratedLayoutConfig","hasChanged","isEqual","debug","root","contentItems","flushOnUnmount","flush","handleLayoutStateChanged","glConfig","toConfig","contentConfig","content","dehydrateLayoutConfig","handleLayoutItemPickedUp","component","componentId","eventHub","emit","DRAGGING","handleLayoutItemDropped","DROPPED","handleComponentCreated","item","element","cssComponent","replace","toLowerCase","cssClass","addClass","handleReactChildrenChange","TITLE_CHANGED","previousLayoutConfig","loadNewConfig","hydrateLayoutConfig","remove","i","addChild","Children","map","child","fallback","cloneElement"],"sources":["../src/DashboardLayout.tsx"],"sourcesContent":["import React, {\n type ComponentType,\n type ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport type {\n Container,\n ItemConfig,\n ReactComponentConfig,\n AbstractContentItem,\n} from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport { usePrevious, useThrottledCallback } from '@deephaven/react-hooks';\nimport { ErrorBoundary } from '@deephaven/components';\nimport { type RootState } from '@deephaven/redux';\nimport { useDispatch, useSelector } from 'react-redux';\nimport PanelManager, { type ClosedPanels } from './PanelManager';\nimport PanelErrorBoundary from './PanelErrorBoundary';\nimport LayoutUtils, { isReactComponentConfig } from './layout/LayoutUtils';\nimport {\n canHaveRef,\n dehydrate as dehydrateDefault,\n hydrate as hydrateDefault,\n} from './DashboardUtils';\nimport PanelEvent from './PanelEvent';\nimport { useListener } from './layout';\nimport { getDashboardData, updateDashboardData } from './redux';\nimport {\n type PanelConfig,\n type PanelComponentType,\n type PanelDehydrateFunction,\n type PanelHydrateFunction,\n type PanelProps,\n type DehydratedPanelProps,\n} from './DashboardPlugin';\nimport DashboardPanelWrapper from './DashboardPanelWrapper';\nimport { PanelIdContext } from './usePanelId';\n\nexport type DashboardLayoutConfig = ItemConfig[];\n\nconst log = Log.module('DashboardLayout');\n\nconst EMPTY_OBJECT = Object.freeze({});\n\nconst DEFAULT_LAYOUT_CONFIG: DashboardLayoutConfig = [];\n\nconst DEFAULT_CALLBACK = (): void => undefined;\n\nconst STATE_CHANGE_THROTTLE_MS = 1000;\n\n// If a component isn't registered, just pass through the props so they are saved if a plugin is loaded later\nconst FALLBACK_CALLBACK = <P,>(props: P): P => props;\n\ntype DashboardData = {\n closed?: ClosedPanels;\n};\n\ntype DashboardLayoutProps = React.PropsWithChildren<{\n id: string;\n\n // Default hydrate/dehydration functions\n hydrate?: PanelHydrateFunction;\n dehydrate?: PanelDehydrateFunction;\n layout: GoldenLayout;\n layoutConfig?: DashboardLayoutConfig;\n onLayoutChange?: (dehydratedLayout: DashboardLayoutConfig) => void;\n onLayoutInitialized?: () => void;\n data?: DashboardData;\n emptyDashboard?: React.ReactNode;\n\n /** Component to wrap each panel with */\n panelWrapper?: ComponentType<React.PropsWithChildren<PanelProps>>;\n}>;\n\n/**\n * DashboardLayout component. Handles hydrating, dehydrating components, listening for dragging panels.\n */\nexport function DashboardLayout({\n id,\n children,\n emptyDashboard = <div className=\"dashboard-empty\">Dashboard is empty.</div>,\n layout,\n layoutConfig = DEFAULT_LAYOUT_CONFIG,\n onLayoutChange = DEFAULT_CALLBACK,\n onLayoutInitialized = DEFAULT_CALLBACK,\n hydrate = hydrateDefault,\n dehydrate = dehydrateDefault,\n panelWrapper,\n}: DashboardLayoutProps): JSX.Element {\n const dispatch = useDispatch();\n const data =\n useSelector<RootState>(state => getDashboardData(state, id)) ??\n EMPTY_OBJECT;\n\n const [isDashboardEmpty, setIsDashboardEmpty] = useState(false);\n const [isItemDragging, setIsItemDragging] = useState(false);\n const [lastConfig, setLastConfig] = useState<DashboardLayoutConfig>();\n const [initialClosedPanels] = useState<ReactComponentConfig[] | undefined>(\n (data as DashboardData)?.closed ?? []\n );\n const [layoutChildren, setLayoutChildren] = useState(\n layout.getReactChildren()\n );\n\n const hydrateMap = useMemo(() => new Map<string, PanelHydrateFunction>(), []);\n const dehydrateMap = useMemo(\n () => new Map<string, PanelDehydrateFunction>(),\n []\n );\n const registerComponent = useCallback(\n (\n name: string,\n componentType: PanelComponentType,\n componentHydrate = hydrate,\n componentDehydrate = dehydrate\n ) => {\n log.debug2(\n 'registerComponent',\n name,\n componentType,\n componentHydrate,\n componentDehydrate\n );\n\n function wrappedComponent(\n props: PanelProps,\n ref: React.Ref<unknown>\n ): JSX.Element {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const CType = componentType as any;\n const PanelWrapperType = panelWrapper;\n\n /**\n * The ref is used to detect changes to class component state so we\n * can track changes to panelState. We should opt for more explicit\n * state changes in the future and in functional components.\n */\n const hasRef = canHaveRef(CType);\n\n const innerElem = hasRef ? (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <CType {...props} ref={ref} />\n ) : (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <CType {...props} />\n );\n\n // Props supplied by GoldenLayout\n const { glContainer, glEventHub } = props;\n const panelId = LayoutUtils.getIdFromContainer(glContainer);\n return (\n <PanelErrorBoundary glContainer={glContainer} glEventHub={glEventHub}>\n <PanelIdContext.Provider value={panelId as string | null}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <DashboardPanelWrapper {...props}>\n {PanelWrapperType == null ? (\n innerElem\n ) : (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <PanelWrapperType {...props}>{innerElem}</PanelWrapperType>\n )}\n </DashboardPanelWrapper>\n </PanelIdContext.Provider>\n </PanelErrorBoundary>\n );\n }\n\n wrappedComponent.displayName = `DashboardWrapper(${\n componentType.displayName ?? name\n })`;\n\n const cleanup = layout.registerComponent(\n name,\n React.forwardRef(wrappedComponent)\n );\n hydrateMap.set(name, componentHydrate);\n dehydrateMap.set(name, componentDehydrate);\n return cleanup;\n },\n [hydrate, dehydrate, hydrateMap, dehydrateMap, layout, panelWrapper]\n );\n const hydrateComponent = useCallback(\n (name: string, props: DehydratedPanelProps) =>\n (hydrateMap.get(name) ?? (FALLBACK_CALLBACK as PanelHydrateFunction))(\n props,\n id\n ),\n [hydrateMap, id]\n );\n const dehydrateComponent = useCallback(\n (name: string, config: PanelConfig) =>\n (dehydrateMap.get(name) ?? (FALLBACK_CALLBACK as PanelDehydrateFunction))(\n config,\n id\n ),\n [dehydrateMap, id]\n );\n const panelManager = useMemo(\n () =>\n new PanelManager(\n layout,\n hydrateComponent,\n dehydrateComponent,\n new Map(),\n initialClosedPanels,\n ({ closed, openedMap }) => {\n dispatch(updateDashboardData(id, { closed, openedMap }));\n }\n ),\n [\n dehydrateComponent,\n dispatch,\n hydrateComponent,\n id,\n initialClosedPanels,\n layout,\n ]\n );\n\n // Throttle the calls so that we don't flood comparing these layouts\n const throttledProcessDehydratedLayoutConfig = useThrottledCallback(\n (dehydratedLayoutConfig: DashboardLayoutConfig) => {\n const hasChanged =\n lastConfig == null ||\n !LayoutUtils.isEqual(lastConfig, dehydratedLayoutConfig);\n\n log.debug('handleLayoutStateChanged', hasChanged, dehydratedLayoutConfig);\n\n if (hasChanged) {\n setIsDashboardEmpty(layout.root.contentItems.length === 0);\n\n setLastConfig(dehydratedLayoutConfig);\n\n onLayoutChange(dehydratedLayoutConfig);\n\n setLayoutChildren(layout.getReactChildren());\n }\n },\n STATE_CHANGE_THROTTLE_MS,\n { flushOnUnmount: true }\n );\n\n useEffect(\n () => () => throttledProcessDehydratedLayoutConfig.flush(),\n [throttledProcessDehydratedLayoutConfig]\n );\n\n const handleLayoutStateChanged = useCallback(() => {\n // we don't want to emit stateChanges that happen during item drags or else\n // we risk the last saved state being one without that panel in the layout entirely\n if (isItemDragging) return;\n\n const glConfig = layout.toConfig();\n const contentConfig = glConfig.content;\n const dehydratedLayoutConfig = LayoutUtils.dehydrateLayoutConfig(\n contentConfig,\n dehydrateComponent\n );\n throttledProcessDehydratedLayoutConfig(dehydratedLayoutConfig);\n }, [\n dehydrateComponent,\n isItemDragging,\n layout,\n throttledProcessDehydratedLayoutConfig,\n ]);\n\n const handleLayoutItemPickedUp = useCallback(\n (component: Container) => {\n const componentId = LayoutUtils.getIdFromContainer(component);\n layout.eventHub.emit(PanelEvent.DRAGGING, componentId);\n setIsItemDragging(true);\n },\n [layout.eventHub]\n );\n\n const handleLayoutItemDropped = useCallback(\n (component: Container) => {\n const componentId = LayoutUtils.getIdFromContainer(component);\n layout.eventHub.emit(PanelEvent.DROPPED, componentId);\n setIsItemDragging(false);\n },\n [layout.eventHub]\n );\n\n const handleComponentCreated = useCallback((item: AbstractContentItem) => {\n log.debug2('handleComponentCreated', item);\n\n if (\n item == null ||\n item.config == null ||\n !isReactComponentConfig(item.config) ||\n item.config.component == null ||\n item.element == null\n ) {\n return;\n }\n\n const cssComponent = item.config.component\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase();\n const cssClass = `${cssComponent}-component`;\n item.element.addClass(cssClass);\n }, []);\n\n const handleReactChildrenChange = useCallback(() => {\n setLayoutChildren(layout.getReactChildren());\n }, [layout]);\n\n useListener(layout, 'stateChanged', handleLayoutStateChanged);\n useListener(layout, 'itemPickedUp', handleLayoutItemPickedUp);\n useListener(layout, 'itemDropped', handleLayoutItemDropped);\n useListener(layout, 'componentCreated', handleComponentCreated);\n useListener(\n layout.eventHub,\n PanelEvent.TITLE_CHANGED,\n handleLayoutStateChanged\n );\n useListener(layout, 'reactChildrenChanged', handleReactChildrenChange);\n\n const previousLayoutConfig = usePrevious(layoutConfig);\n useEffect(\n function loadNewConfig() {\n if (\n previousLayoutConfig !== layoutConfig &&\n layoutConfig !== lastConfig\n ) {\n log.debug('Setting new layout content...');\n const content = LayoutUtils.hydrateLayoutConfig(\n layoutConfig,\n hydrateComponent\n );\n // Remove the old layout before add the new one\n while (layout.root.contentItems.length > 0) {\n layout.root.contentItems[0].remove();\n }\n\n // Add the new content. It is usally just one item from the root\n for (let i = 0; i < content.length; i += 1) {\n layout.root.addChild(content[i]);\n }\n\n setIsDashboardEmpty(layout.root.contentItems.length === 0);\n }\n },\n [\n hydrateComponent,\n layout,\n layoutConfig,\n lastConfig,\n panelManager,\n previousLayoutConfig,\n ]\n );\n\n // This should be the last hook called in this component\n // Ensures it runs after any other effects on mount\n // Fire only once after the layout is mounted\n // This should ensure DashboardPlugins have been mounted\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => onLayoutInitialized(), []);\n\n return (\n <>\n {isDashboardEmpty && emptyDashboard}\n {layoutChildren}\n {React.Children.map(children, child =>\n child != null ? (\n // Have fallback be an empty array so that we don't show the error message over entire app\n // Look into using toast message in the future\n <ErrorBoundary fallback={[]}>\n {React.cloneElement(child as ReactElement, {\n id,\n layout,\n panelManager,\n registerComponent,\n })}\n </ErrorBoundary>\n ) : null\n )}\n </>\n );\n}\n\nexport default DashboardLayout;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DashboardLayout.js","names":["React","useCallback","useEffect","useMemo","useState","Log","usePrevious","useThrottledCallback","ErrorBoundary","useDispatch","useSelector","PanelManager","PanelErrorBoundary","LayoutUtils","isReactComponentConfig","canHaveRef","dehydrate","dehydrateDefault","hydrate","hydrateDefault","PanelEvent","useListener","getDashboardData","updateDashboardData","DashboardPanelWrapper","PanelIdContext","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","EMPTY_OBJECT","Object","freeze","DEFAULT_LAYOUT_CONFIG","DEFAULT_CALLBACK","undefined","STATE_CHANGE_THROTTLE_MS","FALLBACK_CALLBACK","props","DashboardLayout","_ref","_useSelector","_closed","id","children","emptyDashboard","className","layout","layoutConfig","onLayoutChange","onLayoutInitialized","panelWrapper","dispatch","data","state","isDashboardEmpty","setIsDashboardEmpty","isItemDragging","setIsItemDragging","lastConfig","setLastConfig","initialClosedPanels","closed","layoutChildren","setLayoutChildren","getReactChildren","hydrateMap","Map","dehydrateMap","registerComponent","name","componentType","_componentType$displa","componentHydrate","arguments","length","componentDehydrate","debug2","wrappedComponent","ref","CType","PanelWrapperType","hasRef","innerElem","_objectSpread","glContainer","glEventHub","panelId","getIdFromContainer","Provider","value","displayName","concat","cleanup","forwardRef","set","hydrateComponent","_hydrateMap$get","get","dehydrateComponent","config","_dehydrateMap$get","panelManager","_ref2","openedMap","throttledProcessDehydratedLayoutConfig","dehydratedLayoutConfig","hasChanged","isEqual","debug","root","contentItems","flushOnUnmount","flush","handleLayoutStateChanged","glConfig","toConfig","contentConfig","content","dehydrateLayoutConfig","handleLayoutItemPickedUp","component","componentId","eventHub","emit","DRAGGING","handleLayoutItemDropped","DROPPED","handleComponentCreated","item","element","cssComponent","replace","toLowerCase","cssClass","addClass","handleReactChildrenChange","TITLE_CHANGED","previousLayoutConfig","loadNewConfig","hydrateLayoutConfig","remove","i","addChild","Children","map","child","fallback","cloneElement"],"sources":["../src/DashboardLayout.tsx"],"sourcesContent":["import React, {\n type ComponentType,\n type ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport type {\n Container,\n ItemConfig,\n ReactComponentConfig,\n AbstractContentItem,\n} from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport { usePrevious, useThrottledCallback } from '@deephaven/react-hooks';\nimport { ErrorBoundary } from '@deephaven/components';\nimport { type RootState } from '@deephaven/redux';\nimport { useDispatch, useSelector } from 'react-redux';\nimport PanelManager, { type ClosedPanels } from './PanelManager';\nimport PanelErrorBoundary from './PanelErrorBoundary';\nimport LayoutUtils, { isReactComponentConfig } from './layout/LayoutUtils';\nimport {\n canHaveRef,\n dehydrate as dehydrateDefault,\n hydrate as hydrateDefault,\n} from './DashboardUtils';\nimport PanelEvent from './PanelEvent';\nimport { useListener } from './layout';\nimport { getDashboardData, updateDashboardData } from './redux';\nimport {\n type PanelConfig,\n type PanelComponentType,\n type PanelDehydrateFunction,\n type PanelHydrateFunction,\n type PanelProps,\n type DehydratedPanelProps,\n} from './DashboardPlugin';\nimport DashboardPanelWrapper from './DashboardPanelWrapper';\nimport { PanelIdContext } from './usePanelId';\n\nexport type DashboardLayoutConfig = ItemConfig[];\n\nconst log = Log.module('DashboardLayout');\n\nconst EMPTY_OBJECT = Object.freeze({});\n\nconst DEFAULT_LAYOUT_CONFIG: DashboardLayoutConfig = [];\n\nconst DEFAULT_CALLBACK = (): void => undefined;\n\nconst STATE_CHANGE_THROTTLE_MS = 1000;\n\n// If a component isn't registered, just pass through the props so they are saved if a plugin is loaded later\nconst FALLBACK_CALLBACK = <P,>(props: P): P => props;\n\ntype DashboardData = {\n closed?: ClosedPanels;\n};\n\ntype DashboardLayoutProps = React.PropsWithChildren<{\n id: string;\n\n // Default hydrate/dehydration functions\n hydrate?: PanelHydrateFunction;\n dehydrate?: PanelDehydrateFunction;\n layout: GoldenLayout;\n layoutConfig?: DashboardLayoutConfig;\n onLayoutChange?: (dehydratedLayout: DashboardLayoutConfig) => void;\n onLayoutInitialized?: () => void;\n data?: DashboardData;\n emptyDashboard?: React.ReactNode;\n\n /** Component to wrap each panel with */\n panelWrapper?: ComponentType<React.PropsWithChildren<PanelProps>>;\n}>;\n\n/**\n * DashboardLayout component. Handles hydrating, dehydrating components, listening for dragging panels.\n */\nexport function DashboardLayout({\n id,\n children,\n emptyDashboard = <div className=\"dashboard-empty\">Dashboard is empty.</div>,\n layout,\n layoutConfig = DEFAULT_LAYOUT_CONFIG,\n onLayoutChange = DEFAULT_CALLBACK,\n onLayoutInitialized = DEFAULT_CALLBACK,\n hydrate = hydrateDefault,\n dehydrate = dehydrateDefault,\n panelWrapper,\n}: DashboardLayoutProps): JSX.Element {\n const dispatch = useDispatch();\n const data =\n useSelector<RootState>(state => getDashboardData(state, id)) ??\n EMPTY_OBJECT;\n\n const [isDashboardEmpty, setIsDashboardEmpty] = useState(false);\n const [isItemDragging, setIsItemDragging] = useState(false);\n const [lastConfig, setLastConfig] = useState<DashboardLayoutConfig>();\n const [initialClosedPanels] = useState<ReactComponentConfig[] | undefined>(\n (data as DashboardData)?.closed ?? []\n );\n const [layoutChildren, setLayoutChildren] = useState(\n layout.getReactChildren()\n );\n\n const hydrateMap = useMemo(() => new Map<string, PanelHydrateFunction>(), []);\n const dehydrateMap = useMemo(\n () => new Map<string, PanelDehydrateFunction>(),\n []\n );\n const registerComponent = useCallback(\n (\n name: string,\n componentType: PanelComponentType,\n componentHydrate = hydrate,\n componentDehydrate = dehydrate\n ) => {\n log.debug2(\n 'registerComponent',\n name,\n componentType,\n componentHydrate,\n componentDehydrate\n );\n\n function wrappedComponent(\n props: PanelProps,\n ref: React.Ref<unknown>\n ): JSX.Element {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const CType = componentType as any;\n const PanelWrapperType = panelWrapper;\n\n /**\n * The ref is used to detect changes to class component state so we\n * can track changes to panelState. We should opt for more explicit\n * state changes in the future and in functional components.\n */\n const hasRef = canHaveRef(CType);\n\n const innerElem = hasRef ? (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <CType {...props} ref={ref} />\n ) : (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <CType {...props} />\n );\n\n // Props supplied by GoldenLayout\n const { glContainer, glEventHub } = props;\n const panelId = LayoutUtils.getIdFromContainer(glContainer);\n return (\n <PanelErrorBoundary glContainer={glContainer} glEventHub={glEventHub}>\n <PanelIdContext.Provider value={panelId as string | null}>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <DashboardPanelWrapper {...props}>\n {PanelWrapperType == null ? (\n innerElem\n ) : (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <PanelWrapperType {...props}>{innerElem}</PanelWrapperType>\n )}\n </DashboardPanelWrapper>\n </PanelIdContext.Provider>\n </PanelErrorBoundary>\n );\n }\n\n wrappedComponent.displayName = `DashboardWrapper(${\n componentType.displayName ?? name\n })`;\n\n const cleanup = layout.registerComponent(\n name,\n React.forwardRef(wrappedComponent)\n );\n hydrateMap.set(name, componentHydrate);\n dehydrateMap.set(name, componentDehydrate);\n return cleanup;\n },\n [hydrate, dehydrate, hydrateMap, dehydrateMap, layout, panelWrapper]\n );\n const hydrateComponent = useCallback(\n (name: string, props: DehydratedPanelProps) =>\n (hydrateMap.get(name) ?? (FALLBACK_CALLBACK as PanelHydrateFunction))(\n props,\n id\n ),\n [hydrateMap, id]\n );\n const dehydrateComponent = useCallback(\n (name: string, config: PanelConfig) =>\n (dehydrateMap.get(name) ?? (FALLBACK_CALLBACK as PanelDehydrateFunction))(\n config,\n id\n ),\n [dehydrateMap, id]\n );\n const panelManager = useMemo(\n () =>\n new PanelManager(\n layout,\n hydrateComponent,\n dehydrateComponent,\n new Map(),\n initialClosedPanels,\n ({ closed, openedMap }) => {\n dispatch(updateDashboardData(id, { closed, openedMap }));\n }\n ),\n [\n dehydrateComponent,\n dispatch,\n hydrateComponent,\n id,\n initialClosedPanels,\n layout,\n ]\n );\n\n // Throttle the calls so that we don't flood comparing these layouts\n const throttledProcessDehydratedLayoutConfig = useThrottledCallback(\n (dehydratedLayoutConfig: DashboardLayoutConfig) => {\n const hasChanged =\n lastConfig == null ||\n !LayoutUtils.isEqual(lastConfig, dehydratedLayoutConfig);\n\n log.debug('handleLayoutStateChanged', hasChanged, dehydratedLayoutConfig);\n\n if (hasChanged) {\n log.debug(\n 'Layout config has changed',\n 'lastConfig',\n lastConfig,\n 'dehydratedLayoutConfig',\n dehydratedLayoutConfig\n );\n setIsDashboardEmpty(layout.root.contentItems.length === 0);\n\n setLastConfig(dehydratedLayoutConfig);\n\n onLayoutChange(dehydratedLayoutConfig);\n\n setLayoutChildren(layout.getReactChildren());\n }\n },\n STATE_CHANGE_THROTTLE_MS,\n { flushOnUnmount: true }\n );\n\n useEffect(\n () => () => throttledProcessDehydratedLayoutConfig.flush(),\n [throttledProcessDehydratedLayoutConfig]\n );\n\n const handleLayoutStateChanged = useCallback(() => {\n // we don't want to emit stateChanges that happen during item drags or else\n // we risk the last saved state being one without that panel in the layout entirely\n if (isItemDragging) return;\n\n const glConfig = layout.toConfig();\n const contentConfig = glConfig.content;\n const dehydratedLayoutConfig = LayoutUtils.dehydrateLayoutConfig(\n contentConfig,\n dehydrateComponent\n );\n throttledProcessDehydratedLayoutConfig(dehydratedLayoutConfig);\n }, [\n dehydrateComponent,\n isItemDragging,\n layout,\n throttledProcessDehydratedLayoutConfig,\n ]);\n\n const handleLayoutItemPickedUp = useCallback(\n (component: Container) => {\n const componentId = LayoutUtils.getIdFromContainer(component);\n layout.eventHub.emit(PanelEvent.DRAGGING, componentId);\n setIsItemDragging(true);\n },\n [layout.eventHub]\n );\n\n const handleLayoutItemDropped = useCallback(\n (component: Container) => {\n const componentId = LayoutUtils.getIdFromContainer(component);\n layout.eventHub.emit(PanelEvent.DROPPED, componentId);\n setIsItemDragging(false);\n },\n [layout.eventHub]\n );\n\n const handleComponentCreated = useCallback((item: AbstractContentItem) => {\n log.debug2('handleComponentCreated', item);\n\n if (\n item == null ||\n item.config == null ||\n !isReactComponentConfig(item.config) ||\n item.config.component == null ||\n item.element == null\n ) {\n return;\n }\n\n const cssComponent = item.config.component\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase();\n const cssClass = `${cssComponent}-component`;\n item.element.addClass(cssClass);\n }, []);\n\n const handleReactChildrenChange = useCallback(() => {\n setLayoutChildren(layout.getReactChildren());\n }, [layout]);\n\n useListener(layout, 'stateChanged', handleLayoutStateChanged);\n useListener(layout, 'itemPickedUp', handleLayoutItemPickedUp);\n useListener(layout, 'itemDropped', handleLayoutItemDropped);\n useListener(layout, 'componentCreated', handleComponentCreated);\n useListener(\n layout.eventHub,\n PanelEvent.TITLE_CHANGED,\n handleLayoutStateChanged\n );\n useListener(layout, 'reactChildrenChanged', handleReactChildrenChange);\n\n const previousLayoutConfig = usePrevious(layoutConfig);\n useEffect(\n function loadNewConfig() {\n if (\n previousLayoutConfig !== layoutConfig &&\n layoutConfig !== lastConfig\n ) {\n log.debug(\n 'loadNewConfig effect triggered. previousLayoutConfig',\n previousLayoutConfig,\n 'layoutConfig',\n layoutConfig,\n 'lastConfig',\n lastConfig\n );\n\n log.debug('Setting new layout content...');\n const content = LayoutUtils.hydrateLayoutConfig(\n layoutConfig,\n hydrateComponent\n );\n // Remove the old layout before add the new one\n while (layout.root.contentItems.length > 0) {\n layout.root.contentItems[0].remove();\n }\n\n // Add the new content. It is usally just one item from the root\n for (let i = 0; i < content.length; i += 1) {\n layout.root.addChild(content[i]);\n }\n\n setIsDashboardEmpty(layout.root.contentItems.length === 0);\n }\n },\n [\n hydrateComponent,\n layout,\n layoutConfig,\n lastConfig,\n panelManager,\n previousLayoutConfig,\n ]\n );\n\n // This should be the last hook called in this component\n // Ensures it runs after any other effects on mount\n // Fire only once after the layout is mounted\n // This should ensure DashboardPlugins have been mounted\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => onLayoutInitialized(), []);\n\n return (\n <>\n {isDashboardEmpty && emptyDashboard}\n {layoutChildren}\n {React.Children.map(children, child =>\n child != null ? (\n // Have fallback be an empty array so that we don't show the error message over entire app\n // Look into using toast message in the future\n <ErrorBoundary fallback={[]}>\n {React.cloneElement(child as ReactElement, {\n id,\n layout,\n panelManager,\n registerComponent,\n })}\n </ErrorBoundary>\n ) : null\n )}\n </>\n );\n}\n\nexport default DashboardLayout;\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/dashboard",
3
- "version": "1.16.0",
3
+ "version": "1.16.1",
4
4
  "description": "Deephaven Dashboard",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -53,5 +53,5 @@
53
53
  "publishConfig": {
54
54
  "access": "public"
55
55
  },
56
- "gitHead": "33a489fbfa08dd8000983267ddae69217db90224"
56
+ "gitHead": "58ff25e1b73eea828da9412e83a0c5be1d889843"
57
57
  }