From 18b067e3715b4986bd2aadd5daa5db8b1d84f17c Mon Sep 17 00:00:00 2001
From: vkovtun <viktor.kovtun@id.ethz.ch>
Date: Thu, 22 Jun 2023 17:06:19 +0200
Subject: [PATCH] SSDM-13579: Added file info panel.

---
 .../database/data-browser/DataBrowser.jsx     | 121 ++++++++++--------
 .../database/data-browser/InfoPanel.jsx       |  67 ++++++++++
 .../database/data-browser/Toolbar.jsx         |   1 -
 3 files changed, 132 insertions(+), 57 deletions(-)
 create mode 100644 ui-admin/src/js/components/database/data-browser/InfoPanel.jsx

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 b8c442ba83c..8c600dd90f6 100644
--- a/ui-admin/src/js/components/database/data-browser/DataBrowser.jsx
+++ b/ui-admin/src/js/components/database/data-browser/DataBrowser.jsx
@@ -12,6 +12,7 @@ import Grid from '@src/js/components/common/grid/Grid.jsx'
 import GridFilterOptions from '@src/js/components/common/grid/GridFilterOptions.js'
 import AppController from '@src/js/components/AppController.js'
 import ItemIcon from '@src/js/components/database/data-browser/ItemIcon.jsx'
+import { InfoPanel } from "@src/js/components/database/data-browser/InfoPanel.jsx";
 
 const styles = theme => ({
   boundary: {
@@ -24,6 +25,10 @@ const styles = theme => ({
   icon: {
     fontSize: '4rem',
   },
+  flex: {
+    display: 'flex',
+    flexWrap: 'wrap',
+  }
 })
 
 const configuration =
@@ -116,8 +121,8 @@ class DataBrowser extends React.Component {
     // TODO: implement
   }
 
-  handleSelect(file) {
-    this.setState({selectedFile: file});
+  handleSelect(selectedRow) {
+    this.setState({selectedFile: selectedRow.data});
   }
 
   handleMultiselect(file) {
@@ -142,60 +147,64 @@ class DataBrowser extends React.Component {
           viewType={viewType}
           onViewTypeChange={this.handleViewTypeChange}
         />
-        {viewType === 'list' && (
-          <Grid
-            // id={id}
-            // settingsId={id}
-            filterModes={[GridFilterOptions.COLUMN_FILTERS]}
-            header='Files'
-            columns={[
-              {
-                name: 'name',
-                label: 'Name',
-                sortable: true,
-                getValue: ({ row }) => row,
-                renderValue: ({ value }) => <><ItemIcon file={value} classes={classes} configuration={configuration} /> {value.name}</>,
-                renderFilter: null
-              },
-              {
-                name: 'size',
-                label: 'Size',
-                sortable: true,
-                getValue: ({ row }) => row.size
-              },
-              {
-                name: 'modified',
-                label: 'Modified',
-                sortable: false,
-                getValue: ({ row }) => row.lastModifiedTime.toLocaleString()
-              },
-            ]}
-            loadRows={this.load}
-            sort='registrationDate'
-            sortDirection='desc'
-            exportable={false}
-            selectable={true}
-            multiselectable={true}
-            loadSettings={null}
-            onSettingsChange={null}
-            onError={this.onError}
-            exportXLS={null}
-          />
-        )}
-        {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}
-          />
-        )}
+        <div className={classes.flex}>
+          {viewType === 'list' && (
+            <Grid
+              // id={id}
+              // settingsId={id}
+              filterModes={[GridFilterOptions.COLUMN_FILTERS]}
+              header='Files'
+              columns={[
+                {
+                  name: 'name',
+                  label: 'Name',
+                  sortable: true,
+                  getValue: ({ row }) => row,
+                  renderValue: ({ value }) => <><ItemIcon file={value} classes={classes} configuration={configuration} /> {value.name}</>,
+                  renderFilter: null
+                },
+                {
+                  name: 'size',
+                  label: 'Size',
+                  sortable: true,
+                  getValue: ({ row }) => row.size
+                },
+                {
+                  name: 'modified',
+                  label: 'Modified',
+                  sortable: false,
+                  getValue: ({ row }) => row.lastModifiedTime.toLocaleString()
+                },
+              ]}
+              loadRows={this.load}
+              sort='registrationDate'
+              sortDirection='desc'
+              exportable={false}
+              selectable={true}
+              multiselectable={true}
+              loadSettings={null}
+              onSettingsChange={null}
+              onError={this.onError}
+              onSelectedRowChange={this.handleSelect}
+              exportXLS={null}
+            />
+          )}
+          {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}
+            />
+          )}
+          <InfoPanel file={selectedFile} />
+        </div>
       </Paper>
     )
   }
diff --git a/ui-admin/src/js/components/database/data-browser/InfoPanel.jsx b/ui-admin/src/js/components/database/data-browser/InfoPanel.jsx
new file mode 100644
index 00000000000..082c516d5c0
--- /dev/null
+++ b/ui-admin/src/js/components/database/data-browser/InfoPanel.jsx
@@ -0,0 +1,67 @@
+/*
+ *  Copyright ETH 2023 Zürich, Scientific IT Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+import React from 'react'
+
+import autoBind from 'auto-bind'
+import Container from '@src/js/components/common/form/Container.jsx'
+import Table from '@material-ui/core/Table'
+import TableBody from '@material-ui/core/TableBody'
+import TableCell from '@material-ui/core/TableCell'
+import TableRow from '@material-ui/core/TableRow'
+
+export class InfoPanel extends React.Component {
+  constructor(props, context) {
+    super(props, context)
+    autoBind(this)
+  }
+
+  render() {
+    const { classes, file } = this.props
+
+    // return <div>Test</div>
+
+    return (file &&
+      <Container>
+        <Table>
+          <TableBody>
+            <TableRow>
+              <TableCell variant='head'>Name</TableCell>
+              <TableCell>{file.name}</TableCell>
+            </TableRow>
+            <TableRow>
+              <TableCell variant='head'>Size</TableCell>
+              <TableCell>{file.size}</TableCell>
+            </TableRow>
+            <TableRow>
+              <TableCell variant='head'>Created</TableCell>
+              <TableCell>{file.creationTime.toLocaleString()}</TableCell>
+            </TableRow>
+            <TableRow>
+              <TableCell variant='head'>Modified</TableCell>
+              <TableCell>{file.lastModifiedTime.toLocaleString()}</TableCell>
+            </TableRow>
+            <TableRow>
+              <TableCell variant='head'>Accessed</TableCell>
+              <TableCell>{file.lastAccessTime.toLocaleString()}</TableCell>
+            </TableRow>
+          </TableBody>
+        </Table>
+      </Container>
+    )
+  }
+}
diff --git a/ui-admin/src/js/components/database/data-browser/Toolbar.jsx b/ui-admin/src/js/components/database/data-browser/Toolbar.jsx
index dafb0c83732..a7cdd4ccedc 100644
--- a/ui-admin/src/js/components/database/data-browser/Toolbar.jsx
+++ b/ui-admin/src/js/components/database/data-browser/Toolbar.jsx
@@ -18,7 +18,6 @@
 import React from 'react'
 import { withStyles } from '@material-ui/core/styles'
 import messages from '@src/js/common/messages.js'
-import Container from '@src/js/components/common/form/Container.jsx'
 import Button from '@src/js/components/common/form/Button.jsx'
 import ViewComfyIcon from '@material-ui/icons/ViewComfy'
 import ViewListIcon from '@material-ui/icons/ViewList'
-- 
GitLab