@deephaven/dashboard 1.1.2-grid-render-loop.4 → 1.2.1-3-revert-plotly.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.
- package/dist/BasePanel.js.map +1 -1
- package/dist/Dashboard.js.map +1 -1
- package/dist/DashboardConstants.js.map +1 -1
- package/dist/DashboardEvents.js.map +1 -1
- package/dist/DashboardLayout.js.map +1 -1
- package/dist/DashboardPanelWrapper.js.map +1 -1
- package/dist/DashboardPlugin.js.map +1 -1
- package/dist/DashboardUtils.js.map +1 -1
- package/dist/LazyDashboard.js.map +1 -1
- package/dist/NavigationEvent.js.map +1 -1
- package/dist/PanelContextMenu.js.map +1 -1
- package/dist/PanelErrorBoundary.js.map +1 -1
- package/dist/PanelEvent.js.map +1 -1
- package/dist/PanelManager.js.map +1 -1
- package/dist/PanelPlaceholder.js.map +1 -1
- package/dist/RenameDialog.js.map +1 -1
- package/dist/TabEvent.js.map +1 -1
- package/dist/declaration.d.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/GLPropTypes.js.map +1 -1
- package/dist/layout/LayoutManagerContext.js.map +1 -1
- package/dist/layout/LayoutUtils.d.ts +6 -0
- package/dist/layout/LayoutUtils.d.ts.map +1 -1
- package/dist/layout/LayoutUtils.js +22 -0
- package/dist/layout/LayoutUtils.js.map +1 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/useDashboardPanel.js.map +1 -1
- package/dist/layout/useLayoutManager.js.map +1 -1
- package/dist/layout/useListener.js.map +1 -1
- package/dist/layout/usePanelRegistration.js.map +1 -1
- package/dist/redux/actionTypes.js.map +1 -1
- package/dist/redux/actions.js.map +1 -1
- package/dist/redux/hooks.js.map +1 -1
- package/dist/redux/index.js.map +1 -1
- package/dist/redux/reducers/dashboardData.js.map +1 -1
- package/dist/redux/reducers/index.js.map +1 -1
- package/dist/redux/selectors.js.map +1 -1
- package/dist/useDashboardId.js.map +1 -1
- package/dist/useDhId.js.map +1 -1
- package/dist/useFiber.js.map +1 -1
- package/dist/usePanelId.js.map +1 -1
- package/package.json +10 -10
package/dist/BasePanel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasePanel.js","names":["React","PureComponent","ReactDOM","classNames","memoize","ContextActions","createXComponent","LoadingOverlay","Tooltip","assertNotNull","EMPTY_ARRAY","Log","LayoutUtils","PanelEvent","PanelContextMenu","RenameDialog","TabEvent","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","BasePanel","constructor","props","_defineProperty","actions","isClonable","isRenamable","additionalActions","push","getCloneAction","getRenameAction","handleCopyPanel","bind","handleFocus","handleBlur","handleHide","handleResize","handleBeforeShow","handleShow","handleTabBlur","handleTabFocus","handleRenameCancel","handleRenameSubmit","handleShowRenameDialog","handleTabClicked","handleTab","ref","createRef","glContainer","state","title","getTitleFromContainer","showRenameDialog","isWithinPanel","componentDidMount","_this$ref$current","_this$ref$current$par","componentPanel","glEventHub","on","focus","blur","emit","MOUNT","setState","current","parentElement","closest","componentWillUnmount","off","UNMOUNT","tab","getTitleFromTab","forceUpdate","onTab","e","onTabClicked","event","FOCUS","onFocus","onBlur","onHide","_len","arguments","length","args","Array","_key","onResize","_len2","_key2","onBeforeShow","_len3","_key3","onShow","_len4","_key4","onTabBlur","_len5","_key5","onTabFocus","_len6","_key6","newTitle","root","getRootFromContainer","config","getComponentConfigFromContainer","renameComponent","error","cloneConfig","cloneComponent","CLONED","order","group","groups","high","action","medium","render","children","className","renderTabTooltip","errorMessage","isLoaded","isLoading","glTab","onFocusCapture","onBlurCapture","createPortal","getAdditionalActions","isShown","value","itemType","onCancel","onSubmit","interactive","options","placement","popperClassName","element","XBasePanel"],"sources":["../src/BasePanel.tsx"],"sourcesContent":["import React, {\n type FocusEvent,\n type FocusEventHandler,\n PureComponent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport memoize from 'memoize-one';\nimport {\n type ContextAction,\n ContextActions,\n createXComponent,\n LoadingOverlay,\n type ResolvableContextAction,\n Tooltip,\n} from '@deephaven/components';\nimport type {\n Container,\n EventEmitter,\n ReactComponentConfig,\n Tab,\n} from '@deephaven/golden-layout';\nimport { assertNotNull, EMPTY_ARRAY } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport LayoutUtils from './layout/LayoutUtils';\nimport { type PanelComponent } from './DashboardPlugin';\nimport PanelEvent from './PanelEvent';\nimport PanelContextMenu from './PanelContextMenu';\nimport RenameDialog from './RenameDialog';\nimport TabEvent from './TabEvent';\nimport './Panel.scss';\n\nconst log = Log.module('Panel');\n\nexport type BasePanelProps = {\n /**\n * Reference to the component panel.\n * Will wait until it is set before emitting mount/unmount events.\n *\n */\n componentPanel?: PanelComponent;\n children: ReactNode;\n glContainer: Container;\n glEventHub: EventEmitter;\n className?: string;\n onFocus?: FocusEventHandler<HTMLDivElement>;\n onBlur?: FocusEventHandler<HTMLDivElement>;\n onTab?: (tab: Tab) => void;\n onTabClicked?: (e: MouseEvent) => void;\n onHide?: (...args: unknown[]) => void;\n onResize?: (...args: unknown[]) => void;\n onBeforeShow?: (...args: unknown[]) => void;\n onShow?: (...args: unknown[]) => void;\n onTabBlur?: (...args: unknown[]) => void;\n onTabFocus?: (...args: unknown[]) => void;\n renderTabTooltip?: () => ReactNode;\n additionalActions?: ResolvableContextAction[];\n errorMessage?: string;\n isLoading?: boolean;\n isLoaded?: boolean;\n isClonable?: boolean;\n isRenamable?: boolean;\n};\n\ninterface BasePanelState {\n title?: string | null;\n showRenameDialog: boolean;\n isWithinPanel: boolean;\n}\n/**\n * Generic panel component that emits mount/unmount/focus events.\n * Also wires up some triggers for common events:\n * Focus, Resize, Show\n */\nclass BasePanel extends PureComponent<BasePanelProps, BasePanelState> {\n constructor(props: BasePanelProps) {\n super(props);\n\n this.handleCopyPanel = this.handleCopyPanel.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleBlur = this.handleBlur.bind(this);\n this.handleHide = this.handleHide.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleBeforeShow = this.handleBeforeShow.bind(this);\n this.handleShow = this.handleShow.bind(this);\n this.handleTabBlur = this.handleTabBlur.bind(this);\n this.handleTabFocus = this.handleTabFocus.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRenameSubmit = this.handleRenameSubmit.bind(this);\n this.handleShowRenameDialog = this.handleShowRenameDialog.bind(this);\n this.handleTabClicked = this.handleTabClicked.bind(this);\n this.handleTab = this.handleTab.bind(this);\n\n this.ref = React.createRef<HTMLDivElement>();\n\n const { glContainer } = this.props;\n this.state = {\n title: LayoutUtils.getTitleFromContainer(glContainer),\n showRenameDialog: false,\n isWithinPanel: true,\n };\n }\n\n componentDidMount(): void {\n const { componentPanel, glContainer, glEventHub } = this.props;\n\n glContainer.on('resize', this.handleResize);\n glContainer.on('show', this.handleBeforeShow);\n glContainer.on('shown', this.handleShow);\n glContainer.on('hide', this.handleHide);\n glContainer.on('tab', this.handleTab);\n glContainer.on('tabClicked', this.handleTabClicked);\n glEventHub.on(TabEvent.focus, this.handleTabFocus);\n glEventHub.on(TabEvent.blur, this.handleTabBlur);\n\n glEventHub.emit(PanelEvent.MOUNT, componentPanel ?? this);\n\n this.setState({\n isWithinPanel:\n this.ref.current?.parentElement?.closest('.dh-panel') != null,\n });\n }\n\n componentWillUnmount(): void {\n const { componentPanel, glContainer, glEventHub } = this.props;\n\n glContainer.off('resize', this.handleResize);\n glContainer.off('show', this.handleBeforeShow);\n glContainer.off('shown', this.handleShow);\n glContainer.off('hide', this.handleHide);\n glContainer.off('tab', this.handleTab);\n glContainer.off('tabClicked', this.handleTabClicked);\n glEventHub.off(TabEvent.focus, this.handleTabFocus);\n glEventHub.off(TabEvent.blur, this.handleTabBlur);\n\n glEventHub.emit(PanelEvent.UNMOUNT, componentPanel ?? this);\n }\n\n ref: React.RefObject<HTMLDivElement>;\n\n handleTab(tab: Tab): void {\n if (tab != null) {\n this.setState({\n title: LayoutUtils.getTitleFromTab(tab),\n });\n }\n // render after move can happen before tab event, glTab could be null\n // when tab event is emitted, force a render update\n this.forceUpdate();\n\n const { onTab } = this.props;\n onTab?.(tab);\n }\n\n handleTabClicked(e: MouseEvent): void {\n const { onTabClicked } = this.props;\n onTabClicked?.(e);\n }\n\n handleFocus(event: FocusEvent<HTMLDivElement>): void {\n const { componentPanel, glEventHub } = this.props;\n glEventHub.emit(PanelEvent.FOCUS, componentPanel ?? this);\n\n const { onFocus } = this.props;\n onFocus?.(event);\n }\n\n handleBlur(event: FocusEvent<HTMLDivElement>): void {\n const { onBlur } = this.props;\n onBlur?.(event);\n }\n\n handleHide(...args: unknown[]): void {\n const { onHide } = this.props;\n onHide?.(...args);\n }\n\n handleResize(...args: unknown[]): void {\n const { onResize } = this.props;\n onResize?.(...args);\n }\n\n handleBeforeShow(...args: unknown[]): void {\n const { onBeforeShow } = this.props;\n onBeforeShow?.(...args);\n }\n\n handleShow(...args: unknown[]): void {\n const { onShow } = this.props;\n onShow?.(...args);\n }\n\n handleTabBlur(...args: unknown[]): void {\n const { onTabBlur } = this.props;\n onTabBlur?.(...args);\n }\n\n handleTabFocus(...args: unknown[]): void {\n const { onTabFocus } = this.props;\n onTabFocus?.(...args);\n }\n\n handleRenameCancel(): void {\n this.setState({ showRenameDialog: false });\n }\n\n handleShowRenameDialog(): void {\n this.setState({ showRenameDialog: true });\n }\n\n handleRenameSubmit(newTitle: string): void {\n const { glContainer } = this.props;\n this.setState({ showRenameDialog: false, title: newTitle });\n const root = LayoutUtils.getRootFromContainer(glContainer);\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n assertNotNull(config);\n LayoutUtils.renameComponent(root, config, newTitle);\n }\n\n handleCopyPanel(): void {\n const { glContainer, glEventHub } = this.props;\n const root = LayoutUtils.getRootFromContainer(glContainer);\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config == null) {\n log.error('Could not get component config from container', glContainer);\n return;\n }\n const cloneConfig = LayoutUtils.cloneComponent(\n root,\n config as ReactComponentConfig\n );\n if (cloneConfig !== null) {\n glEventHub.emit(PanelEvent.CLONED, this, cloneConfig);\n }\n }\n\n getCloneAction(): ContextAction {\n return {\n title: 'Copy Panel',\n order: 10,\n group: ContextActions.groups.high,\n action: this.handleCopyPanel,\n };\n }\n\n getRenameAction(): ContextAction {\n return {\n title: 'Rename',\n order: 10,\n group: ContextActions.groups.medium,\n action: this.handleShowRenameDialog,\n };\n }\n\n getAdditionalActions = memoize(\n (\n actions: readonly ResolvableContextAction[],\n isClonable: boolean,\n isRenamable: boolean\n ) => {\n const additionalActions = [];\n if (isClonable) {\n additionalActions.push(this.getCloneAction());\n }\n if (isRenamable) {\n additionalActions.push(this.getRenameAction());\n }\n return [...additionalActions, ...actions];\n }\n );\n\n render(): ReactElement {\n const {\n children,\n className,\n renderTabTooltip,\n glContainer,\n glEventHub,\n additionalActions = EMPTY_ARRAY,\n errorMessage,\n isLoaded = true,\n isLoading = false,\n isClonable = false,\n isRenamable = false,\n } = this.props;\n\n const { tab: glTab } = glContainer;\n const { showRenameDialog, title, isWithinPanel } = this.state;\n\n return (\n <div\n className={classNames('h-100 w-100 dh-panel', className)}\n onFocusCapture={this.handleFocus}\n onBlurCapture={this.handleBlur}\n ref={this.ref}\n >\n {children}\n <LoadingOverlay\n errorMessage={errorMessage}\n isLoaded={isLoaded}\n isLoading={isLoading}\n />\n {!isWithinPanel &&\n glTab != null &&\n ReactDOM.createPortal(\n <>\n <PanelContextMenu\n glContainer={glContainer}\n glEventHub={glEventHub}\n additionalActions={this.getAdditionalActions(\n additionalActions,\n isClonable,\n isRenamable\n )}\n />\n {isRenamable && (\n <RenameDialog\n isShown={showRenameDialog}\n value={title}\n itemType=\"Panel\"\n onCancel={this.handleRenameCancel}\n onSubmit={this.handleRenameSubmit}\n />\n )}\n {renderTabTooltip != null && (\n <Tooltip\n interactive\n options={{\n placement: 'bottom',\n }}\n popperClassName=\"panel-tab-popper\"\n >\n {renderTabTooltip()}\n </Tooltip>\n )}\n </>,\n glTab.element[0] // tab.element is jquery element, we want a dom element\n )}\n </div>\n );\n }\n}\n\nconst XBasePanel = createXComponent(BasePanel);\n\nexport default XBasePanel;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"BasePanel.js","names":["React","PureComponent","ReactDOM","classNames","memoize","ContextActions","createXComponent","LoadingOverlay","Tooltip","assertNotNull","EMPTY_ARRAY","Log","LayoutUtils","PanelEvent","PanelContextMenu","RenameDialog","TabEvent","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","BasePanel","constructor","props","_defineProperty","actions","isClonable","isRenamable","additionalActions","push","getCloneAction","getRenameAction","handleCopyPanel","bind","handleFocus","handleBlur","handleHide","handleResize","handleBeforeShow","handleShow","handleTabBlur","handleTabFocus","handleRenameCancel","handleRenameSubmit","handleShowRenameDialog","handleTabClicked","handleTab","ref","createRef","glContainer","state","title","getTitleFromContainer","showRenameDialog","isWithinPanel","componentDidMount","_this$ref$current","_this$ref$current$par","componentPanel","glEventHub","on","focus","blur","emit","MOUNT","setState","current","parentElement","closest","componentWillUnmount","off","UNMOUNT","tab","getTitleFromTab","forceUpdate","onTab","e","onTabClicked","event","FOCUS","onFocus","onBlur","onHide","_len","arguments","length","args","Array","_key","onResize","_len2","_key2","onBeforeShow","_len3","_key3","onShow","_len4","_key4","onTabBlur","_len5","_key5","onTabFocus","_len6","_key6","newTitle","root","getRootFromContainer","config","getComponentConfigFromContainer","renameComponent","error","cloneConfig","cloneComponent","CLONED","order","group","groups","high","action","medium","render","children","className","renderTabTooltip","errorMessage","isLoaded","isLoading","glTab","onFocusCapture","onBlurCapture","createPortal","getAdditionalActions","isShown","value","itemType","onCancel","onSubmit","interactive","options","placement","popperClassName","element","XBasePanel"],"sources":["../src/BasePanel.tsx"],"sourcesContent":["import React, {\n type FocusEvent,\n type FocusEventHandler,\n PureComponent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport memoize from 'memoize-one';\nimport {\n type ContextAction,\n ContextActions,\n createXComponent,\n LoadingOverlay,\n type ResolvableContextAction,\n Tooltip,\n} from '@deephaven/components';\nimport type {\n Container,\n EventEmitter,\n ReactComponentConfig,\n Tab,\n} from '@deephaven/golden-layout';\nimport { assertNotNull, EMPTY_ARRAY } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport LayoutUtils from './layout/LayoutUtils';\nimport { type PanelComponent } from './DashboardPlugin';\nimport PanelEvent from './PanelEvent';\nimport PanelContextMenu from './PanelContextMenu';\nimport RenameDialog from './RenameDialog';\nimport TabEvent from './TabEvent';\nimport './Panel.scss';\n\nconst log = Log.module('Panel');\n\nexport type BasePanelProps = {\n /**\n * Reference to the component panel.\n * Will wait until it is set before emitting mount/unmount events.\n *\n */\n componentPanel?: PanelComponent;\n children: ReactNode;\n glContainer: Container;\n glEventHub: EventEmitter;\n className?: string;\n onFocus?: FocusEventHandler<HTMLDivElement>;\n onBlur?: FocusEventHandler<HTMLDivElement>;\n onTab?: (tab: Tab) => void;\n onTabClicked?: (e: MouseEvent) => void;\n onHide?: (...args: unknown[]) => void;\n onResize?: (...args: unknown[]) => void;\n onBeforeShow?: (...args: unknown[]) => void;\n onShow?: (...args: unknown[]) => void;\n onTabBlur?: (...args: unknown[]) => void;\n onTabFocus?: (...args: unknown[]) => void;\n renderTabTooltip?: () => ReactNode;\n additionalActions?: ResolvableContextAction[];\n errorMessage?: string;\n isLoading?: boolean;\n isLoaded?: boolean;\n isClonable?: boolean;\n isRenamable?: boolean;\n};\n\ninterface BasePanelState {\n title?: string | null;\n showRenameDialog: boolean;\n isWithinPanel: boolean;\n}\n/**\n * Generic panel component that emits mount/unmount/focus events.\n * Also wires up some triggers for common events:\n * Focus, Resize, Show\n */\nclass BasePanel extends PureComponent<BasePanelProps, BasePanelState> {\n constructor(props: BasePanelProps) {\n super(props);\n\n this.handleCopyPanel = this.handleCopyPanel.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleBlur = this.handleBlur.bind(this);\n this.handleHide = this.handleHide.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleBeforeShow = this.handleBeforeShow.bind(this);\n this.handleShow = this.handleShow.bind(this);\n this.handleTabBlur = this.handleTabBlur.bind(this);\n this.handleTabFocus = this.handleTabFocus.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRenameSubmit = this.handleRenameSubmit.bind(this);\n this.handleShowRenameDialog = this.handleShowRenameDialog.bind(this);\n this.handleTabClicked = this.handleTabClicked.bind(this);\n this.handleTab = this.handleTab.bind(this);\n\n this.ref = React.createRef<HTMLDivElement>();\n\n const { glContainer } = this.props;\n this.state = {\n title: LayoutUtils.getTitleFromContainer(glContainer),\n showRenameDialog: false,\n isWithinPanel: true,\n };\n }\n\n componentDidMount(): void {\n const { componentPanel, glContainer, glEventHub } = this.props;\n\n glContainer.on('resize', this.handleResize);\n glContainer.on('show', this.handleBeforeShow);\n glContainer.on('shown', this.handleShow);\n glContainer.on('hide', this.handleHide);\n glContainer.on('tab', this.handleTab);\n glContainer.on('tabClicked', this.handleTabClicked);\n glEventHub.on(TabEvent.focus, this.handleTabFocus);\n glEventHub.on(TabEvent.blur, this.handleTabBlur);\n\n glEventHub.emit(PanelEvent.MOUNT, componentPanel ?? this);\n\n this.setState({\n isWithinPanel:\n this.ref.current?.parentElement?.closest('.dh-panel') != null,\n });\n }\n\n componentWillUnmount(): void {\n const { componentPanel, glContainer, glEventHub } = this.props;\n\n glContainer.off('resize', this.handleResize);\n glContainer.off('show', this.handleBeforeShow);\n glContainer.off('shown', this.handleShow);\n glContainer.off('hide', this.handleHide);\n glContainer.off('tab', this.handleTab);\n glContainer.off('tabClicked', this.handleTabClicked);\n glEventHub.off(TabEvent.focus, this.handleTabFocus);\n glEventHub.off(TabEvent.blur, this.handleTabBlur);\n\n glEventHub.emit(PanelEvent.UNMOUNT, componentPanel ?? this);\n }\n\n ref: React.RefObject<HTMLDivElement>;\n\n handleTab(tab: Tab): void {\n if (tab != null) {\n this.setState({\n title: LayoutUtils.getTitleFromTab(tab),\n });\n }\n // render after move can happen before tab event, glTab could be null\n // when tab event is emitted, force a render update\n this.forceUpdate();\n\n const { onTab } = this.props;\n onTab?.(tab);\n }\n\n handleTabClicked(e: MouseEvent): void {\n const { onTabClicked } = this.props;\n onTabClicked?.(e);\n }\n\n handleFocus(event: FocusEvent<HTMLDivElement>): void {\n const { componentPanel, glEventHub } = this.props;\n glEventHub.emit(PanelEvent.FOCUS, componentPanel ?? this);\n\n const { onFocus } = this.props;\n onFocus?.(event);\n }\n\n handleBlur(event: FocusEvent<HTMLDivElement>): void {\n const { onBlur } = this.props;\n onBlur?.(event);\n }\n\n handleHide(...args: unknown[]): void {\n const { onHide } = this.props;\n onHide?.(...args);\n }\n\n handleResize(...args: unknown[]): void {\n const { onResize } = this.props;\n onResize?.(...args);\n }\n\n handleBeforeShow(...args: unknown[]): void {\n const { onBeforeShow } = this.props;\n onBeforeShow?.(...args);\n }\n\n handleShow(...args: unknown[]): void {\n const { onShow } = this.props;\n onShow?.(...args);\n }\n\n handleTabBlur(...args: unknown[]): void {\n const { onTabBlur } = this.props;\n onTabBlur?.(...args);\n }\n\n handleTabFocus(...args: unknown[]): void {\n const { onTabFocus } = this.props;\n onTabFocus?.(...args);\n }\n\n handleRenameCancel(): void {\n this.setState({ showRenameDialog: false });\n }\n\n handleShowRenameDialog(): void {\n this.setState({ showRenameDialog: true });\n }\n\n handleRenameSubmit(newTitle: string): void {\n const { glContainer } = this.props;\n this.setState({ showRenameDialog: false, title: newTitle });\n const root = LayoutUtils.getRootFromContainer(glContainer);\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n assertNotNull(config);\n LayoutUtils.renameComponent(root, config, newTitle);\n }\n\n handleCopyPanel(): void {\n const { glContainer, glEventHub } = this.props;\n const root = LayoutUtils.getRootFromContainer(glContainer);\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config == null) {\n log.error('Could not get component config from container', glContainer);\n return;\n }\n const cloneConfig = LayoutUtils.cloneComponent(\n root,\n config as ReactComponentConfig\n );\n if (cloneConfig !== null) {\n glEventHub.emit(PanelEvent.CLONED, this, cloneConfig);\n }\n }\n\n getCloneAction(): ContextAction {\n return {\n title: 'Copy Panel',\n order: 10,\n group: ContextActions.groups.high,\n action: this.handleCopyPanel,\n };\n }\n\n getRenameAction(): ContextAction {\n return {\n title: 'Rename',\n order: 10,\n group: ContextActions.groups.medium,\n action: this.handleShowRenameDialog,\n };\n }\n\n getAdditionalActions = memoize(\n (\n actions: readonly ResolvableContextAction[],\n isClonable: boolean,\n isRenamable: boolean\n ) => {\n const additionalActions = [];\n if (isClonable) {\n additionalActions.push(this.getCloneAction());\n }\n if (isRenamable) {\n additionalActions.push(this.getRenameAction());\n }\n return [...additionalActions, ...actions];\n }\n );\n\n render(): ReactElement {\n const {\n children,\n className,\n renderTabTooltip,\n glContainer,\n glEventHub,\n additionalActions = EMPTY_ARRAY,\n errorMessage,\n isLoaded = true,\n isLoading = false,\n isClonable = false,\n isRenamable = false,\n } = this.props;\n\n const { tab: glTab } = glContainer;\n const { showRenameDialog, title, isWithinPanel } = this.state;\n\n return (\n <div\n className={classNames('h-100 w-100 dh-panel', className)}\n onFocusCapture={this.handleFocus}\n onBlurCapture={this.handleBlur}\n ref={this.ref}\n >\n {children}\n <LoadingOverlay\n errorMessage={errorMessage}\n isLoaded={isLoaded}\n isLoading={isLoading}\n />\n {!isWithinPanel &&\n glTab != null &&\n ReactDOM.createPortal(\n <>\n <PanelContextMenu\n glContainer={glContainer}\n glEventHub={glEventHub}\n additionalActions={this.getAdditionalActions(\n additionalActions,\n isClonable,\n isRenamable\n )}\n />\n {isRenamable && (\n <RenameDialog\n isShown={showRenameDialog}\n value={title}\n itemType=\"Panel\"\n onCancel={this.handleRenameCancel}\n onSubmit={this.handleRenameSubmit}\n />\n )}\n {renderTabTooltip != null && (\n <Tooltip\n interactive\n options={{\n placement: 'bottom',\n }}\n popperClassName=\"panel-tab-popper\"\n >\n {renderTabTooltip()}\n </Tooltip>\n )}\n </>,\n glTab.element[0] // tab.element is jquery element, we want a dom element\n )}\n </div>\n );\n }\n}\n\nconst XBasePanel = createXComponent(BasePanel);\n\nexport default XBasePanel;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAGVC,aAAa,QAGR,OAAO;AACd,OAAOC,QAAQ,MAAM,WAAW;AAChC,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,OAAO,MAAM,aAAa;AACjC,SAEEC,cAAc,EACdC,gBAAgB,EAChBC,cAAc,EAEdC,OAAO,QACF,uBAAuB;AAO9B,SAASC,aAAa,EAAEC,WAAW,QAAQ,kBAAkB;AAC7D,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,WAAW;AAAA,OAEXC,UAAU;AAAA,OACVC,gBAAgB;AAAA,OAChBC,YAAY;AAAA,OACZC,QAAQ;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAGf,IAAMC,GAAG,GAAGZ,GAAG,CAACa,MAAM,CAAC,OAAO,CAAC;AAqC/B;AACA;AACA;AACA;AACA;AACA,MAAMC,SAAS,SAASxB,aAAa,CAAiC;EACpEyB,WAAWA,CAACC,KAAqB,EAAE;IACjC,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IAAAA,eAAA,+BAkLQxB,OAAO,CAC5B,CACEyB,OAA2C,EAC3CC,UAAmB,EACnBC,WAAoB,KACjB;MACH,IAAMC,iBAAiB,GAAG,EAAE;MAC5B,IAAIF,UAAU,EAAE;QACdE,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAACC,cAAc,CAAC,CAAC,CAAC;MAC/C;MACA,IAAIH,WAAW,EAAE;QACfC,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAACE,eAAe,CAAC,CAAC,CAAC;MAChD;MACA,OAAO,CAAC,GAAGH,iBAAiB,EAAE,GAAGH,OAAO,CAAC;IAC3C,CACF,CAAC;IA/LC,IAAI,CAACO,eAAe,GAAG,IAAI,CAACA,eAAe,CAACC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACC,WAAW,GAAG,IAAI,CAACA,WAAW,CAACD,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACE,UAAU,GAAG,IAAI,CAACA,UAAU,CAACF,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACG,UAAU,GAAG,IAAI,CAACA,UAAU,CAACH,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACI,YAAY,GAAG,IAAI,CAACA,YAAY,CAACJ,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACK,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACL,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACM,UAAU,GAAG,IAAI,CAACA,UAAU,CAACN,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACO,aAAa,GAAG,IAAI,CAACA,aAAa,CAACP,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACQ,cAAc,GAAG,IAAI,CAACA,cAAc,CAACR,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACS,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACT,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACU,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACV,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACW,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACX,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACY,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACZ,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACa,SAAS,GAAG,IAAI,CAACA,SAAS,CAACb,IAAI,CAAC,IAAI,CAAC;IAE1C,IAAI,CAACc,GAAG,gBAAGnD,KAAK,CAACoD,SAAS,CAAiB,CAAC;IAE5C,IAAM;MAAEC;IAAY,CAAC,GAAG,IAAI,CAAC1B,KAAK;IAClC,IAAI,CAAC2B,KAAK,GAAG;MACXC,KAAK,EAAE3C,WAAW,CAAC4C,qBAAqB,CAACH,WAAW,CAAC;MACrDI,gBAAgB,EAAE,KAAK;MACvBC,aAAa,EAAE;IACjB,CAAC;EACH;EAEAC,iBAAiBA,CAAA,EAAS;IAAA,IAAAC,iBAAA,EAAAC,qBAAA;IACxB,IAAM;MAAEC,cAAc;MAAET,WAAW;MAAEU;IAAW,CAAC,GAAG,IAAI,CAACpC,KAAK;IAE9D0B,WAAW,CAACW,EAAE,CAAC,QAAQ,EAAE,IAAI,CAACvB,YAAY,CAAC;IAC3CY,WAAW,CAACW,EAAE,CAAC,MAAM,EAAE,IAAI,CAACtB,gBAAgB,CAAC;IAC7CW,WAAW,CAACW,EAAE,CAAC,OAAO,EAAE,IAAI,CAACrB,UAAU,CAAC;IACxCU,WAAW,CAACW,EAAE,CAAC,MAAM,EAAE,IAAI,CAACxB,UAAU,CAAC;IACvCa,WAAW,CAACW,EAAE,CAAC,KAAK,EAAE,IAAI,CAACd,SAAS,CAAC;IACrCG,WAAW,CAACW,EAAE,CAAC,YAAY,EAAE,IAAI,CAACf,gBAAgB,CAAC;IACnDc,UAAU,CAACC,EAAE,CAAChD,QAAQ,CAACiD,KAAK,EAAE,IAAI,CAACpB,cAAc,CAAC;IAClDkB,UAAU,CAACC,EAAE,CAAChD,QAAQ,CAACkD,IAAI,EAAE,IAAI,CAACtB,aAAa,CAAC;IAEhDmB,UAAU,CAACI,IAAI,CAACtD,UAAU,CAACuD,KAAK,EAAEN,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,IAAI,CAAC;IAEzD,IAAI,CAACO,QAAQ,CAAC;MACZX,aAAa,EACX,EAAAE,iBAAA,OAAI,CAACT,GAAG,CAACmB,OAAO,cAAAV,iBAAA,wBAAAC,qBAAA,GAAhBD,iBAAA,CAAkBW,aAAa,cAAAV,qBAAA,uBAA/BA,qBAAA,CAAiCW,OAAO,CAAC,WAAW,CAAC,KAAI;IAC7D,CAAC,CAAC;EACJ;EAEAC,oBAAoBA,CAAA,EAAS;IAC3B,IAAM;MAAEX,cAAc;MAAET,WAAW;MAAEU;IAAW,CAAC,GAAG,IAAI,CAACpC,KAAK;IAE9D0B,WAAW,CAACqB,GAAG,CAAC,QAAQ,EAAE,IAAI,CAACjC,YAAY,CAAC;IAC5CY,WAAW,CAACqB,GAAG,CAAC,MAAM,EAAE,IAAI,CAAChC,gBAAgB,CAAC;IAC9CW,WAAW,CAACqB,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC/B,UAAU,CAAC;IACzCU,WAAW,CAACqB,GAAG,CAAC,MAAM,EAAE,IAAI,CAAClC,UAAU,CAAC;IACxCa,WAAW,CAACqB,GAAG,CAAC,KAAK,EAAE,IAAI,CAACxB,SAAS,CAAC;IACtCG,WAAW,CAACqB,GAAG,CAAC,YAAY,EAAE,IAAI,CAACzB,gBAAgB,CAAC;IACpDc,UAAU,CAACW,GAAG,CAAC1D,QAAQ,CAACiD,KAAK,EAAE,IAAI,CAACpB,cAAc,CAAC;IACnDkB,UAAU,CAACW,GAAG,CAAC1D,QAAQ,CAACkD,IAAI,EAAE,IAAI,CAACtB,aAAa,CAAC;IAEjDmB,UAAU,CAACI,IAAI,CAACtD,UAAU,CAAC8D,OAAO,EAAEb,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,IAAI,CAAC;EAC7D;EAIAZ,SAASA,CAAC0B,GAAQ,EAAQ;IACxB,IAAIA,GAAG,IAAI,IAAI,EAAE;MACf,IAAI,CAACP,QAAQ,CAAC;QACZd,KAAK,EAAE3C,WAAW,CAACiE,eAAe,CAACD,GAAG;MACxC,CAAC,CAAC;IACJ;IACA;IACA;IACA,IAAI,CAACE,WAAW,CAAC,CAAC;IAElB,IAAM;MAAEC;IAAM,CAAC,GAAG,IAAI,CAACpD,KAAK;IAC5BoD,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAGH,GAAG,CAAC;EACd;EAEA3B,gBAAgBA,CAAC+B,CAAa,EAAQ;IACpC,IAAM;MAAEC;IAAa,CAAC,GAAG,IAAI,CAACtD,KAAK;IACnCsD,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAGD,CAAC,CAAC;EACnB;EAEA1C,WAAWA,CAAC4C,KAAiC,EAAQ;IACnD,IAAM;MAAEpB,cAAc;MAAEC;IAAW,CAAC,GAAG,IAAI,CAACpC,KAAK;IACjDoC,UAAU,CAACI,IAAI,CAACtD,UAAU,CAACsE,KAAK,EAAErB,cAAc,aAAdA,cAAc,cAAdA,cAAc,GAAI,IAAI,CAAC;IAEzD,IAAM;MAAEsB;IAAQ,CAAC,GAAG,IAAI,CAACzD,KAAK;IAC9ByD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAGF,KAAK,CAAC;EAClB;EAEA3C,UAAUA,CAAC2C,KAAiC,EAAQ;IAClD,IAAM;MAAEG;IAAO,CAAC,GAAG,IAAI,CAAC1D,KAAK;IAC7B0D,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAGH,KAAK,CAAC;EACjB;EAEA1C,UAAUA,CAAA,EAA2B;IACnC,IAAM;MAAE8C;IAAO,CAAC,GAAG,IAAI,CAAC3D,KAAK;IAAC,SAAA4D,IAAA,GAAAC,SAAA,CAAAC,MAAA,EADlBC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;MAAJF,IAAI,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;IAAA;IAEhBN,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAG,GAAGI,IAAI,CAAC;EACnB;EAEAjD,YAAYA,CAAA,EAA2B;IACrC,IAAM;MAAEoD;IAAS,CAAC,GAAG,IAAI,CAAClE,KAAK;IAAC,SAAAmE,KAAA,GAAAN,SAAA,CAAAC,MAAA,EADlBC,IAAI,OAAAC,KAAA,CAAAG,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;MAAJL,IAAI,CAAAK,KAAA,IAAAP,SAAA,CAAAO,KAAA;IAAA;IAElBF,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAG,GAAGH,IAAI,CAAC;EACrB;EAEAhD,gBAAgBA,CAAA,EAA2B;IACzC,IAAM;MAAEsD;IAAa,CAAC,GAAG,IAAI,CAACrE,KAAK;IAAC,SAAAsE,KAAA,GAAAT,SAAA,CAAAC,MAAA,EADlBC,IAAI,OAAAC,KAAA,CAAAM,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;MAAJR,IAAI,CAAAQ,KAAA,IAAAV,SAAA,CAAAU,KAAA;IAAA;IAEtBF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAG,GAAGN,IAAI,CAAC;EACzB;EAEA/C,UAAUA,CAAA,EAA2B;IACnC,IAAM;MAAEwD;IAAO,CAAC,GAAG,IAAI,CAACxE,KAAK;IAAC,SAAAyE,KAAA,GAAAZ,SAAA,CAAAC,MAAA,EADlBC,IAAI,OAAAC,KAAA,CAAAS,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;MAAJX,IAAI,CAAAW,KAAA,IAAAb,SAAA,CAAAa,KAAA;IAAA;IAEhBF,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAG,GAAGT,IAAI,CAAC;EACnB;EAEA9C,aAAaA,CAAA,EAA2B;IACtC,IAAM;MAAE0D;IAAU,CAAC,GAAG,IAAI,CAAC3E,KAAK;IAAC,SAAA4E,KAAA,GAAAf,SAAA,CAAAC,MAAA,EADlBC,IAAI,OAAAC,KAAA,CAAAY,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;MAAJd,IAAI,CAAAc,KAAA,IAAAhB,SAAA,CAAAgB,KAAA;IAAA;IAEnBF,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAG,GAAGZ,IAAI,CAAC;EACtB;EAEA7C,cAAcA,CAAA,EAA2B;IACvC,IAAM;MAAE4D;IAAW,CAAC,GAAG,IAAI,CAAC9E,KAAK;IAAC,SAAA+E,KAAA,GAAAlB,SAAA,CAAAC,MAAA,EADlBC,IAAI,OAAAC,KAAA,CAAAe,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;MAAJjB,IAAI,CAAAiB,KAAA,IAAAnB,SAAA,CAAAmB,KAAA;IAAA;IAEpBF,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAG,GAAGf,IAAI,CAAC;EACvB;EAEA5C,kBAAkBA,CAAA,EAAS;IACzB,IAAI,CAACuB,QAAQ,CAAC;MAAEZ,gBAAgB,EAAE;IAAM,CAAC,CAAC;EAC5C;EAEAT,sBAAsBA,CAAA,EAAS;IAC7B,IAAI,CAACqB,QAAQ,CAAC;MAAEZ,gBAAgB,EAAE;IAAK,CAAC,CAAC;EAC3C;EAEAV,kBAAkBA,CAAC6D,QAAgB,EAAQ;IACzC,IAAM;MAAEvD;IAAY,CAAC,GAAG,IAAI,CAAC1B,KAAK;IAClC,IAAI,CAAC0C,QAAQ,CAAC;MAAEZ,gBAAgB,EAAE,KAAK;MAAEF,KAAK,EAAEqD;IAAS,CAAC,CAAC;IAC3D,IAAMC,IAAI,GAAGjG,WAAW,CAACkG,oBAAoB,CAACzD,WAAW,CAAC;IAC1D,IAAM0D,MAAM,GAAGnG,WAAW,CAACoG,+BAA+B,CAAC3D,WAAW,CAAC;IACvE5C,aAAa,CAACsG,MAAM,CAAC;IACrBnG,WAAW,CAACqG,eAAe,CAACJ,IAAI,EAAEE,MAAM,EAAEH,QAAQ,CAAC;EACrD;EAEAxE,eAAeA,CAAA,EAAS;IACtB,IAAM;MAAEiB,WAAW;MAAEU;IAAW,CAAC,GAAG,IAAI,CAACpC,KAAK;IAC9C,IAAMkF,IAAI,GAAGjG,WAAW,CAACkG,oBAAoB,CAACzD,WAAW,CAAC;IAC1D,IAAM0D,MAAM,GAAGnG,WAAW,CAACoG,+BAA+B,CAAC3D,WAAW,CAAC;IACvE,IAAI0D,MAAM,IAAI,IAAI,EAAE;MAClBxF,GAAG,CAAC2F,KAAK,CAAC,+CAA+C,EAAE7D,WAAW,CAAC;MACvE;IACF;IACA,IAAM8D,WAAW,GAAGvG,WAAW,CAACwG,cAAc,CAC5CP,IAAI,EACJE,MACF,CAAC;IACD,IAAII,WAAW,KAAK,IAAI,EAAE;MACxBpD,UAAU,CAACI,IAAI,CAACtD,UAAU,CAACwG,MAAM,EAAE,IAAI,EAAEF,WAAW,CAAC;IACvD;EACF;EAEAjF,cAAcA,CAAA,EAAkB;IAC9B,OAAO;MACLqB,KAAK,EAAE,YAAY;MACnB+D,KAAK,EAAE,EAAE;MACTC,KAAK,EAAElH,cAAc,CAACmH,MAAM,CAACC,IAAI;MACjCC,MAAM,EAAE,IAAI,CAACtF;IACf,CAAC;EACH;EAEAD,eAAeA,CAAA,EAAkB;IAC/B,OAAO;MACLoB,KAAK,EAAE,QAAQ;MACf+D,KAAK,EAAE,EAAE;MACTC,KAAK,EAAElH,cAAc,CAACmH,MAAM,CAACG,MAAM;MACnCD,MAAM,EAAE,IAAI,CAAC1E;IACf,CAAC;EACH;EAmBA4E,MAAMA,CAAA,EAAiB;IACrB,IAAM;MACJC,QAAQ;MACRC,SAAS;MACTC,gBAAgB;MAChB1E,WAAW;MACXU,UAAU;MACV/B,iBAAiB,GAAGtB,WAAW;MAC/BsH,YAAY;MACZC,QAAQ,GAAG,IAAI;MACfC,SAAS,GAAG,KAAK;MACjBpG,UAAU,GAAG,KAAK;MAClBC,WAAW,GAAG;IAChB,CAAC,GAAG,IAAI,CAACJ,KAAK;IAEd,IAAM;MAAEiD,GAAG,EAAEuD;IAAM,CAAC,GAAG9E,WAAW;IAClC,IAAM;MAAEI,gBAAgB;MAAEF,KAAK;MAAEG;IAAc,CAAC,GAAG,IAAI,CAACJ,KAAK;IAE7D,oBACEhC,KAAA;MACEwG,SAAS,EAAE3H,UAAU,CAAC,sBAAsB,EAAE2H,SAAS,CAAE;MACzDM,cAAc,EAAE,IAAI,CAAC9F,WAAY;MACjC+F,aAAa,EAAE,IAAI,CAAC9F,UAAW;MAC/BY,GAAG,EAAE,IAAI,CAACA,GAAI;MAAA0E,QAAA,GAEbA,QAAQ,eACT3G,IAAA,CAACX,cAAc;QACbyH,YAAY,EAAEA,YAAa;QAC3BC,QAAQ,EAAEA,QAAS;QACnBC,SAAS,EAAEA;MAAU,CACtB,CAAC,EACD,CAACxE,aAAa,IACbyE,KAAK,IAAI,IAAI,iBACbjI,QAAQ,CAACoI,YAAY,eACnBhH,KAAA,CAAAF,SAAA;QAAAyG,QAAA,gBACE3G,IAAA,CAACJ,gBAAgB;UACfuC,WAAW,EAAEA,WAAY;UACzBU,UAAU,EAAEA,UAAW;UACvB/B,iBAAiB,EAAE,IAAI,CAACuG,oBAAoB,CAC1CvG,iBAAiB,EACjBF,UAAU,EACVC,WACF;QAAE,CACH,CAAC,EACDA,WAAW,iBACVb,IAAA,CAACH,YAAY;UACXyH,OAAO,EAAE/E,gBAAiB;UAC1BgF,KAAK,EAAElF,KAAM;UACbmF,QAAQ,EAAC,OAAO;UAChBC,QAAQ,EAAE,IAAI,CAAC7F,kBAAmB;UAClC8F,QAAQ,EAAE,IAAI,CAAC7F;QAAmB,CACnC,CACF,EACAgF,gBAAgB,IAAI,IAAI,iBACvB7G,IAAA,CAACV,OAAO;UACNqI,WAAW;UACXC,OAAO,EAAE;YACPC,SAAS,EAAE;UACb,CAAE;UACFC,eAAe,EAAC,kBAAkB;UAAAnB,QAAA,EAEjCE,gBAAgB,CAAC;QAAC,CACZ,CACV;MAAA,CACD,CAAC,EACHI,KAAK,CAACc,OAAO,CAAC,CAAC,CAAC,CAAC;MACnB,CAAC;IAAA,CACA,CAAC;EAEV;AACF;;AAEA,IAAMC,UAAU,GAAG5I,gBAAgB,CAACmB,SAAS,CAAC;AAE9C,eAAeyH,UAAU"}
|
package/dist/Dashboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dashboard.js","names":["React","useEffect","useMemo","useRef","useState","throttle","GoldenLayout","useResizeObserver","LayoutUtils","PanelPlaceholder","DashboardLayout","LayoutManagerContext","DashboardIdContext","FiberProvider","jsx","_jsx","jsxs","_jsxs","RESIZE_THROTTLE","DEFAULT_CALLBACK","undefined","EMPTY_OBJECT","Object","freeze","Dashboard","_ref","id","children","emptyDashboard","layoutConfig","layoutSettings","onLayoutConfigChange","onGoldenLayoutChange","onLayoutInitialized","fallbackComponent","hydrate","dehydrate","panelWrapper","layoutElement","isInitialized","setIsInitialized","layout","setLayout","initDashboard","current","config","_objectSpread","makeDefaultLayout","settings","assign","content","newLayout","onInit","off","on","setFallbackComponent","init","destroy","handleResize","isInitialised","updateSize","className","ref","Provider","value","onLayoutChange"],"sources":["../src/Dashboard.tsx"],"sourcesContent":["import React, {\n type ComponentType,\n type ForwardRefExoticComponent,\n type RefAttributes,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport throttle from 'lodash.throttle';\nimport GoldenLayout from '@deephaven/golden-layout';\nimport type { ItemConfig } from '@deephaven/golden-layout';\nimport { useResizeObserver } from '@deephaven/react-hooks';\nimport './layout/GoldenLayout.scss';\nimport LayoutUtils from './layout/LayoutUtils';\nimport PanelPlaceholder from './PanelPlaceholder';\nimport DashboardLayout from './DashboardLayout';\nimport {\n type PanelDehydrateFunction,\n type PanelHydrateFunction,\n type PanelProps,\n} from './DashboardPlugin';\nimport './Dashboard.scss';\nimport { LayoutManagerContext } from './layout';\nimport { DashboardIdContext } from './useDashboardId';\nimport { FiberProvider } from './useFiber';\n\nconst RESIZE_THROTTLE = 100;\n\nconst DEFAULT_CALLBACK = (): void => undefined;\n\nconst EMPTY_OBJECT = Object.freeze({});\n\nexport type DashboardProps = {\n id?: string;\n children?: React.ReactNode | React.ReactNode[];\n emptyDashboard?: React.ReactNode;\n layoutConfig?: ItemConfig[];\n layoutSettings?: Record<string, unknown>;\n onLayoutConfigChange?: () => void;\n onGoldenLayoutChange?: (goldenLayout: GoldenLayout) => void;\n onLayoutInitialized?: () => void;\n fallbackComponent?: ForwardRefExoticComponent<\n PanelProps & RefAttributes<HTMLDivElement>\n >;\n hydrate?: PanelHydrateFunction;\n dehydrate?: PanelDehydrateFunction;\n\n /** Component to wrap each panel with */\n panelWrapper?: ComponentType;\n};\n\nexport function Dashboard({\n id = 'default',\n children,\n emptyDashboard,\n layoutConfig,\n layoutSettings = EMPTY_OBJECT,\n onLayoutConfigChange = DEFAULT_CALLBACK,\n onGoldenLayoutChange = DEFAULT_CALLBACK,\n onLayoutInitialized = DEFAULT_CALLBACK,\n fallbackComponent = PanelPlaceholder,\n hydrate,\n dehydrate,\n panelWrapper,\n}: DashboardProps): JSX.Element {\n const layoutElement = useRef<HTMLDivElement>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [layout, setLayout] = useState<GoldenLayout>();\n\n useEffect(\n function initDashboard() {\n if (!layoutElement.current) {\n setLayout(undefined);\n return;\n }\n const config = {\n ...LayoutUtils.makeDefaultLayout(),\n };\n if (config.settings === undefined) {\n config.settings = {};\n }\n Object.assign(config.settings, layoutSettings);\n\n // Load our content later after plugins have registered\n config.content = [];\n\n const newLayout = new GoldenLayout(config, layoutElement.current);\n\n const onInit = (): void => {\n newLayout.off('initialised', onInit);\n setIsInitialized(true);\n };\n newLayout.on('initialised', onInit);\n\n if (fallbackComponent != null) {\n newLayout.setFallbackComponent(fallbackComponent);\n }\n\n newLayout.init();\n\n setLayout(newLayout);\n\n onGoldenLayoutChange(newLayout);\n\n return () => {\n newLayout.destroy();\n };\n },\n [\n layoutSettings,\n fallbackComponent,\n onGoldenLayoutChange,\n setIsInitialized,\n setLayout,\n ]\n );\n\n const handleResize = useMemo(\n () =>\n throttle(() => {\n if (layout != null && layout.isInitialised) {\n layout?.updateSize();\n }\n }, RESIZE_THROTTLE),\n [layout]\n );\n\n useResizeObserver(layoutElement.current, handleResize);\n\n return (\n <div className=\"dashboard-container w-100 h-100\">\n <div className=\"w-100 h-100\" ref={layoutElement} />\n {isInitialized && layout && (\n <LayoutManagerContext.Provider value={layout}>\n <DashboardIdContext.Provider value={id}>\n <FiberProvider>\n <DashboardLayout\n emptyDashboard={emptyDashboard}\n id={id}\n layout={layout}\n layoutConfig={layoutConfig}\n onLayoutChange={onLayoutConfigChange}\n onLayoutInitialized={onLayoutInitialized}\n hydrate={hydrate}\n dehydrate={dehydrate}\n panelWrapper={panelWrapper}\n >\n {children}\n </DashboardLayout>\n </FiberProvider>\n </DashboardIdContext.Provider>\n </LayoutManagerContext.Provider>\n )}\n </div>\n );\n}\n\nexport default Dashboard;\n"],"mappings":"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"
|
|
1
|
+
{"version":3,"file":"Dashboard.js","names":["React","useEffect","useMemo","useRef","useState","throttle","GoldenLayout","useResizeObserver","LayoutUtils","PanelPlaceholder","DashboardLayout","LayoutManagerContext","DashboardIdContext","FiberProvider","jsx","_jsx","jsxs","_jsxs","RESIZE_THROTTLE","DEFAULT_CALLBACK","undefined","EMPTY_OBJECT","Object","freeze","Dashboard","_ref","id","children","emptyDashboard","layoutConfig","layoutSettings","onLayoutConfigChange","onGoldenLayoutChange","onLayoutInitialized","fallbackComponent","hydrate","dehydrate","panelWrapper","layoutElement","isInitialized","setIsInitialized","layout","setLayout","initDashboard","current","config","_objectSpread","makeDefaultLayout","settings","assign","content","newLayout","onInit","off","on","setFallbackComponent","init","destroy","handleResize","isInitialised","updateSize","className","ref","Provider","value","onLayoutChange"],"sources":["../src/Dashboard.tsx"],"sourcesContent":["import React, {\n type ComponentType,\n type ForwardRefExoticComponent,\n type RefAttributes,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport throttle from 'lodash.throttle';\nimport GoldenLayout from '@deephaven/golden-layout';\nimport type { ItemConfig } from '@deephaven/golden-layout';\nimport { useResizeObserver } from '@deephaven/react-hooks';\nimport './layout/GoldenLayout.scss';\nimport LayoutUtils from './layout/LayoutUtils';\nimport PanelPlaceholder from './PanelPlaceholder';\nimport DashboardLayout from './DashboardLayout';\nimport {\n type PanelDehydrateFunction,\n type PanelHydrateFunction,\n type PanelProps,\n} from './DashboardPlugin';\nimport './Dashboard.scss';\nimport { LayoutManagerContext } from './layout';\nimport { DashboardIdContext } from './useDashboardId';\nimport { FiberProvider } from './useFiber';\n\nconst RESIZE_THROTTLE = 100;\n\nconst DEFAULT_CALLBACK = (): void => undefined;\n\nconst EMPTY_OBJECT = Object.freeze({});\n\nexport type DashboardProps = {\n id?: string;\n children?: React.ReactNode | React.ReactNode[];\n emptyDashboard?: React.ReactNode;\n layoutConfig?: ItemConfig[];\n layoutSettings?: Record<string, unknown>;\n onLayoutConfigChange?: () => void;\n onGoldenLayoutChange?: (goldenLayout: GoldenLayout) => void;\n onLayoutInitialized?: () => void;\n fallbackComponent?: ForwardRefExoticComponent<\n PanelProps & RefAttributes<HTMLDivElement>\n >;\n hydrate?: PanelHydrateFunction;\n dehydrate?: PanelDehydrateFunction;\n\n /** Component to wrap each panel with */\n panelWrapper?: ComponentType;\n};\n\nexport function Dashboard({\n id = 'default',\n children,\n emptyDashboard,\n layoutConfig,\n layoutSettings = EMPTY_OBJECT,\n onLayoutConfigChange = DEFAULT_CALLBACK,\n onGoldenLayoutChange = DEFAULT_CALLBACK,\n onLayoutInitialized = DEFAULT_CALLBACK,\n fallbackComponent = PanelPlaceholder,\n hydrate,\n dehydrate,\n panelWrapper,\n}: DashboardProps): JSX.Element {\n const layoutElement = useRef<HTMLDivElement>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [layout, setLayout] = useState<GoldenLayout>();\n\n useEffect(\n function initDashboard() {\n if (!layoutElement.current) {\n setLayout(undefined);\n return;\n }\n const config = {\n ...LayoutUtils.makeDefaultLayout(),\n };\n if (config.settings === undefined) {\n config.settings = {};\n }\n Object.assign(config.settings, layoutSettings);\n\n // Load our content later after plugins have registered\n config.content = [];\n\n const newLayout = new GoldenLayout(config, layoutElement.current);\n\n const onInit = (): void => {\n newLayout.off('initialised', onInit);\n setIsInitialized(true);\n };\n newLayout.on('initialised', onInit);\n\n if (fallbackComponent != null) {\n newLayout.setFallbackComponent(fallbackComponent);\n }\n\n newLayout.init();\n\n setLayout(newLayout);\n\n onGoldenLayoutChange(newLayout);\n\n return () => {\n newLayout.destroy();\n };\n },\n [\n layoutSettings,\n fallbackComponent,\n onGoldenLayoutChange,\n setIsInitialized,\n setLayout,\n ]\n );\n\n const handleResize = useMemo(\n () =>\n throttle(() => {\n if (layout != null && layout.isInitialised) {\n layout?.updateSize();\n }\n }, RESIZE_THROTTLE),\n [layout]\n );\n\n useResizeObserver(layoutElement.current, handleResize);\n\n return (\n <div className=\"dashboard-container w-100 h-100\">\n <div className=\"w-100 h-100\" ref={layoutElement} />\n {isInitialized && layout && (\n <LayoutManagerContext.Provider value={layout}>\n <DashboardIdContext.Provider value={id}>\n <FiberProvider>\n <DashboardLayout\n emptyDashboard={emptyDashboard}\n id={id}\n layout={layout}\n layoutConfig={layoutConfig}\n onLayoutChange={onLayoutConfigChange}\n onLayoutInitialized={onLayoutInitialized}\n hydrate={hydrate}\n dehydrate={dehydrate}\n panelWrapper={panelWrapper}\n >\n {children}\n </DashboardLayout>\n </FiberProvider>\n </DashboardIdContext.Provider>\n </LayoutManagerContext.Provider>\n )}\n </div>\n );\n}\n\nexport default Dashboard;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardConstants.js","names":["DEFAULT_DASHBOARD_ID"],"sources":["../src/DashboardConstants.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport const DEFAULT_DASHBOARD_ID = 'default';\n"],"mappings":"AAAA;AACA,OAAO,IAAMA,oBAAoB,GAAG,SAAS"
|
|
1
|
+
{"version":3,"file":"DashboardConstants.js","names":["DEFAULT_DASHBOARD_ID"],"sources":["../src/DashboardConstants.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport const DEFAULT_DASHBOARD_ID = 'default';\n"],"mappings":"AAAA;AACA,OAAO,IAAMA,oBAAoB,GAAG,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardEvents.js","names":["makeEventFunctions","CREATE_DASHBOARD","CLOSE_DASHBOARD","listen","listenForCreateDashboard","emit","emitCreateDashboard","useListener","useCreateDashboardListener","listenForCloseDashboard","emitCloseDashboard","useCloseDashboardListener"],"sources":["../src/DashboardEvents.ts"],"sourcesContent":["import { makeEventFunctions } from '@deephaven/golden-layout';\n\nexport const CREATE_DASHBOARD = 'CREATE_DASHBOARD';\n\nexport const CLOSE_DASHBOARD = 'CLOSE_DASHBOARD';\n\nexport interface CreateDashboardPayload<T = unknown> {\n pluginId: string;\n title: string;\n data: T;\n}\n\nexport const {\n listen: listenForCreateDashboard,\n emit: emitCreateDashboard,\n useListener: useCreateDashboardListener,\n} = makeEventFunctions<[detail: CreateDashboardPayload]>(CREATE_DASHBOARD);\n\nexport const {\n listen: listenForCloseDashboard,\n emit: emitCloseDashboard,\n useListener: useCloseDashboardListener,\n} = makeEventFunctions<[title: string]>(CLOSE_DASHBOARD);\n"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,0BAA0B;AAE7D,OAAO,IAAMC,gBAAgB,GAAG,kBAAkB;AAElD,OAAO,IAAMC,eAAe,GAAG,iBAAiB;AAQhD,OAAO,IAAM;EACXC,MAAM,EAAEC,wBAAwB;EAChCC,IAAI,EAAEC,mBAAmB;EACzBC,WAAW,EAAEC;AACf,CAAC,GAAGR,kBAAkB,CAAmCC,gBAAgB,CAAC;AAE1E,OAAO,IAAM;EACXE,MAAM,EAAEM,uBAAuB;EAC/BJ,IAAI,EAAEK,kBAAkB;EACxBH,WAAW,EAAEI;AACf,CAAC,GAAGX,kBAAkB,CAAkBE,eAAe,CAAC"
|
|
1
|
+
{"version":3,"file":"DashboardEvents.js","names":["makeEventFunctions","CREATE_DASHBOARD","CLOSE_DASHBOARD","listen","listenForCreateDashboard","emit","emitCreateDashboard","useListener","useCreateDashboardListener","listenForCloseDashboard","emitCloseDashboard","useCloseDashboardListener"],"sources":["../src/DashboardEvents.ts"],"sourcesContent":["import { makeEventFunctions } from '@deephaven/golden-layout';\n\nexport const CREATE_DASHBOARD = 'CREATE_DASHBOARD';\n\nexport const CLOSE_DASHBOARD = 'CLOSE_DASHBOARD';\n\nexport interface CreateDashboardPayload<T = unknown> {\n pluginId: string;\n title: string;\n data: T;\n}\n\nexport const {\n listen: listenForCreateDashboard,\n emit: emitCreateDashboard,\n useListener: useCreateDashboardListener,\n} = makeEventFunctions<[detail: CreateDashboardPayload]>(CREATE_DASHBOARD);\n\nexport const {\n listen: listenForCloseDashboard,\n emit: emitCloseDashboard,\n useListener: useCloseDashboardListener,\n} = makeEventFunctions<[title: string]>(CLOSE_DASHBOARD);\n"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,0BAA0B;AAE7D,OAAO,IAAMC,gBAAgB,GAAG,kBAAkB;AAElD,OAAO,IAAMC,eAAe,GAAG,iBAAiB;AAQhD,OAAO,IAAM;EACXC,MAAM,EAAEC,wBAAwB;EAChCC,IAAI,EAAEC,mBAAmB;EACzBC,WAAW,EAAEC;AACf,CAAC,GAAGR,kBAAkB,CAAmCC,gBAAgB,CAAC;AAE1E,OAAO,IAAM;EACXE,MAAM,EAAEM,uBAAuB;EAC/BJ,IAAI,EAAEK,kBAAkB;EACxBH,WAAW,EAAEI;AACf,CAAC,GAAGX,kBAAkB,CAAkBE,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardLayout.js","names":["React","useCallback","useEffect","useMemo","useState","PropTypes","Log","usePrevious","useThrottledCallback","ErrorBoundary","useDispatch","useSelector","PanelManager","PanelErrorBoundary","LayoutUtils","canHaveRef","dehydrate","dehydrateDefault","hydrate","hydrateDefault","PanelEvent","GLPropTypes","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","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","glContainer","glEventHub","panelId","getIdFromContainer","Provider","value","_objectSpread","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","propTypes","string","isRequired","node","shape","Layout","arrayOf","func"],"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 PropTypes from 'prop-types';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport type {\n Container,\n ItemConfig,\n ReactComponentConfig,\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 from './layout/LayoutUtils';\nimport {\n canHaveRef,\n dehydrate as dehydrateDefault,\n hydrate as hydrateDefault,\n} from './DashboardUtils';\nimport PanelEvent from './PanelEvent';\nimport { GLPropTypes, useListener } from './layout';\nimport { getDashboardData, updateDashboardData } from './redux';\nimport {\n type PanelComponentType,\n type PanelDehydrateFunction,\n type PanelHydrateFunction,\n type PanelProps,\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 = (props: unknown): unknown => props;\n\ntype DashboardData = {\n closed?: ClosedPanels;\n};\n\ninterface DashboardLayoutProps {\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 children?: React.ReactNode | React.ReactNode[];\n emptyDashboard?: React.ReactNode;\n\n /** Component to wrap each panel with */\n panelWrapper?: ComponentType;\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>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 = DashboardPanelWrapper,\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(), []);\n const dehydrateMap = useMemo(() => new Map(), []);\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 // 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 <PanelWrapperType {...props}>\n {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 </PanelWrapperType>\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, props) => (hydrateMap.get(name) ?? FALLBACK_CALLBACK)(props, id),\n [hydrateMap, id]\n );\n const dehydrateComponent = useCallback(\n (name, config) => (dehydrateMap.get(name) ?? FALLBACK_CALLBACK)(config, id),\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 => {\n log.debug2('handleComponentCreated', item);\n\n if (\n item == null ||\n item.config == null ||\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\nDashboardLayout.propTypes = {\n id: PropTypes.string.isRequired,\n children: PropTypes.node,\n data: PropTypes.shape({}),\n emptyDashboard: PropTypes.node,\n layout: GLPropTypes.Layout.isRequired,\n layoutConfig: PropTypes.arrayOf(PropTypes.shape({})),\n onLayoutChange: PropTypes.func,\n onLayoutInitialized: PropTypes.func,\n};\n\nexport default DashboardLayout;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DashboardLayout.js","names":["React","useCallback","useEffect","useMemo","useState","PropTypes","Log","usePrevious","useThrottledCallback","ErrorBoundary","useDispatch","useSelector","PanelManager","PanelErrorBoundary","LayoutUtils","canHaveRef","dehydrate","dehydrateDefault","hydrate","hydrateDefault","PanelEvent","GLPropTypes","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","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","glContainer","glEventHub","panelId","getIdFromContainer","Provider","value","_objectSpread","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","propTypes","string","isRequired","node","shape","Layout","arrayOf","func"],"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 PropTypes from 'prop-types';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport type {\n Container,\n ItemConfig,\n ReactComponentConfig,\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 from './layout/LayoutUtils';\nimport {\n canHaveRef,\n dehydrate as dehydrateDefault,\n hydrate as hydrateDefault,\n} from './DashboardUtils';\nimport PanelEvent from './PanelEvent';\nimport { GLPropTypes, useListener } from './layout';\nimport { getDashboardData, updateDashboardData } from './redux';\nimport {\n type PanelComponentType,\n type PanelDehydrateFunction,\n type PanelHydrateFunction,\n type PanelProps,\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 = (props: unknown): unknown => props;\n\ntype DashboardData = {\n closed?: ClosedPanels;\n};\n\ninterface DashboardLayoutProps {\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 children?: React.ReactNode | React.ReactNode[];\n emptyDashboard?: React.ReactNode;\n\n /** Component to wrap each panel with */\n panelWrapper?: ComponentType;\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>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 = DashboardPanelWrapper,\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(), []);\n const dehydrateMap = useMemo(() => new Map(), []);\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 // 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 <PanelWrapperType {...props}>\n {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 </PanelWrapperType>\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, props) => (hydrateMap.get(name) ?? FALLBACK_CALLBACK)(props, id),\n [hydrateMap, id]\n );\n const dehydrateComponent = useCallback(\n (name, config) => (dehydrateMap.get(name) ?? FALLBACK_CALLBACK)(config, id),\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 => {\n log.debug2('handleComponentCreated', item);\n\n if (\n item == null ||\n item.config == null ||\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\nDashboardLayout.propTypes = {\n id: PropTypes.string.isRequired,\n children: PropTypes.node,\n data: PropTypes.shape({}),\n emptyDashboard: PropTypes.node,\n layout: GLPropTypes.Layout.isRequired,\n layoutConfig: PropTypes.arrayOf(PropTypes.shape({})),\n onLayoutChange: PropTypes.func,\n onLayoutInitialized: PropTypes.func,\n};\n\nexport default DashboardLayout;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPanelWrapper.js","names":["React","Fragment","_Fragment","jsx","_jsx","DashboardPanelWrapper","_ref","children"],"sources":["../src/DashboardPanelWrapper.tsx"],"sourcesContent":["import React, { type PropsWithChildren } from 'react';\n\nexport function DashboardPanelWrapper({\n children,\n}: PropsWithChildren<object>): JSX.Element {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <>{children}</>;\n}\n\nexport default DashboardPanelWrapper;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAkC,OAAO;AAAC,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEtD,OAAO,SAASC,qBAAqBA,CAAAC,IAAA,EAEM;EAAA,IAFL;IACpCC;EACyB,CAAC,GAAAD,IAAA;EAC1B;EACA,oBAAOF,IAAA,CAAAF,SAAA;IAAAK,QAAA,EAAGA;EAAQ,CAAG,CAAC;AACxB;AAEA,eAAeF,qBAAqB"
|
|
1
|
+
{"version":3,"file":"DashboardPanelWrapper.js","names":["React","Fragment","_Fragment","jsx","_jsx","DashboardPanelWrapper","_ref","children"],"sources":["../src/DashboardPanelWrapper.tsx"],"sourcesContent":["import React, { type PropsWithChildren } from 'react';\n\nexport function DashboardPanelWrapper({\n children,\n}: PropsWithChildren<object>): JSX.Element {\n // eslint-disable-next-line react/jsx-no-useless-fragment\n return <>{children}</>;\n}\n\nexport default DashboardPanelWrapper;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAkC,OAAO;AAAC,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEtD,OAAO,SAASC,qBAAqBA,CAAAC,IAAA,EAEM;EAAA,IAFL;IACpCC;EACyB,CAAC,GAAAD,IAAA;EAC1B;EACA,oBAAOF,IAAA,CAAAF,SAAA;IAAAK,QAAA,EAAGA;EAAQ,CAAG,CAAC;AACxB;AAEA,eAAeF,qBAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPlugin.js","names":["GoldenLayout","PanelManager","isWrappedComponent","isDashboardPluginProps","props","id","layout","panelManager","registerComponent","assertIsDashboardPluginProps","Error","concat"],"sources":["../src/DashboardPlugin.ts"],"sourcesContent":["import type {\n Component,\n ComponentType,\n ForwardRefExoticComponent,\n PropsWithoutRef,\n RefAttributes,\n} from 'react';\nimport { type ConnectedComponent } from 'react-redux';\nimport GoldenLayout from '@deephaven/golden-layout';\nimport type {\n GLPanelProps,\n ReactComponentConfig,\n} from '@deephaven/golden-layout';\nimport PanelManager from './PanelManager';\nimport { type WidgetDescriptor } from './PanelEvent';\n\nexport { isWrappedComponent } from '@deephaven/components';\n\n/**\n * Panel components can provide static props that provide meta data about the\n * panel.\n */\nexport interface PanelStaticMetaData {\n /**\n * Should be set to the same name as the component type.\n * @deprecated Use `displayName` instead.\n */\n COMPONENT?: string;\n\n /** Title of the panel. */\n TITLE?: string;\n}\n\n/**\n * Alias for the return type of React.forwardRef()\n */\ntype ForwardRefComponentType<P, R> = ForwardRefExoticComponent<\n PropsWithoutRef<P> & RefAttributes<R>\n>;\n\n/**\n * @deprecated Use `PanelComponentType` instead and add generic types to forwardRef call.\n */\nexport type PanelFunctionComponentType<P, R> = ForwardRefComponentType<P, R> &\n PanelStaticMetaData;\n\nexport type WrappedComponentType<\n P extends PanelProps,\n C extends ComponentType<P>,\n> = ConnectedComponent<C, P>;\n\nexport type PanelComponentType<\n P extends PanelProps = PanelProps,\n C extends ComponentType<P> = ComponentType<P>,\n> = (ComponentType<P> | WrappedComponentType<P, C>) & PanelStaticMetaData;\n\nexport type PanelMetadata = WidgetDescriptor;\n\nexport type PanelProps = GLPanelProps & {\n metadata?: PanelMetadata;\n panelState?: unknown;\n};\n\nexport type DehydratedPanelProps = Omit<PanelProps, keyof GLPanelProps>;\n\nexport type LocalDashboardProps = { localDashboardId: string };\n\nexport type DashboardPanelProps = PanelProps & LocalDashboardProps;\n\nexport type DehydratedDashboardPanelProps = DehydratedPanelProps &\n LocalDashboardProps;\n\nexport type PanelComponent<T extends PanelProps = PanelProps> =\n | Component<T>\n | { props: T; state: unknown };\n\nexport type PanelConfig = ReactComponentConfig & {\n componentState?: Record<string, unknown> | null;\n};\n\nexport type DehydratedPanelConfig = PanelConfig & {\n componentState: null;\n props: DehydratedPanelProps;\n type: 'react-component';\n};\n\nexport type DashboardConfig = {\n id: string;\n layout: GoldenLayout;\n panelManager: PanelManager;\n};\n\nexport interface DashboardPanelDefinition {\n name: string;\n definition: ComponentType;\n}\n\nexport type DeregisterComponentFunction = () => void;\n\nexport type PanelHydrateFunction<\n T extends DehydratedDashboardPanelProps = DehydratedDashboardPanelProps,\n R extends T = T,\n> = (props: T, dashboardId: string) => R;\n\nexport type PanelDehydrateFunction = (\n config: PanelConfig,\n dashboardId: string\n) => PanelConfig | null;\n\nexport type DashboardPluginComponentProps = {\n id: string;\n layout: GoldenLayout;\n panelManager: PanelManager;\n registerComponent: <\n P extends DashboardPanelProps,\n C extends ComponentType<P>,\n >(\n name: string,\n ComponentType: PanelComponentType<P, C>,\n hydrate?: PanelHydrateFunction,\n dehydrate?: PanelDehydrateFunction\n ) => DeregisterComponentFunction;\n};\n\n/**\n * Takes a partial DashboardPluginComponentProps and verifies all the dashboard component fields are filled in.\n * @param props The props to check\n * @returns True if the props are valid DashboardPluginComponentProps, false otherwise\n */\nexport function isDashboardPluginProps(\n props: Partial<DashboardPluginComponentProps>\n): props is DashboardPluginComponentProps {\n return (\n typeof props.id === 'string' &&\n props.layout instanceof GoldenLayout &&\n props.panelManager instanceof PanelManager &&\n typeof props.registerComponent === 'function'\n );\n}\n\nexport function assertIsDashboardPluginProps(\n props: Partial<DashboardPluginComponentProps>\n): asserts props is DashboardPluginComponentProps {\n if (!isDashboardPluginProps(props)) {\n throw new Error(\n `Expected dashboard plugin props, but instead received ${props}`\n );\n }\n}\n"],"mappings":"AAQA,OAAOA,YAAY,MAAM,0BAA0B;AAAC,OAK7CC,YAAY;AAGnB,SAASC,kBAAkB,QAAQ,uBAAuB;;AAE1D;AACA;AACA;AACA;;AAYA;AACA;AACA;;AAKA;AACA;AACA;;AAkFA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CACpCC,KAA6C,EACL;EACxC,OACE,OAAOA,KAAK,CAACC,EAAE,KAAK,QAAQ,IAC5BD,KAAK,CAACE,MAAM,YAAYN,YAAY,IACpCI,KAAK,CAACG,YAAY,YAAYN,YAAY,IAC1C,OAAOG,KAAK,CAACI,iBAAiB,KAAK,UAAU;AAEjD;AAEA,OAAO,SAASC,4BAA4BA,CAC1CL,KAA6C,EACG;EAChD,IAAI,CAACD,sBAAsB,CAACC,KAAK,CAAC,EAAE;IAClC,MAAM,IAAIM,KAAK,0DAAAC,MAAA,CAC4CP,KAAK,CAChE,CAAC;EACH;AACF"
|
|
1
|
+
{"version":3,"file":"DashboardPlugin.js","names":["GoldenLayout","PanelManager","isWrappedComponent","isDashboardPluginProps","props","id","layout","panelManager","registerComponent","assertIsDashboardPluginProps","Error","concat"],"sources":["../src/DashboardPlugin.ts"],"sourcesContent":["import type {\n Component,\n ComponentType,\n ForwardRefExoticComponent,\n PropsWithoutRef,\n RefAttributes,\n} from 'react';\nimport { type ConnectedComponent } from 'react-redux';\nimport GoldenLayout from '@deephaven/golden-layout';\nimport type {\n GLPanelProps,\n ReactComponentConfig,\n} from '@deephaven/golden-layout';\nimport PanelManager from './PanelManager';\nimport { type WidgetDescriptor } from './PanelEvent';\n\nexport { isWrappedComponent } from '@deephaven/components';\n\n/**\n * Panel components can provide static props that provide meta data about the\n * panel.\n */\nexport interface PanelStaticMetaData {\n /**\n * Should be set to the same name as the component type.\n * @deprecated Use `displayName` instead.\n */\n COMPONENT?: string;\n\n /** Title of the panel. */\n TITLE?: string;\n}\n\n/**\n * Alias for the return type of React.forwardRef()\n */\ntype ForwardRefComponentType<P, R> = ForwardRefExoticComponent<\n PropsWithoutRef<P> & RefAttributes<R>\n>;\n\n/**\n * @deprecated Use `PanelComponentType` instead and add generic types to forwardRef call.\n */\nexport type PanelFunctionComponentType<P, R> = ForwardRefComponentType<P, R> &\n PanelStaticMetaData;\n\nexport type WrappedComponentType<\n P extends PanelProps,\n C extends ComponentType<P>,\n> = ConnectedComponent<C, P>;\n\nexport type PanelComponentType<\n P extends PanelProps = PanelProps,\n C extends ComponentType<P> = ComponentType<P>,\n> = (ComponentType<P> | WrappedComponentType<P, C>) & PanelStaticMetaData;\n\nexport type PanelMetadata = WidgetDescriptor;\n\nexport type PanelProps = GLPanelProps & {\n metadata?: PanelMetadata;\n panelState?: unknown;\n};\n\nexport type DehydratedPanelProps = Omit<PanelProps, keyof GLPanelProps>;\n\nexport type LocalDashboardProps = { localDashboardId: string };\n\nexport type DashboardPanelProps = PanelProps & LocalDashboardProps;\n\nexport type DehydratedDashboardPanelProps = DehydratedPanelProps &\n LocalDashboardProps;\n\nexport type PanelComponent<T extends PanelProps = PanelProps> =\n | Component<T>\n | { props: T; state: unknown };\n\nexport type PanelConfig = ReactComponentConfig & {\n componentState?: Record<string, unknown> | null;\n};\n\nexport type DehydratedPanelConfig = PanelConfig & {\n componentState: null;\n props: DehydratedPanelProps;\n type: 'react-component';\n};\n\nexport type DashboardConfig = {\n id: string;\n layout: GoldenLayout;\n panelManager: PanelManager;\n};\n\nexport interface DashboardPanelDefinition {\n name: string;\n definition: ComponentType;\n}\n\nexport type DeregisterComponentFunction = () => void;\n\nexport type PanelHydrateFunction<\n T extends DehydratedDashboardPanelProps = DehydratedDashboardPanelProps,\n R extends T = T,\n> = (props: T, dashboardId: string) => R;\n\nexport type PanelDehydrateFunction = (\n config: PanelConfig,\n dashboardId: string\n) => PanelConfig | null;\n\nexport type DashboardPluginComponentProps = {\n id: string;\n layout: GoldenLayout;\n panelManager: PanelManager;\n registerComponent: <\n P extends DashboardPanelProps,\n C extends ComponentType<P>,\n >(\n name: string,\n ComponentType: PanelComponentType<P, C>,\n hydrate?: PanelHydrateFunction,\n dehydrate?: PanelDehydrateFunction\n ) => DeregisterComponentFunction;\n};\n\n/**\n * Takes a partial DashboardPluginComponentProps and verifies all the dashboard component fields are filled in.\n * @param props The props to check\n * @returns True if the props are valid DashboardPluginComponentProps, false otherwise\n */\nexport function isDashboardPluginProps(\n props: Partial<DashboardPluginComponentProps>\n): props is DashboardPluginComponentProps {\n return (\n typeof props.id === 'string' &&\n props.layout instanceof GoldenLayout &&\n props.panelManager instanceof PanelManager &&\n typeof props.registerComponent === 'function'\n );\n}\n\nexport function assertIsDashboardPluginProps(\n props: Partial<DashboardPluginComponentProps>\n): asserts props is DashboardPluginComponentProps {\n if (!isDashboardPluginProps(props)) {\n throw new Error(\n `Expected dashboard plugin props, but instead received ${props}`\n );\n }\n}\n"],"mappings":"AAQA,OAAOA,YAAY,MAAM,0BAA0B;AAAC,OAK7CC,YAAY;AAGnB,SAASC,kBAAkB,QAAQ,uBAAuB;;AAE1D;AACA;AACA;AACA;;AAYA;AACA;AACA;;AAKA;AACA;AACA;;AAkFA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CACpCC,KAA6C,EACL;EACxC,OACE,OAAOA,KAAK,CAACC,EAAE,KAAK,QAAQ,IAC5BD,KAAK,CAACE,MAAM,YAAYN,YAAY,IACpCI,KAAK,CAACG,YAAY,YAAYN,YAAY,IAC1C,OAAOG,KAAK,CAACI,iBAAiB,KAAK,UAAU;AAEjD;AAEA,OAAO,SAASC,4BAA4BA,CAC1CL,KAA6C,EACG;EAChD,IAAI,CAACD,sBAAsB,CAACC,KAAK,CAAC,EAAE;IAClC,MAAM,IAAIM,KAAK,0DAAAC,MAAA,CAC4CP,KAAK,CAChE,CAAC;EACH;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardUtils.js","names":["canHaveRef","dehydrate","config","props","componentState","metadata","panelState","newProps","_objectSpread","type","hydrate","localDashboardId","arguments","length","undefined"],"sources":["../src/DashboardUtils.tsx"],"sourcesContent":["import {\n type DehydratedDashboardPanelProps,\n type DehydratedPanelConfig,\n type PanelConfig,\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<T extends DehydratedDashboardPanelProps>(\n props: T,\n localDashboardId = ''\n): T {\n return {\n ...props,\n localDashboardId,\n };\n}\n\nexport default {\n dehydrate,\n hydrate,\n};\n"],"mappings":";;;;;AAMA,SAASA,UAAU,QAAQ,uBAAuB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACC,MAAmB,EAAyB;EACpE,IAAM;IAAEC,KAAK;IAAEC;EAAe,CAAC,GAAGF,MAAM;EACxC,IAAM;IAAEG;EAAS,CAAC,GAAGF,KAAK;EAC1B,IAAI;IAAEG,UAAU,GAAG;EAAK,CAAC,GAAGH,KAAK;EACjC,IAAIC,cAAc,EAAE;IAClB,CAAC;MAAEE;IAAW,CAAC,GAAGF,cAAc;EAClC;EACA,IAAMG,QAAiC,GAAG,CAAC,CAAC;EAC5C,IAAIF,QAAQ,IAAI,IAAI,EAAE;IACpBE,QAAQ,CAACF,QAAQ,GAAGA,QAAQ;EAC9B;EACA,IAAIC,UAAU,IAAI,IAAI,EAAE;IACtBC,QAAQ,CAACD,UAAU,GAAGA,UAAU;EAClC;EAEA,OAAAE,aAAA,CAAAA,aAAA,KACKN,MAAM;IACTE,cAAc,EAAE,IAAI;IACpBD,KAAK,EAAEI,QAAQ;IACfE,IAAI,EAAE;EAAiB;AAE3B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CACrBP,KAAQ,EAEL;EAAA,IADHQ,gBAAgB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EAErB,OAAAJ,aAAA,CAAAA,aAAA,KACKL,KAAK;IACRQ;EAAgB;AAEpB;AAEA,eAAe;EACbV,SAAS;EACTS;AACF,CAAC"
|
|
1
|
+
{"version":3,"file":"DashboardUtils.js","names":["canHaveRef","dehydrate","config","props","componentState","metadata","panelState","newProps","_objectSpread","type","hydrate","localDashboardId","arguments","length","undefined"],"sources":["../src/DashboardUtils.tsx"],"sourcesContent":["import {\n type DehydratedDashboardPanelProps,\n type DehydratedPanelConfig,\n type PanelConfig,\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<T extends DehydratedDashboardPanelProps>(\n props: T,\n localDashboardId = ''\n): T {\n return {\n ...props,\n localDashboardId,\n };\n}\n\nexport default {\n dehydrate,\n hydrate,\n};\n"],"mappings":";;;;;AAMA,SAASA,UAAU,QAAQ,uBAAuB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAACC,MAAmB,EAAyB;EACpE,IAAM;IAAEC,KAAK;IAAEC;EAAe,CAAC,GAAGF,MAAM;EACxC,IAAM;IAAEG;EAAS,CAAC,GAAGF,KAAK;EAC1B,IAAI;IAAEG,UAAU,GAAG;EAAK,CAAC,GAAGH,KAAK;EACjC,IAAIC,cAAc,EAAE;IAClB,CAAC;MAAEE;IAAW,CAAC,GAAGF,cAAc;EAClC;EACA,IAAMG,QAAiC,GAAG,CAAC,CAAC;EAC5C,IAAIF,QAAQ,IAAI,IAAI,EAAE;IACpBE,QAAQ,CAACF,QAAQ,GAAGA,QAAQ;EAC9B;EACA,IAAIC,UAAU,IAAI,IAAI,EAAE;IACtBC,QAAQ,CAACD,UAAU,GAAGA,UAAU;EAClC;EAEA,OAAAE,aAAA,CAAAA,aAAA,KACKN,MAAM;IACTE,cAAc,EAAE,IAAI;IACpBD,KAAK,EAAEI,QAAQ;IACfE,IAAI,EAAE;EAAiB;AAE3B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CACrBP,KAAQ,EAEL;EAAA,IADHQ,gBAAgB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EAErB,OAAAJ,aAAA,CAAAA,aAAA,KACKL,KAAK;IACRQ;EAAgB;AAEpB;AAEA,eAAe;EACbV,SAAS;EACTS;AACF,CAAC"}
|
|
@@ -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 />;\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,IALN;MAC5BC,EAAE;MACFC,QAAQ;MACRC;IAEkB,CAAC,GAAAH,IAAA;IADhBI,IAAI,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAEP,IAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGlB,QAAQ,CAACY,QAAQ,CAAC;EAClD,IAAMO,QAAQ,GAAGlB,WAAW,CAAC,CAAC;EAE9B,IAAMmB,wBAAwB,GAAGrB,WAAW,CACzCsB,MAA8B,IAAK;IAClC;IACA;IACA;IACA;IACA,IAAIV,EAAE,KAAKL,oBAAoB,EAAE;MAC/Ba,QAAQ,CAAChB,mBAAmB,CAAC;QAAEmB,YAAY,EAAED;MAAO,CAAC,CAAC,CAAC;IACzD,CAAC,MAAM;MACLF,QAAQ,CAACd,mBAAmB,CAACM,EAAE,EAAE;QAAEW,YAAY,EAAED;MAAO,CAAC,CAAC,CAAC;IAC7D;EACF,CAAC,EACD,CAACV,EAAE,EAAEQ,QAAQ,CACf,CAAC;EAED,IAAI,CAACF,QAAQ,IAAIL,QAAQ,EAAE;IACzBM,WAAW,CAAC,IAAI,CAAC;EACnB;EAEA,IAAI,CAACD,QAAQ,EAAE;IACb,oBAAOT,IAAA,CAACN,cAAc,IAAE,CAAC;EAC3B;EAEA,oBACEM,IAAA,CAACJ,SAAS,EAAAmB,aAAA,CAAAA,aAAA;IACRZ,EAAE,EAAEA,EAAG;IACPa,oBAAoB,EAAEJ;IACtB;EAAA,GACIN,IAAI;IAAAW,QAAA,EAEPZ;EAAO,EACC,CAAC;AAEhB;AAEA,eAAeJ,aAAa"
|
|
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 />;\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,IALN;MAC5BC,EAAE;MACFC,QAAQ;MACRC;IAEkB,CAAC,GAAAH,IAAA;IADhBI,IAAI,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAEP,IAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGlB,QAAQ,CAACY,QAAQ,CAAC;EAClD,IAAMO,QAAQ,GAAGlB,WAAW,CAAC,CAAC;EAE9B,IAAMmB,wBAAwB,GAAGrB,WAAW,CACzCsB,MAA8B,IAAK;IAClC;IACA;IACA;IACA;IACA,IAAIV,EAAE,KAAKL,oBAAoB,EAAE;MAC/Ba,QAAQ,CAAChB,mBAAmB,CAAC;QAAEmB,YAAY,EAAED;MAAO,CAAC,CAAC,CAAC;IACzD,CAAC,MAAM;MACLF,QAAQ,CAACd,mBAAmB,CAACM,EAAE,EAAE;QAAEW,YAAY,EAAED;MAAO,CAAC,CAAC,CAAC;IAC7D;EACF,CAAC,EACD,CAACV,EAAE,EAAEQ,QAAQ,CACf,CAAC;EAED,IAAI,CAACF,QAAQ,IAAIL,QAAQ,EAAE;IACzBM,WAAW,CAAC,IAAI,CAAC;EACnB;EAEA,IAAI,CAACD,QAAQ,EAAE;IACb,oBAAOT,IAAA,CAACN,cAAc,IAAE,CAAC;EAC3B;EAEA,oBACEM,IAAA,CAACJ,SAAS,EAAAmB,aAAA,CAAAA,aAAA;IACRZ,EAAE,EAAEA,EAAG;IACPa,oBAAoB,EAAEJ;IACtB;EAAA,GACIN,IAAI;IAAAW,QAAA,EAEPZ;EAAO,EACC,CAAC;AAEhB;AAEA,eAAeJ,aAAa"}
|
|
@@ -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","listen","listenForCycleToNextStack","emit","emitCycleToNextStack","useListener","useCycleToNextStackListener","listenForCycleToPreviousStack","emitCycleToPreviousStack","useCycleToPreviousStackListener","listenForCycleToNextTab","emitCycleToNextTab","useCycleToNextTabListener","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;AAEF,OAAO,IAAM;EACXC,MAAM,EAAEC,yBAAyB;EACjCC,IAAI,EAAEC,oBAAoB;EAC1BC,WAAW,EAAEC;AACf,CAAC,GAAGb,kBAAkB,CAACC,eAAe,CAACG,mBAAmB,CAAC;AAE3D,OAAO,IAAM;EACXI,MAAM,EAAEM,6BAA6B;EACrCJ,IAAI,EAAEK,wBAAwB;EAC9BH,WAAW,EAAEI;AACf,CAAC,GAAGhB,kBAAkB,CAACC,eAAe,CAACI,uBAAuB,CAAC;AAE/D,OAAO,IAAM;EACXG,MAAM,EAAES,uBAAuB;EAC/BP,IAAI,EAAEQ,kBAAkB;EACxBN,WAAW,EAAEO;AACf,CAAC,GAAGnB,kBAAkB,CAACC,eAAe,CAACK,iBAAiB,CAAC;AAEzD,OAAO,IAAM;EACXE,MAAM,EAAEY,2BAA2B;EACnCV,IAAI,EAAEW,sBAAsB;EAC5BT,WAAW,EAAEU;AACf,CAAC,GAAGtB,kBAAkB,CAACC,eAAe,CAACM,qBAAqB,CAAC;AAE7D,eAAeN,eAAe"
|
|
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","listen","listenForCycleToNextStack","emit","emitCycleToNextStack","useListener","useCycleToNextStackListener","listenForCycleToPreviousStack","emitCycleToPreviousStack","useCycleToPreviousStackListener","listenForCycleToNextTab","emitCycleToNextTab","useCycleToNextTabListener","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;AAEF,OAAO,IAAM;EACXC,MAAM,EAAEC,yBAAyB;EACjCC,IAAI,EAAEC,oBAAoB;EAC1BC,WAAW,EAAEC;AACf,CAAC,GAAGb,kBAAkB,CAACC,eAAe,CAACG,mBAAmB,CAAC;AAE3D,OAAO,IAAM;EACXI,MAAM,EAAEM,6BAA6B;EACrCJ,IAAI,EAAEK,wBAAwB;EAC9BH,WAAW,EAAEI;AACf,CAAC,GAAGhB,kBAAkB,CAACC,eAAe,CAACI,uBAAuB,CAAC;AAE/D,OAAO,IAAM;EACXG,MAAM,EAAES,uBAAuB;EAC/BP,IAAI,EAAEQ,kBAAkB;EACxBN,WAAW,EAAEO;AACf,CAAC,GAAGnB,kBAAkB,CAACC,eAAe,CAACK,iBAAiB,CAAC;AAEzD,OAAO,IAAM;EACXE,MAAM,EAAEY,2BAA2B;EACnCV,IAAI,EAAEW,sBAAsB;EAC5BT,WAAW,EAAEU;AACf,CAAC,GAAGtB,kBAAkB,CAACC,eAAe,CAACM,qBAAqB,CAAC;AAE7D,eAAeN,eAAe"}
|
|
@@ -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$head2","glContainer","tab","header","tabs","close","forEach","_container","contentItem","container","i","length","_tabs$i$contentItem","_tabs$i$contentItem$c","_glContainer$tab2","_glContainer$tab2$con","_glContainer$tab2$con2","_container2","_tabs$i","config","id","glEventHub","emit","REOPEN_LAST","canCloseTabsRight","disabled","_tabs$i$contentItem2","_tabs$i$contentItem2$","_glContainer$tab3","_glContainer$tab3$con","_glContainer$tab3$con2","_tabs$i2","_tabs$i2$contentItem","_tabs$i2$contentItem$","closable","Boolean","isClosable","canCloseAny","_tabs$i3","_tabs$i3$contentItem","_tabs$i3$contentItem$","canReopenLast","_LayoutUtils$getStack","_workspace$data$close","workspace","stackId","getStackForConfig","layoutManager","root","getConfig","data","closed","some","panel","parentStackId","render","_glContainer$tab4","_glContainer$tab4$con","_glContainer$tab4$con2","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$head2","glContainer","tab","header","tabs","close","forEach","_container","contentItem","container","i","length","_tabs$i$contentItem","_tabs$i$contentItem$c","_glContainer$tab2","_glContainer$tab2$con","_glContainer$tab2$con2","_container2","_tabs$i","config","id","glEventHub","emit","REOPEN_LAST","canCloseTabsRight","disabled","_tabs$i$contentItem2","_tabs$i$contentItem2$","_glContainer$tab3","_glContainer$tab3$con","_glContainer$tab3$con2","_tabs$i2","_tabs$i2$contentItem","_tabs$i2$contentItem$","closable","Boolean","isClosable","canCloseAny","_tabs$i3","_tabs$i3$contentItem","_tabs$i3$contentItem$","canReopenLast","_LayoutUtils$getStack","_workspace$data$close","workspace","stackId","getStackForConfig","layoutManager","root","getConfig","data","closed","some","panel","parentStackId","render","_glContainer$tab4","_glContainer$tab4$con","_glContainer$tab4$con2","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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"}
|
|
@@ -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 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,IAAM;MAAEC,WAAW;MAAEC;IAAW,CAAC,GAAG,IAAI,CAACP,KAAK;IAC9C,IAAMQ,OAAO,GAAGf,WAAW,CAACgB,kBAAkB,CAACH,WAAW,CAAC;IAC3DV,GAAG,CAACc,KAAK,CAAC,sBAAsB,EAAEF,OAAO,CAAC;IAC1CD,UAAU,CAACI,IAAI,CAACnB,UAAU,CAACoB,MAAM,EAAEJ,OAAO,EAAEF,WAAW,CAAC;EAC1D;EAEAO,MAAMA,CAAA,EAAc;IAClB,IAAM;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACd,KAAK;IAC/B,IAAM;MAAEE;IAAM,CAAC,GAAG,IAAI,CAACD,KAAK;IAC5B,IAAIC,KAAK,IAAI,IAAI,EAAE;MACjB,oBACEP,IAAA;QAAKoB,SAAS,EAAC,sBAAsB;QAAAD,QAAA,eACnCnB,IAAA,CAACL,cAAc;UACb0B,YAAY,KAAAC,MAAA,CAAKf,KAAK,CAAG;UACzBgB,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,eAAehB,kBAAkB"
|
|
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 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,IAAM;MAAEC,WAAW;MAAEC;IAAW,CAAC,GAAG,IAAI,CAACP,KAAK;IAC9C,IAAMQ,OAAO,GAAGf,WAAW,CAACgB,kBAAkB,CAACH,WAAW,CAAC;IAC3DV,GAAG,CAACc,KAAK,CAAC,sBAAsB,EAAEF,OAAO,CAAC;IAC1CD,UAAU,CAACI,IAAI,CAACnB,UAAU,CAACoB,MAAM,EAAEJ,OAAO,EAAEF,WAAW,CAAC;EAC1D;EAEAO,MAAMA,CAAA,EAAc;IAClB,IAAM;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACd,KAAK;IAC/B,IAAM;MAAEE;IAAM,CAAC,GAAG,IAAI,CAACD,KAAK;IAC5B,IAAIC,KAAK,IAAI,IAAI,EAAE;MACjB,oBACEP,IAAA;QAAKoB,SAAS,EAAC,sBAAsB;QAAAD,QAAA,eACnCnB,IAAA,CAACL,cAAc;UACb0B,YAAY,KAAAC,MAAA,CAAKf,KAAK,CAAG;UACzBgB,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,eAAehB,kBAAkB"}
|
package/dist/PanelEvent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelEvent.js","names":["makeEventFunctions","PanelEvent","Object","freeze","FOCUS","MOUNT","UNMOUNT","TITLE_CHANGED","REOPEN","REOPEN_LAST","DELETE","CLONED","CLOSED","OPEN","CLOSE","DRAGGING","DROPPED","listen","listenForPanelOpen","emit","emitPanelOpen","useListener","usePanelOpenListener"],"sources":["../src/PanelEvent.ts"],"sourcesContent":["import { makeEventFunctions } from '@deephaven/golden-layout';\n\nexport type WidgetDescriptor = {\n type: string;\n name?: string | null;\n id?: string | null;\n};\n\nexport type PanelOpenEventDetail<T = unknown> = {\n /**\n * Opening the widget was triggered by dragging from a list, such as the Panels dropdown.\n * The coordinates are used as the starting location for the drag, where we will show the panel until the user drops it in the dashboard.\n */\n dragEvent?: MouseEvent;\n\n /** ID of the panel to re-use. Will replace any existing panel with this ID. Otherwise a new panel is opened with a randomly generated ID. */\n panelId?: string;\n\n /** Descriptor of the widget. */\n widget: WidgetDescriptor;\n\n /**\n * Function to fetch the instance of the widget\n * @deprecated Use `useWidget` hook with the `widget` descriptor instead\n */\n fetch?: () => Promise<T>;\n};\n\n/**\n * Events emitted by panels and to control panels\n */\nexport const PanelEvent = Object.freeze({\n // Panel has received focus\n FOCUS: 'PanelEvent.FOCUS',\n\n // Panel has been mounted\n MOUNT: 'PanelEvent.MOUNT',\n\n // Panel has been unmounted\n UNMOUNT: 'PanelEvent.UNMOUNT',\n\n // The title of the panel has changed\n TITLE_CHANGED: 'PanelEvent.TITLE_CHANGED',\n\n // Panel was re-opened from a dehydrated state\n REOPEN: 'PanelEvent.REOPEN',\n\n // Reopen last closed panel\n REOPEN_LAST: 'PanelEvent.REOPEN_LAST',\n\n // Panel was deleted\n DELETE: 'PanelEvent.DELETE',\n\n // Panel was cloned/copied\n CLONED: 'PanelEvent.CLONED',\n\n // Panel was closed\n CLOSED: 'PanelEvent.CLOSED',\n\n // Event to open a new panel\n // Plugins will need to register to open based on this event.\n // Multiple plugins could open panels for the same event if desired.\n OPEN: 'PanelEvent.OPEN',\n\n // Event to close a panel that's currently open\n CLOSE: 'PanelEvent.CLOSE',\n\n // Panel is being dragged\n DRAGGING: 'PanelEvent.DRAGGING',\n\n // Panel is dropped\n DROPPED: 'PanelEvent.DROPPED',\n});\n\nexport const {\n listen: listenForPanelOpen,\n emit: emitPanelOpen,\n useListener: usePanelOpenListener,\n} = makeEventFunctions<[detail: PanelOpenEventDetail]>(PanelEvent.OPEN);\n\n// TODO (#2147): Add the rest of the event functions here. Need to create the correct types for all of them.\n\nexport default PanelEvent;\n"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,0BAA0B;AA4B7D;AACA;AACA;AACA,OAAO,IAAMC,UAAU,GAAGC,MAAM,CAACC,MAAM,CAAC;EACtC;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,OAAO,EAAE,oBAAoB;EAE7B;EACAC,aAAa,EAAE,0BAA0B;EAEzC;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,WAAW,EAAE,wBAAwB;EAErC;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACA;EACA;EACAC,IAAI,EAAE,iBAAiB;EAEvB;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,QAAQ,EAAE,qBAAqB;EAE/B;EACAC,OAAO,EAAE;AACX,CAAC,CAAC;AAEF,OAAO,IAAM;EACXC,MAAM,EAAEC,kBAAkB;EAC1BC,IAAI,EAAEC,aAAa;EACnBC,WAAW,EAAEC;AACf,CAAC,GAAGtB,kBAAkB,CAAiCC,UAAU,CAACY,IAAI,CAAC;;AAEvE;;AAEA,eAAeZ,UAAU"
|
|
1
|
+
{"version":3,"file":"PanelEvent.js","names":["makeEventFunctions","PanelEvent","Object","freeze","FOCUS","MOUNT","UNMOUNT","TITLE_CHANGED","REOPEN","REOPEN_LAST","DELETE","CLONED","CLOSED","OPEN","CLOSE","DRAGGING","DROPPED","listen","listenForPanelOpen","emit","emitPanelOpen","useListener","usePanelOpenListener"],"sources":["../src/PanelEvent.ts"],"sourcesContent":["import { makeEventFunctions } from '@deephaven/golden-layout';\n\nexport type WidgetDescriptor = {\n type: string;\n name?: string | null;\n id?: string | null;\n};\n\nexport type PanelOpenEventDetail<T = unknown> = {\n /**\n * Opening the widget was triggered by dragging from a list, such as the Panels dropdown.\n * The coordinates are used as the starting location for the drag, where we will show the panel until the user drops it in the dashboard.\n */\n dragEvent?: MouseEvent;\n\n /** ID of the panel to re-use. Will replace any existing panel with this ID. Otherwise a new panel is opened with a randomly generated ID. */\n panelId?: string;\n\n /** Descriptor of the widget. */\n widget: WidgetDescriptor;\n\n /**\n * Function to fetch the instance of the widget\n * @deprecated Use `useWidget` hook with the `widget` descriptor instead\n */\n fetch?: () => Promise<T>;\n};\n\n/**\n * Events emitted by panels and to control panels\n */\nexport const PanelEvent = Object.freeze({\n // Panel has received focus\n FOCUS: 'PanelEvent.FOCUS',\n\n // Panel has been mounted\n MOUNT: 'PanelEvent.MOUNT',\n\n // Panel has been unmounted\n UNMOUNT: 'PanelEvent.UNMOUNT',\n\n // The title of the panel has changed\n TITLE_CHANGED: 'PanelEvent.TITLE_CHANGED',\n\n // Panel was re-opened from a dehydrated state\n REOPEN: 'PanelEvent.REOPEN',\n\n // Reopen last closed panel\n REOPEN_LAST: 'PanelEvent.REOPEN_LAST',\n\n // Panel was deleted\n DELETE: 'PanelEvent.DELETE',\n\n // Panel was cloned/copied\n CLONED: 'PanelEvent.CLONED',\n\n // Panel was closed\n CLOSED: 'PanelEvent.CLOSED',\n\n // Event to open a new panel\n // Plugins will need to register to open based on this event.\n // Multiple plugins could open panels for the same event if desired.\n OPEN: 'PanelEvent.OPEN',\n\n // Event to close a panel that's currently open\n CLOSE: 'PanelEvent.CLOSE',\n\n // Panel is being dragged\n DRAGGING: 'PanelEvent.DRAGGING',\n\n // Panel is dropped\n DROPPED: 'PanelEvent.DROPPED',\n});\n\nexport const {\n listen: listenForPanelOpen,\n emit: emitPanelOpen,\n useListener: usePanelOpenListener,\n} = makeEventFunctions<[detail: PanelOpenEventDetail]>(PanelEvent.OPEN);\n\n// TODO (#2147): Add the rest of the event functions here. Need to create the correct types for all of them.\n\nexport default PanelEvent;\n"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,0BAA0B;AA4B7D;AACA;AACA;AACA,OAAO,IAAMC,UAAU,GAAGC,MAAM,CAACC,MAAM,CAAC;EACtC;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,OAAO,EAAE,oBAAoB;EAE7B;EACAC,aAAa,EAAE,0BAA0B;EAEzC;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,WAAW,EAAE,wBAAwB;EAErC;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACA;EACA;EACAC,IAAI,EAAE,iBAAiB;EAEvB;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,QAAQ,EAAE,qBAAqB;EAE/B;EACAC,OAAO,EAAE;AACX,CAAC,CAAC;AAEF,OAAO,IAAM;EACXC,MAAM,EAAEC,kBAAkB;EAC1BC,IAAI,EAAEC,aAAa;EACnBC,WAAW,EAAEC;AACf,CAAC,GAAGtB,kBAAkB,CAAiCC,UAAU,CAACY,IAAI,CAAC;;AAEvE;;AAEA,eAAeZ,UAAU"}
|