From bd22d21e948cd0e084e09d2d708c0d08526dc1f6 Mon Sep 17 00:00:00 2001
From: Jacopo Gasparetto <jacopo.gasparetto@cnaf.infn.it>
Date: Wed, 26 Apr 2023 14:49:05 +0200
Subject: [PATCH] Add BucketInspector

---
 frontend/src/components/BucketInspector.tsx | 22 +++++++++
 frontend/src/components/Inspector.tsx       | 26 ++++++++++
 frontend/src/routes/BucketBrowser/index.tsx | 53 +++++++++++++--------
 3 files changed, 80 insertions(+), 21 deletions(-)
 create mode 100644 frontend/src/components/BucketInspector.tsx
 create mode 100644 frontend/src/components/Inspector.tsx

diff --git a/frontend/src/components/BucketInspector.tsx b/frontend/src/components/BucketInspector.tsx
new file mode 100644
index 0000000..1fdf530
--- /dev/null
+++ b/frontend/src/components/BucketInspector.tsx
@@ -0,0 +1,22 @@
+import { BucketObject } from "../models/bucket";
+import { Inspector, InspectorProps } from "./Inspector";
+
+interface BucketInspectorProps extends InspectorProps {
+  buckets: BucketObject[]
+}
+
+export const BucketInspector = (props: BucketInspectorProps) => {
+
+  const { buckets } = props;
+  const title = buckets.length === 1 ? buckets[0].Key : "Multiple objects";
+
+  return (
+    <Inspector
+      isOpen={props.isOpen}>
+      {props.children}
+      <div className="p-8 text-lg font-semibold">
+        {title}
+      </div>
+    </Inspector>
+  )
+}
\ No newline at end of file
diff --git a/frontend/src/components/Inspector.tsx b/frontend/src/components/Inspector.tsx
new file mode 100644
index 0000000..6af80e6
--- /dev/null
+++ b/frontend/src/components/Inspector.tsx
@@ -0,0 +1,26 @@
+import { ReactNode } from "react"
+import { Transition } from '@headlessui/react';
+
+export interface InspectorProps {
+  children?: ReactNode;
+  isOpen: boolean;
+}
+export const Inspector = ({ isOpen, children }: InspectorProps) => {
+  return (
+    <Transition
+      show={isOpen}
+      enter="transition-transform duration-200"
+      enterFrom="translate-x-64"
+      enterTo="translate-x-0"
+      leave="transition-transform duration-200"
+      leaveFrom='translate-x-0'
+      leaveTo="translate-x-64"
+    >
+      <div className="w-64 right-0 top-0 h-screen fixed z-1 overflow-auto">
+        <div className='h-full bg-gray-100 dark:bg-gray-800'>
+          {children}
+        </div>
+      </div>
+    </Transition>
+  )
+}
\ No newline at end of file
diff --git a/frontend/src/routes/BucketBrowser/index.tsx b/frontend/src/routes/BucketBrowser/index.tsx
index ec510b7..3c552a0 100644
--- a/frontend/src/routes/BucketBrowser/index.tsx
+++ b/frontend/src/routes/BucketBrowser/index.tsx
@@ -4,6 +4,7 @@ import { BucketObject } from '../../models/bucket';
 import { Column, Table } from '../../components/Table';
 import { getHumanSize } from '../../commons/utils';
 import { Button } from '../../components/Button';
+import { BucketInspector } from '../../components/BucketInspector';
 import {
   DocumentIcon,
   PhotoIcon,
@@ -194,31 +195,41 @@ export const BucketBrowser = ({ bucketName }: PropsType) => {
         icon={<ArrowLeftIcon />}
         onClick={() => navigate(-1)}
       />
-      <div className='container w-2/3'>
-        <div className="flex mt-8 place-content-between">
-          <div className='flex space-x-4'>
-            <InputFile
-              icon={<ArrowUpOnSquareIcon />}
-              onChange={handleFileChange}
+
+      <div className='top-0 fixed z-10 right-0 w-64 bg-slate-300'>
+        <BucketInspector
+          isOpen={selectedRows.size > 0}
+          buckets={Array.from(selectedRows).map(index => bucketObjects[index])}
+        />
+      </div>
+      <div className={`transition-all ease-in-out duration-200 ${selectedRows.size > 0 ? "mr-64" : "mr-0"}`}>
+        <div className='container w-2/3'>
+          <div className="flex mt-8 place-content-between">
+            <div className='flex space-x-4'>
+              <InputFile
+                icon={<ArrowUpOnSquareIcon />}
+                onChange={handleFileChange}
+              />
+            </div>
+            <Button
+              title="Delete file(s)"
+              icon={<TrashIcon />}
+              onClick={deleteSelectedObjects}
+              disabled={selectedRows.size === 0}
+            />
+          </div>
+          <div className="flex place-content-center mt-4">
+            <Table
+              selectable={true}
+              columns={columns}
+              data={tableData}
+              onSelect={onSelect}
+              selectedRows={selectedRows}
             />
           </div>
-          <Button
-            title="Delete file(s)"
-            icon={<TrashIcon />}
-            onClick={deleteSelectedObjects}
-            disabled={selectedRows.size === 0}
-          />
-        </div>
-        <div className="flex place-content-center mt-4">
-          <Table
-            selectable={true}
-            columns={columns}
-            data={tableData}
-            onSelect={onSelect}
-            selectedRows={selectedRows}
-          />
         </div>
       </div>
+
     </Page>
   )
 }
\ No newline at end of file
-- 
GitLab