From 32ff05ec0f3294a7d734a25cfac05361afe246ab Mon Sep 17 00:00:00 2001
From: ali asaria <aliasaria@users.noreply.github.com>
Date: Wed, 26 Jun 2024 11:14:37 -0400
Subject: [PATCH] move dataset table into own component so it can be reused

---
 src/renderer/components/Data/DatasetTable.tsx | 161 ++++++++++++++++++
 .../components/Data/PreviewDatasetModal.tsx   | 154 +----------------
 2 files changed, 163 insertions(+), 152 deletions(-)
 create mode 100644 src/renderer/components/Data/DatasetTable.tsx

diff --git a/src/renderer/components/Data/DatasetTable.tsx b/src/renderer/components/Data/DatasetTable.tsx
new file mode 100644
index 00000000..d9ac762d
--- /dev/null
+++ b/src/renderer/components/Data/DatasetTable.tsx
@@ -0,0 +1,161 @@
+import { useEffect, useState } from 'react';
+import {
+  Button,
+  Table,
+  CircularProgress,
+  Box,
+  IconButton,
+  iconButtonClasses,
+} from '@mui/joy';
+
+import * as chatAPI from '../../lib/transformerlab-api-sdk';
+import { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';
+import useSWR from 'swr';
+const fetcher = (url) =>
+  fetch(url)
+    .then((res) => res.json())
+    .then((data) => data);
+
+const DatasetTable = ({ datasetId }) => {
+  const [pageNumber, setPageNumber] = useState(1);
+  const [numOfPages, setNumOfPages] = useState(1);
+  const [datasetLen, setDatasetLen] = useState(null);
+  let pageSize = 10; //Set the number of rows per page
+  const offset = (pageNumber - 1) * pageSize; //Calculate current row number to start from
+  //Set the pagination for the dataset
+  const setPagination = (totalRows, rowsPerPage) => {
+    const totalPages = Math.ceil(totalRows / rowsPerPage);
+    setNumOfPages(totalPages);
+  };
+  const { data, error, isLoading, mutate } = useSWR(
+    chatAPI.Endpoints.Dataset.Preview(datasetId, offset, pageSize),
+    fetcher
+  );
+
+  useEffect(() => {
+    if (data && data.data && datasetLen === null) {
+      setDatasetLen(data.data['len']);
+      setPagination(data.data['len'], pageSize);
+    }
+  }, [data, pageSize, datasetLen]);
+  return (
+    <>
+      <Box sx={{ overflow: 'auto', height: '100%' }}>
+        {isLoading && <CircularProgress />}
+        {data &&
+          data?.data?.['columns'] && ( //Data is loaded as a map of column names to arrays of values
+            <Table sx={{ tableLayout: 'auto', overflow: 'scroll' }}>
+              <thead>
+                <tr>
+                  {Object.keys(data.data['columns']).map((key) => (
+                    <th key={key}>{key}</th>
+                  ))}
+                </tr>
+              </thead>
+              <tbody>
+                {Array.from({
+                  length:
+                    data.data['columns'][Object.keys(data.data['columns'])[0]]
+                      .length,
+                }).map((_, rowIndex) => (
+                  <tr key={rowIndex}>
+                    {Object.keys(data.data['columns']).map((key) => (
+                      <td
+                        key={key}
+                        style={{
+                          whiteSpace: 'pre-line',
+                          verticalAlign: 'top',
+                        }}
+                      >
+                        {typeof data.data['columns'][key][rowIndex] === 'string'
+                          ? data.data['columns'][key][rowIndex]
+                          : JSON.stringify(data.data['columns'][key][rowIndex])}
+                      </td>
+                    ))}
+                  </tr>
+                ))}
+              </tbody>
+            </Table>
+          )}{' '}
+      </Box>
+      <Box
+        className="Pagination"
+        sx={{
+          pt: 2,
+          gap: 1,
+          [`& .${iconButtonClasses.root}`]: { borderRadius: '50%' },
+          display: 'inline-flex',
+          alignItems: 'center',
+        }}
+      >
+        {pageNumber > 1 ? (
+          <Button
+            size="sm"
+            variant="outlined"
+            color="neutral"
+            onClick={() => setPageNumber(pageNumber - 1)}
+          >
+            <ChevronLeftIcon /> Previous
+          </Button>
+        ) : (
+          <div style={{ width: '78px', height: '30px' }} />
+        )}
+        <Box sx={{ flex: 1, alignItems: 'center' }} />
+        <IconButton
+          key={1}
+          size="sm"
+          variant={Number(1) === pageNumber ? 'outlined' : 'plain'}
+          color="neutral"
+          onClick={() => setPageNumber(Number(1))}
+        >
+          {1}
+        </IconButton>
+        {pageNumber > 4 ? '…' : <div />}
+        {Array.from(
+          { length: Math.min(5, numOfPages) },
+          (_, i) => pageNumber + i - 2
+        )
+          .filter((page) => page >= 2 && page < numOfPages)
+
+          .map((page) => (
+            <IconButton
+              key={page}
+              size="sm"
+              variant={page === pageNumber ? 'outlined' : 'plain'}
+              color="neutral"
+              onClick={() => setPageNumber(Number(page))}
+            >
+              {page}
+            </IconButton>
+          ))}
+        {pageNumber < numOfPages - 4 ? '…' : <div />}
+        {numOfPages != 1 && (
+          <IconButton
+            key={numOfPages}
+            size="sm"
+            variant={Number(numOfPages) === pageNumber ? 'outlined' : 'plain'}
+            color="neutral"
+            onClick={() => setPageNumber(Number(numOfPages))}
+          >
+            {numOfPages}
+          </IconButton>
+        )}
+        <Box sx={{ flex: 1 }} />
+        {pageNumber < numOfPages ? (
+          <Button
+            size="sm"
+            variant="outlined"
+            color="neutral"
+            onClick={() => setPageNumber(pageNumber + 1)}
+          >
+            Next <ChevronRightIcon />
+          </Button>
+        ) : (
+          <div style={{ width: '78px', height: '30px' }} />
+        )}
+      </Box>
+    </>
+  );
+};
+
+export default DatasetTable;
diff --git a/src/renderer/components/Data/PreviewDatasetModal.tsx b/src/renderer/components/Data/PreviewDatasetModal.tsx
index 5018eee6..c977c450 100644
--- a/src/renderer/components/Data/PreviewDatasetModal.tsx
+++ b/src/renderer/components/Data/PreviewDatasetModal.tsx
@@ -1,24 +1,14 @@
 /* eslint-disable camelcase */
-import { useEffect, useState } from 'react';
-import useSWR from 'swr';
 import {
-  Button,
   Divider,
-  Table,
-  Input,
   Modal,
   ModalClose,
   ModalDialog,
   Sheet,
   Typography,
-  CircularProgress,
-  Box,
-  IconButton,
 } from '@mui/joy';
-import { iconButtonClasses } from '@mui/joy/IconButton';
 
-import * as chatAPI from '../../lib/transformerlab-api-sdk';
-import { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';
+import DatasetTable from './DatasetTable';
 
 const fetcher = (url) =>
   fetch(url)
@@ -26,27 +16,6 @@ const fetcher = (url) =>
     .then((data) => data);
 
 export default function PreviewDatasetModal({ dataset_id, open, setOpen }) {
-  const [pageNumber, setPageNumber] = useState(1);
-  const [numOfPages, setNumOfPages] = useState(1);
-  const [datasetLen, setDatasetLen] = useState(null);
-  let pageSize = 10; //Set the number of rows per page
-  const offset = (pageNumber - 1) * pageSize; //Calculate current row number to start from
-  //Set the pagination for the dataset
-  const setPagination = (totalRows, rowsPerPage) => {
-    const totalPages = Math.ceil(totalRows / rowsPerPage);
-    setNumOfPages(totalPages);
-  };
-  const { data, error, isLoading, mutate } = useSWR(
-    chatAPI.Endpoints.Dataset.Preview(dataset_id, offset, pageSize),
-    fetcher
-  );
-  useEffect(() => {
-    if (data && data.data && datasetLen === null) {
-      setDatasetLen(data.data['len']);
-      setPagination(data.data['len'], pageSize);
-    }
-  }, [data, pageSize, datasetLen]);
-
   return (
     <Modal
       open={open}
@@ -71,126 +40,7 @@ export default function PreviewDatasetModal({ dataset_id, open, setOpen }) {
             justifyContent: 'space-between',
           }}
         >
-          <Box sx={{ overflow: 'auto', height: '100%' }}>
-            {isLoading && <CircularProgress />}
-            {data &&
-              data?.data?.['columns'] && ( //Data is loaded as a map of column names to arrays of values
-                <Table sx={{ tableLayout: 'auto', overflow: 'scroll' }}>
-                  <thead>
-                    <tr>
-                      {Object.keys(data.data['columns']).map((key) => (
-                        <th key={key}>{key}</th>
-                      ))}
-                    </tr>
-                  </thead>
-                  <tbody>
-                    {Array.from({
-                      length:
-                        data.data['columns'][
-                          Object.keys(data.data['columns'])[0]
-                        ].length,
-                    }).map((_, rowIndex) => (
-                      <tr key={rowIndex}>
-                        {Object.keys(data.data['columns']).map((key) => (
-                          <td
-                            key={key}
-                            style={{
-                              whiteSpace: 'pre-line',
-                              verticalAlign: 'top',
-                            }}
-                          >
-                            {typeof data.data['columns'][key][rowIndex] ===
-                            'string'
-                              ? data.data['columns'][key][rowIndex]
-                              : JSON.stringify(
-                                  data.data['columns'][key][rowIndex]
-                                )}
-                          </td>
-                        ))}
-                      </tr>
-                    ))}
-                  </tbody>
-                </Table>
-              )}{' '}
-          </Box>
-          <Box
-            className="Pagination"
-            sx={{
-              pt: 2,
-              gap: 1,
-              [`& .${iconButtonClasses.root}`]: { borderRadius: '50%' },
-              display: 'inline-flex',
-              alignItems: 'center',
-            }}
-          >
-            {pageNumber > 1 ? (
-              <Button
-                size="sm"
-                variant="outlined"
-                color="neutral"
-                onClick={() => setPageNumber(pageNumber - 1)}
-              >
-                <ChevronLeftIcon /> Previous
-              </Button>
-            ) : (
-              <div style={{ width: '78px', height: '30px' }} />
-            )}
-            <Box sx={{ flex: 1, alignItems: 'center' }} />
-            <IconButton
-              key={1}
-              size="sm"
-              variant={Number(1) === pageNumber ? 'outlined' : 'plain'}
-              color="neutral"
-              onClick={() => setPageNumber(Number(1))}
-            >
-              {1}
-            </IconButton>
-            {pageNumber > 4 ? '…' : <div />}
-            {Array.from(
-              { length: Math.min(5, numOfPages) },
-              (_, i) => pageNumber + i - 2
-            )
-              .filter((page) => page >= 2 && page < numOfPages)
-
-              .map((page) => (
-                <IconButton
-                  key={page}
-                  size="sm"
-                  variant={page === pageNumber ? 'outlined' : 'plain'}
-                  color="neutral"
-                  onClick={() => setPageNumber(Number(page))}
-                >
-                  {page}
-                </IconButton>
-              ))}
-            {pageNumber < numOfPages - 4 ? '…' : <div />}
-            {numOfPages != 1 && (
-              <IconButton
-                key={numOfPages}
-                size="sm"
-                variant={
-                  Number(numOfPages) === pageNumber ? 'outlined' : 'plain'
-                }
-                color="neutral"
-                onClick={() => setPageNumber(Number(numOfPages))}
-              >
-                {numOfPages}
-              </IconButton>
-            )}
-            <Box sx={{ flex: 1 }} />
-            {pageNumber < numOfPages ? (
-              <Button
-                size="sm"
-                variant="outlined"
-                color="neutral"
-                onClick={() => setPageNumber(pageNumber + 1)}
-              >
-                Next <ChevronRightIcon />
-              </Button>
-            ) : (
-              <div style={{ width: '78px', height: '30px' }} />
-            )}
-          </Box>
+          <DatasetTable datasetId={dataset_id} />
         </Sheet>
       </ModalDialog>
     </Modal>
-- 
GitLab