import { ReactNodeArray } from 'prop-types';
import classNames from 'classnames';
-type CssRules = 'button' | 'buttonIcon' | 'content';
+type CssRules = 'root' | 'button' | 'buttonIcon' | 'content';
const styles: StyleRulesCallback<CssRules> = theme => ({
+ root: {
+ marginTop: '10px',
+ },
button: {
padding: '2px 5px',
marginRight: '5px',
interface MPVHideablePanelActionProps {
doHidePanel: () => void;
doMaximizePanel: () => void;
+ doUnMaximizePanel: () => void;
}
type MPVHideablePanelProps = MPVHideablePanelDataProps & MPVHideablePanelActionProps;
-const MPVHideablePanel = ({doHidePanel, doMaximizePanel, name, visible, maximized, illuminated, ...props}: MPVHideablePanelProps) =>
+const MPVHideablePanel = ({doHidePanel, doMaximizePanel, doUnMaximizePanel, name, visible, maximized, illuminated, ...props}: MPVHideablePanelProps) =>
visible
? <>
- {React.cloneElement((props.children as ReactElement), { doHidePanel, doMaximizePanel, 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 })}
</>
: null;
panelRef?: MutableRefObject<any>;
forwardProps?: boolean;
maxHeight?: string;
+ minHeight?: string;
}
interface MPVPanelActionProps {
doHidePanel?: () => void;
doMaximizePanel?: () => void;
+ doUnMaximizePanel?: () => void;
}
// Props received by panel implementors
type MPVPanelContentProps = {children: ReactElement} & MPVPanelProps & GridProps;
// Grid item compatible component for layout and MPV props passing
-export const MPVPanelContent = ({doHidePanel, doMaximizePanel, panelName,
- panelMaximized, panelIlluminated, panelRef, forwardProps, maxHeight,
+export const MPVPanelContent = ({doHidePanel, doMaximizePanel, doUnMaximizePanel, panelName,
+ panelMaximized, panelIlluminated, panelRef, forwardProps, maxHeight, minHeight,
...props}: MPVPanelContentProps) => {
useEffect(() => {
if (panelRef && panelRef.current) {
- panelRef.current.scrollIntoView({behavior: 'smooth'});
+ panelRef.current.scrollIntoView({alignToTop: true});
}
}, [panelRef]);
- const mh = panelMaximized
+ const maxH = panelMaximized
? '100%'
: maxHeight;
- return <Grid item style={{maxHeight: mh}} {...props}>
+ return <Grid item style={{maxHeight: maxH, minHeight}} {...props}>
<span ref={panelRef} /> {/* Element to scroll to when the panel is selected */}
<Paper style={{height: '100%'}} elevation={panelIlluminated ? 8 : 0}>
{ forwardProps
- ? React.cloneElement(props.children, { doHidePanel, doMaximizePanel, panelName, panelMaximized })
+ ? React.cloneElement(props.children, { doHidePanel, doMaximizePanel, doUnMaximizePanel, panelName, panelMaximized })
: props.children }
</Paper>
</Grid>;
} else if (!isArray(children)) {
children = [children];
}
- const visibility = (children as ReactNodeArray).map((_, idx) =>
+ const initialVisibility = (children as ReactNodeArray).map((_, idx) =>
!panelStates || // if panelStates wasn't passed, default to all visible panels
(panelStates[idx] &&
(panelStates[idx].visible || panelStates[idx].visible === undefined)));
- const [panelVisibility, setPanelVisibility] = useState<boolean[]>(visibility);
+ const [panelVisibility, setPanelVisibility] = useState<boolean[]>(initialVisibility);
+ const [previousPanelVisibility, setPreviousPanelVisibility] = useState<boolean[]>(initialVisibility);
const [highlightedPanel, setHighlightedPanel] = useState<number>(-1);
const [selectedPanel, setSelectedPanel] = useState<number>(-1);
const panelRef = useRef<any>(null);
if (isArray(children)) {
for (let idx = 0; idx < children.length; idx++) {
const showFn = (idx: number) => () => {
+ setPreviousPanelVisibility(initialVisibility);
setPanelVisibility([
...panelVisibility.slice(0, idx),
true,
setSelectedPanel(idx);
};
const hideFn = (idx: number) => () => {
+ setPreviousPanelVisibility(initialVisibility);
setPanelVisibility([
...panelVisibility.slice(0, idx),
false,
])
};
const maximizeFn = (idx: number) => () => {
+ setPreviousPanelVisibility(panelVisibility);
// Maximize X == hide all but X
setPanelVisibility([
...panelVisibility.slice(0, idx).map(() => false),
true,
...panelVisibility.slice(idx+1).map(() => false),
- ])
+ ]);
};
+ const unMaximizeFn = (idx: number) => () => {
+ setPanelVisibility(previousPanelVisibility);
+ setSelectedPanel(idx);
+ }
const panelName = panelStates === undefined
? `Panel ${idx+1}`
: (panelStates[idx] && panelStates[idx].name) || `Panel ${idx+1}`;
<MPVHideablePanel key={idx} visible={panelVisibility[idx]} name={panelName}
panelRef={(idx === selectedPanel) ? panelRef : undefined}
maximized={panelIsMaximized} illuminated={idx === highlightedPanel}
- doHidePanel={hideFn(idx)} doMaximizePanel={maximizeFn(idx)}>
+ doHidePanel={hideFn(idx)} doMaximizePanel={maximizeFn(idx)} doUnMaximizePanel={panelIsMaximized ? unMaximizeFn(idx) : () => null}>
{children[idx]}
</MPVHideablePanel>;
panels = [...panels, aPanel];
};
};
- return <Grid container {...props}>
+ return <Grid container {...props} className={classes.root}>
<Grid container item direction="row">
{ buttons.map((tgl, idx) => <Grid item key={idx}>{tgl}</Grid>) }
</Grid>
</Grid>;
};
-export const MPVContainer = withStyles(styles)(MPVContainerComponent);
\ No newline at end of file
+export const MPVContainer = withStyles(styles)(MPVContainerComponent);