width: "100%",
height: "200px",
position: "relative",
- border: "1px solid rgba(0, 0, 0, 0.42)"
+ border: "1px solid rgba(0, 0, 0, 0.42)",
+ boxSizing: 'border-box',
},
dropzoneBorder: {
content: "",
import { Button, StyleRulesCallback, WithStyles, withStyles, CircularProgress } from '@material-ui/core';
import { WithDialogProps } from 'store/dialog/with-dialog';
-type CssRules = "button" | "lastButton" | "formContainer" | "dialogTitle" | "progressIndicator" | "dialogActions";
+type CssRules = "button" | "lastButton" | "form" | "formContainer" | "dialogTitle" | "progressIndicator" | "dialogActions";
const styles: StyleRulesCallback<CssRules> = theme => ({
button: {
marginLeft: theme.spacing.unit,
marginRight: "0",
},
+ form: {
+ display: 'flex',
+ overflowY: 'auto',
+ flexDirection: 'column',
+ flex: '0 1 auto',
+ },
formContainer: {
display: "flex",
flexDirection: "column",
disableEscapeKeyDown={props.submitting}
fullWidth
maxWidth='md'>
- <form data-cy='form-dialog'>
+ <form data-cy='form-dialog' className={props.classes.form}>
<DialogTitle className={props.classes.dialogTitle}>
{props.dialogTitle}
</DialogTitle>
export const CollectionPartialCopyFields = memoize(
(pickerId: string) =>
() =>
- <div>
+ <>
<CollectionNameField />
<CollectionDescriptionField />
<CollectionProjectPickerField {...{ pickerId }} />
- </div>);
+ </>);
const CopyDialogFields = memoize((pickerId: string) =>
() =>
- <span>
+ <>
<Field
name='name'
component={TextField as any}
component={ProjectTreePickerField}
validate={COPY_FILE_VALIDATION}
pickerId={pickerId}/>
- </span>);
+ </>);
export const CollectionPartialCopyFields = memoize(
(pickerId: string) =>
() =>
- <div>
+ <>
<CollectionPickerField {...{ pickerId }}/>
- </div>);
+ </>);
export const FileUploader = connect(mapStateToProps, mapDispatchToProps)(FileUpload);
export const FileUploaderField = (props: WrappedFieldProps & { label?: string }) =>
- <div>
+ <>
<Typography variant='caption'>{props.label}</Typography>
<FileUploader disabled={false} onDrop={props.input.onChange} />
- </div>;
+ </>;
import { PickerIdProp } from 'store/tree-picker/picker-id';
export const ProjectTreePickerField = (props: WrappedFieldProps & PickerIdProp) =>
- <div style={{ height: '200px', display: 'flex', flexDirection: 'column' }}>
- <ProjectsTreePicker
- pickerId={props.pickerId}
- toggleItemActive={handleChange(props)}
- options={{ showOnlyOwned: false, showOnlyWritable: true }} />
- {props.meta.dirty && props.meta.error &&
- <Typography variant='caption' color='error'>
- {props.meta.error}
- </Typography>}
+ <div style={{ display: 'flex', minHeight: 0, flexDirection: 'column' }}>
+ <div style={{ flexBasis: '200px', flexShrink: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>
+ <ProjectsTreePicker
+ pickerId={props.pickerId}
+ toggleItemActive={handleChange(props)}
+ options={{ showOnlyOwned: false, showOnlyWritable: true }} />
+ {props.meta.dirty && props.meta.error &&
+ <Typography variant='caption' color='error'>
+ {props.meta.error}
+ </Typography>}
+ </div>
</div>;
const handleChange = (props: WrappedFieldProps) =>
props.input.onChange(id);
export const CollectionTreePickerField = (props: WrappedFieldProps & PickerIdProp) =>
- <div style={{ height: '200px', display: 'flex', flexDirection: 'column' }}>
- <ProjectsTreePicker
- pickerId={props.pickerId}
- toggleItemActive={handleChange(props)}
- options={{ showOnlyOwned: false, showOnlyWritable: true }}
- includeCollections />
- {props.meta.dirty && props.meta.error &&
- <Typography variant='caption' color='error'>
- {props.meta.error}
- </Typography>}
+ <div style={{ display: 'flex', minHeight: 0, flexDirection: 'column' }}>
+ <div style={{ flexBasis: '200px', flexShrink: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>
+ <ProjectsTreePicker
+ pickerId={props.pickerId}
+ toggleItemActive={handleChange(props)}
+ options={{ showOnlyOwned: false, showOnlyWritable: true }}
+ includeCollections />
+ {props.meta.dirty && props.meta.error &&
+ <Typography variant='caption' color='error'>
+ {props.meta.error}
+ </Typography>}
+ </div>
</div>;
onBlur={this.props.input.onBlur}
disabled={this.props.commandInput.disabled} />
- dialog = () =>
- <Dialog
- open={this.state.open}
- onClose={this.closeDialog}
- fullWidth
- maxWidth='md' >
- <DialogTitle>Choose collections</DialogTitle>
- <DialogContent>
- <this.dialogContent />
- </DialogContent>
- <DialogActions>
- <Button onClick={this.closeDialog}>Cancel</Button>
- <Button
- data-cy='ok-button'
- variant='contained'
- color='primary'
- onClick={this.submit}>Ok</Button>
- </DialogActions>
- </Dialog>
-
dialogContentStyles: StyleRulesCallback<DialogContentCssRules> = ({ spacing }) => ({
root: {
display: 'flex',
flexDirection: 'column',
- height: `${spacing.unit * 8}vh`,
+ },
+ pickerWrapper: {
+ display: 'flex',
+ flexDirection: 'column',
+ flexBasis: `${spacing.unit * 8}vh`,
+ flexShrink: 1,
+ minHeight: 0,
},
tree: {
flex: 3,
padding: `${spacing.unit}px 0`,
overflowX: 'hidden',
},
- })
+ });
+
+ dialog = withStyles(this.dialogContentStyles)(
+ ({ classes }: WithStyles<DialogContentCssRules>) =>
+ <Dialog
+ open={this.state.open}
+ onClose={this.closeDialog}
+ fullWidth
+ maxWidth='md' >
+ <DialogTitle>Choose collections</DialogTitle>
+ <DialogContent className={classes.root}>
+ <this.dialogContent />
+ </DialogContent>
+ <DialogActions>
+ <Button onClick={this.closeDialog}>Cancel</Button>
+ <Button
+ data-cy='ok-button'
+ variant='contained'
+ color='primary'
+ onClick={this.submit}>Ok</Button>
+ </DialogActions>
+ </Dialog>
+ );
dialogContent = withStyles(this.dialogContentStyles)(
({ classes }: WithStyles<DialogContentCssRules>) =>
- <div className={classes.root}>
+ <div className={classes.pickerWrapper}>
<div className={classes.tree}>
<ProjectsTreePicker
pickerId={this.props.commandInput.id}
});
-type DialogContentCssRules = 'root' | 'tree' | 'divider' | 'chips';
+type DialogContentCssRules = 'root' | 'pickerWrapper' | 'tree' | 'divider' | 'chips';
options?: { showOnlyOwned: boolean, showOnlyWritable: boolean };
}
-type DialogContentCssRules = 'root';
+type DialogContentCssRules = 'root' | 'pickerWrapper';
export const DirectoryInput = ({ input, options }: DirectoryInputProps) =>
<Field
render() {
return <>
{this.renderInput()}
- {this.renderDialog()}
+ <this.dialog />
</>;
}
dialogContentStyles: StyleRulesCallback<DialogContentCssRules> = ({ spacing }) => ({
root: {
- height: `${spacing.unit * 8}vh`,
+ display: 'flex',
+ flexDirection: 'column',
+ },
+ pickerWrapper: {
+ flexBasis: `${spacing.unit * 8}vh`,
+ flexShrink: 1,
+ minHeight: 0,
},
});
- renderDialog() {
- return <Dialog
- open={this.state.open}
- onClose={this.closeDialog}
- fullWidth
- data-cy="choose-a-directory-dialog"
- maxWidth='md'>
- <DialogTitle>Choose a directory</DialogTitle>
- <DialogContent>
- <this.dialogContent />
- </DialogContent>
- <DialogActions>
- <Button onClick={this.closeDialog}>Cancel</Button>
- <Button
- disabled={!this.state.directory}
- variant='contained'
- color='primary'
- onClick={this.submit}>Ok</Button>
- </DialogActions>
- </Dialog>;
- }
-
- dialogContent = withStyles(this.dialogContentStyles)(
+ dialog = withStyles(this.dialogContentStyles)(
({ classes }: WithStyles<DialogContentCssRules>) =>
- <div className={classes.root}>
- <ProjectsTreePicker
- pickerId={this.props.commandInput.id}
- includeCollections
- options={this.props.options}
- toggleItemActive={this.setDirectory} />
- </div>
+ <Dialog
+ open={this.state.open}
+ onClose={this.closeDialog}
+ fullWidth
+ data-cy="choose-a-directory-dialog"
+ maxWidth='md'>
+ <DialogTitle>Choose a directory</DialogTitle>
+ <DialogContent className={classes.root}>
+ <div className={classes.pickerWrapper}>
+ <ProjectsTreePicker
+ pickerId={this.props.commandInput.id}
+ includeCollections
+ options={this.props.options}
+ toggleItemActive={this.setDirectory} />
+ </div>
+ </DialogContent>
+ <DialogActions>
+ <Button onClick={this.closeDialog}>Cancel</Button>
+ <Button
+ disabled={!this.state.directory}
+ variant='contained'
+ color='primary'
+ onClick={this.submit}>Ok</Button>
+ </DialogActions>
+ </Dialog>
);
});
onKeyPress={!this.props.commandInput.disabled ? this.openDialog : undefined}
onBlur={this.props.input.onBlur} />
- dialog = () =>
- <Dialog
- open={this.state.open}
- onClose={this.closeDialog}
- fullWidth
- maxWidth='md' >
- <DialogTitle>Choose files</DialogTitle>
- <DialogContent>
- <this.dialogContent />
- </DialogContent>
- <DialogActions>
- <Button onClick={this.closeDialog}>Cancel</Button>
- <Button
- data-cy='ok-button'
- variant='contained'
- color='primary'
- onClick={this.submit}>Ok</Button>
- </DialogActions>
- </Dialog>
-
dialogContentStyles: StyleRulesCallback<DialogContentCssRules> = ({ spacing }) => ({
root: {
display: 'flex',
flexDirection: 'column',
- height: `${spacing.unit * 8}vh`,
+ },
+ pickerWrapper: {
+ display: 'flex',
+ flexDirection: 'column',
+ flexBasis: `${spacing.unit * 8}vh`,
+ flexShrink: 1,
+ minHeight: 0,
},
tree: {
flex: 3,
},
})
+
+ dialog = withStyles(this.dialogContentStyles)(
+ ({ classes }: WithStyles<DialogContentCssRules>) =>
+ <Dialog
+ open={this.state.open}
+ onClose={this.closeDialog}
+ fullWidth
+ maxWidth='md' >
+ <DialogTitle>Choose files</DialogTitle>
+ <DialogContent className={classes.root}>
+ <this.dialogContent />
+ </DialogContent>
+ <DialogActions>
+ <Button onClick={this.closeDialog}>Cancel</Button>
+ <Button
+ data-cy='ok-button'
+ variant='contained'
+ color='primary'
+ onClick={this.submit}>Ok</Button>
+ </DialogActions>
+ </Dialog>
+ );
+
dialogContent = withStyles(this.dialogContentStyles)(
({ classes }: WithStyles<DialogContentCssRules>) =>
- <div className={classes.root}>
+ <div className={classes.pickerWrapper}>
<div className={classes.tree}>
<ProjectsTreePicker
pickerId={this.props.commandInput.id}
});
-type DialogContentCssRules = 'root' | 'tree' | 'divider' | 'chips';
+type DialogContentCssRules = 'root' | 'pickerWrapper' | 'tree' | 'divider' | 'chips';
options?: { showOnlyOwned: boolean, showOnlyWritable: boolean };
}
-type DialogContentCssRules = 'root';
+type DialogContentCssRules = 'root' | 'pickerWrapper';
export const FileInput = ({ input, options }: FileInputProps) =>
<Field
render() {
return <>
{this.renderInput()}
- {this.renderDialog()}
+ <this.dialog />
</>;
}
dialogContentStyles: StyleRulesCallback<DialogContentCssRules> = ({ spacing }) => ({
root: {
- height: `${spacing.unit * 8}vh`,
+ display: 'flex',
+ flexDirection: 'column',
+ },
+ pickerWrapper: {
+ flexBasis: `${spacing.unit * 8}vh`,
+ flexShrink: 1,
+ minHeight: 0,
},
});
- renderDialog() {
- return <Dialog
- open={this.state.open}
- onClose={this.closeDialog}
- fullWidth
- data-cy="choose-a-file-dialog"
- maxWidth='md'>
- <DialogTitle>Choose a file</DialogTitle>
- <DialogContent>
- <this.dialogContent />
- </DialogContent>
- <DialogActions>
- <Button onClick={this.closeDialog}>Cancel</Button>
- <Button
- disabled={!this.state.file}
- variant='contained'
- color='primary'
- onClick={this.submit}>Ok</Button>
- </DialogActions>
- </Dialog >;
- }
+ dialog = withStyles(this.dialogContentStyles)(
+ ({ classes }: WithStyles<DialogContentCssRules>) =>
+ <Dialog
+ open={this.state.open}
+ onClose={this.closeDialog}
+ fullWidth
+ data-cy="choose-a-file-dialog"
+ maxWidth='md'>
+ <DialogTitle>Choose a file</DialogTitle>
+ <DialogContent className={classes.root}>
+ <this.dialogContent />
+ </DialogContent>
+ <DialogActions>
+ <Button onClick={this.closeDialog}>Cancel</Button>
+ <Button
+ disabled={!this.state.file}
+ variant='contained'
+ color='primary'
+ onClick={this.submit}>Ok</Button>
+ </DialogActions>
+ </Dialog >
+ );
dialogContent = withStyles(this.dialogContentStyles)(
({ classes }: WithStyles<DialogContentCssRules>) =>
- <div className={classes.root}>
+ <div className={classes.pickerWrapper}>
<ProjectsTreePicker
pickerId={this.props.commandInput.id}
includeCollections
options?: { showOnlyOwned: boolean, showOnlyWritable: boolean };
}
-type DialogContentCssRules = 'root';
+type DialogContentCssRules = 'root' | 'pickerWrapper';
export const ProjectInput = ({ input, options }: ProjectInputProps) =>
<Field
render() {
return <>
{this.renderInput()}
- {this.renderDialog()}
+ <this.dialog />
</>;
}
dialogContentStyles: StyleRulesCallback<DialogContentCssRules> = ({ spacing }) => ({
root: {
- height: `${spacing.unit * 8}vh`,
+ display: 'flex',
+ flexDirection: 'column',
+ },
+ pickerWrapper: {
+ flexBasis: `${spacing.unit * 8}vh`,
+ flexShrink: 1,
+ minHeight: 0,
},
});
- renderDialog() {
- return this.state.open ? <Dialog
- open={this.state.open}
- onClose={this.closeDialog}
- fullWidth
- data-cy="choose-a-project-dialog"
- maxWidth='md'>
- <DialogTitle>Choose a project</DialogTitle>
- <DialogContent>
- <this.dialogContent />
- </DialogContent>
- <DialogActions>
- <Button onClick={this.closeDialog}>Cancel</Button>
- <Button
- disabled={this.invalid()}
- variant='contained'
- color='primary'
- onClick={this.submit}>Ok</Button>
- </DialogActions>
- </Dialog> : null;
- }
-
- dialogContent = withStyles(this.dialogContentStyles)(
+ dialog = withStyles(this.dialogContentStyles)(
({ classes }: WithStyles<DialogContentCssRules>) =>
- <div className={classes.root}>
- <ProjectsTreePicker
- pickerId={this.props.commandInput.id}
- options={this.props.options}
- toggleItemActive={this.setProject} />
- </div>
+ this.state.open ? <Dialog
+ open={this.state.open}
+ onClose={this.closeDialog}
+ fullWidth
+ data-cy="choose-a-project-dialog"
+ maxWidth='md'>
+ <DialogTitle>Choose a project</DialogTitle>
+ <DialogContent className={classes.root}>
+ <div className={classes.pickerWrapper}>
+ <ProjectsTreePicker
+ pickerId={this.props.commandInput.id}
+ options={this.props.options}
+ toggleItemActive={this.setProject} />
+ </div>
+ </DialogContent>
+ <DialogActions>
+ <Button onClick={this.closeDialog}>Cancel</Button>
+ <Button
+ disabled={this.invalid()}
+ variant='contained'
+ color='primary'
+ onClick={this.submit}>Ok</Button>
+ </DialogActions>
+ </Dialog> : null
);
});