From f6c05eb877974d164f050239e561a4834a6e9947 Mon Sep 17 00:00:00 2001
From: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com>
Date: Tue, 9 Jul 2024 13:22:55 +0200
Subject: [PATCH] API tokens - virtualized table (#7531)
API tokens table in both main list and project API tokens list can now
support more items - it doesn't slow the browser down if there is >500
items.
---
.../apiToken/ApiTokenPage/ApiTokenPage.tsx | 4 --
.../ProjectsList/ProjectsList.test.tsx | 16 ++++-
.../apiToken/ProjectsList/ProjectsList.tsx | 35 +++++-----
.../common/ApiTokenTable/ApiTokenTable.tsx | 65 ++++---------------
.../common/ApiTokenTable/useApiTokenTable.tsx | 24 ++++---
.../cells/HighlightCell/HighlightCell.tsx | 10 ++-
.../ProjectApiAccess/ProjectApiAccess.tsx | 2 -
7 files changed, 65 insertions(+), 91 deletions(-)
diff --git a/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.tsx b/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.tsx
index ad9bb17f91..a832eceb8f 100644
--- a/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.tsx
+++ b/frontend/src/component/admin/apiToken/ApiTokenPage/ApiTokenPage.tsx
@@ -25,8 +25,6 @@ export const ApiTokenPage = () => {
const { deleteToken } = useApiTokensApi();
const {
- getTableProps,
- getTableBodyProps,
headerGroups,
rows,
prepareRow,
@@ -103,8 +101,6 @@ export const ApiTokenPage = () => {
headerGroups={headerGroups}
setHiddenColumns={setHiddenColumns}
prepareRow={prepareRow}
- getTableBodyProps={getTableBodyProps}
- getTableProps={getTableProps}
rows={rows}
columns={columns}
globalFilter={globalFilter}
diff --git a/frontend/src/component/admin/apiToken/ProjectsList/ProjectsList.test.tsx b/frontend/src/component/admin/apiToken/ProjectsList/ProjectsList.test.tsx
index 38064de145..77fd1536b2 100644
--- a/frontend/src/component/admin/apiToken/ProjectsList/ProjectsList.test.tsx
+++ b/frontend/src/component/admin/apiToken/ProjectsList/ProjectsList.test.tsx
@@ -22,13 +22,13 @@ describe('ProjectsList', () => {
expect(links[0]).toHaveTextContent('project');
});
- it('should render asterisk if no projects are passed', async () => {
+ it('should render "*" if no projects are passed', async () => {
const { container } = render();
expect(container.textContent).toEqual('*');
});
- it('should render asterisk if empty projects array is passed', async () => {
+ it('should render "*" if empty projects array is passed', async () => {
const { container } = render();
expect(container.textContent).toEqual('*');
@@ -43,4 +43,16 @@ describe('ProjectsList', () => {
expect(container.textContent).toContain('4 projects');
});
+
+ it('should render "*" if project is "*" and no projects are passed', async () => {
+ const { container } = render();
+
+ expect(container.textContent).toEqual('*');
+ });
+
+ it('should render "*" if projects has only "*"', async () => {
+ const { container } = render();
+
+ expect(container.textContent).toEqual('*');
+ });
});
diff --git a/frontend/src/component/admin/apiToken/ProjectsList/ProjectsList.tsx b/frontend/src/component/admin/apiToken/ProjectsList/ProjectsList.tsx
index c1db052e07..905fc2b9f0 100644
--- a/frontend/src/component/admin/apiToken/ProjectsList/ProjectsList.tsx
+++ b/frontend/src/component/admin/apiToken/ProjectsList/ProjectsList.tsx
@@ -59,30 +59,25 @@ export const ProjectsList: FC = ({ projects, project }) => {
}
if (
- (projectsList.length === 1 && projectsList[0] === '*') ||
- project === '*' ||
- (!project && (!projectsList || projectsList.length === 0))
+ (projectsList.length === 1 && projectsList[0] !== '*') ||
+ (project && project !== '*')
) {
- return (
-
-
-
- *
-
-
-
- );
- }
-
- if (projectsList.length === 1 || project) {
const item = project || projectsList[0];
return ;
}
- return null;
+ return (
+
+
+
+ *
+
+
+
+ );
};
diff --git a/frontend/src/component/common/ApiTokenTable/ApiTokenTable.tsx b/frontend/src/component/common/ApiTokenTable/ApiTokenTable.tsx
index 5a2cb4a1ab..edb852a1e3 100644
--- a/frontend/src/component/common/ApiTokenTable/ApiTokenTable.tsx
+++ b/frontend/src/component/common/ApiTokenTable/ApiTokenTable.tsx
@@ -1,24 +1,6 @@
-import type {
- Row,
- TablePropGetter,
- TableProps,
- TableBodyPropGetter,
- TableBodyProps,
- HeaderGroup,
-} from 'react-table';
-import {
- SortableTableHeader,
- TableCell,
- TablePlaceholder,
-} from 'component/common/Table';
-import {
- Box,
- Table,
- TableBody,
- TableRow,
- useMediaQuery,
- Link,
-} from '@mui/material';
+import type { Row, HeaderGroup } from 'react-table';
+import { TablePlaceholder, VirtualizedTable } from 'component/common/Table';
+import { Box, useMediaQuery, Link } from '@mui/material';
import { SearchHighlightProvider } from 'component/common/Table/SearchHighlightContext/SearchHighlightContext';
import { ApiTokenDocs } from 'component/admin/apiToken/ApiTokenDocs/ApiTokenDocs';
@@ -27,7 +9,7 @@ import { ConditionallyRender } from 'component/common/ConditionallyRender/Condit
import { useConditionallyHiddenColumns } from 'hooks/useConditionallyHiddenColumns';
-const hiddenColumnsSmall = ['Icon', 'createdAt'];
+const hiddenColumnsNotExtraLarge = ['Icon', 'createdAt', 'seenAt'];
const hiddenColumnsCompact = ['Icon', 'project', 'seenAt'];
interface IApiTokenTableProps {
@@ -37,34 +19,27 @@ interface IApiTokenTableProps {
columns: any[];
rows: Row