--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from "react";
+import isImage from 'is-image';
+import { withStyles, WithStyles } from '@material-ui/core';
+import { FileTreeData } from '~/components/file-tree/file-tree-data';
+import { CollectionFileType } from '~/models/collection-file';
+
+export interface FileThumbnailProps {
+ file: FileTreeData;
+}
+
+export const FileThumbnail =
+ ({ file }: FileThumbnailProps) =>
+ file.type === CollectionFileType.FILE && isImage(file.name)
+ ? <ImageFileThumbnail file={file} />
+ : null;
+
+type ImageFileThumbnailCssRules = 'thumbnail';
+
+const imageFileThumbnailStyle = withStyles<ImageFileThumbnailCssRules>({
+ thumbnail: {
+ maxWidth: 250,
+ }
+});
+
+const ImageFileThumbnail = imageFileThumbnailStyle(
+ ({ classes, file }: WithStyles<ImageFileThumbnailCssRules> & FileThumbnailProps) =>
+ file.type === CollectionFileType.DIRECTORY
+ ? null
+ : <img
+ className={classes.thumbnail}
+ alt={file.name} />
+);
import { formatFileSize } from "~/common/formatters";
import { ListItemTextIcon } from "../list-item-text-icon/list-item-text-icon";
import { FileTreeData } from "./file-tree-data";
+import { FileThumbnail } from '~/components/file-tree/file-thumbnail';
type CssRules = "root" | "spacer" | "sizeInfo" | "button" | "moreOptions";
class extends React.Component<FileTreeItemProps & WithStyles<CssRules>> {
render() {
const { classes, item } = this.props;
- return <div className={classes.root}>
- <ListItemTextIcon
- icon={getIcon(item)}
- name={item.data.name} />
- <div className={classes.spacer} />
- <Typography
- className={classes.sizeInfo}
- variant="caption">{formatFileSize(item.data.size)}</Typography>
- <Tooltip title="More options" disableFocusListener>
- <IconButton
- className={classes.button}
- onClick={this.handleClick}>
- <MoreOptionsIcon className={classes.moreOptions}/>
- </IconButton>
- </Tooltip>
- </div >;
+ return <>
+ <div className={classes.root}>
+ <ListItemTextIcon
+ icon={getIcon(item)}
+ name={item.data.name} />
+ <div className={classes.spacer} />
+ <Typography
+ className={classes.sizeInfo}
+ variant="caption">{formatFileSize(item.data.size)}</Typography>
+ <Tooltip title="More options" disableFocusListener>
+ <IconButton
+ className={classes.button}
+ onClick={this.handleClick}>
+ <MoreOptionsIcon className={classes.moreOptions} />
+ </IconButton>
+ </Tooltip>
+ </div >
+ <FileThumbnail file={item.data} />
+ </>;
}
handleClick = (event: React.MouseEvent<any>) => {