@deephaven/dashboard 1.2.1-plotly-rc.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/BasePanel.js.map +1 -1
  2. package/dist/Dashboard.js.map +1 -1
  3. package/dist/DashboardConstants.js.map +1 -1
  4. package/dist/DashboardEvents.js.map +1 -1
  5. package/dist/DashboardLayout.js.map +1 -1
  6. package/dist/DashboardPanelWrapper.js.map +1 -1
  7. package/dist/DashboardPlugin.js.map +1 -1
  8. package/dist/DashboardUtils.js.map +1 -1
  9. package/dist/LazyDashboard.js.map +1 -1
  10. package/dist/NavigationEvent.js.map +1 -1
  11. package/dist/PanelContextMenu.js.map +1 -1
  12. package/dist/PanelErrorBoundary.css.map +1 -1
  13. package/dist/PanelErrorBoundary.js.map +1 -1
  14. package/dist/PanelEvent.js.map +1 -1
  15. package/dist/PanelManager.js.map +1 -1
  16. package/dist/PanelPlaceholder.css.map +1 -1
  17. package/dist/PanelPlaceholder.js.map +1 -1
  18. package/dist/RenameDialog.js.map +1 -1
  19. package/dist/TabEvent.js.map +1 -1
  20. package/dist/declaration.d.js.map +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/layout/GLPropTypes.js.map +1 -1
  23. package/dist/layout/GoldenLayout.css.map +1 -1
  24. package/dist/layout/LayoutManagerContext.js.map +1 -1
  25. package/dist/layout/LayoutUtils.js.map +1 -1
  26. package/dist/layout/index.js.map +1 -1
  27. package/dist/layout/useDashboardPanel.js.map +1 -1
  28. package/dist/layout/useLayoutManager.js.map +1 -1
  29. package/dist/layout/useListener.js.map +1 -1
  30. package/dist/layout/usePanelRegistration.js.map +1 -1
  31. package/dist/redux/actionTypes.js.map +1 -1
  32. package/dist/redux/actions.js.map +1 -1
  33. package/dist/redux/hooks.js.map +1 -1
  34. package/dist/redux/index.js.map +1 -1
  35. package/dist/redux/reducers/dashboardData.js.map +1 -1
  36. package/dist/redux/reducers/index.js.map +1 -1
  37. package/dist/redux/selectors.js.map +1 -1
  38. package/dist/useDashboardId.js.map +1 -1
  39. package/dist/useDhId.js.map +1 -1
  40. package/dist/useFiber.js.map +1 -1
  41. package/dist/usePanelId.js.map +1 -1
  42. package/package.json +10 -10
@@ -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"}
@@ -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":";;;;;AAAA,OAAOA,KAAK,IAIVC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,OAAOC,QAAQ,MAAM,iBAAiB;AACtC,OAAOC,YAAY,MAAM,0BAA0B;AAEnD,SAASC,iBAAiB,QAAQ,wBAAwB;AAAC;AAAA,OAEpDC,WAAW;AAAA,OACXC,gBAAgB;AAAA,OAChBC,eAAe;AAAA;AAAA,SAObC,oBAAoB;AAAA,SACpBC,kBAAkB;AAAA,SAClBC,aAAa;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAEtB,IAAMC,eAAe,GAAG,GAAG;AAE3B,IAAMC,gBAAgB,GAAGA,CAAA,KAAYC,SAAS;AAE9C,IAAMC,YAAY,GAAGC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC;AAqBtC,OAAO,SAASC,SAASA,CAAAC,IAAA,EAaO;EAAA,IAbN;IACxBC,EAAE,GAAG,SAAS;IACdC,QAAQ;IACRC,cAAc;IACdC,YAAY;IACZC,cAAc,GAAGT,YAAY;IAC7BU,oBAAoB,GAAGZ,gBAAgB;IACvCa,oBAAoB,GAAGb,gBAAgB;IACvCc,mBAAmB,GAAGd,gBAAgB;IACtCe,iBAAiB,GAAGzB,gBAAgB;IACpC0B,OAAO;IACPC,SAAS;IACTC;EACc,CAAC,GAAAZ,IAAA;EACf,IAAMa,aAAa,GAAGnC,MAAM,CAAiB,IAAI,CAAC;EAClD,IAAM,CAACoC,aAAa,EAAEC,gBAAgB,CAAC,GAAGpC,QAAQ,CAAC,KAAK,CAAC;EACzD,IAAM,CAACqC,MAAM,EAAEC,SAAS,CAAC,GAAGtC,QAAQ,CAAe,CAAC;EAEpDH,SAAS,CACP,SAAS0C,aAAaA,CAAA,EAAG;IACvB,IAAI,CAACL,aAAa,CAACM,OAAO,EAAE;MAC1BF,SAAS,CAACtB,SAAS,CAAC;MACpB;IACF;IACA,IAAMyB,MAAM,GAAAC,aAAA,KACPtC,WAAW,CAACuC,iBAAiB,CAAC,CAAC,CACnC;IACD,IAAIF,MAAM,CAACG,QAAQ,KAAK5B,SAAS,EAAE;MACjCyB,MAAM,CAACG,QAAQ,GAAG,CAAC,CAAC;IACtB;IACA1B,MAAM,CAAC2B,MAAM,CAACJ,MAAM,CAACG,QAAQ,EAAElB,cAAc,CAAC;;IAE9C;IACAe,MAAM,CAACK,OAAO,GAAG,EAAE;IAEnB,IAAMC,SAAS,GAAG,IAAI7C,YAAY,CAACuC,MAAM,EAAEP,aAAa,CAACM,OAAO,CAAC;IAEjE,IAAMQ,MAAM,GAAGA,CAAA,KAAY;MACzBD,SAAS,CAACE,GAAG,CAAC,aAAa,EAAED,MAAM,CAAC;MACpCZ,gBAAgB,CAAC,IAAI,CAAC;IACxB,CAAC;IACDW,SAAS,CAACG,EAAE,CAAC,aAAa,EAAEF,MAAM,CAAC;IAEnC,IAAIlB,iBAAiB,IAAI,IAAI,EAAE;MAC7BiB,SAAS,CAACI,oBAAoB,CAACrB,iBAAiB,CAAC;IACnD;IAEAiB,SAAS,CAACK,IAAI,CAAC,CAAC;IAEhBd,SAAS,CAACS,SAAS,CAAC;IAEpBnB,oBAAoB,CAACmB,SAAS,CAAC;IAE/B,OAAO,MAAM;MACXA,SAAS,CAACM,OAAO,CAAC,CAAC;IACrB,CAAC;EACH,CAAC,EACD,CACE3B,cAAc,EACdI,iBAAiB,EACjBF,oBAAoB,EACpBQ,gBAAgB,EAChBE,SAAS,CAEb,CAAC;EAED,IAAMgB,YAAY,GAAGxD,OAAO,CAC1B,MACEG,QAAQ,CAAC,MAAM;IACb,IAAIoC,MAAM,IAAI,IAAI,IAAIA,MAAM,CAACkB,aAAa,EAAE;MAC1ClB,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEmB,UAAU,CAAC,CAAC;IACtB;EACF,CAAC,EAAE1C,eAAe,CAAC,EACrB,CAACuB,MAAM,CACT,CAAC;EAEDlC,iBAAiB,CAAC+B,aAAa,CAACM,OAAO,EAAEc,YAAY,CAAC;EAEtD,oBACEzC,KAAA;IAAK4C,SAAS,EAAC,iCAAiC;IAAAlC,QAAA,gBAC9CZ,IAAA;MAAK8C,SAAS,EAAC,aAAa;MAACC,GAAG,EAAExB;IAAc,CAAE,CAAC,EAClDC,aAAa,IAAIE,MAAM,iBACtB1B,IAAA,CAACJ,oBAAoB,CAACoD,QAAQ;MAACC,KAAK,EAAEvB,MAAO;MAAAd,QAAA,eAC3CZ,IAAA,CAACH,kBAAkB,CAACmD,QAAQ;QAACC,KAAK,EAAEtC,EAAG;QAAAC,QAAA,eACrCZ,IAAA,CAACF,aAAa;UAAAc,QAAA,eACZZ,IAAA,CAACL,eAAe;YACdkB,cAAc,EAAEA,cAAe;YAC/BF,EAAE,EAAEA,EAAG;YACPe,MAAM,EAAEA,MAAO;YACfZ,YAAY,EAAEA,YAAa;YAC3BoC,cAAc,EAAElC,oBAAqB;YACrCE,mBAAmB,EAAEA,mBAAoB;YACzCE,OAAO,EAAEA,OAAQ;YACjBC,SAAS,EAAEA,SAAU;YACrBC,YAAY,EAAEA,YAAa;YAAAV,QAAA,EAE1BA;UAAQ,CACM;QAAC,CACL;MAAC,CACW;IAAC,CACD,CAChC;EAAA,CACE,CAAC;AAEV;AAEA,eAAeH,SAAS","ignoreList":[]}
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":";;;;;AAAA,OAAOA,KAAK,IAIVC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,OAAOC,QAAQ,MAAM,iBAAiB;AACtC,OAAOC,YAAY,MAAM,0BAA0B;AAEnD,SAASC,iBAAiB,QAAQ,wBAAwB;AAAC;AAAA,OAEpDC,WAAW;AAAA,OACXC,gBAAgB;AAAA,OAChBC,eAAe;AAAA;AAAA,SAObC,oBAAoB;AAAA,SACpBC,kBAAkB;AAAA,SAClBC,aAAa;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAEtB,IAAMC,eAAe,GAAG,GAAG;AAE3B,IAAMC,gBAAgB,GAAGA,CAAA,KAAYC,SAAS;AAE9C,IAAMC,YAAY,GAAGC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC;AAqBtC,OAAO,SAASC,SAASA,CAAAC,IAAA,EAaO;EAAA,IAbN;IACxBC,EAAE,GAAG,SAAS;IACdC,QAAQ;IACRC,cAAc;IACdC,YAAY;IACZC,cAAc,GAAGT,YAAY;IAC7BU,oBAAoB,GAAGZ,gBAAgB;IACvCa,oBAAoB,GAAGb,gBAAgB;IACvCc,mBAAmB,GAAGd,gBAAgB;IACtCe,iBAAiB,GAAGzB,gBAAgB;IACpC0B,OAAO;IACPC,SAAS;IACTC;EACc,CAAC,GAAAZ,IAAA;EACf,IAAMa,aAAa,GAAGnC,MAAM,CAAiB,IAAI,CAAC;EAClD,IAAM,CAACoC,aAAa,EAAEC,gBAAgB,CAAC,GAAGpC,QAAQ,CAAC,KAAK,CAAC;EACzD,IAAM,CAACqC,MAAM,EAAEC,SAAS,CAAC,GAAGtC,QAAQ,CAAe,CAAC;EAEpDH,SAAS,CACP,SAAS0C,aAAaA,CAAA,EAAG;IACvB,IAAI,CAACL,aAAa,CAACM,OAAO,EAAE;MAC1BF,SAAS,CAACtB,SAAS,CAAC;MACpB;IACF;IACA,IAAMyB,MAAM,GAAAC,aAAA,KACPtC,WAAW,CAACuC,iBAAiB,CAAC,CAAC,CACnC;IACD,IAAIF,MAAM,CAACG,QAAQ,KAAK5B,SAAS,EAAE;MACjCyB,MAAM,CAACG,QAAQ,GAAG,CAAC,CAAC;IACtB;IACA1B,MAAM,CAAC2B,MAAM,CAACJ,MAAM,CAACG,QAAQ,EAAElB,cAAc,CAAC;;IAE9C;IACAe,MAAM,CAACK,OAAO,GAAG,EAAE;IAEnB,IAAMC,SAAS,GAAG,IAAI7C,YAAY,CAACuC,MAAM,EAAEP,aAAa,CAACM,OAAO,CAAC;IAEjE,IAAMQ,MAAM,GAAGA,CAAA,KAAY;MACzBD,SAAS,CAACE,GAAG,CAAC,aAAa,EAAED,MAAM,CAAC;MACpCZ,gBAAgB,CAAC,IAAI,CAAC;IACxB,CAAC;IACDW,SAAS,CAACG,EAAE,CAAC,aAAa,EAAEF,MAAM,CAAC;IAEnC,IAAIlB,iBAAiB,IAAI,IAAI,EAAE;MAC7BiB,SAAS,CAACI,oBAAoB,CAACrB,iBAAiB,CAAC;IACnD;IAEAiB,SAAS,CAACK,IAAI,CAAC,CAAC;IAEhBd,SAAS,CAACS,SAAS,CAAC;IAEpBnB,oBAAoB,CAACmB,SAAS,CAAC;IAE/B,OAAO,MAAM;MACXA,SAAS,CAACM,OAAO,CAAC,CAAC;IACrB,CAAC;EACH,CAAC,EACD,CACE3B,cAAc,EACdI,iBAAiB,EACjBF,oBAAoB,EACpBQ,gBAAgB,EAChBE,SAAS,CAEb,CAAC;EAED,IAAMgB,YAAY,GAAGxD,OAAO,CAC1B,MACEG,QAAQ,CAAC,MAAM;IACb,IAAIoC,MAAM,IAAI,IAAI,IAAIA,MAAM,CAACkB,aAAa,EAAE;MAC1ClB,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEmB,UAAU,CAAC,CAAC;IACtB;EACF,CAAC,EAAE1C,eAAe,CAAC,EACrB,CAACuB,MAAM,CACT,CAAC;EAEDlC,iBAAiB,CAAC+B,aAAa,CAACM,OAAO,EAAEc,YAAY,CAAC;EAEtD,oBACEzC,KAAA;IAAK4C,SAAS,EAAC,iCAAiC;IAAAlC,QAAA,gBAC9CZ,IAAA;MAAK8C,SAAS,EAAC,aAAa;MAACC,GAAG,EAAExB;IAAc,CAAE,CAAC,EAClDC,aAAa,IAAIE,MAAM,iBACtB1B,IAAA,CAACJ,oBAAoB,CAACoD,QAAQ;MAACC,KAAK,EAAEvB,MAAO;MAAAd,QAAA,eAC3CZ,IAAA,CAACH,kBAAkB,CAACmD,QAAQ;QAACC,KAAK,EAAEtC,EAAG;QAAAC,QAAA,eACrCZ,IAAA,CAACF,aAAa;UAAAc,QAAA,eACZZ,IAAA,CAACL,eAAe;YACdkB,cAAc,EAAEA,cAAe;YAC/BF,EAAE,EAAEA,EAAG;YACPe,MAAM,EAAEA,MAAO;YACfZ,YAAY,EAAEA,YAAa;YAC3BoC,cAAc,EAAElC,oBAAqB;YACrCE,mBAAmB,EAAEA,mBAAoB;YACzCE,OAAO,EAAEA,OAAQ;YACjBC,SAAS,EAAEA,SAAU;YACrBC,YAAY,EAAEA,YAAa;YAAAV,QAAA,EAE1BA;UAAQ,CACM;QAAC,CACL;MAAC,CACW;IAAC,CACD,CAChC;EAAA,CACE,CAAC;AAEV;AAEA,eAAeH,SAAS"}
@@ -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","ignoreList":[]}
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","ignoreList":[]}
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","ignoreList":[]}
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","ignoreList":[]}
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","ignoreList":[]}
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","ignoreList":[]}
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","ignoreList":[]}
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":";;;AAAA,OAAOA,KAAK,IAAIC,aAAa,QAA2B,OAAO;AAC/D,SACEC,cAAc,QAET,uBAAuB;AAE9B,SAGEC,YAAY,EACZC,YAAY,IAAIC,kBAAkB,QAC7B,kBAAkB;AACzB,SAASC,OAAO,QAAQ,aAAa;AAAC,SAE7BC,WAAW;AAAA,SACXC,UAAU;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAcnB,MAAMC,gBAAgB,SAASV,aAAa,CAG1C;EAKAW,WAAWA,CAACC,KAA4B,EAAE;IACxC,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,cAAc,GAAG,IAAI,CAACA,cAAc,CAACC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACC,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACD,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACE,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACF,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACG,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACH,IAAI,CAAC,IAAI,CAAC;EAC1D;EAEAI,UAAUA,CAAA,EAAU;IAAA,IAAAC,qBAAA,EAAAC,gBAAA,EAAAC,sBAAA;IAClB;IACA,IAAM;MAAEC;IAAY,CAAC,GAAG,IAAI,CAACV,KAAK;IAClC,OAAO,CAAC,KAAAO,qBAAA,GAAIG,WAAW,aAAXA,WAAW,wBAAAF,gBAAA,GAAXE,WAAW,CAAEC,GAAG,cAAAH,gBAAA,wBAAAC,sBAAA,GAAhBD,gBAAA,CAAkBI,MAAM,cAAAH,sBAAA,uBAAxBA,sBAAA,CAA0BI,IAAI,cAAAN,qBAAA,cAAAA,qBAAA,GAAI,EAAE,CAAC,CAAC;EACpD;EAEAN,cAAcA,CAAA,EAAS;IACrB,IAAM;MAAES;IAAY,CAAC,GAAG,IAAI,CAACV,KAAK;IAClCU,WAAW,CAACI,KAAK,CAAC,CAAC;EACrB;EAEAV,kBAAkBA,CAAA,EAAS;IACzB,IAAMS,IAAI,GAAG,IAAI,CAACP,UAAU,CAAC,CAAC;;IAE9B;IACA;IACAO,IAAI,CAACE,OAAO,CACVJ,GAAG;MAAA,IAAAK,UAAA;MAAA,QAAAA,UAAA,GAAI,CAACL,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEM,WAAW,EAA6BC,SAAS,cAAAF,UAAA,uBAAvDA,UAAA,CAAyDF,KAAK,CAAC,CAAC;IAAA,CACzE,CAAC;EACH;EAEAX,oBAAoBA,CAAA,EAAS;IAC3B,IAAM;MAAEO;IAAY,CAAC,GAAG,IAAI,CAACV,KAAK;IAClC,IAAMa,IAAI,GAAG,IAAI,CAACP,UAAU,CAAC,CAAC;IAE9B,KAAK,IAAIa,CAAC,GAAGN,IAAI,CAACO,MAAM,GAAG,CAAC,EAAED,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI,CAAC,EAAE;MAAA,IAAAE,mBAAA,EAAAC,qBAAA,EAAAC,iBAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,WAAA,EAAAC,OAAA;MAC3C,IACE,EAAAN,mBAAA,GAAAR,IAAI,CAACM,CAAC,CAAC,CAACF,WAAW,cAAAI,mBAAA,wBAAAC,qBAAA,GAAnBD,mBAAA,CAAqBO,MAAM,cAAAN,qBAAA,uBAA3BA,qBAAA,CAA6BO,EAAE,QAAAN,iBAAA,GAC/Bb,WAAW,CAACC,GAAG,cAAAY,iBAAA,wBAAAC,qBAAA,GAAfD,iBAAA,CAAiBN,WAAW,cAAAO,qBAAA,wBAAAC,sBAAA,GAA5BD,qBAAA,CAA8BI,MAAM,cAAAH,sBAAA,uBAApCA,sBAAA,CAAsCI,EAAE,GACxC;QACA,MAAM,CAAC;MACT;;MAEA;MACA,CAAAH,WAAA,KAAAC,OAAA,GAACd,IAAI,CAACM,CAAC,CAAC,cAAAQ,OAAA,uBAAPA,OAAA,CAASV,WAAW,EAA6BC,SAAS,cAAAQ,WAAA,uBAA3DA,WAAA,CAA6DZ,KAAK,CAAC,CAAC;IACtE;EACF;EAEAT,gBAAgBA,CAAA,EAAS;IACvB,IAAM;MAAEK,WAAW;MAAEoB;IAAW,CAAC,GAAG,IAAI,CAAC9B,KAAK;IAC9C8B,UAAU,CAACC,IAAI,CAACpC,UAAU,CAACqC,WAAW,EAAEtB,WAAW,CAAC;EACtD;EAEAuB,iBAAiBA,CAAA,EAAY;IAC3B,IAAM;MAAEvB;IAAY,CAAC,GAAG,IAAI,CAACV,KAAK;IAClC,IAAMa,IAAI,GAAG,IAAI,CAACP,UAAU,CAAC,CAAC;IAE9B,IAAI4B,QAAQ,GAAG,IAAI;IACnB,KAAK,IAAIf,CAAC,GAAGN,IAAI,CAACO,MAAM,GAAG,CAAC,EAAED,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI,CAAC,EAAE;MAAA,IAAAgB,oBAAA,EAAAC,qBAAA,EAAAC,iBAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,QAAA,EAAAC,oBAAA,EAAAC,qBAAA;MAC3C,IACE,EAAAP,oBAAA,GAAAtB,IAAI,CAACM,CAAC,CAAC,CAACF,WAAW,cAAAkB,oBAAA,wBAAAC,qBAAA,GAAnBD,oBAAA,CAAqBP,MAAM,cAAAQ,qBAAA,uBAA3BA,qBAAA,CAA6BP,EAAE,QAAAQ,iBAAA,GAC/B3B,WAAW,CAACC,GAAG,cAAA0B,iBAAA,wBAAAC,qBAAA,GAAfD,iBAAA,CAAiBpB,WAAW,cAAAqB,qBAAA,wBAAAC,sBAAA,GAA5BD,qBAAA,CAA8BV,MAAM,cAAAW,sBAAA,uBAApCA,sBAAA,CAAsCV,EAAE,GACxC;QACA,MAAM,CAAC;MACT;;MACA,IAAMc,QAAQ,GAAGC,OAAO,EAAAJ,QAAA,GAAC3B,IAAI,CAACM,CAAC,CAAC,cAAAqB,QAAA,wBAAAC,oBAAA,GAAPD,QAAA,CAASvB,WAAW,cAAAwB,oBAAA,wBAAAC,qBAAA,GAApBD,oBAAA,CAAsBb,MAAM,cAAAc,qBAAA,uBAA5BA,qBAAA,CAA8BG,UAAU,CAAC;MAClE,IAAIF,QAAQ,EAAE;QACZT,QAAQ,GAAG,KAAK;QAChB,MAAM,CAAC;MACT;IACF;;IACA,OAAOA,QAAQ;EACjB;EAEAY,WAAWA,CAAA,EAAY;IACrB,IAAMjC,IAAI,GAAG,IAAI,CAACP,UAAU,CAAC,CAAC;IAE9B,IAAI4B,QAAQ,GAAG,IAAI;IACnB,KAAK,IAAIf,CAAC,GAAGN,IAAI,CAACO,MAAM,GAAG,CAAC,EAAED,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI,CAAC,EAAE;MAAA,IAAA4B,QAAA,EAAAC,oBAAA,EAAAC,qBAAA;MAC3C,IAAMN,QAAQ,GAAGC,OAAO,EAAAG,QAAA,GAAClC,IAAI,CAACM,CAAC,CAAC,cAAA4B,QAAA,wBAAAC,oBAAA,GAAPD,QAAA,CAAS9B,WAAW,cAAA+B,oBAAA,wBAAAC,qBAAA,GAApBD,oBAAA,CAAsBpB,MAAM,cAAAqB,qBAAA,uBAA5BA,qBAAA,CAA8BJ,UAAU,CAAC;MAClE,IAAIF,QAAQ,EAAE;QACZT,QAAQ,GAAG,KAAK;QAChB;MACF;IACF;IACA,OAAOA,QAAQ;EACjB;EAEAgB,aAAaA,CAAA,EAAY;IAAA,IAAAC,qBAAA,EAAAC,qBAAA;IACvB,IAAM;MAAEC,SAAS;MAAE3C;IAAY,CAAC,GAAG,IAAI,CAACV,KAAK;IAC7C,IAAMsD,OAAO,IAAAH,qBAAA,GAAGzD,WAAW,CAAC6D,iBAAiB,CAC3C7C,WAAW,CAAC8C,aAAa,CAACC,IAAI,EAC9B/C,WAAW,CAACgD,SAAS,CAAC,CACxB,CAAC,cAAAP,qBAAA,uBAHeA,qBAAA,CAGbvB,MAAM,CAACC,EAAE;IAEZ,OAAO,GAAAuB,qBAAA,GAACC,SAAS,CAACM,IAAI,CAACC,MAAM,cAAAR,qBAAA,eAArBA,qBAAA,CAAuBS,IAAI,CACjCC,KAAK,IAAKA,KAAK,CAAiBC,aAAa,KAAKT,OACpD,CAAC;EACH;EAEAU,MAAMA,CAAA,EAAiB;IAAA,IAAAC,iBAAA,EAAAC,qBAAA,EAAAC,sBAAA;IACrB,IAAM;MAAEC,iBAAiB;MAAE1D;IAAY,CAAC,GAAG,IAAI,CAACV,KAAK;IAErD,IAAMqE,cAAc,GAAG,CAAC,GAAGD,iBAAiB,CAAC;IAE7CC,cAAc,CAACC,IAAI,CAAC,OAAO;MACzBC,KAAK,EAAE,sBAAsB;MAC7BC,KAAK,EAAEnF,cAAc,CAACoF,MAAM,CAACC,MAAM,GAAG,IAAI;MAC1CC,MAAM,EAAE,IAAI,CAACtE,gBAAgB;MAC7B6B,QAAQ,EAAE,IAAI,CAACgB,aAAa,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAMP,QAAQ,IAAAsB,iBAAA,GAAGvD,WAAW,CAACC,GAAG,cAAAsD,iBAAA,wBAAAC,qBAAA,GAAfD,iBAAA,CAAiBhD,WAAW,cAAAiD,qBAAA,wBAAAC,sBAAA,GAA5BD,qBAAA,CAA8BtC,MAAM,cAAAuC,sBAAA,uBAApCA,sBAAA,CAAsCtB,UAAU;IACjEwB,cAAc,CAACC,IAAI,CAAC;MAClBC,KAAK,EAAE,OAAO;MACdK,KAAK,EAAE,EAAE;MACTJ,KAAK,EAAEnF,cAAc,CAACoF,MAAM,CAACI,GAAG;MAChCF,MAAM,EAAE,IAAI,CAAC1E,cAAc;MAC3BiC,QAAQ,EAAES,QAAQ,KAAKmC,SAAS,IAAI,CAACnC;IACvC,CAAC,CAAC;;IAEF;IACA0B,cAAc,CAACC,IAAI,CAAC,OAAO;MACzBC,KAAK,EAAE,qBAAqB;MAC5BK,KAAK,EAAE,EAAE;MACTJ,KAAK,EAAEnF,cAAc,CAACoF,MAAM,CAACI,GAAG;MAChCF,MAAM,EAAE,IAAI,CAACxE,oBAAoB;MACjC+B,QAAQ,EAAE,IAAI,CAACD,iBAAiB,CAAC;IACnC,CAAC,CAAC,CAAC;IAEHoC,cAAc,CAACC,IAAI,CAAC,OAAO;MACzBC,KAAK,EAAE,WAAW;MAClBK,KAAK,EAAE,EAAE;MACTJ,KAAK,EAAEnF,cAAc,CAACoF,MAAM,CAACI,GAAG;MAChCF,MAAM,EAAE,IAAI,CAACvE,kBAAkB;MAC/B8B,QAAQ,EAAE,IAAI,CAACY,WAAW,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,oBAAOjD,IAAA,CAACR,cAAc;MAAC0F,OAAO,EAAEV;IAAe,CAAE,CAAC;EACpD;AACF;AAACW,eAAA,CAnJKlF,gBAAgB,kBAIE;EACpBsE,iBAAiB,EAAE;AACrB,CAAC;AA+IH,IAAMa,eAAe,GACnBC,KAAgB,KAGZ;EACJ7B,SAAS,EAAE/D,YAAY,CAAC4F,KAAK;AAC/B,CAAC,CAAC;AAEF,IAAMC,yBAAyB,GAAG1F,OAAO,CAACwF,eAAe,EAAE;EACzD1F,YAAY,EAAEC;AAChB,CAAC,CAAC,CAACM,gBAAgB,CAAC;AAEpB,eAAeqF,yBAAyB","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,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss","../src/PanelErrorBoundary.scss"],"names":[],"mappings":"AAAA;AC6LA;AC3LA;EACE;EACA;EACA","file":"PanelErrorBoundary.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n@import './util.scss';\n","// Styling overrides for bootstrap\n@use 'sass:map';\n\n// Override / set color variables\n$red: var(--dh-color-visual-red);\n$orange: var(--dh-color-visual-orange);\n$yellow: var(--dh-color-visual-yellow);\n$green: var(--dh-color-visual-green);\n$blue: var(--dh-color-visual-blue);\n$purple: var(--dh-color-visual-purple);\n\n// Fallback colors are used if theme isn't loaded\n// this is required for error messages if the API doesn't load\n\n//Define our Gray scale\n$gray-100: var(--dh-color-gray-900, #fcfcfa);\n$gray-200: var(--dh-color-gray-800);\n$gray-300: var(--dh-color-gray-700);\n$gray-400: var(--dh-color-gray-600);\n$gray-500: var(--dh-color-gray-500);\n// intentional duplicate, scale doesn't line up otherwise\n// as we have gray-850 and spectrum doesn't and it is needed\n$gray-600: var(--dh-color-gray-500);\n$gray-700: var(--dh-color-gray-400);\n$gray-800: var(--dh-color-gray-300);\n$gray-850: var(--dh-color-gray-200);\n$gray-900: var(--dh-color-gray-75);\n$black: var(--dh-color-black, #1a171a);\n$white: var(--dh-color-white, #f0f0ee);\n\n//Define some UI colors\n$interfacegray: var(--dh-color-content-bg, #2d2a2e);\n$interfaceblue: var(--dh-color-accent-bg);\n$interfacewhite: $white;\n$interfaceblack: $black;\n$content-bg: var(--dh-color-content-bg, #2d2a2e);\n$background: var(--dh-color-bg, #1a171a);\n$foreground: var(--dh-color-fg, #f0f0ee);\n\n// Extend default Bootstrap $grays map\n$grays-custom: (\n '850': $gray-850,\n);\n$grays: () !default;\n$grays: map-merge($grays, $grays-custom);\n\n// Extend default Bootstrap $colors map\n$colors-custom: (\n 'black': $black,\n);\n$colors: () !default;\n$colors: map-merge($colors, $colors-custom);\n\n// Override default Bootstrap $theme-colors map by mapping each key to itself.\n// These will then be re-mapped inside of `button-outline-variant` and\n// `button-outline-variant` mixins in `bootstrap_override_mixins_buttons.scss`\n$theme-colors-self-map: ();\n@each $key\n in (\n 'primary',\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'light',\n 'dark'\n )\n{\n $theme-colors-self-map: map.set($theme-colors-self-map, $key, $key);\n}\n$theme-colors: () !default;\n$theme-colors: map-merge($theme-colors, $theme-colors-self-map);\n\n// Used by bootstrap_override_mixins_buttons.scss to map Bootstrap colors to\n// DH semantic colors\n$bootstrap-dh-semantic-map: (\n 'primary': 'accent',\n 'secondary': 'neutral',\n 'success': 'positive',\n 'info': 'info',\n 'warning': 'notice',\n 'danger': 'negative',\n // We shouldn't be using these, but mapping so they work with our custom\n // `color-yiq` mixin. If we find a way to remove $light + $dark that are\n // defined in Bootstrap _variables.scss, we should remove these\n 'light': 'neutral',\n 'dark': 'neutral',\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: var(--dh-color-accent-bg);\n$primary-hover: var(--dh-color-accent-hover-bg);\n$primary-dark: var(--dh-color-accent-down-bg);\n$secondary: var(--dh-color-neutral-bg);\n$secondary-hover: var(--dh-color-neutral-hover-bg);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: var(--dh-color-negative-bg);\n$danger-hover: var(--dh-color-negative-hover-bg);\n// We really don't want to use $light or $dark variables, but Bootstrap defines\n// them in _variables.scss. Explicitly setting them to ensure we are in control\n// of their values. If we can find a way to remove them, we should\n$light: var(--dh-color-gray-light);\n$dark: var(--dh-color-gray-dark);\n// Bootstrap doesn't define $mid, and we want to move away from this particular\n// semantic. Should be deleted by #1635\n$mid: var(--dh-color-gray-mid);\n\n$semantic-colors: (\n 'primary-hover': $primary-hover,\n 'primary-dark': $primary-dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n 'secondary-hover': $secondary-hover,\n 'danger-hover': $danger-hover,\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif:\n 'Fira Sans',\n -apple-system,\n blinkmacsystemfont,\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n arial,\n sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n$text-select-color: var(--dh-color-text-highlight);\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem var(--dh-color-dropshadow);\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition:\n color 0.12s ease-in-out,\n background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out,\n box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n$btn-font-weight: var(--spectrum-global-font-weight-bold);\n$btn-line-height: 1.3;\n\n//Override Inputs\n$input-bg: var(--dh-color-input-bg);\n$input-disabled-bg: var(--dh-color-input-disabled-bg);\n$input-color: var(--dh-color-input-fg);\n$input-border-color: var(--dh-color-input-border);\n$input-placeholder-color: var(--dh-color-input-placeholder);\n$input-focus-border-color: var(--dh-color-input-focus-border);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: color-mix(\n in srgb,\n var(--dh-color-accent) 35%,\n transparent\n);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n$input-btn-line-height: 1.3;\n// Bootstrap uses a calc expression to determine the input height (calc(line-height + 2*padding-y + border)).\n// The padding-y value has to be in rem to match units as it is a SASS calc.\n// Using 0.42145rem with 1.3 line height gets us to spectrum's 32px.\n/* stylelint-disable-next-line number-max-precision */\n$input-btn-padding-y: 0.42145rem;\n\n//checkbox\n$custom-control-indicator-bg: var(--dh-color-input-bg);\n$custom-control-indicator-border-color: var(--dh-color-input-border);\n$custom-checkbox-indicator-border-radius: 2px;\n$custom-control-indicator-border-width: 2px;\n$custom-control-indicator-active-bg: var(--dh-color-input-bg);\n$custom-control-indicator-active-border-color: var(--dh-color-input-fg);\n$custom-control-indicator-checked-bg: var(--dh-color-input-fg);\n$custom-control-indicator-checked-color: black; // used as mask fill color\n$custom-checkbox-indicator-indeterminate-bg: var(--dh-color-input-fg);\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: var(--dh-color-input-disabled-bg);\n$custom-control-indicator-checked-disabled-bg: var(\n --dh-color-input-disabled-bg\n);\n$custom-control-label-disabled-color: var(--dh-color-input-disabled-fg);\n\n// The $custom-select-indicator variable is used by Bootstrap to provide the\n// icon for the select dropdown. Inline svgs can't use CSS variables, so we hard\n// code the color to #929192 (the default value of --dh-color-gray-600). PR #1651\n// overrides this icon altogether for known dropdowns, so technically we may not\n// need this, but it's here in case there are any remaining instances.\n$custom-select-indicator-color: #929192;\n$custom-select-bg: var(--dh-color-selector-bg);\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: $gray-500;\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $content-bg;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n$close-color: var(--dh-color-text);\n$close-text-shadow: none;\n\n// Toast notification\n$toast-bg: var(--dh-color-accent-100);\n$toast-color: var(--dh-color-text);\n$toast-error-bg: var(--dh-color-negative-bg);\n$toast-error-color: var(--dh-color-text);\n\n//tooltips\n$tooltip-bg: var(--dh-color-tooltip-bg);\n$tooltip-color: var(--dh-color-tooltip-fg);\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem var(--dh-color-tooltip-box-shadow);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: var(--dh-color-item-list-hover-bg);\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: var(--dh-color-popover-bg);\n$contextmenu-color: var(--dh-color-text);\n$contextmenu-disabled-color: var(--dh-color-input-disabled-fg);\n$contextmenu-keyboard-selected-bg: var(--dh-color-keyboard-selected-bg);\n$contextmenu-selected-bg: var(--dh-color-item-list-hover-bg);\n$contextmenu-selected-color: var(--dh-color-item-list-selected-fg);\n\n//hr\n$hr-border-color: var(--dh-color-hr);\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: $danger;\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n\n// This section of variables is not consumed directly by DH, but they need to be\n// defined for sass to compile _variables\n$table-dark-bg: $gray-800;\n$table-dark-accent-bg: var(--dh-color-highlight-hover);\n$table-dark-hover-bg: var(--dh-color-highlight-active);\n$table-dark-border-color: $gray-700;\n$popover-bg: var(--dh-color-tooltip-bg);\n$popover-border-color: var(--dh-color-overlay-modal-bg);\n$popover-header-bg: #000;\n$popover-arrow-outer-color: var(--dh-color-dropshadow);\n$custom-range-thumb-active-bg: var(--dh-color-accent-1100);\n","@import '@deephaven/components/scss/custom.scss';\n\n.panel-error-boundary {\n height: 100%;\n width: 100%;\n position: relative;\n}\n"]}
1
+ {"version":3,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss","../src/PanelErrorBoundary.scss"],"names":[],"mappings":"AAAA;AC6LA;AC3LA;EACE;EACA;EACA","file":"PanelErrorBoundary.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n@import './util.scss';\n","// Styling overrides for bootstrap\n@use 'sass:map';\n\n// Override / set color variables\n$red: var(--dh-color-visual-red);\n$orange: var(--dh-color-visual-orange);\n$yellow: var(--dh-color-visual-yellow);\n$green: var(--dh-color-visual-green);\n$blue: var(--dh-color-visual-blue);\n$purple: var(--dh-color-visual-purple);\n\n// Fallback colors are used if theme isn't loaded\n// this is required for error messages if the API doesn't load\n\n//Define our Gray scale\n$gray-100: var(--dh-color-gray-900, #fcfcfa);\n$gray-200: var(--dh-color-gray-800);\n$gray-300: var(--dh-color-gray-700);\n$gray-400: var(--dh-color-gray-600);\n$gray-500: var(--dh-color-gray-500);\n// intentional duplicate, scale doesn't line up otherwise\n// as we have gray-850 and spectrum doesn't and it is needed\n$gray-600: var(--dh-color-gray-500);\n$gray-700: var(--dh-color-gray-400);\n$gray-800: var(--dh-color-gray-300);\n$gray-850: var(--dh-color-gray-200);\n$gray-900: var(--dh-color-gray-75);\n$black: var(--dh-color-black, #1a171a);\n$white: var(--dh-color-white, #f0f0ee);\n\n//Define some UI colors\n$interfacegray: var(--dh-color-content-bg, #2d2a2e);\n$interfaceblue: var(--dh-color-accent-bg);\n$interfacewhite: $white;\n$interfaceblack: $black;\n$content-bg: var(--dh-color-content-bg, #2d2a2e);\n$background: var(--dh-color-bg, #1a171a);\n$foreground: var(--dh-color-fg, #f0f0ee);\n\n// Extend default Bootstrap $grays map\n$grays-custom: (\n '850': $gray-850,\n);\n$grays: () !default;\n$grays: map-merge($grays, $grays-custom);\n\n// Extend default Bootstrap $colors map\n$colors-custom: (\n 'black': $black,\n);\n$colors: () !default;\n$colors: map-merge($colors, $colors-custom);\n\n// Override default Bootstrap $theme-colors map by mapping each key to itself.\n// These will then be re-mapped inside of `button-outline-variant` and\n// `button-outline-variant` mixins in `bootstrap_override_mixins_buttons.scss`\n$theme-colors-self-map: ();\n@each $key\n in (\n 'primary',\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'light',\n 'dark'\n )\n{\n $theme-colors-self-map: map.set($theme-colors-self-map, $key, $key);\n}\n$theme-colors: () !default;\n$theme-colors: map-merge($theme-colors, $theme-colors-self-map);\n\n// Used by bootstrap_override_mixins_buttons.scss to map Bootstrap colors to\n// DH semantic colors\n$bootstrap-dh-semantic-map: (\n 'primary': 'accent',\n 'secondary': 'neutral',\n 'success': 'positive',\n 'info': 'info',\n 'warning': 'notice',\n 'danger': 'negative',\n // We shouldn't be using these, but mapping so they work with our custom\n // `color-yiq` mixin. If we find a way to remove $light + $dark that are\n // defined in Bootstrap _variables.scss, we should remove these\n 'light': 'neutral',\n 'dark': 'neutral',\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: var(--dh-color-accent-bg);\n$primary-hover: var(--dh-color-accent-hover-bg);\n$primary-dark: var(--dh-color-accent-down-bg);\n$secondary: var(--dh-color-neutral-bg);\n$secondary-hover: var(--dh-color-neutral-hover-bg);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: var(--dh-color-negative-bg);\n$danger-hover: var(--dh-color-negative-hover-bg);\n// We really don't want to use $light or $dark variables, but Bootstrap defines\n// them in _variables.scss. Explicitly setting them to ensure we are in control\n// of their values. If we can find a way to remove them, we should\n$light: var(--dh-color-gray-light);\n$dark: var(--dh-color-gray-dark);\n// Bootstrap doesn't define $mid, and we want to move away from this particular\n// semantic. Should be deleted by #1635\n$mid: var(--dh-color-gray-mid);\n\n$semantic-colors: (\n 'primary-hover': $primary-hover,\n 'primary-dark': $primary-dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n 'secondary-hover': $secondary-hover,\n 'danger-hover': $danger-hover,\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif:\n 'Fira Sans',\n -apple-system,\n blinkmacsystemfont,\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n arial,\n sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n$text-select-color: var(--dh-color-text-highlight);\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem var(--dh-color-dropshadow);\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition:\n color 0.12s ease-in-out,\n background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out,\n box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n$btn-font-weight: var(--spectrum-global-font-weight-bold);\n$btn-line-height: 1.3;\n\n//Override Inputs\n$input-bg: var(--dh-color-input-bg);\n$input-disabled-bg: var(--dh-color-input-disabled-bg);\n$input-color: var(--dh-color-input-fg);\n$input-border-color: var(--dh-color-input-border);\n$input-placeholder-color: var(--dh-color-input-placeholder);\n$input-focus-border-color: var(--dh-color-input-focus-border);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: color-mix(\n in srgb,\n var(--dh-color-accent) 35%,\n transparent\n);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n$input-btn-line-height: 1.3;\n// Bootstrap uses a calc expression to determine the input height (calc(line-height + 2*padding-y + border)).\n// The padding-y value has to be in rem to match units as it is a SASS calc.\n// Using 0.42145rem with 1.3 line height gets us to spectrum's 32px.\n/* stylelint-disable-next-line number-max-precision */\n$input-btn-padding-y: 0.42145rem;\n\n//checkbox\n$custom-control-indicator-bg: var(--dh-color-input-bg);\n$custom-control-indicator-border-color: var(--dh-color-input-border);\n$custom-checkbox-indicator-border-radius: 2px;\n$custom-control-indicator-border-width: 2px;\n$custom-control-indicator-active-bg: var(--dh-color-input-bg);\n$custom-control-indicator-active-border-color: var(--dh-color-input-fg);\n$custom-control-indicator-checked-bg: var(--dh-color-input-fg);\n$custom-control-indicator-checked-color: black; // used as mask fill color\n$custom-checkbox-indicator-indeterminate-bg: var(--dh-color-input-fg);\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: var(--dh-color-input-disabled-bg);\n$custom-control-indicator-checked-disabled-bg: var(\n --dh-color-input-disabled-bg\n);\n$custom-control-label-disabled-color: var(--dh-color-input-disabled-fg);\n\n// The $custom-select-indicator variable is used by Bootstrap to provide the\n// icon for the select dropdown. Inline svgs can't use CSS variables, so we hard\n// code the color to #929192 (the default value of --dh-color-gray-600). PR #1651\n// overrides this icon altogether for known dropdowns, so technically we may not\n// need this, but it's here in case there are any remaining instances.\n$custom-select-indicator-color: #929192;\n$custom-select-bg: var(--dh-color-selector-bg);\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: $gray-500;\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $content-bg;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n$close-color: var(--dh-color-text);\n$close-text-shadow: none;\n\n// Toast notification\n$toast-bg: var(--dh-color-accent-100);\n$toast-color: var(--dh-color-text);\n$toast-error-bg: var(--dh-color-negative-bg);\n$toast-error-color: var(--dh-color-text);\n\n//tooltips\n$tooltip-bg: var(--dh-color-tooltip-bg);\n$tooltip-color: var(--dh-color-tooltip-fg);\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem var(--dh-color-tooltip-box-shadow);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: var(--dh-color-item-list-hover-bg);\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: var(--dh-color-popover-bg);\n$contextmenu-color: var(--dh-color-text);\n$contextmenu-disabled-color: var(--dh-color-text-disabled);\n$contextmenu-keyboard-selected-bg: var(--dh-color-keyboard-selected-bg);\n$contextmenu-selected-bg: var(--dh-color-item-list-hover-bg);\n$contextmenu-selected-color: var(--dh-color-item-list-selected-fg);\n\n//hr\n$hr-border-color: var(--dh-color-hr);\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: $danger;\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n\n// This section of variables is not consumed directly by DH, but they need to be\n// defined for sass to compile _variables\n$table-dark-bg: $gray-800;\n$table-dark-accent-bg: var(--dh-color-highlight-hover);\n$table-dark-hover-bg: var(--dh-color-highlight-active);\n$table-dark-border-color: $gray-700;\n$popover-bg: var(--dh-color-tooltip-bg);\n$popover-border-color: var(--dh-color-overlay-modal-bg);\n$popover-header-bg: #000;\n$popover-arrow-outer-color: var(--dh-color-dropshadow);\n$custom-range-thumb-active-bg: var(--dh-color-accent-1100);\n","@import '@deephaven/components/scss/custom.scss';\n\n.panel-error-boundary {\n height: 100%;\n width: 100%;\n position: relative;\n}\n"]}
@@ -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","ignoreList":[]}
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 +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","ignoreList":[]}
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"}