Migrate Schema details table to the new version of Table component (#2708)
* Migrate Schema details table to the new version of Table component * change get row ogigin data from fixtures
This commit is contained in:
parent
15e7fc42d2
commit
45aa4542ba
5 changed files with 68 additions and 82 deletions
|
@ -10,8 +10,6 @@ import ClusterContext from 'components/contexts/ClusterContext';
|
||||||
import PageLoader from 'components/common/PageLoader/PageLoader';
|
import PageLoader from 'components/common/PageLoader/PageLoader';
|
||||||
import PageHeading from 'components/common/PageHeading/PageHeading';
|
import PageHeading from 'components/common/PageHeading/PageHeading';
|
||||||
import { Button } from 'components/common/Button/Button';
|
import { Button } from 'components/common/Button/Button';
|
||||||
import { Table } from 'components/common/table/Table/Table.styled';
|
|
||||||
import TableHeaderCell from 'components/common/table/TableHeaderCell/TableHeaderCell';
|
|
||||||
import { useAppDispatch, useAppSelector } from 'lib/hooks/redux';
|
import { useAppDispatch, useAppSelector } from 'lib/hooks/redux';
|
||||||
import {
|
import {
|
||||||
fetchLatestSchema,
|
fetchLatestSchema,
|
||||||
|
@ -29,6 +27,7 @@ import { TableTitle } from 'components/common/table/TableTitle/TableTitle.styled
|
||||||
import useAppParams from 'lib/hooks/useAppParams';
|
import useAppParams from 'lib/hooks/useAppParams';
|
||||||
import { schemasApiClient } from 'lib/api';
|
import { schemasApiClient } from 'lib/api';
|
||||||
import { Dropdown, DropdownItem } from 'components/common/Dropdown';
|
import { Dropdown, DropdownItem } from 'components/common/Dropdown';
|
||||||
|
import Table from 'components/common/NewTable';
|
||||||
|
|
||||||
import LatestVersionItem from './LatestVersion/LatestVersionItem';
|
import LatestVersionItem from './LatestVersion/LatestVersionItem';
|
||||||
import SchemaVersion from './SchemaVersion/SchemaVersion';
|
import SchemaVersion from './SchemaVersion/SchemaVersion';
|
||||||
|
@ -58,6 +57,15 @@ const Details: React.FC = () => {
|
||||||
const isFetched = useAppSelector(getAreSchemaLatestFulfilled);
|
const isFetched = useAppSelector(getAreSchemaLatestFulfilled);
|
||||||
const areVersionsFetched = useAppSelector(getAreSchemaVersionsFulfilled);
|
const areVersionsFetched = useAppSelector(getAreSchemaVersionsFulfilled);
|
||||||
|
|
||||||
|
const columns = React.useMemo(
|
||||||
|
() => [
|
||||||
|
{ header: 'Version', accessorKey: 'version' },
|
||||||
|
{ header: 'ID', accessorKey: 'id' },
|
||||||
|
{ header: 'Type', accessorKey: 'schemaType' },
|
||||||
|
],
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
const deleteHandler = async () => {
|
const deleteHandler = async () => {
|
||||||
try {
|
try {
|
||||||
await schemasApiClient.deleteSchema({
|
await schemasApiClient.deleteSchema({
|
||||||
|
@ -118,26 +126,13 @@ const Details: React.FC = () => {
|
||||||
<LatestVersionItem schema={schema} />
|
<LatestVersionItem schema={schema} />
|
||||||
<TableTitle>Old versions</TableTitle>
|
<TableTitle>Old versions</TableTitle>
|
||||||
{areVersionsFetched ? (
|
{areVersionsFetched ? (
|
||||||
<Table isFullwidth>
|
<Table
|
||||||
<thead>
|
columns={columns}
|
||||||
<tr>
|
data={versions}
|
||||||
<TableHeaderCell />
|
getRowCanExpand={() => true}
|
||||||
<TableHeaderCell title="Version" />
|
renderSubComponent={SchemaVersion}
|
||||||
<TableHeaderCell title="ID" />
|
enableSorting
|
||||||
<TableHeaderCell title="Type" />
|
/>
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{versions.map((version) => (
|
|
||||||
<SchemaVersion key={version.id} version={version} />
|
|
||||||
))}
|
|
||||||
{versions.length === 0 && (
|
|
||||||
<tr>
|
|
||||||
<td colSpan={10}>No active Schema</td>
|
|
||||||
</tr>
|
|
||||||
)}
|
|
||||||
</tbody>
|
|
||||||
</Table>
|
|
||||||
) : (
|
) : (
|
||||||
<PageLoader />
|
<PageLoader />
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
import styled from 'styled-components';
|
|
||||||
|
|
||||||
export const Wrapper = styled.tr`
|
|
||||||
background-color: ${({ theme }) => theme.schema.backgroundColor.tr};
|
|
||||||
& > td {
|
|
||||||
padding: 16px !important;
|
|
||||||
& > div {
|
|
||||||
background-color: ${({ theme }) => theme.schema.backgroundColor.div};
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
|
@ -1,41 +1,18 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { SchemaSubject } from 'generated-sources';
|
|
||||||
import MessageToggleIcon from 'components/common/Icons/MessageToggleIcon';
|
|
||||||
import IconButtonWrapper from 'components/common/Icons/IconButtonWrapper';
|
|
||||||
import EditorViewer from 'components/common/EditorViewer/EditorViewer';
|
import EditorViewer from 'components/common/EditorViewer/EditorViewer';
|
||||||
|
import { SchemaSubject } from 'generated-sources';
|
||||||
|
import { Row } from '@tanstack/react-table';
|
||||||
|
|
||||||
import * as S from './SchemaVersion.styled';
|
export interface Props {
|
||||||
|
row: Row<SchemaSubject>;
|
||||||
interface SchemaVersionProps {
|
|
||||||
version: SchemaSubject;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const SchemaVersion: React.FC<SchemaVersionProps> = ({
|
const SchemaVersion: React.FC<Props> = ({ row }) => {
|
||||||
version: { version, id, schema, schemaType },
|
|
||||||
}) => {
|
|
||||||
const [isOpen, setIsOpen] = React.useState(false);
|
|
||||||
const toggleIsOpen = () => setIsOpen(!isOpen);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<EditorViewer
|
||||||
<tr>
|
data={row?.original?.schema}
|
||||||
<td style={{ width: '3%' }}>
|
schemaType={row?.original?.schemaType}
|
||||||
<IconButtonWrapper onClick={toggleIsOpen}>
|
/>
|
||||||
<MessageToggleIcon isOpen={isOpen} />
|
|
||||||
</IconButtonWrapper>
|
|
||||||
</td>
|
|
||||||
<td style={{ width: '6%' }}>{version}</td>
|
|
||||||
<td style={{ width: '6%' }}>{id}</td>
|
|
||||||
<td>{schemaType}</td>
|
|
||||||
</tr>
|
|
||||||
{isOpen && (
|
|
||||||
<S.Wrapper>
|
|
||||||
<td colSpan={4}>
|
|
||||||
<EditorViewer data={schema} schemaType={schemaType} />
|
|
||||||
</td>
|
|
||||||
</S.Wrapper>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,12 @@ const clusterName = 'testClusterName';
|
||||||
const schemasAPILatestUrl = `/api/clusters/${clusterName}/schemas/${schemaVersion.subject}/latest`;
|
const schemasAPILatestUrl = `/api/clusters/${clusterName}/schemas/${schemaVersion.subject}/latest`;
|
||||||
const schemasAPIVersionsUrl = `/api/clusters/${clusterName}/schemas/${schemaVersion.subject}/versions`;
|
const schemasAPIVersionsUrl = `/api/clusters/${clusterName}/schemas/${schemaVersion.subject}/versions`;
|
||||||
|
|
||||||
|
const mockHistoryPush = jest.fn();
|
||||||
|
jest.mock('react-router-dom', () => ({
|
||||||
|
...jest.requireActual('react-router-dom'),
|
||||||
|
useNavigate: () => mockHistoryPush,
|
||||||
|
}));
|
||||||
|
|
||||||
const renderComponent = (
|
const renderComponent = (
|
||||||
initialState: RootState['schemas'] = schemasInitialState,
|
initialState: RootState['schemas'] = schemasInitialState,
|
||||||
context: ContextProps = contextInitialValue
|
context: ContextProps = contextInitialValue
|
||||||
|
@ -62,6 +68,27 @@ describe('Details', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('handles [Delete schema] click', async () => {
|
||||||
|
const deleteSchemaMock = fetchMock.deleteOnce(
|
||||||
|
`/api/clusters/${clusterName}/schemas/${schemaVersion.subject}`,
|
||||||
|
200
|
||||||
|
);
|
||||||
|
|
||||||
|
await act(() => {
|
||||||
|
renderComponent();
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
expect(deleteSchemaMock.called()).toBeTruthy();
|
||||||
|
expect(mockHistoryPush).toHaveBeenCalledTimes(1);
|
||||||
|
expect(mockHistoryPush).toHaveBeenCalledWith(
|
||||||
|
clusterSchemaPath(clusterName)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
expect(deleteSchemaMock.called()).toBeTruthy();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('renders pageloader', () => {
|
it('renders pageloader', () => {
|
||||||
expect(screen.getByRole('progressbar')).toBeInTheDocument();
|
expect(screen.getByRole('progressbar')).toBeInTheDocument();
|
||||||
expect(screen.queryByText(schemaVersion.subject)).not.toBeInTheDocument();
|
expect(screen.queryByText(schemaVersion.subject)).not.toBeInTheDocument();
|
||||||
|
@ -153,7 +180,6 @@ describe('Details', () => {
|
||||||
// seems like incorrect behaviour
|
// seems like incorrect behaviour
|
||||||
it('renders versions table with 0 items', () => {
|
it('renders versions table with 0 items', () => {
|
||||||
expect(screen.getByRole('table')).toBeInTheDocument();
|
expect(screen.getByRole('table')).toBeInTheDocument();
|
||||||
expect(screen.getByText('No active Schema')).toBeInTheDocument();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,24 +1,25 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import SchemaVersion from 'components/Schemas/Details/SchemaVersion/SchemaVersion';
|
import SchemaVersion from 'components/Schemas/Details/SchemaVersion/SchemaVersion';
|
||||||
import { render } from 'lib/testHelpers';
|
import { render } from 'lib/testHelpers';
|
||||||
import { screen } from '@testing-library/react';
|
import { SchemaSubject } from 'generated-sources';
|
||||||
import userEvent from '@testing-library/user-event';
|
import { Row } from '@tanstack/react-table';
|
||||||
|
|
||||||
import { versions } from './fixtures';
|
import { jsonSchema } from './fixtures';
|
||||||
|
|
||||||
const component = (
|
export interface Props {
|
||||||
<table>
|
row: Row<SchemaSubject>;
|
||||||
<tbody>
|
}
|
||||||
<SchemaVersion version={versions[0]} />
|
|
||||||
</tbody>
|
const renderComponent = () => {
|
||||||
</table>
|
const row = {
|
||||||
);
|
original: jsonSchema,
|
||||||
|
};
|
||||||
|
|
||||||
|
return render(<SchemaVersion row={row as Row<SchemaSubject>} />);
|
||||||
|
};
|
||||||
|
|
||||||
describe('SchemaVersion', () => {
|
describe('SchemaVersion', () => {
|
||||||
it('renders versions', () => {
|
it('renders versions', () => {
|
||||||
render(component);
|
renderComponent();
|
||||||
expect(screen.getAllByRole('cell')).toHaveLength(4);
|
|
||||||
expect(screen.queryByTestId('json-viewer')).not.toBeInTheDocument();
|
|
||||||
userEvent.click(screen.getByRole('button'));
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue