@deephaven/dashboard 1.22.1 → 1.22.2-alpha-pivot-builder.0
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/BasePanel.js +48 -75
- package/dist/BasePanel.js.map +1 -1
- package/dist/Dashboard.js +32 -16
- package/dist/Dashboard.js.map +1 -1
- package/dist/DashboardEvents.js +10 -10
- package/dist/DashboardEvents.js.map +1 -1
- package/dist/DashboardLayout.js +42 -25
- package/dist/DashboardLayout.js.map +1 -1
- package/dist/DashboardPanelWrapper.js +19 -14
- package/dist/DashboardPanelWrapper.js.map +1 -1
- package/dist/DashboardUtils.js +6 -13
- package/dist/DashboardUtils.js.map +1 -1
- package/dist/LazyDashboard.js +13 -6
- package/dist/LazyDashboard.js.map +1 -1
- package/dist/NavigationEvent.js +20 -20
- package/dist/NavigationEvent.js.map +1 -1
- package/dist/PanelContextMenu.js +13 -24
- package/dist/PanelContextMenu.js.map +1 -1
- package/dist/PanelErrorBoundary.js +5 -10
- package/dist/PanelErrorBoundary.js.map +1 -1
- package/dist/PanelEvent.js +10 -11
- package/dist/PanelEvent.js.map +1 -1
- package/dist/PanelManager.js +10 -28
- package/dist/PanelManager.js.map +1 -1
- package/dist/PersistentStateContext.js +22 -19
- package/dist/PersistentStateContext.js.map +1 -1
- package/dist/RenameDialog.js +17 -34
- package/dist/RenameDialog.js.map +1 -1
- package/dist/layout/LayoutUtils.js +28 -37
- package/dist/layout/LayoutUtils.js.map +1 -1
- package/dist/layout/useDashboardPanel.js +16 -25
- package/dist/layout/useDashboardPanel.js.map +1 -1
- package/dist/redux/index.js +9 -1
- package/dist/redux/index.js.map +1 -1
- package/dist/useFiber.js +10 -4
- package/dist/useFiber.js.map +1 -1
- package/dist/usePersistentState.js +25 -16
- package/dist/usePersistentState.js.map +1 -1
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardLayout.js","names":["React","useCallback","useEffect","useMemo","useRef","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","lastConfigRef","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","previousConfig","current","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 useRef,\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 // `lastConfig` is intentionally a ref rather than state so it can be written synchronously inside the throttled body before `onLayoutChange` runs.\n // This guarantees any subsequent render triggered by the parent observes the latest value, regardless of how that render was scheduled (see DH-21843).\n const lastConfigRef = useRef<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 previousConfig = lastConfigRef.current;\n const hasChanged =\n previousConfig == null ||\n !LayoutUtils.isEqual(previousConfig, dehydratedLayoutConfig);\n\n log.debug('handleLayoutStateChanged', hasChanged, dehydratedLayoutConfig);\n\n if (hasChanged) {\n log.debug(\n 'Layout config has changed',\n 'lastConfig',\n previousConfig,\n 'dehydratedLayoutConfig',\n dehydratedLayoutConfig\n );\n setIsDashboardEmpty(layout.root.contentItems.length === 0);\n\n // Update the ref synchronously before calling `onLayoutChange` so\n // that any subsequent render triggered by the parent observes the\n // latest value, regardless of how that render was scheduled.\n lastConfigRef.current = 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 !== lastConfigRef.current\n ) {\n log.debug(\n 'loadNewConfig effect triggered. previousLayoutConfig',\n previousLayoutConfig,\n 'layoutConfig',\n layoutConfig,\n 'lastConfig',\n lastConfigRef.current\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 [hydrateComponent, layout, layoutConfig, panelManager, previousLayoutConfig]\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","useRef","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","_ref$emptyDashboard","emptyDashboard","className","layout","_ref$layoutConfig","layoutConfig","_ref$onLayoutChange","onLayoutChange","_ref$onLayoutInitiali","onLayoutInitialized","_ref$hydrate","_ref$dehydrate","panelWrapper","dispatch","data","state","_useState","_useState2","_slicedToArray","isDashboardEmpty","setIsDashboardEmpty","_useState3","_useState4","isItemDragging","setIsItemDragging","lastConfigRef","_useState5","closed","_useState6","initialClosedPanels","_useState7","getReactChildren","_useState8","layoutChildren","setLayoutChildren","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","previousConfig","current","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 useRef,\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 // `lastConfig` is intentionally a ref rather than state so it can be written synchronously inside the throttled body before `onLayoutChange` runs.\n // This guarantees any subsequent render triggered by the parent observes the latest value, regardless of how that render was scheduled (see DH-21843).\n const lastConfigRef = useRef<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 previousConfig = lastConfigRef.current;\n const hasChanged =\n previousConfig == null ||\n !LayoutUtils.isEqual(previousConfig, dehydratedLayoutConfig);\n\n log.debug('handleLayoutStateChanged', hasChanged, dehydratedLayoutConfig);\n\n if (hasChanged) {\n log.debug(\n 'Layout config has changed',\n 'lastConfig',\n previousConfig,\n 'dehydratedLayoutConfig',\n dehydratedLayoutConfig\n );\n setIsDashboardEmpty(layout.root.contentItems.length === 0);\n\n // Update the ref synchronously before calling `onLayoutChange` so\n // that any subsequent render triggered by the parent observes the\n // latest value, regardless of how that render was scheduled.\n lastConfigRef.current = 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 !== lastConfigRef.current\n ) {\n log.debug(\n 'loadNewConfig effect triggered. previousLayoutConfig',\n previousLayoutConfig,\n 'layoutConfig',\n layoutConfig,\n 'lastConfig',\n lastConfigRef.current\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 [hydrateComponent, layout, layoutConfig, panelManager, previousLayoutConfig]\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,28 +1,33 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
1
7
|
import { useCallback, useState } from 'react';
|
|
2
8
|
import Log from '@deephaven/log';
|
|
3
9
|
import { PersistentStateProvider } from "./PersistentStateContext.js";
|
|
4
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
11
|
var log = Log.module('DashboardPanelWrapper');
|
|
6
12
|
export function DashboardPanelWrapper(_ref) {
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
children
|
|
10
|
-
} = _ref;
|
|
13
|
+
var glContainer = _ref.glContainer,
|
|
14
|
+
children = _ref.children;
|
|
11
15
|
var handleDataChange = useCallback(data => {
|
|
12
16
|
glContainer.setPersistedState(data);
|
|
13
17
|
}, [glContainer]);
|
|
14
|
-
var
|
|
15
|
-
persistedState
|
|
16
|
-
} = glContainer.getConfig();
|
|
18
|
+
var _glContainer$getConfi = glContainer.getConfig(),
|
|
19
|
+
persistedState = _glContainer$getConfi.persistedState;
|
|
17
20
|
|
|
18
21
|
// Use a state initializer so we can warn once if the persisted state is invalid
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
var _useState = useState(() => {
|
|
23
|
+
if (persistedState != null && !Array.isArray(persistedState)) {
|
|
24
|
+
log.warn("Persisted state is type ".concat(typeof persistedState, ". Expected array. Setting to empty array."));
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
return persistedState !== null && persistedState !== void 0 ? persistedState : [];
|
|
28
|
+
}),
|
|
29
|
+
_useState2 = _slicedToArray(_useState, 1),
|
|
30
|
+
initialPersistedState = _useState2[0];
|
|
26
31
|
return /*#__PURE__*/_jsx(PersistentStateProvider, {
|
|
27
32
|
initialState: initialPersistedState,
|
|
28
33
|
onChange: handleDataChange,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPanelWrapper.js","names":["useCallback","useState","Log","PersistentStateProvider","jsx","_jsx","log","module","DashboardPanelWrapper","_ref","glContainer","children","handleDataChange","data","setPersistedState","
|
|
1
|
+
{"version":3,"file":"DashboardPanelWrapper.js","names":["useCallback","useState","Log","PersistentStateProvider","jsx","_jsx","log","module","DashboardPanelWrapper","_ref","glContainer","children","handleDataChange","data","setPersistedState","_glContainer$getConfi","getConfig","persistedState","_useState","Array","isArray","warn","concat","_useState2","_slicedToArray","initialPersistedState","initialState","onChange"],"sources":["../src/DashboardPanelWrapper.tsx"],"sourcesContent":["import { useCallback, useState, type PropsWithChildren } from 'react';\nimport Log from '@deephaven/log';\nimport { PersistentStateProvider } from './PersistentStateContext';\nimport type { PanelProps } from './DashboardPlugin';\n\nconst log = Log.module('DashboardPanelWrapper');\n\nexport function DashboardPanelWrapper({\n glContainer,\n children,\n}: PropsWithChildren<PanelProps>): JSX.Element {\n const handleDataChange = useCallback(\n (data: unknown) => {\n glContainer.setPersistedState(data);\n },\n [glContainer]\n );\n\n const { persistedState } = glContainer.getConfig();\n\n // Use a state initializer so we can warn once if the persisted state is invalid\n const [initialPersistedState] = useState(() => {\n if (persistedState != null && !Array.isArray(persistedState)) {\n log.warn(\n `Persisted state is type ${typeof persistedState}. Expected array. Setting to empty array.`\n );\n return [];\n }\n return persistedState ?? [];\n });\n\n return (\n <PersistentStateProvider\n initialState={initialPersistedState}\n onChange={handleDataChange}\n >\n {children}\n </PersistentStateProvider>\n );\n}\n\nexport default DashboardPanelWrapper;\n"],"mappings":";;;;;;AAAA,SAASA,WAAW,EAAEC,QAAQ,QAAgC,OAAO;AACrE,OAAOC,GAAG,MAAM,gBAAgB;AAAC,SACxBC,uBAAuB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAGhC,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,uBAAuB,CAAC;AAE/C,OAAO,SAASC,qBAAqBA,CAAAC,IAAA,EAGU;EAAA,IAF7CC,WAAW,GAAAD,IAAA,CAAXC,WAAW;IACXC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;EAER,IAAMC,gBAAgB,GAAGZ,WAAW,CACjCa,IAAa,IAAK;IACjBH,WAAW,CAACI,iBAAiB,CAACD,IAAI,CAAC;EACrC,CAAC,EACD,CAACH,WAAW,CACd,CAAC;EAED,IAAAK,qBAAA,GAA2BL,WAAW,CAACM,SAAS,CAAC,CAAC;IAA1CC,cAAc,GAAAF,qBAAA,CAAdE,cAAc;;EAEtB;EACA,IAAAC,SAAA,GAAgCjB,QAAQ,CAAC,MAAM;MAC7C,IAAIgB,cAAc,IAAI,IAAI,IAAI,CAACE,KAAK,CAACC,OAAO,CAACH,cAAc,CAAC,EAAE;QAC5DX,GAAG,CAACe,IAAI,4BAAAC,MAAA,CACqB,OAAOL,cAAc,8CAClD,CAAC;QACD,OAAO,EAAE;MACX;MACA,OAAOA,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,EAAE;IAC7B,CAAC,CAAC;IAAAM,UAAA,GAAAC,cAAA,CAAAN,SAAA;IARKO,qBAAqB,GAAAF,UAAA;EAU5B,oBACElB,IAAA,CAACF,uBAAuB;IACtBuB,YAAY,EAAED,qBAAsB;IACpCE,QAAQ,EAAEf,gBAAiB;IAAAD,QAAA,EAE1BA;EAAQ,CACc,CAAC;AAE9B;AAEA,eAAeH,qBAAqB","ignoreList":[]}
|
package/dist/DashboardUtils.js
CHANGED
|
@@ -13,20 +13,13 @@ export { canHaveRef } from '@deephaven/components';
|
|
|
13
13
|
* @returns The dehydrated PanelConfig
|
|
14
14
|
*/
|
|
15
15
|
export function dehydrate(config) {
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
metadata
|
|
22
|
-
} = props;
|
|
23
|
-
var {
|
|
24
|
-
panelState = null
|
|
25
|
-
} = props;
|
|
16
|
+
var props = config.props,
|
|
17
|
+
componentState = config.componentState;
|
|
18
|
+
var metadata = props.metadata;
|
|
19
|
+
var _props$panelState = props.panelState,
|
|
20
|
+
panelState = _props$panelState === void 0 ? null : _props$panelState;
|
|
26
21
|
if (componentState) {
|
|
27
|
-
|
|
28
|
-
panelState
|
|
29
|
-
} = componentState);
|
|
22
|
+
panelState = componentState.panelState;
|
|
30
23
|
}
|
|
31
24
|
var newProps = {};
|
|
32
25
|
if (metadata != null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardUtils.js","names":["canHaveRef","dehydrate","config","props","componentState","metadata","panelState","newProps","_objectSpread","type","hydrate","localDashboardId"],"sources":["../src/DashboardUtils.tsx"],"sourcesContent":["import {\n type DehydratedPanelConfig,\n type PanelConfig,\n type DehydratedPanelProps,\n type LocalDashboardProps,\n} from './DashboardPlugin';\n\nexport { canHaveRef } from '@deephaven/components';\n\n/**\n * Dehydrate an existing panel to allow it to be serialized/saved.\n * Just takes what's in the panels `metadata` in the props and `panelState` in\n * the component state, assumes it's serializable, and saves it.\n * @param config The panel config to dehydrate\n * @returns The dehydrated PanelConfig\n */\nexport function dehydrate(config: PanelConfig): DehydratedPanelConfig {\n const { props, componentState } = config;\n const { metadata } = props;\n let { panelState = null } = props;\n if (componentState) {\n ({ panelState } = componentState);\n }\n const newProps: Record<string, unknown> = {};\n if (metadata != null) {\n newProps.metadata = metadata;\n }\n if (panelState != null) {\n newProps.panelState = panelState;\n }\n\n return {\n ...config,\n componentState: null,\n props: newProps,\n type: 'react-component',\n };\n}\n\n/**\n * Default hydration function. Just applies the dashboard ID. When used with dehydrate above,\n * the panels state will be stored in `panelState` prop.\n * @param props Panel props to hydrate\n * @param localDashboardId The local dashboard ID to hydrate the panel with\n * @returns The hydrated panel props\n */\nexport function hydrate<P extends DehydratedPanelProps>(\n props: P,\n localDashboardId: string\n): P & LocalDashboardProps {\n return {\n ...props,\n localDashboardId,\n };\n}\n\nexport default {\n dehydrate,\n hydrate,\n};\n"],"mappings":";;;;;AAOA,SAASA,UAAU,QAAQ,uBAAuB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACC,MAAmB,EAAyB;EACpE,
|
|
1
|
+
{"version":3,"file":"DashboardUtils.js","names":["canHaveRef","dehydrate","config","props","componentState","metadata","_props$panelState","panelState","newProps","_objectSpread","type","hydrate","localDashboardId"],"sources":["../src/DashboardUtils.tsx"],"sourcesContent":["import {\n type DehydratedPanelConfig,\n type PanelConfig,\n type DehydratedPanelProps,\n type LocalDashboardProps,\n} from './DashboardPlugin';\n\nexport { canHaveRef } from '@deephaven/components';\n\n/**\n * Dehydrate an existing panel to allow it to be serialized/saved.\n * Just takes what's in the panels `metadata` in the props and `panelState` in\n * the component state, assumes it's serializable, and saves it.\n * @param config The panel config to dehydrate\n * @returns The dehydrated PanelConfig\n */\nexport function dehydrate(config: PanelConfig): DehydratedPanelConfig {\n const { props, componentState } = config;\n const { metadata } = props;\n let { panelState = null } = props;\n if (componentState) {\n ({ panelState } = componentState);\n }\n const newProps: Record<string, unknown> = {};\n if (metadata != null) {\n newProps.metadata = metadata;\n }\n if (panelState != null) {\n newProps.panelState = panelState;\n }\n\n return {\n ...config,\n componentState: null,\n props: newProps,\n type: 'react-component',\n };\n}\n\n/**\n * Default hydration function. Just applies the dashboard ID. When used with dehydrate above,\n * the panels state will be stored in `panelState` prop.\n * @param props Panel props to hydrate\n * @param localDashboardId The local dashboard ID to hydrate the panel with\n * @returns The hydrated panel props\n */\nexport function hydrate<P extends DehydratedPanelProps>(\n props: P,\n localDashboardId: string\n): P & LocalDashboardProps {\n return {\n ...props,\n localDashboardId,\n };\n}\n\nexport default {\n dehydrate,\n hydrate,\n};\n"],"mappings":";;;;;AAOA,SAASA,UAAU,QAAQ,uBAAuB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACC,MAAmB,EAAyB;EACpE,IAAQC,KAAK,GAAqBD,MAAM,CAAhCC,KAAK;IAAEC,cAAc,GAAKF,MAAM,CAAzBE,cAAc;EAC7B,IAAQC,QAAQ,GAAKF,KAAK,CAAlBE,QAAQ;EAChB,IAAAC,iBAAA,GAA4BH,KAAK,CAA3BI,UAAU;IAAVA,UAAU,GAAAD,iBAAA,cAAG,IAAI,GAAAA,iBAAA;EACvB,IAAIF,cAAc,EAAE;IACfG,UAAU,GAAKH,cAAc,CAA7BG,UAAU;EACf;EACA,IAAMC,QAAiC,GAAG,CAAC,CAAC;EAC5C,IAAIH,QAAQ,IAAI,IAAI,EAAE;IACpBG,QAAQ,CAACH,QAAQ,GAAGA,QAAQ;EAC9B;EACA,IAAIE,UAAU,IAAI,IAAI,EAAE;IACtBC,QAAQ,CAACD,UAAU,GAAGA,UAAU;EAClC;EAEA,OAAAE,aAAA,CAAAA,aAAA,KACKP,MAAM;IACTE,cAAc,EAAE,IAAI;IACpBD,KAAK,EAAEK,QAAQ;IACfE,IAAI,EAAE;EAAiB;AAE3B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CACrBR,KAAQ,EACRS,gBAAwB,EACC;EACzB,OAAAH,aAAA,CAAAA,aAAA,KACKN,KAAK;IACRS;EAAgB;AAEpB;AAEA,eAAe;EACbX,SAAS;EACTU;AACF,CAAC","ignoreList":[]}
|
package/dist/LazyDashboard.js
CHANGED
|
@@ -4,6 +4,12 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
4
4
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
5
5
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
6
6
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
8
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
9
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
10
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
11
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
12
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
7
13
|
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
8
14
|
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
9
15
|
import React, { useCallback, useState } from 'react';
|
|
@@ -15,13 +21,14 @@ import { updateDashboardData } from "./redux/index.js";
|
|
|
15
21
|
import { DEFAULT_DASHBOARD_ID } from "./DashboardConstants.js";
|
|
16
22
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
17
23
|
export function LazyDashboard(_ref) {
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
plugins
|
|
22
|
-
} = _ref,
|
|
24
|
+
var id = _ref.id,
|
|
25
|
+
isActive = _ref.isActive,
|
|
26
|
+
plugins = _ref.plugins,
|
|
23
27
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
24
|
-
var
|
|
28
|
+
var _useState = useState(isActive),
|
|
29
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
30
|
+
isLoaded = _useState2[0],
|
|
31
|
+
setIsLoaded = _useState2[1];
|
|
25
32
|
var dispatch = useDispatch();
|
|
26
33
|
var handleLayoutConfigChange = useCallback(config => {
|
|
27
34
|
// TODO: #1746 Call updateDashboardData for every dashboard
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyDashboard.js","names":["React","useCallback","useState","useDispatch","LoadingOverlay","updateWorkspaceData","Dashboard","updateDashboardData","DEFAULT_DASHBOARD_ID","jsx","_jsx","LazyDashboard","_ref","id","isActive","plugins","rest","_objectWithoutProperties","_excluded","isLoaded","setIsLoaded","dispatch","handleLayoutConfigChange","config","layoutConfig","_objectSpread","onLayoutConfigChange","children"],"sources":["../src/LazyDashboard.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { updateWorkspaceData } from '@deephaven/redux';\nimport { Dashboard, type DashboardProps } from './Dashboard';\nimport { updateDashboardData } from './redux';\nimport { type DashboardLayoutConfig } from './DashboardLayout';\nimport { DEFAULT_DASHBOARD_ID } from './DashboardConstants';\n\nexport interface LazyDashboardProps extends DashboardProps {\n id: string;\n isActive: boolean;\n plugins: JSX.Element[];\n}\n\nexport function LazyDashboard({\n id,\n isActive,\n plugins,\n ...rest\n}: LazyDashboardProps): JSX.Element {\n const [isLoaded, setIsLoaded] = useState(isActive);\n const dispatch = useDispatch();\n\n const handleLayoutConfigChange = useCallback(\n (config?: DashboardLayoutConfig) => {\n // TODO: #1746 Call updateDashboardData for every dashboard\n // This currently allows the default dashboard to keep its layout since\n // other dashboards are not persistent yet and we read workspaceData\n // for the default dashboard layout\n if (id === DEFAULT_DASHBOARD_ID) {\n dispatch(updateWorkspaceData({ layoutConfig: config }));\n } else {\n dispatch(updateDashboardData(id, { layoutConfig: config }));\n }\n },\n [id, dispatch]\n );\n\n if (!isLoaded && isActive) {\n setIsLoaded(true);\n }\n\n if (!isLoaded) {\n return <LoadingOverlay data-testid=\"lazy-dashboard-loading\" />;\n }\n\n return (\n <Dashboard\n id={id}\n onLayoutConfigChange={handleLayoutConfigChange}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...rest}\n >\n {plugins}\n </Dashboard>\n );\n}\n\nexport default LazyDashboard;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"LazyDashboard.js","names":["React","useCallback","useState","useDispatch","LoadingOverlay","updateWorkspaceData","Dashboard","updateDashboardData","DEFAULT_DASHBOARD_ID","jsx","_jsx","LazyDashboard","_ref","id","isActive","plugins","rest","_objectWithoutProperties","_excluded","_useState","_useState2","_slicedToArray","isLoaded","setIsLoaded","dispatch","handleLayoutConfigChange","config","layoutConfig","_objectSpread","onLayoutConfigChange","children"],"sources":["../src/LazyDashboard.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { updateWorkspaceData } from '@deephaven/redux';\nimport { Dashboard, type DashboardProps } from './Dashboard';\nimport { updateDashboardData } from './redux';\nimport { type DashboardLayoutConfig } from './DashboardLayout';\nimport { DEFAULT_DASHBOARD_ID } from './DashboardConstants';\n\nexport interface LazyDashboardProps extends DashboardProps {\n id: string;\n isActive: boolean;\n plugins: JSX.Element[];\n}\n\nexport function LazyDashboard({\n id,\n isActive,\n plugins,\n ...rest\n}: LazyDashboardProps): JSX.Element {\n const [isLoaded, setIsLoaded] = useState(isActive);\n const dispatch = useDispatch();\n\n const handleLayoutConfigChange = useCallback(\n (config?: DashboardLayoutConfig) => {\n // TODO: #1746 Call updateDashboardData for every dashboard\n // This currently allows the default dashboard to keep its layout since\n // other dashboards are not persistent yet and we read workspaceData\n // for the default dashboard layout\n if (id === DEFAULT_DASHBOARD_ID) {\n dispatch(updateWorkspaceData({ layoutConfig: config }));\n } else {\n dispatch(updateDashboardData(id, { layoutConfig: config }));\n }\n },\n [id, dispatch]\n );\n\n if (!isLoaded && isActive) {\n setIsLoaded(true);\n }\n\n if (!isLoaded) {\n return <LoadingOverlay data-testid=\"lazy-dashboard-loading\" />;\n }\n\n return (\n <Dashboard\n id={id}\n onLayoutConfigChange={handleLayoutConfigChange}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...rest}\n >\n {plugins}\n </Dashboard>\n );\n}\n\nexport default LazyDashboard;\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,WAAW,QAAQ,aAAa;AACzC,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,mBAAmB,QAAQ,kBAAkB;AAAC,SAC9CC,SAAS;AAAA,SACTC,mBAAmB;AAAA,SAEnBC,oBAAoB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAQ7B,OAAO,SAASC,aAAaA,CAAAC,IAAA,EAKO;EAAA,IAJlCC,EAAE,GAAAD,IAAA,CAAFC,EAAE;IACFC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;IACRC,OAAO,GAAAH,IAAA,CAAPG,OAAO;IACJC,IAAI,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAEP,IAAAC,SAAA,GAAgCjB,QAAQ,CAACY,QAAQ,CAAC;IAAAM,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAA3CG,QAAQ,GAAAF,UAAA;IAAEG,WAAW,GAAAH,UAAA;EAC5B,IAAMI,QAAQ,GAAGrB,WAAW,CAAC,CAAC;EAE9B,IAAMsB,wBAAwB,GAAGxB,WAAW,CACzCyB,MAA8B,IAAK;IAClC;IACA;IACA;IACA;IACA,IAAIb,EAAE,KAAKL,oBAAoB,EAAE;MAC/BgB,QAAQ,CAACnB,mBAAmB,CAAC;QAAEsB,YAAY,EAAED;MAAO,CAAC,CAAC,CAAC;IACzD,CAAC,MAAM;MACLF,QAAQ,CAACjB,mBAAmB,CAACM,EAAE,EAAE;QAAEc,YAAY,EAAED;MAAO,CAAC,CAAC,CAAC;IAC7D;EACF,CAAC,EACD,CAACb,EAAE,EAAEW,QAAQ,CACf,CAAC;EAED,IAAI,CAACF,QAAQ,IAAIR,QAAQ,EAAE;IACzBS,WAAW,CAAC,IAAI,CAAC;EACnB;EAEA,IAAI,CAACD,QAAQ,EAAE;IACb,oBAAOZ,IAAA,CAACN,cAAc;MAAC,eAAY;IAAwB,CAAE,CAAC;EAChE;EAEA,oBACEM,IAAA,CAACJ,SAAS,EAAAsB,aAAA,CAAAA,aAAA;IACRf,EAAE,EAAEA,EAAG;IACPgB,oBAAoB,EAAEJ;IACtB;EAAA,GACIT,IAAI;IAAAc,QAAA,EAEPf;EAAO,EACC,CAAC;AAEhB;AAEA,eAAeJ,aAAa","ignoreList":[]}
|
package/dist/NavigationEvent.js
CHANGED
|
@@ -5,25 +5,25 @@ var NavigationEvent = Object.freeze({
|
|
|
5
5
|
CYCLE_TO_NEXT_TAB: 'NavigationEvent.CYCLE_TO_NEXT_TAB',
|
|
6
6
|
CYCLE_TO_PREVIOUS_TAB: 'NavigationEvent.CYCLE_TO_PREVIOUS_TAB'
|
|
7
7
|
});
|
|
8
|
-
|
|
9
|
-
listen
|
|
10
|
-
emit
|
|
11
|
-
useListener
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
listen
|
|
15
|
-
emit
|
|
16
|
-
useListener
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
listen
|
|
20
|
-
emit
|
|
21
|
-
useListener
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
listen
|
|
25
|
-
emit
|
|
26
|
-
useListener
|
|
27
|
-
|
|
8
|
+
var _makeEventFunctions = makeEventFunctions(NavigationEvent.CYCLE_TO_NEXT_STACK),
|
|
9
|
+
listenForCycleToNextStack = _makeEventFunctions.listen,
|
|
10
|
+
emitCycleToNextStack = _makeEventFunctions.emit,
|
|
11
|
+
useCycleToNextStackListener = _makeEventFunctions.useListener;
|
|
12
|
+
export { listenForCycleToNextStack, emitCycleToNextStack, useCycleToNextStackListener };
|
|
13
|
+
var _makeEventFunctions2 = makeEventFunctions(NavigationEvent.CYCLE_TO_PREVIOUS_STACK),
|
|
14
|
+
listenForCycleToPreviousStack = _makeEventFunctions2.listen,
|
|
15
|
+
emitCycleToPreviousStack = _makeEventFunctions2.emit,
|
|
16
|
+
useCycleToPreviousStackListener = _makeEventFunctions2.useListener;
|
|
17
|
+
export { listenForCycleToPreviousStack, emitCycleToPreviousStack, useCycleToPreviousStackListener };
|
|
18
|
+
var _makeEventFunctions3 = makeEventFunctions(NavigationEvent.CYCLE_TO_NEXT_TAB),
|
|
19
|
+
listenForCycleToNextTab = _makeEventFunctions3.listen,
|
|
20
|
+
emitCycleToNextTab = _makeEventFunctions3.emit,
|
|
21
|
+
useCycleToNextTabListener = _makeEventFunctions3.useListener;
|
|
22
|
+
export { listenForCycleToNextTab, emitCycleToNextTab, useCycleToNextTabListener };
|
|
23
|
+
var _makeEventFunctions4 = makeEventFunctions(NavigationEvent.CYCLE_TO_PREVIOUS_TAB),
|
|
24
|
+
listenForCycleToPreviousTab = _makeEventFunctions4.listen,
|
|
25
|
+
emitCycleToPreviousTab = _makeEventFunctions4.emit,
|
|
26
|
+
useCycleToPreviousTabListener = _makeEventFunctions4.useListener;
|
|
27
|
+
export { listenForCycleToPreviousTab, emitCycleToPreviousTab, useCycleToPreviousTabListener };
|
|
28
28
|
export default NavigationEvent;
|
|
29
29
|
//# sourceMappingURL=NavigationEvent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavigationEvent.js","names":["makeEventFunctions","NavigationEvent","Object","freeze","CYCLE_TO_NEXT_STACK","CYCLE_TO_PREVIOUS_STACK","CYCLE_TO_NEXT_TAB","CYCLE_TO_PREVIOUS_TAB","
|
|
1
|
+
{"version":3,"file":"NavigationEvent.js","names":["makeEventFunctions","NavigationEvent","Object","freeze","CYCLE_TO_NEXT_STACK","CYCLE_TO_PREVIOUS_STACK","CYCLE_TO_NEXT_TAB","CYCLE_TO_PREVIOUS_TAB","_makeEventFunctions","listenForCycleToNextStack","listen","emitCycleToNextStack","emit","useCycleToNextStackListener","useListener","_makeEventFunctions2","listenForCycleToPreviousStack","emitCycleToPreviousStack","useCycleToPreviousStackListener","_makeEventFunctions3","listenForCycleToNextTab","emitCycleToNextTab","useCycleToNextTabListener","_makeEventFunctions4","listenForCycleToPreviousTab","emitCycleToPreviousTab","useCycleToPreviousTabListener"],"sources":["../src/NavigationEvent.ts"],"sourcesContent":["import { makeEventFunctions } from '@deephaven/golden-layout';\n\nconst NavigationEvent = Object.freeze({\n CYCLE_TO_NEXT_STACK: 'NavigationEvent.CYCLE_TO_NEXT_STACK',\n CYCLE_TO_PREVIOUS_STACK: 'NavigationEvent.CYCLE_TO_PREVIOUS_STACK',\n CYCLE_TO_NEXT_TAB: 'NavigationEvent.CYCLE_TO_NEXT_TAB',\n CYCLE_TO_PREVIOUS_TAB: 'NavigationEvent.CYCLE_TO_PREVIOUS_TAB',\n});\n\nexport const {\n listen: listenForCycleToNextStack,\n emit: emitCycleToNextStack,\n useListener: useCycleToNextStackListener,\n} = makeEventFunctions(NavigationEvent.CYCLE_TO_NEXT_STACK);\n\nexport const {\n listen: listenForCycleToPreviousStack,\n emit: emitCycleToPreviousStack,\n useListener: useCycleToPreviousStackListener,\n} = makeEventFunctions(NavigationEvent.CYCLE_TO_PREVIOUS_STACK);\n\nexport const {\n listen: listenForCycleToNextTab,\n emit: emitCycleToNextTab,\n useListener: useCycleToNextTabListener,\n} = makeEventFunctions(NavigationEvent.CYCLE_TO_NEXT_TAB);\n\nexport const {\n listen: listenForCycleToPreviousTab,\n emit: emitCycleToPreviousTab,\n useListener: useCycleToPreviousTabListener,\n} = makeEventFunctions(NavigationEvent.CYCLE_TO_PREVIOUS_TAB);\n\nexport default NavigationEvent;\n"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,0BAA0B;AAE7D,IAAMC,eAAe,GAAGC,MAAM,CAACC,MAAM,CAAC;EACpCC,mBAAmB,EAAE,qCAAqC;EAC1DC,uBAAuB,EAAE,yCAAyC;EAClEC,iBAAiB,EAAE,mCAAmC;EACtDC,qBAAqB,EAAE;AACzB,CAAC,CAAC;AAEK,IAAAC,mBAAA,GAIHR,kBAAkB,CAACC,eAAe,CAACG,mBAAmB,CAAC;EAHjDK,yBAAyB,GAAAD,mBAAA,CAAjCE,MAAM;EACAC,oBAAoB,GAAAH,mBAAA,CAA1BI,IAAI;EACSC,2BAA2B,GAAAL,mBAAA,CAAxCM,WAAW;AAC+C,SAAAL,yBAAA,EAAAE,oBAAA,EAAAE,2BAAA;AAErD,IAAAE,oBAAA,GAIHf,kBAAkB,CAACC,eAAe,CAACI,uBAAuB,CAAC;EAHrDW,6BAA6B,GAAAD,oBAAA,CAArCL,MAAM;EACAO,wBAAwB,GAAAF,oBAAA,CAA9BH,IAAI;EACSM,+BAA+B,GAAAH,oBAAA,CAA5CD,WAAW;AACmD,SAAAE,6BAAA,EAAAC,wBAAA,EAAAC,+BAAA;AAEzD,IAAAC,oBAAA,GAIHnB,kBAAkB,CAACC,eAAe,CAACK,iBAAiB,CAAC;EAH/Cc,uBAAuB,GAAAD,oBAAA,CAA/BT,MAAM;EACAW,kBAAkB,GAAAF,oBAAA,CAAxBP,IAAI;EACSU,yBAAyB,GAAAH,oBAAA,CAAtCL,WAAW;AAC6C,SAAAM,uBAAA,EAAAC,kBAAA,EAAAC,yBAAA;AAEnD,IAAAC,oBAAA,GAIHvB,kBAAkB,CAACC,eAAe,CAACM,qBAAqB,CAAC;EAHnDiB,2BAA2B,GAAAD,oBAAA,CAAnCb,MAAM;EACAe,sBAAsB,GAAAF,oBAAA,CAA5BX,IAAI;EACSc,6BAA6B,GAAAH,oBAAA,CAA1CT,WAAW;AACiD,SAAAU,2BAAA,EAAAC,sBAAA,EAAAC,6BAAA;AAE9D,eAAezB,eAAe","ignoreList":[]}
|
package/dist/PanelContextMenu.js
CHANGED
|
@@ -19,15 +19,11 @@ class PanelContextMenu extends PureComponent {
|
|
|
19
19
|
getAllTabs() {
|
|
20
20
|
var _glContainer$tab$head, _glContainer$tab;
|
|
21
21
|
// return a clone of the tabs array, or returns empty array if null
|
|
22
|
-
var
|
|
23
|
-
glContainer
|
|
24
|
-
} = this.props;
|
|
22
|
+
var glContainer = this.props.glContainer;
|
|
25
23
|
return [...((_glContainer$tab$head = glContainer === null || glContainer === void 0 || (_glContainer$tab = glContainer.tab) === null || _glContainer$tab === void 0 || (_glContainer$tab = _glContainer$tab.header) === null || _glContainer$tab === void 0 ? void 0 : _glContainer$tab.tabs) !== null && _glContainer$tab$head !== void 0 ? _glContainer$tab$head : [])];
|
|
26
24
|
}
|
|
27
25
|
handleCloseTab() {
|
|
28
|
-
var
|
|
29
|
-
glContainer
|
|
30
|
-
} = this.props;
|
|
26
|
+
var glContainer = this.props.glContainer;
|
|
31
27
|
glContainer.close();
|
|
32
28
|
}
|
|
33
29
|
handleCloseTabsAll() {
|
|
@@ -41,9 +37,7 @@ class PanelContextMenu extends PureComponent {
|
|
|
41
37
|
});
|
|
42
38
|
}
|
|
43
39
|
handleCloseTabsRight() {
|
|
44
|
-
var
|
|
45
|
-
glContainer
|
|
46
|
-
} = this.props;
|
|
40
|
+
var glContainer = this.props.glContainer;
|
|
47
41
|
var tabs = this.getAllTabs();
|
|
48
42
|
for (var i = tabs.length - 1; i > 0; i -= 1) {
|
|
49
43
|
var _tabs$i$contentItem, _glContainer$tab2, _container2, _tabs$i;
|
|
@@ -56,16 +50,13 @@ class PanelContextMenu extends PureComponent {
|
|
|
56
50
|
}
|
|
57
51
|
}
|
|
58
52
|
handleReopenLast() {
|
|
59
|
-
var
|
|
60
|
-
glContainer,
|
|
61
|
-
glEventHub
|
|
62
|
-
} = this.props;
|
|
53
|
+
var _this$props = this.props,
|
|
54
|
+
glContainer = _this$props.glContainer,
|
|
55
|
+
glEventHub = _this$props.glEventHub;
|
|
63
56
|
glEventHub.emit(PanelEvent.REOPEN_LAST, glContainer);
|
|
64
57
|
}
|
|
65
58
|
canCloseTabsRight() {
|
|
66
|
-
var
|
|
67
|
-
glContainer
|
|
68
|
-
} = this.props;
|
|
59
|
+
var glContainer = this.props.glContainer;
|
|
69
60
|
var tabs = this.getAllTabs();
|
|
70
61
|
var disabled = true;
|
|
71
62
|
for (var i = tabs.length - 1; i > 0; i -= 1) {
|
|
@@ -96,19 +87,17 @@ class PanelContextMenu extends PureComponent {
|
|
|
96
87
|
}
|
|
97
88
|
canReopenLast() {
|
|
98
89
|
var _LayoutUtils$getStack, _workspace$data$close;
|
|
99
|
-
var
|
|
100
|
-
workspace,
|
|
101
|
-
glContainer
|
|
102
|
-
} = this.props;
|
|
90
|
+
var _this$props2 = this.props,
|
|
91
|
+
workspace = _this$props2.workspace,
|
|
92
|
+
glContainer = _this$props2.glContainer;
|
|
103
93
|
var stackId = (_LayoutUtils$getStack = LayoutUtils.getStackForConfig(glContainer.layoutManager.root, glContainer.getConfig())) === null || _LayoutUtils$getStack === void 0 ? void 0 : _LayoutUtils$getStack.config.id;
|
|
104
94
|
return !((_workspace$data$close = workspace.data.closed) !== null && _workspace$data$close !== void 0 && _workspace$data$close.some(panel => panel.parentStackId === stackId));
|
|
105
95
|
}
|
|
106
96
|
render() {
|
|
107
97
|
var _glContainer$tab4;
|
|
108
|
-
var
|
|
109
|
-
additionalActions,
|
|
110
|
-
glContainer
|
|
111
|
-
} = this.props;
|
|
98
|
+
var _this$props3 = this.props,
|
|
99
|
+
additionalActions = _this$props3.additionalActions,
|
|
100
|
+
glContainer = _this$props3.glContainer;
|
|
112
101
|
var contextActions = [...additionalActions];
|
|
113
102
|
contextActions.push(() => ({
|
|
114
103
|
title: 'Re-open closed panel',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelContextMenu.js","names":["React","PureComponent","ContextActions","getWorkspace","setWorkspace","setWorkspaceAction","connect","LayoutUtils","PanelEvent","jsx","_jsx","PanelContextMenu","constructor","props","handleCloseTab","bind","handleCloseTabsRight","handleCloseTabsAll","handleReopenLast","getAllTabs","_glContainer$tab$head","_glContainer$tab","glContainer","tab","header","tabs","close","forEach","_container","contentItem","container","i","length","_tabs$i$contentItem","_glContainer$tab2","_container2","_tabs$i","config","id","glEventHub","emit","REOPEN_LAST","canCloseTabsRight","disabled","_tabs$i$contentItem2","_glContainer$tab3","_tabs$i2","closable","Boolean","isClosable","canCloseAny","_tabs$i3","canReopenLast","_LayoutUtils$getStack","_workspace$data$close","workspace","stackId","getStackForConfig","layoutManager","root","getConfig","data","closed","some","panel","parentStackId","render","_glContainer$tab4","additionalActions","contextActions","push","title","group","groups","medium","action","order","low","undefined","actions","_defineProperty","mapStateToProps","state","ConnectedPanelContextMenu"],"sources":["../src/PanelContextMenu.tsx"],"sourcesContent":["import React, { PureComponent, type ReactElement } from 'react';\nimport {\n ContextActions,\n type ResolvableContextAction,\n} from '@deephaven/components';\nimport type { Container, EventEmitter, Tab } from '@deephaven/golden-layout';\nimport {\n type CustomizableWorkspace,\n type RootState,\n getWorkspace,\n setWorkspace as setWorkspaceAction,\n} from '@deephaven/redux';\nimport { connect } from 'react-redux';\nimport { type ClosedPanel } from './PanelManager';\nimport { LayoutUtils } from './layout';\nimport { PanelEvent } from './PanelEvent';\n\ninterface PanelContextMenuProps {\n additionalActions: ResolvableContextAction[];\n glContainer: Container;\n glEventHub: EventEmitter;\n workspace: CustomizableWorkspace;\n}\n\ninterface HasContainer {\n container: {\n close: () => void;\n };\n}\nclass PanelContextMenu extends PureComponent<\n PanelContextMenuProps,\n Record<string, never>\n> {\n static defaultProps = {\n additionalActions: [],\n };\n\n constructor(props: PanelContextMenuProps) {\n super(props);\n\n this.handleCloseTab = this.handleCloseTab.bind(this);\n this.handleCloseTabsRight = this.handleCloseTabsRight.bind(this);\n this.handleCloseTabsAll = this.handleCloseTabsAll.bind(this);\n this.handleReopenLast = this.handleReopenLast.bind(this);\n }\n\n getAllTabs(): Tab[] {\n // return a clone of the tabs array, or returns empty array if null\n const { glContainer } = this.props;\n return [...(glContainer?.tab?.header?.tabs ?? [])];\n }\n\n handleCloseTab(): void {\n const { glContainer } = this.props;\n glContainer.close();\n }\n\n handleCloseTabsAll(): void {\n const tabs = this.getAllTabs();\n\n // No need to check if isClosable, golden-layout returns\n // false when attempting to close tabs that you can't\n tabs.forEach(\n tab => (tab?.contentItem as unknown as HasContainer).container?.close()\n );\n }\n\n handleCloseTabsRight(): void {\n const { glContainer } = this.props;\n const tabs = this.getAllTabs();\n\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (\n tabs[i].contentItem?.config?.id ===\n glContainer.tab?.contentItem?.config?.id\n ) {\n break; // end when we get back to current id\n }\n\n // eslint-disable-next-line no-unused-expressions\n (tabs[i]?.contentItem as unknown as HasContainer).container?.close();\n }\n }\n\n handleReopenLast(): void {\n const { glContainer, glEventHub } = this.props;\n glEventHub.emit(PanelEvent.REOPEN_LAST, glContainer);\n }\n\n canCloseTabsRight(): boolean {\n const { glContainer } = this.props;\n const tabs = this.getAllTabs();\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (\n tabs[i].contentItem?.config?.id ===\n glContainer.tab?.contentItem?.config?.id\n ) {\n break; // end when we get back to current id\n }\n const closable = Boolean(tabs[i]?.contentItem?.config?.isClosable);\n if (closable) {\n disabled = false;\n break; // end if we find a closeable tab\n }\n }\n return disabled;\n }\n\n canCloseAny(): boolean {\n const tabs = this.getAllTabs();\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n const closable = Boolean(tabs[i]?.contentItem?.config?.isClosable);\n if (closable) {\n disabled = false;\n break;\n }\n }\n return disabled;\n }\n\n canReopenLast(): boolean {\n const { workspace, glContainer } = this.props;\n const stackId = LayoutUtils.getStackForConfig(\n glContainer.layoutManager.root,\n glContainer.getConfig()\n )?.config.id;\n\n return !workspace.data.closed?.some(\n panel => (panel as ClosedPanel).parentStackId === stackId\n );\n }\n\n render(): ReactElement {\n const { additionalActions, glContainer } = this.props;\n\n const contextActions = [...additionalActions];\n\n contextActions.push(() => ({\n title: 'Re-open closed panel',\n group: ContextActions.groups.medium + 2004,\n action: this.handleReopenLast,\n disabled: this.canReopenLast(),\n }));\n\n const closable = glContainer.tab?.contentItem?.config?.isClosable;\n contextActions.push({\n title: 'Close',\n order: 10,\n group: ContextActions.groups.low,\n action: this.handleCloseTab,\n disabled: closable === undefined || !closable,\n });\n\n // pushed as function so the disable check happens on run\n contextActions.push(() => ({\n title: 'Close Tabs to Right',\n order: 20,\n group: ContextActions.groups.low,\n action: this.handleCloseTabsRight,\n disabled: this.canCloseTabsRight(),\n }));\n\n contextActions.push(() => ({\n title: 'Close All',\n order: 30,\n group: ContextActions.groups.low,\n action: this.handleCloseTabsAll,\n disabled: this.canCloseAny(),\n }));\n\n return <ContextActions actions={contextActions} />;\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): {\n workspace: CustomizableWorkspace;\n} => ({\n workspace: getWorkspace(state),\n});\n\nconst ConnectedPanelContextMenu = connect(mapStateToProps, {\n setWorkspace: setWorkspaceAction,\n})(PanelContextMenu);\n\nexport default ConnectedPanelContextMenu;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"PanelContextMenu.js","names":["React","PureComponent","ContextActions","getWorkspace","setWorkspace","setWorkspaceAction","connect","LayoutUtils","PanelEvent","jsx","_jsx","PanelContextMenu","constructor","props","handleCloseTab","bind","handleCloseTabsRight","handleCloseTabsAll","handleReopenLast","getAllTabs","_glContainer$tab$head","_glContainer$tab","glContainer","tab","header","tabs","close","forEach","_container","contentItem","container","i","length","_tabs$i$contentItem","_glContainer$tab2","_container2","_tabs$i","config","id","_this$props","glEventHub","emit","REOPEN_LAST","canCloseTabsRight","disabled","_tabs$i$contentItem2","_glContainer$tab3","_tabs$i2","closable","Boolean","isClosable","canCloseAny","_tabs$i3","canReopenLast","_LayoutUtils$getStack","_workspace$data$close","_this$props2","workspace","stackId","getStackForConfig","layoutManager","root","getConfig","data","closed","some","panel","parentStackId","render","_glContainer$tab4","_this$props3","additionalActions","contextActions","push","title","group","groups","medium","action","order","low","undefined","actions","_defineProperty","mapStateToProps","state","ConnectedPanelContextMenu"],"sources":["../src/PanelContextMenu.tsx"],"sourcesContent":["import React, { PureComponent, type ReactElement } from 'react';\nimport {\n ContextActions,\n type ResolvableContextAction,\n} from '@deephaven/components';\nimport type { Container, EventEmitter, Tab } from '@deephaven/golden-layout';\nimport {\n type CustomizableWorkspace,\n type RootState,\n getWorkspace,\n setWorkspace as setWorkspaceAction,\n} from '@deephaven/redux';\nimport { connect } from 'react-redux';\nimport { type ClosedPanel } from './PanelManager';\nimport { LayoutUtils } from './layout';\nimport { PanelEvent } from './PanelEvent';\n\ninterface PanelContextMenuProps {\n additionalActions: ResolvableContextAction[];\n glContainer: Container;\n glEventHub: EventEmitter;\n workspace: CustomizableWorkspace;\n}\n\ninterface HasContainer {\n container: {\n close: () => void;\n };\n}\nclass PanelContextMenu extends PureComponent<\n PanelContextMenuProps,\n Record<string, never>\n> {\n static defaultProps = {\n additionalActions: [],\n };\n\n constructor(props: PanelContextMenuProps) {\n super(props);\n\n this.handleCloseTab = this.handleCloseTab.bind(this);\n this.handleCloseTabsRight = this.handleCloseTabsRight.bind(this);\n this.handleCloseTabsAll = this.handleCloseTabsAll.bind(this);\n this.handleReopenLast = this.handleReopenLast.bind(this);\n }\n\n getAllTabs(): Tab[] {\n // return a clone of the tabs array, or returns empty array if null\n const { glContainer } = this.props;\n return [...(glContainer?.tab?.header?.tabs ?? [])];\n }\n\n handleCloseTab(): void {\n const { glContainer } = this.props;\n glContainer.close();\n }\n\n handleCloseTabsAll(): void {\n const tabs = this.getAllTabs();\n\n // No need to check if isClosable, golden-layout returns\n // false when attempting to close tabs that you can't\n tabs.forEach(\n tab => (tab?.contentItem as unknown as HasContainer).container?.close()\n );\n }\n\n handleCloseTabsRight(): void {\n const { glContainer } = this.props;\n const tabs = this.getAllTabs();\n\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (\n tabs[i].contentItem?.config?.id ===\n glContainer.tab?.contentItem?.config?.id\n ) {\n break; // end when we get back to current id\n }\n\n // eslint-disable-next-line no-unused-expressions\n (tabs[i]?.contentItem as unknown as HasContainer).container?.close();\n }\n }\n\n handleReopenLast(): void {\n const { glContainer, glEventHub } = this.props;\n glEventHub.emit(PanelEvent.REOPEN_LAST, glContainer);\n }\n\n canCloseTabsRight(): boolean {\n const { glContainer } = this.props;\n const tabs = this.getAllTabs();\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (\n tabs[i].contentItem?.config?.id ===\n glContainer.tab?.contentItem?.config?.id\n ) {\n break; // end when we get back to current id\n }\n const closable = Boolean(tabs[i]?.contentItem?.config?.isClosable);\n if (closable) {\n disabled = false;\n break; // end if we find a closeable tab\n }\n }\n return disabled;\n }\n\n canCloseAny(): boolean {\n const tabs = this.getAllTabs();\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n const closable = Boolean(tabs[i]?.contentItem?.config?.isClosable);\n if (closable) {\n disabled = false;\n break;\n }\n }\n return disabled;\n }\n\n canReopenLast(): boolean {\n const { workspace, glContainer } = this.props;\n const stackId = LayoutUtils.getStackForConfig(\n glContainer.layoutManager.root,\n glContainer.getConfig()\n )?.config.id;\n\n return !workspace.data.closed?.some(\n panel => (panel as ClosedPanel).parentStackId === stackId\n );\n }\n\n render(): ReactElement {\n const { additionalActions, glContainer } = this.props;\n\n const contextActions = [...additionalActions];\n\n contextActions.push(() => ({\n title: 'Re-open closed panel',\n group: ContextActions.groups.medium + 2004,\n action: this.handleReopenLast,\n disabled: this.canReopenLast(),\n }));\n\n const closable = glContainer.tab?.contentItem?.config?.isClosable;\n contextActions.push({\n title: 'Close',\n order: 10,\n group: ContextActions.groups.low,\n action: this.handleCloseTab,\n disabled: closable === undefined || !closable,\n });\n\n // pushed as function so the disable check happens on run\n contextActions.push(() => ({\n title: 'Close Tabs to Right',\n order: 20,\n group: ContextActions.groups.low,\n action: this.handleCloseTabsRight,\n disabled: this.canCloseTabsRight(),\n }));\n\n contextActions.push(() => ({\n title: 'Close All',\n order: 30,\n group: ContextActions.groups.low,\n action: this.handleCloseTabsAll,\n disabled: this.canCloseAny(),\n }));\n\n return <ContextActions actions={contextActions} />;\n }\n}\n\nconst mapStateToProps = (\n state: RootState\n): {\n workspace: CustomizableWorkspace;\n} => ({\n workspace: getWorkspace(state),\n});\n\nconst ConnectedPanelContextMenu = connect(mapStateToProps, {\n setWorkspace: setWorkspaceAction,\n})(PanelContextMenu);\n\nexport default ConnectedPanelContextMenu;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -25,21 +25,16 @@ class PanelErrorBoundary extends Component {
|
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
componentWillUnmount() {
|
|
28
|
-
var
|
|
29
|
-
glContainer,
|
|
30
|
-
glEventHub
|
|
31
|
-
} = this.props;
|
|
28
|
+
var _this$props = this.props,
|
|
29
|
+
glContainer = _this$props.glContainer,
|
|
30
|
+
glEventHub = _this$props.glEventHub;
|
|
32
31
|
var panelId = LayoutUtils.getIdFromContainer(glContainer);
|
|
33
32
|
log.debug('componentWillUnmount', panelId);
|
|
34
33
|
glEventHub.emit(PanelEvent.CLOSED, panelId, glContainer);
|
|
35
34
|
}
|
|
36
35
|
render() {
|
|
37
|
-
var
|
|
38
|
-
|
|
39
|
-
} = this.props;
|
|
40
|
-
var {
|
|
41
|
-
error
|
|
42
|
-
} = this.state;
|
|
36
|
+
var children = this.props.children;
|
|
37
|
+
var error = this.state.error;
|
|
43
38
|
if (error != null) {
|
|
44
39
|
return /*#__PURE__*/_jsx("div", {
|
|
45
40
|
className: "panel-error-boundary",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelErrorBoundary.js","names":["React","Component","LoadingOverlay","Log","PanelEvent","LayoutUtils","jsx","_jsx","log","module","PanelErrorBoundary","constructor","props","state","error","componentDidCatch","setState","componentWillUnmount","glContainer","glEventHub","panelId","getIdFromContainer","debug","emit","CLOSED","render","children","className","errorMessage","concat","isLoading","isLoaded"],"sources":["../src/PanelErrorBoundary.tsx"],"sourcesContent":["import React, { Component, type ReactNode } from 'react';\nimport { LoadingOverlay } from '@deephaven/components';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport PanelEvent from './PanelEvent';\nimport LayoutUtils from './layout/LayoutUtils';\nimport './PanelErrorBoundary.scss';\n\nconst log = Log.module('PanelErrorBoundary');\n\ninterface PanelErrorBoundaryProps {\n children: ReactNode;\n glContainer: Container;\n glEventHub: EventEmitter;\n}\n\ninterface PanelErrorBoundaryState {\n error: Error | null;\n}\n/**\n * Panel wrapper implementing Error Boundary and emitting Closed event.\n * Closed event has to be emitted from the wrapper instead of the panel itself\n * because the panel can get unmounted on errors\n * and we want to differentiate between unmount on error vs panel being intentionally closed.\n */\nclass PanelErrorBoundary extends Component<\n PanelErrorBoundaryProps,\n PanelErrorBoundaryState\n> {\n constructor(props: PanelErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n componentDidCatch(error: Error): void {\n this.setState({ error });\n }\n\n componentWillUnmount(): void {\n const { glContainer, glEventHub } = this.props;\n const panelId = LayoutUtils.getIdFromContainer(glContainer);\n log.debug('componentWillUnmount', panelId);\n glEventHub.emit(PanelEvent.CLOSED, panelId, glContainer);\n }\n\n render(): ReactNode {\n const { children } = this.props;\n const { error } = this.state;\n if (error != null) {\n return (\n <div className=\"panel-error-boundary\">\n <LoadingOverlay\n data-testid=\"panel-error-boundary-loading-error\"\n errorMessage={`${error}`}\n isLoading={false}\n isLoaded={false}\n />\n </div>\n );\n }\n\n // We need to check for undefined children because React will throw an error if we return undefined from a render method\n // Note this behaviour was changed in React 18: https://github.com/reactwg/react-18/discussions/75\n return children ?? null;\n }\n}\n\nexport default PanelErrorBoundary;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAwB,OAAO;AACxD,SAASC,cAAc,QAAQ,uBAAuB;AAEtD,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,UAAU;AAAA,OACVC,WAAW;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAGlB,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,oBAAoB,CAAC;AAW5C;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,kBAAkB,SAAST,SAAS,CAGxC;EACAU,WAAWA,CAACC,KAA8B,EAAE;IAC1C,KAAK,CAACA,KAAK,CAAC;IACZ,IAAI,CAACC,KAAK,GAAG;MAAEC,KAAK,EAAE;IAAK,CAAC;EAC9B;EAEAC,iBAAiBA,CAACD,KAAY,EAAQ;IACpC,IAAI,CAACE,QAAQ,CAAC;MAAEF;IAAM,CAAC,CAAC;EAC1B;EAEAG,oBAAoBA,CAAA,EAAS;IAC3B,
|
|
1
|
+
{"version":3,"file":"PanelErrorBoundary.js","names":["React","Component","LoadingOverlay","Log","PanelEvent","LayoutUtils","jsx","_jsx","log","module","PanelErrorBoundary","constructor","props","state","error","componentDidCatch","setState","componentWillUnmount","_this$props","glContainer","glEventHub","panelId","getIdFromContainer","debug","emit","CLOSED","render","children","className","errorMessage","concat","isLoading","isLoaded"],"sources":["../src/PanelErrorBoundary.tsx"],"sourcesContent":["import React, { Component, type ReactNode } from 'react';\nimport { LoadingOverlay } from '@deephaven/components';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport PanelEvent from './PanelEvent';\nimport LayoutUtils from './layout/LayoutUtils';\nimport './PanelErrorBoundary.scss';\n\nconst log = Log.module('PanelErrorBoundary');\n\ninterface PanelErrorBoundaryProps {\n children: ReactNode;\n glContainer: Container;\n glEventHub: EventEmitter;\n}\n\ninterface PanelErrorBoundaryState {\n error: Error | null;\n}\n/**\n * Panel wrapper implementing Error Boundary and emitting Closed event.\n * Closed event has to be emitted from the wrapper instead of the panel itself\n * because the panel can get unmounted on errors\n * and we want to differentiate between unmount on error vs panel being intentionally closed.\n */\nclass PanelErrorBoundary extends Component<\n PanelErrorBoundaryProps,\n PanelErrorBoundaryState\n> {\n constructor(props: PanelErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n componentDidCatch(error: Error): void {\n this.setState({ error });\n }\n\n componentWillUnmount(): void {\n const { glContainer, glEventHub } = this.props;\n const panelId = LayoutUtils.getIdFromContainer(glContainer);\n log.debug('componentWillUnmount', panelId);\n glEventHub.emit(PanelEvent.CLOSED, panelId, glContainer);\n }\n\n render(): ReactNode {\n const { children } = this.props;\n const { error } = this.state;\n if (error != null) {\n return (\n <div className=\"panel-error-boundary\">\n <LoadingOverlay\n data-testid=\"panel-error-boundary-loading-error\"\n errorMessage={`${error}`}\n isLoading={false}\n isLoaded={false}\n />\n </div>\n );\n }\n\n // We need to check for undefined children because React will throw an error if we return undefined from a render method\n // Note this behaviour was changed in React 18: https://github.com/reactwg/react-18/discussions/75\n return children ?? null;\n }\n}\n\nexport default PanelErrorBoundary;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAwB,OAAO;AACxD,SAASC,cAAc,QAAQ,uBAAuB;AAEtD,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,UAAU;AAAA,OACVC,WAAW;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAGlB,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,oBAAoB,CAAC;AAW5C;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,kBAAkB,SAAST,SAAS,CAGxC;EACAU,WAAWA,CAACC,KAA8B,EAAE;IAC1C,KAAK,CAACA,KAAK,CAAC;IACZ,IAAI,CAACC,KAAK,GAAG;MAAEC,KAAK,EAAE;IAAK,CAAC;EAC9B;EAEAC,iBAAiBA,CAACD,KAAY,EAAQ;IACpC,IAAI,CAACE,QAAQ,CAAC;MAAEF;IAAM,CAAC,CAAC;EAC1B;EAEAG,oBAAoBA,CAAA,EAAS;IAC3B,IAAAC,WAAA,GAAoC,IAAI,CAACN,KAAK;MAAtCO,WAAW,GAAAD,WAAA,CAAXC,WAAW;MAAEC,UAAU,GAAAF,WAAA,CAAVE,UAAU;IAC/B,IAAMC,OAAO,GAAGhB,WAAW,CAACiB,kBAAkB,CAACH,WAAW,CAAC;IAC3DX,GAAG,CAACe,KAAK,CAAC,sBAAsB,EAAEF,OAAO,CAAC;IAC1CD,UAAU,CAACI,IAAI,CAACpB,UAAU,CAACqB,MAAM,EAAEJ,OAAO,EAAEF,WAAW,CAAC;EAC1D;EAEAO,MAAMA,CAAA,EAAc;IAClB,IAAQC,QAAQ,GAAK,IAAI,CAACf,KAAK,CAAvBe,QAAQ;IAChB,IAAQb,KAAK,GAAK,IAAI,CAACD,KAAK,CAApBC,KAAK;IACb,IAAIA,KAAK,IAAI,IAAI,EAAE;MACjB,oBACEP,IAAA;QAAKqB,SAAS,EAAC,sBAAsB;QAAAD,QAAA,eACnCpB,IAAA,CAACL,cAAc;UACb,eAAY,oCAAoC;UAChD2B,YAAY,KAAAC,MAAA,CAAKhB,KAAK,CAAG;UACzBiB,SAAS,EAAE,KAAM;UACjBC,QAAQ,EAAE;QAAM,CACjB;MAAC,CACC,CAAC;IAEV;;IAEA;IACA;IACA,OAAOL,QAAQ,aAARA,QAAQ,cAARA,QAAQ,GAAI,IAAI;EACzB;AACF;AAEA,eAAejB,kBAAkB","ignoreList":[]}
|
package/dist/PanelEvent.js
CHANGED
|
@@ -32,18 +32,17 @@ export var PanelEvent = Object.freeze({
|
|
|
32
32
|
// Panel is dropped
|
|
33
33
|
DROPPED: 'PanelEvent.DROPPED'
|
|
34
34
|
});
|
|
35
|
-
|
|
36
|
-
listen
|
|
37
|
-
emit
|
|
38
|
-
useListener
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
listen
|
|
42
|
-
emit
|
|
43
|
-
useListener
|
|
44
|
-
} = makeEventFunctions(PanelEvent.CLOSE);
|
|
35
|
+
var _makeEventFunctions = makeEventFunctions(PanelEvent.OPEN),
|
|
36
|
+
listenForPanelOpen = _makeEventFunctions.listen,
|
|
37
|
+
emitPanelOpen = _makeEventFunctions.emit,
|
|
38
|
+
usePanelOpenListener = _makeEventFunctions.useListener;
|
|
39
|
+
export { listenForPanelOpen, emitPanelOpen, usePanelOpenListener };
|
|
40
|
+
var _makeEventFunctions2 = makeEventFunctions(PanelEvent.CLOSE),
|
|
41
|
+
listenForPanelClose = _makeEventFunctions2.listen,
|
|
42
|
+
emitPanelClose = _makeEventFunctions2.emit,
|
|
43
|
+
usePanelCloseListener = _makeEventFunctions2.useListener;
|
|
45
44
|
|
|
46
45
|
// TODO (#2147): Add the rest of the event functions here. Need to create the correct types for all of them.
|
|
47
|
-
|
|
46
|
+
export { listenForPanelClose, emitPanelClose, usePanelCloseListener };
|
|
48
47
|
export default PanelEvent;
|
|
49
48
|
//# sourceMappingURL=PanelEvent.js.map
|