progress; delete and list

This commit is contained in:
pauladamseniii
2023-10-17 12:11:53 -04:00
parent a404c4695f
commit 2fa9feb963
6 changed files with 141 additions and 14 deletions

View File

@@ -326,12 +326,29 @@ export const CarUpdatesProvider = ({ children }) => {
return result; return result;
}; };
const deleteSUMSVersionRxSwins = async (sums_version, rxswin, token) => {
let result;
try {
setBusy(true);
result = await api.deleteSUMSVersionRxSwins(sums_version, rxswin, token);
if (result.error)
throw new Error(`Delete software version rxswin error. ${result.message}`);
} finally {
setBusy(false);
}
return result;
};
return ( return (
<CarUpdatesContext.Provider <CarUpdatesContext.Provider
value={{ value={{
busy, busy,
carUpdates, carUpdates,
totalCarUpdates, totalCarUpdates,
versionRxSwins,
versions, versions,
cancelUpdate, cancelUpdate,
deployUpdate, deployUpdate,
@@ -345,6 +362,7 @@ export const CarUpdatesProvider = ({ children }) => {
stopMonitor, stopMonitor,
updateSUMSVersion, updateSUMSVersion,
getSUMSVersionRxSwins, getSUMSVersionRxSwins,
deleteSUMSVersionRxSwins,
}} }}
> >
{children} {children}

View File

@@ -154,5 +154,6 @@ export const useCarUpdatesContext = () => ({
approveUpdate: jest.fn(), approveUpdate: jest.fn(),
getSUMSVersions: jest.fn(() => sumsVersions), getSUMSVersions: jest.fn(() => sumsVersions),
getSUMSVersionRxSwins: jest.fn(() => sumsVersionRxSwins), getSUMSVersionRxSwins: jest.fn(() => sumsVersionRxSwins),
deleteSUMSVersionRxSwins: jest.fn(),
updateSUMSVersion: jest.fn(), updateSUMSVersion: jest.fn(),
}); });

View File

@@ -1,4 +1,5 @@
import { import {
IconButton,
Table, Table,
TableBody, TableBody,
TableCell, TableCell,
@@ -6,6 +7,7 @@ import {
TablePagination, TablePagination,
TableRow, TableRow,
} from "@material-ui/core"; } from "@material-ui/core";
import DeleteIcon from "@material-ui/icons/Delete";
import { logger } from "../../services/monitoring"; import { logger } from "../../services/monitoring";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { useParams } from "react-router"; import { useParams } from "react-router";
@@ -13,9 +15,14 @@ import {
CarUpdatesProvider, CarUpdatesProvider,
useCarUpdatesContext useCarUpdatesContext
} from "../Contexts/CarUpdatesContext"; } from "../Contexts/CarUpdatesContext";
import { useStatusContext } from "../Contexts/StatusContext";
import { useUserContext } from "../Contexts/UserContext"; import { useUserContext } from "../Contexts/UserContext";
import TableHeaderSortable from "../Table/HeaderSortable"; import TableHeaderSortable from "../Table/HeaderSortable";
import { useLocalStorage } from "../useLocalStorage";
import DeleteConfirmation from "../DeleteConfirmation";
import useStyles from "../useStyles"; import useStyles from "../useStyles";
import { Permissions } from "../../utils/roles";
import { RoleWrap } from "../Controls/RoleWrap";
const tableColumns = [ const tableColumns = [
{ {
@@ -28,21 +35,31 @@ const tableColumns = [
}, },
]; ];
const PAGE_SIZE = "SUMS_RXSWIN_TABLE_PAGE_SIZE";
const MainForm = () => { const MainForm = () => {
const { sums_version } = useParams(); const { sums_version } = useParams();
const classes = useStyles(); const classes = useStyles();
const [pageSize, setPageSize] = useLocalStorage(PAGE_SIZE, 10);
const [pageIndex, setPageIndex] = useState(0);
const [orderBy, setOrderBy] = useState("id"); const [orderBy, setOrderBy] = useState("id");
const [order, setOrder] = useState("desc"); const [order, setOrder] = useState("desc");
const [showDeleteModal, setShowDeleteModal] = useState(false);
const [rowToDelete, setRowToDelete] = useState({});
const { const {
deleteSUMSVersionRxSwins,
getSUMSVersionRxSwins, getSUMSVersionRxSwins,
versionRxSwins,
stopMonitor, stopMonitor,
} = useCarUpdatesContext(); } = useCarUpdatesContext();
const [versionRxSwins, setVersionRxSwins] = useState([]);
const { const {
token: { token: {
idToken: { jwtToken: token }, idToken: { jwtToken: token },
}, },
groups,
providers,
} = useUserContext(); } = useUserContext();
const { setMessage } = useStatusContext();
useEffect(() => { useEffect(() => {
(async () => { (async () => {
@@ -54,13 +71,22 @@ const MainForm = () => {
token token
); );
} catch (e) { } catch (e) {
setVersionRxSwins(e.message); setMessage(e.message);
logger.warn(e.stack); logger.warn(e.stack);
} }
})(); })();
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [sums_version, token]); }, [sums_version, token]);
const handleChangePageIndex = (event, newIndex) => {
setPageIndex(newIndex);
};
const handleChangePageSize = (event) => {
setPageSize(parseInt(event.target.value, 10));
setPageIndex(0);
};
const handleSort = (event, property) => { const handleSort = (event, property) => {
try { try {
if (property === orderBy) { if (property === orderBy) {
@@ -78,7 +104,24 @@ const MainForm = () => {
} }
}; };
const onDeleteClick = (row) => {
setRowToDelete(row);
setShowDeleteModal(true);
}
const sendDelete = async () => {
if (rowToDelete) {
try {
await deleteSUMSVersionRxSwins(rowToDelete.version, rowToDelete.rxswin, token);
setMessage(`Sent delete for ${rowToDelete.rxswin}`);
} catch (e) {
setMessage(e.message);
}
}
};
return ( return (
<div>
<Table> <Table>
<TableHeaderSortable <TableHeaderSortable
classes={classes} classes={classes}
@@ -88,8 +131,61 @@ const MainForm = () => {
onSortRequest={handleSort} onSortRequest={handleSort}
/> />
<TableBody> <TableBody>
{versionRxSwins.map((row, index) => (
<TableRow key={index}>
<TableCell align="center">
{row.version}
</TableCell>
<TableCell align="center">
{row.rxswin}
</TableCell>
<TableCell>
<RoleWrap
groups={groups}
providers={providers}
rolesPerProvider={Permissions.FiskerMagnaCreate}
>
<IconButton
onClick={() => onDeleteClick(row)}
aria-label={`Send delete for ${row.rxswin}`}
size="small"
color="primary"
>
<DeleteIcon aria-label={`Delete ${row.rxswin}`} />
</IconButton>
</RoleWrap>
</TableCell>
</TableRow>
))}
</TableBody> </TableBody>
<TableFooter>
<TableRow>
{versionRxSwins.length === 0 ? (
<TableCell colSpan={8} align="center">No RX Identification Numbers</TableCell>
) : (
<TablePagination
rowsPerPageOptions={[5, 10, 25, 100]}
colSpan={8}
count={versionRxSwins.length}
rowsPerPage={pageSize}
page={pageIndex}
SelectProps={{
inputProps: { "aria-label": "rows per page" },
native: true,
}}
onPageChange={handleChangePageIndex}
onRowsPerPageChange={handleChangePageSize}
/>)}
</TableRow>
</TableFooter>
</Table> </Table>
<DeleteConfirmation
message={rowToDelete && rowToDelete.rxswin ? rowToDelete.rxswin : ""}
open={showDeleteModal}
close={() => setShowDeleteModal(false)}
deleteFunction={sendDelete}
/>
</div>
); );
}; };

View File

@@ -134,6 +134,18 @@ const updatesAPI = {
}) })
.then(fetchRespHandler) .then(fetchRespHandler)
.catch(errorHandler); .catch(errorHandler);
},
deleteSUMSVersionRxSwins: async (sums_version, rxswin, token) => {
return fetch(`${API_ENDPOINT}/manifest/sums/${sums_version}/rxswins/${rxswin}`, {
method: "DELETE",
headers: Object.assign(
{ "Content-Type": "application/json" },
getAuthHeaderOptions(token)
),
})
.then(fetchRespHandler)
.catch(errorHandler);
} }
}; };

View File

@@ -96,7 +96,7 @@ export const Permissions = {
[Providers.MAGNA]: [Roles.MAGNAGROUP], [Providers.MAGNA]: [Roles.MAGNAGROUP],
}, },
FiskerMagnaCreate: { FiskerMagnaCreate: {
[Providers.FISKER]: [Roles.CREATE], [Providers.FISKER]: [Roles.CREATE, Roles.DELETE],
[Providers.FISKER_QA]: [Roles.MANUFACTURE], [Providers.FISKER_QA]: [Roles.MANUFACTURE],
[Providers.MAGNA]: [Roles.MAGNAGROUP], [Providers.MAGNA]: [Roles.MAGNAGROUP],
}, },

View File

@@ -103,7 +103,7 @@ describe("Roles Helper", () => {
it("Check FiskerMagnaCreate permission", () => { it("Check FiskerMagnaCreate permission", () => {
expect( expect(
hasRole([Roles.CREATE], Permissions.FiskerMagnaCreate, [Providers.FISKER]) hasRole([Roles.CREATE, Roles.DELETE], Permissions.FiskerMagnaCreate, [Providers.FISKER])
).toEqual(true); ).toEqual(true);
expect( expect(
hasRole([Roles.MAGNAGROUP], Permissions.FiskerMagnaCreate, [Providers.MAGNA]) hasRole([Roles.MAGNAGROUP], Permissions.FiskerMagnaCreate, [Providers.MAGNA])