From 6e429feccaa5e57b956e9d7c0c6039e597bffa1e Mon Sep 17 00:00:00 2001
From: vkovtun <viktor.kovtun@id.ethz.ch>
Date: Tue, 30 May 2023 18:19:42 +0200
Subject: [PATCH] SSDM-13579: First version of grid view.

---
 .../database/data-browser/GridView.jsx        | 14 ++---
 .../database/data-browser/GridViewItem.jsx    | 52 +++++++++++++++++++
 2 files changed, 59 insertions(+), 7 deletions(-)
 create mode 100644 ui-admin/src/js/components/database/data-browser/GridViewItem.jsx

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 55b7ed646e8..69163f7a8b5 100644
--- a/ui-admin/src/js/components/database/data-browser/GridView.jsx
+++ b/ui-admin/src/js/components/database/data-browser/GridView.jsx
@@ -1,19 +1,19 @@
 import React from 'react'
 import { withStyles } from '@material-ui/core/styles'
+import GridViewItem from "@src/js/components/database/data-browser/GridViewItem.jsx";
+import Container from "@src/js/components/common/form/Container.jsx";
 
 const styles = theme => ({
-    containerDefault: {
-        padding: `${theme.spacing(1)}px ${theme.spacing(2)}px`
-    },
-    containerSquare: {
-        padding: `${theme.spacing(2)}px ${theme.spacing(2)}px`
-    }
 })
 
 class GridView extends React.Component {
+
     render() {
+        const { classes, configuration, files } = this.props
         return (
-            <div>GridView</div>
+            <Container>
+                {files.map((file) => <GridViewItem file={file} configuration={configuration}/>)}
+            </Container>
         )
     }
 }
diff --git a/ui-admin/src/js/components/database/data-browser/GridViewItem.jsx b/ui-admin/src/js/components/database/data-browser/GridViewItem.jsx
new file mode 100644
index 00000000000..624509fae67
--- /dev/null
+++ b/ui-admin/src/js/components/database/data-browser/GridViewItem.jsx
@@ -0,0 +1,52 @@
+import React from 'react'
+import { withStyles } from '@material-ui/core/styles'
+import FolderIcon from "@material-ui/icons/FolderOpen";
+import FileIcon from "@material-ui/icons/InsertDriveFileOutlined";
+import autoBind from "auto-bind";
+
+const styles = theme => ({
+    icon: {
+        verticalAlign: 'middle',
+        fontSize: '4rem'
+    },
+})
+
+class GridViewItem extends React.Component {
+
+    constructor(props, context) {
+        super(props, context)
+        autoBind(this)
+
+        const { configuration } = this.props
+
+        this.extensionToIconType = new Map(
+          configuration.flatMap(
+            (configObject) => configObject.extensions.map(extension => [extension, configObject.icon])
+          )
+        )
+    }
+
+    // TODO: move out this method in favour of using a utility method from DataBrowser for example
+    getIcon(file) {
+        const { classes } = this.props
+
+        if (file.folder) {
+            return <FolderIcon className={classes.icon} />
+        } else {
+            const iconType = this.extensionToIconType.get(file.name.substring(file.name.lastIndexOf(".") + 1))
+            return iconType ? React.createElement(iconType, { className: classes.icon }) : <FileIcon className={classes.icon} />
+        }
+    }
+
+    render() {
+        const { classes, file } = this.props
+
+        return (
+            <div>
+                <>{this.getIcon(file)} {file.name}</>
+            </div>
+        )
+    }
+}
+
+export default withStyles(styles)(GridViewItem)
-- 
GitLab