diff --git a/ui-admin/src/js/components/database/data-browser/DataBrowser.jsx b/ui-admin/src/js/components/database/data-browser/DataBrowser.jsx index dd8e946f5ae084fc90fb3ec171da8513ae337a29..ef4e4246ce58f041f645a9557f5855bbb5d6691b 100644 --- a/ui-admin/src/js/components/database/data-browser/DataBrowser.jsx +++ b/ui-admin/src/js/components/database/data-browser/DataBrowser.jsx @@ -96,7 +96,9 @@ class DataBrowser extends React.Component { lastModifiedTime: new Date('2023-05-30 15:33:14.048038'), lastAccessTime: new Date('2023-05-30 15:33:14.048038') } - ] + ], + selectedFile: null, + multiselectedFiles: new Set([]) } } @@ -104,15 +106,56 @@ class DataBrowser extends React.Component { this.setState({ viewType }) } + handleClick(file) { + // TODO: implement + } + + handleSelect(file) { + this.setState({selectedFile: file}); + } + + handleMultiselect(file) { + // TODO: implement + } + render() { - const { viewType, files } = this.state + const { viewType, files, selectedFile, multiselectedFiles } = this.state const { classes } = this.props return ( <Paper className={classes.boundary}> - <Toolbar viewType={viewType} onViewTypeChange={this.handleViewTypeChange} /> - {viewType === 'list' && <ListView configuration={configuration} files={files} />} - {viewType === 'grid' && <GridView configuration={configuration} files={files} />} + <Toolbar + viewType={viewType} + onViewTypeChange={this.handleViewTypeChange} + /> + {viewType === 'list' && ( + <ListView + clickable={true} + selectable={true} + multiselectable={true} + onClick={this.handleClick} + onSelect={this.handleSelect} + onMultiselect={this.handleMultiselect} + configuration={configuration} + files={files} + selectedFile = {selectedFile} + multiselectedFiles = {multiselectedFiles} + /> + )} + {viewType === 'grid' && ( + <GridView + clickable={true} + selectable={true} + multiselectable={true} + onClick={this.handleClick} + onSelect={this.handleSelect} + onMultiselect={this.handleMultiselect} + configuration={configuration} + files={files} + selectedFile = {selectedFile} + multiselectedFiles = {multiselectedFiles} + /> + )} </Paper> ) } diff --git a/ui-admin/src/js/components/database/data-browser/GridView.jsx b/ui-admin/src/js/components/database/data-browser/GridView.jsx index 873846029c8f9e50790a6c01dcc93eb5c50f91f3..d16fc15ac14b88752992a6e2ad0c746c9a5fae5b 100644 --- a/ui-admin/src/js/components/database/data-browser/GridView.jsx +++ b/ui-admin/src/js/components/database/data-browser/GridView.jsx @@ -1,27 +1,73 @@ -import React from 'react' -import { withStyles } from '@material-ui/core/styles' -import GridViewItem from '@src/js/components/database/data-browser/GridViewItem.jsx' -import Grid from '@material-ui/core/Grid' - -const styles = (theme) => ({ - container: { - fontFamily: theme.typography.fontFamily, - display: 'grid', - gridTemplateColumns: 'repeat(auto-fill, minmax(8rem, 1fr))', - gridGap: '0.5rem' - } -}) +import React from "react"; +import { withStyles } from "@material-ui/core/styles"; +import GridViewItem from "@src/js/components/database/data-browser/GridViewItem.jsx"; +import Grid from "@material-ui/core/Grid"; +import autoBind from "auto-bind"; + +const styles = theme => ({ + container: { + fontFamily: theme.typography.fontFamily, + display: "grid", + gridTemplateColumns: "repeat(auto-fill, minmax(8rem, 1fr))", + gridGap: "0.5rem" + } +}); class GridView extends React.Component { + constructor(props, context) { + super(props, context); + autoBind(this); + } + + handleClick(event, file) { + const { clickable, onClick } = this.props; + + if (clickable && onClick) { + onClick(file); + } + } + + handleSelect(event, file) { + const { selectable, onSelect } = this.props; - render() { - const { classes, configuration, files } = this.props - return ( - <Grid container className={classes.container}> - {files.map((file) => <GridViewItem file={file} configuration={configuration}/>)} - </Grid> - ) + if (selectable && onSelect) { + onSelect(file); } + } + + handleMultiselect(event) { + event.preventDefault(); + event.stopPropagation(); + + const { multiselectable, onMultiselect, file } = this.props; + + if (multiselectable && onMultiselect) { + onMultiselect(file); + } + } + + render() { + const { clickable, selectable, multiselectable, classes, configuration, files, selectedFile, multiselectedFiles } = this.props; + + return ( + <Grid container className={classes.container}> + {files.map(file => ( + <GridViewItem + clickable={clickable} + selectable={selectable} + selected={selectedFile === file} + multiselectable={multiselectable} + multiselected={multiselectedFiles.has(file)} + file={file} + configuration={configuration} + onClick={this.handleClick} + onSelect={this.handleSelect} + onMultiselect={this.handleMultiselect} + /> + ))} + </Grid> + ); + } } -export default withStyles(styles)(GridView) +export default withStyles(styles)(GridView); diff --git a/ui-admin/src/js/components/database/data-browser/GridViewItem.jsx b/ui-admin/src/js/components/database/data-browser/GridViewItem.jsx index 4fa61126d9c6cd00e83335106d6b318b54dc9844..c9f88d8fcf5254b571992a97daa9a698cb8cf1c0 100644 --- a/ui-admin/src/js/components/database/data-browser/GridViewItem.jsx +++ b/ui-admin/src/js/components/database/data-browser/GridViewItem.jsx @@ -1,45 +1,93 @@ import React from 'react' import { withStyles } from '@material-ui/core/styles' import Grid from '@material-ui/core/Grid' -import Card from "@material-ui/core/Card"; -import { CardContent, CardMedia } from "@material-ui/core"; +import Card from '@material-ui/core/Card' +import { CardContent, CardMedia } from '@material-ui/core' import ItemIcon from '@src/js/components/database/data-browser/ItemIcon.jsx' +import autoBind from "auto-bind"; const styles = (theme) => ({ - cell: { - display: 'block', - position: 'relative', - width: '8rem', - height: '8rem', - overflow: 'hidden', - margin: '0.25rem', - textAlign: 'center', - cursor: 'pointer', - '&:hover': { - backgroundColor: '#0000000a' - }, - }, - name: { - padding: '0' + cell: { + display: 'block', + position: 'relative', + width: '8rem', + height: '8rem', + overflow: 'hidden', + margin: '0.25rem', + textAlign: 'center', + '&:hover': { + backgroundColor: '#0000000a' } + }, + name: { + padding: '0' + }, + clickable: { + cursor: 'pointer' + }, + selectable: { + cursor: 'pointer' + }, + selected: { + backgroundColor: '#e8f7fd' + } }) class GridViewItem extends React.Component { - render() { - const { classes, file, configuration } = this.props - - return ( - <Grid item component={Card} variant="outlined" className={classes.cell}> - <CardMedia> - <ItemIcon file={file} configuration={configuration} /> - </CardMedia> - <CardContent className={classes.name}> - {file.name} - </CardContent> - </Grid> - ) + + constructor(props, context) { + super(props, context); + autoBind(this); + } + + handleClick(event) { + const { onClick, onSelect, file } = this.props; + + onClick(event, file); + onSelect(event, file); + }; + + render() { + const { classes, + file, + configuration, + clickable, + selectable, + multiselectable, + selected + } = this.props + + let itemClasses = [classes.cell] + + if (multiselectable) { + itemClasses.push(classes.multiselectable) + } + if (selectable) { + itemClasses.push(classes.selectable) + } + if (selected) { + itemClasses.push(classes.selected) } + if (clickable) { + itemClasses.push(classes.clickable) + } + + return ( + <Grid + item + component={Card} + variant='outlined' + className={itemClasses.join(' ')} + onClick={this.handleClick} + > + <CardMedia> + <ItemIcon file={file} configuration={configuration} /> + </CardMedia> + <CardContent className={classes.name}>{file.name}</CardContent> + </Grid> + ) + } } export default withStyles(styles)(GridViewItem) diff --git a/ui-admin/src/js/components/database/data-browser/ListView.jsx b/ui-admin/src/js/components/database/data-browser/ListView.jsx index 5e0cb735a8ebd682c9e2a38f5f04d71dad42f3c1..6325a77c09bc54eb238a479a012d3a951f1587fe 100644 --- a/ui-admin/src/js/components/database/data-browser/ListView.jsx +++ b/ui-admin/src/js/components/database/data-browser/ListView.jsx @@ -55,7 +55,10 @@ const styles = theme => ({ tableData: { padding: theme.spacing(2), borderWidth: '0' - } + }, + selected: { + backgroundColor: '#e8f7fd' + }, }) class ListView extends React.Component {