From 83e7cbb4620d7e7d61c56fb25efc2069955eb78a Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Tue, 4 Jun 2024 16:07:31 -0400 Subject: [PATCH 1/1] 21225: Add styles to wrap mutually exclusive tabs and data explorer in same paper Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- .../data-explorer/data-explorer.tsx | 4 +- .../multi-panel-view/multi-panel-view.tsx | 105 ++++++++++++------ .../data-explorer/data-explorer.tsx | 2 +- .../project-panel/project-panel-data.tsx | 7 +- .../views/project-panel/project-panel-run.tsx | 2 + .../src/views/project-panel/project-panel.tsx | 9 +- 6 files changed, 92 insertions(+), 37 deletions(-) diff --git a/services/workbench2/src/components/data-explorer/data-explorer.tsx b/services/workbench2/src/components/data-explorer/data-explorer.tsx index 94deff0462..40ecfc5b38 100644 --- a/services/workbench2/src/components/data-explorer/data-explorer.tsx +++ b/services/workbench2/src/components/data-explorer/data-explorer.tsx @@ -126,6 +126,7 @@ interface DataExplorerDataProps { checkedList: TCheckedList; isNotFound: boolean; searchBarValue: string; + paperClassName?: string; } interface DataExplorerActionProps { @@ -218,10 +219,11 @@ export const DataExplorer = withStyles(styles)( setCheckedListOnStore, checkedList, working, + paperClassName, } = this.props; return ( = theme => ({ - root: { + gridContainerRoot: { marginTop: '10px', }, + exclusiveGridContainerRoot: { + marginTop: 0, + }, + gridItemRoot: { + paddingTop: '0 !important', + }, + paperRoot: { + height: '100%', + display: 'flex', + flexDirection: 'column', + }, button: { padding: '2px 5px', marginRight: '5px', @@ -40,11 +60,8 @@ const styles: StyleRulesCallback = theme => ({ overflow: 'auto', maxWidth: 'initial', }, - tabsWrapper: { - width: '100%', - }, - tabsRoot: { - flexGrow: 1, + exclusiveContentPaper: { + boxShadow: 'none', }, tabs: { flexGrow: 1, @@ -60,6 +77,7 @@ interface MPVHideablePanelDataProps { illuminated: boolean; children: ReactNode; panelRef?: MutableRefObject; + paperClassName?: string; } interface MPVHideablePanelActionProps { @@ -70,10 +88,19 @@ interface MPVHideablePanelActionProps { type MPVHideablePanelProps = MPVHideablePanelDataProps & MPVHideablePanelActionProps; -const MPVHideablePanel = ({ doHidePanel, doMaximizePanel, doUnMaximizePanel, name, visible, maximized, illuminated, ...props }: MPVHideablePanelProps) => +const MPVHideablePanel = ({ doHidePanel, doMaximizePanel, doUnMaximizePanel, name, visible, maximized, illuminated, paperClassName, ...props }: MPVHideablePanelProps) => visible ? <> - {React.cloneElement((props.children as ReactElement), { doHidePanel, doMaximizePanel, doUnMaximizePanel, panelName: name, panelMaximized: maximized, panelIlluminated: illuminated, panelRef: props.panelRef })} + {React.cloneElement((props.children as ReactElement), { + doHidePanel, + doMaximizePanel, + doUnMaximizePanel, + panelName: name, + panelMaximized: maximized, + panelIlluminated: illuminated, + panelRef: props.panelRef, + paperClassName, + })} : null; @@ -85,6 +112,7 @@ interface MPVPanelDataProps { forwardProps?: boolean; maxHeight?: string; minHeight?: string; + paperClassName?: string; } interface MPVPanelActionProps { @@ -100,7 +128,7 @@ type MPVPanelContentProps = { children: ReactElement } & MPVPanelProps & GridPro // Grid item compatible component for layout and MPV props passing export const MPVPanelContent = ({ doHidePanel, doMaximizePanel, doUnMaximizePanel, panelName, - panelMaximized, panelIlluminated, panelRef, forwardProps, maxHeight, minHeight, + panelMaximized, panelIlluminated, panelRef, forwardProps, maxHeight, minHeight, paperClassName, ...props }: MPVPanelContentProps) => { useEffect(() => { if (panelRef && panelRef.current) { @@ -116,8 +144,8 @@ export const MPVPanelContent = ({ doHidePanel, doMaximizePanel, doUnMaximizePane {/* Element to scroll to when the panel is selected */} {forwardProps - ? React.cloneElement(props.children, { doHidePanel, doMaximizePanel, doUnMaximizePanel, panelName, panelMaximized }) - : props.children} + ? React.cloneElement(props.children, { doHidePanel, doMaximizePanel, doUnMaximizePanel, panelName, panelMaximized, paperClassName }) + : React.cloneElement(props.children, { paperClassName })} ; } @@ -231,7 +259,11 @@ const MPVContainerComponent = ({ children, panelStates, classes, ...props }: MPV ]; const aPanel = - null}> @@ -241,29 +273,38 @@ const MPVContainerComponent = ({ children, panelStates, classes, ...props }: MPV }; buttonBar = props.mutuallyExclusive ? - - showFn(val)()}> - {tabs.map((tgl, idx) => )} - - : - <> + showFn(val)()}> + {tabs.map((tgl, idx) => )} + : + {buttons.map((tgl, idx) => {tgl})} - ; + ; }; - return - - {buttonBar} - - setSelectedPanel(-1)}> - {panelVisibility.includes(true) - ? panels - : - - } - + const content = setSelectedPanel(-1)}> + {panelVisibility.includes(true) + ? panels + : + + } ; + + if (props.mutuallyExclusive) { + return + + + {buttonBar} + {content} + + + ; + } else { + return + {buttonBar} + {content} + ; + } }; export const MPVContainer = withStyles(styles)(MPVContainerComponent); diff --git a/services/workbench2/src/views-components/data-explorer/data-explorer.tsx b/services/workbench2/src/views-components/data-explorer/data-explorer.tsx index 0f4fc56358..bcf8683e89 100644 --- a/services/workbench2/src/views-components/data-explorer/data-explorer.tsx +++ b/services/workbench2/src/views-components/data-explorer/data-explorer.tsx @@ -86,7 +86,7 @@ const mapDispatchToProps = () => { setSelectedUuid: (uuid: string | null) => { dispatch(setSelectedResourceUuid(uuid)); }, - + onRowClick, onRowDoubleClick, diff --git a/services/workbench2/src/views/project-panel/project-panel-data.tsx b/services/workbench2/src/views/project-panel/project-panel-data.tsx index 59c6f22506..8526ebf083 100644 --- a/services/workbench2/src/views/project-panel/project-panel-data.tsx +++ b/services/workbench2/src/views/project-panel/project-panel-data.tsx @@ -150,7 +150,11 @@ export const projectPanelDataColumns: DataColumns = [ const DEFAULT_VIEW_MESSAGES = ['No data found']; -export const ProjectPanelData = class extends React.Component { +interface ProjectPanelDataProps { + paperClassName?: string; +}; + +export const ProjectPanelData = class extends React.Component { handleRowClick = () => {}; handleRowDoubleClick = () => {}; handleContextMenu = () => {}; @@ -164,6 +168,7 @@ export const ProjectPanelData = class extends React.Component { contextMenuColumn={true} defaultViewIcon={ProjectIcon} defaultViewMessages={DEFAULT_VIEW_MESSAGES} + paperClassName={this.props.paperClassName} />; } }; diff --git a/services/workbench2/src/views/project-panel/project-panel-run.tsx b/services/workbench2/src/views/project-panel/project-panel-run.tsx index 0dcda89e8b..e89e761389 100644 --- a/services/workbench2/src/views/project-panel/project-panel-run.tsx +++ b/services/workbench2/src/views/project-panel/project-panel-run.tsx @@ -174,6 +174,7 @@ const DEFAULT_VIEW_MESSAGES = ['No workflow runs found']; interface ProjectPanelRunProps { project?: ProjectResource; + paperClassName?: string; } const mapStateToProps = (state: RootState): ProjectPanelRunProps => { @@ -198,5 +199,6 @@ export const ProjectPanelRun = connect(mapStateToProps)((props: ProjectPanelRunP defaultViewIcon={ProjectIcon} defaultViewMessages={DEFAULT_VIEW_MESSAGES} progressBar={} + paperClassName={props.paperClassName} />; }); diff --git a/services/workbench2/src/views/project-panel/project-panel.tsx b/services/workbench2/src/views/project-panel/project-panel.tsx index fe01a9344f..f84d8e7090 100644 --- a/services/workbench2/src/views/project-panel/project-panel.tsx +++ b/services/workbench2/src/views/project-panel/project-panel.tsx @@ -39,6 +39,11 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ }, mpvRoot: { flexGrow: 1, + display: 'flex', + flexDirection: 'column', + '& > div': { + height: '100%', + }, }, dataExplorer: { height: "100%", @@ -92,14 +97,14 @@ export const ProjectPanel = withStyles(styles)( -- 2.30.2