11import React , { PureComponent , ReactElement } from 'react' ;
22import { ContextAction , ContextActions } from '@deephaven/components' ;
3- import type { Container , Tab } from '@deephaven/golden-layout' ;
3+ import type { Container , EventEmitter , Tab } from '@deephaven/golden-layout' ;
4+ import {
5+ CustomizableWorkspace ,
6+ RootState ,
7+ getWorkspace ,
8+ setWorkspace as setWorkspaceAction ,
9+ } from '@deephaven/redux' ;
10+ import { connect } from 'react-redux' ;
11+ import { ClosedPanel , LayoutUtils , PanelEvent } from '@deephaven/dashboard' ;
412
513interface PanelContextMenuProps {
614 additionalActions : ContextAction [ ] ;
715 glContainer : Container ;
16+ glEventHub : EventEmitter ;
17+ workspace : CustomizableWorkspace ;
818}
919
1020interface HasContainer {
@@ -26,6 +36,7 @@ class PanelContextMenu extends PureComponent<
2636 this . handleCloseTab = this . handleCloseTab . bind ( this ) ;
2737 this . handleCloseTabsRight = this . handleCloseTabsRight . bind ( this ) ;
2838 this . handleCloseTabsAll = this . handleCloseTabsAll . bind ( this ) ;
39+ this . handleReopenLast = this . handleReopenLast . bind ( this ) ;
2940 }
3041
3142 getAllTabs ( ) : Tab [ ] {
@@ -66,6 +77,11 @@ class PanelContextMenu extends PureComponent<
6677 }
6778 }
6879
80+ handleReopenLast ( ) : void {
81+ const { glContainer, glEventHub } = this . props ;
82+ glEventHub . emit ( PanelEvent . REOPEN_LAST , glContainer ) ;
83+ }
84+
6985 canCloseTabsRight ( ) : boolean {
7086 const { glContainer } = this . props ;
7187 const tabs = this . getAllTabs ( ) ;
@@ -101,13 +117,32 @@ class PanelContextMenu extends PureComponent<
101117 return disabled ;
102118 }
103119
120+ canReopenLast ( ) : boolean {
121+ const { workspace, glContainer } = this . props ;
122+ const stackId = LayoutUtils . getStackForConfig (
123+ glContainer . layoutManager . root ,
124+ glContainer . getConfig ( )
125+ ) ?. config . id ;
126+
127+ return ! workspace . data . closed ?. some (
128+ panel => ( panel as ClosedPanel ) . parentStackId === stackId
129+ ) ;
130+ }
131+
104132 render ( ) : ReactElement {
105133 const { additionalActions, glContainer } = this . props ;
106134
107135 const contextActions : ( ContextAction | ( ( ) => ContextAction ) ) [ ] = [
108136 ...additionalActions ,
109137 ] ;
110138
139+ contextActions . push ( ( ) => ( {
140+ title : 'Re-open closed panel' ,
141+ group : ContextActions . groups . medium + 2004 ,
142+ action : this . handleReopenLast ,
143+ disabled : this . canReopenLast ( ) ,
144+ } ) ) ;
145+
111146 const closable = glContainer . tab ?. contentItem ?. config ?. isClosable ;
112147 contextActions . push ( {
113148 title : 'Close' ,
@@ -138,4 +173,16 @@ class PanelContextMenu extends PureComponent<
138173 }
139174}
140175
141- export default PanelContextMenu ;
176+ const mapStateToProps = (
177+ state : RootState
178+ ) : {
179+ workspace : CustomizableWorkspace ;
180+ } => ( {
181+ workspace : getWorkspace ( state ) ,
182+ } ) ;
183+
184+ const ConnectedPanelContextMenu = connect ( mapStateToProps , {
185+ setWorkspace : setWorkspaceAction ,
186+ } ) ( PanelContextMenu ) ;
187+
188+ export default ConnectedPanelContextMenu ;
0 commit comments