From 2fa9feb963eac8e4732eeb8091ca60f43c1fc18a Mon Sep 17 00:00:00 2001 From: pauladamseniii Date: Tue, 17 Oct 2023 12:11:53 -0400 Subject: [PATCH] progress; delete and list --- src/components/Contexts/CarUpdatesContext.jsx | 18 +++ .../Contexts/__mocks__/CarUpdatesContext.jsx | 1 + src/components/SUMS/index.jsx | 120 ++++++++++++++++-- src/services/updatesAPI.js | 12 ++ src/utils/roles.js | 2 +- src/utils/roles.test.js | 2 +- 6 files changed, 141 insertions(+), 14 deletions(-) diff --git a/src/components/Contexts/CarUpdatesContext.jsx b/src/components/Contexts/CarUpdatesContext.jsx index cad4a8b..2227dc5 100644 --- a/src/components/Contexts/CarUpdatesContext.jsx +++ b/src/components/Contexts/CarUpdatesContext.jsx @@ -326,12 +326,29 @@ export const CarUpdatesProvider = ({ children }) => { 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 ( { stopMonitor, updateSUMSVersion, getSUMSVersionRxSwins, + deleteSUMSVersionRxSwins, }} > {children} diff --git a/src/components/Contexts/__mocks__/CarUpdatesContext.jsx b/src/components/Contexts/__mocks__/CarUpdatesContext.jsx index a0c3825..0477b75 100644 --- a/src/components/Contexts/__mocks__/CarUpdatesContext.jsx +++ b/src/components/Contexts/__mocks__/CarUpdatesContext.jsx @@ -154,5 +154,6 @@ export const useCarUpdatesContext = () => ({ approveUpdate: jest.fn(), getSUMSVersions: jest.fn(() => sumsVersions), getSUMSVersionRxSwins: jest.fn(() => sumsVersionRxSwins), + deleteSUMSVersionRxSwins: jest.fn(), updateSUMSVersion: jest.fn(), }); \ No newline at end of file diff --git a/src/components/SUMS/index.jsx b/src/components/SUMS/index.jsx index 2380a38..ff7e4cf 100644 --- a/src/components/SUMS/index.jsx +++ b/src/components/SUMS/index.jsx @@ -1,4 +1,5 @@ import { + IconButton, Table, TableBody, TableCell, @@ -6,6 +7,7 @@ import { TablePagination, TableRow, } from "@material-ui/core"; +import DeleteIcon from "@material-ui/icons/Delete"; import { logger } from "../../services/monitoring"; import React, { useEffect, useState } from "react"; import { useParams } from "react-router"; @@ -13,9 +15,14 @@ import { CarUpdatesProvider, useCarUpdatesContext } from "../Contexts/CarUpdatesContext"; +import { useStatusContext } from "../Contexts/StatusContext"; import { useUserContext } from "../Contexts/UserContext"; import TableHeaderSortable from "../Table/HeaderSortable"; +import { useLocalStorage } from "../useLocalStorage"; +import DeleteConfirmation from "../DeleteConfirmation"; import useStyles from "../useStyles"; +import { Permissions } from "../../utils/roles"; +import { RoleWrap } from "../Controls/RoleWrap"; const tableColumns = [ { @@ -28,21 +35,31 @@ const tableColumns = [ }, ]; +const PAGE_SIZE = "SUMS_RXSWIN_TABLE_PAGE_SIZE"; + const MainForm = () => { const { sums_version } = useParams(); const classes = useStyles(); + const [pageSize, setPageSize] = useLocalStorage(PAGE_SIZE, 10); + const [pageIndex, setPageIndex] = useState(0); const [orderBy, setOrderBy] = useState("id"); const [order, setOrder] = useState("desc"); + const [showDeleteModal, setShowDeleteModal] = useState(false); + const [rowToDelete, setRowToDelete] = useState({}); const { + deleteSUMSVersionRxSwins, getSUMSVersionRxSwins, + versionRxSwins, stopMonitor, } = useCarUpdatesContext(); - const [versionRxSwins, setVersionRxSwins] = useState([]); const { token: { idToken: { jwtToken: token }, }, + groups, + providers, } = useUserContext(); + const { setMessage } = useStatusContext(); useEffect(() => { (async () => { @@ -54,13 +71,22 @@ const MainForm = () => { token ); } catch (e) { - setVersionRxSwins(e.message); + setMessage(e.message); logger.warn(e.stack); } })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [sums_version, token]); + const handleChangePageIndex = (event, newIndex) => { + setPageIndex(newIndex); + }; + + const handleChangePageSize = (event) => { + setPageSize(parseInt(event.target.value, 10)); + setPageIndex(0); + }; + const handleSort = (event, property) => { try { if (property === orderBy) { @@ -78,18 +104,88 @@ 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 ( - - +
+ + + {versionRxSwins.map((row, index) => ( + + + {row.version} + + + {row.rxswin} + + + + onDeleteClick(row)} + aria-label={`Send delete for ${row.rxswin}`} + size="small" + color="primary" + > + + + + + + ))} + + + + {versionRxSwins.length === 0 ? ( + No RX Identification Numbers + ) : ( + )} + + +
+ setShowDeleteModal(false)} + deleteFunction={sendDelete} /> - - - + ); }; diff --git a/src/services/updatesAPI.js b/src/services/updatesAPI.js index 65cf0c9..694afce 100644 --- a/src/services/updatesAPI.js +++ b/src/services/updatesAPI.js @@ -134,6 +134,18 @@ const updatesAPI = { }) .then(fetchRespHandler) .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); } }; diff --git a/src/utils/roles.js b/src/utils/roles.js index fb8b43c..4c12370 100644 --- a/src/utils/roles.js +++ b/src/utils/roles.js @@ -96,7 +96,7 @@ export const Permissions = { [Providers.MAGNA]: [Roles.MAGNAGROUP], }, FiskerMagnaCreate: { - [Providers.FISKER]: [Roles.CREATE], + [Providers.FISKER]: [Roles.CREATE, Roles.DELETE], [Providers.FISKER_QA]: [Roles.MANUFACTURE], [Providers.MAGNA]: [Roles.MAGNAGROUP], }, diff --git a/src/utils/roles.test.js b/src/utils/roles.test.js index 9b40e97..5cfd512 100644 --- a/src/utils/roles.test.js +++ b/src/utils/roles.test.js @@ -103,7 +103,7 @@ describe("Roles Helper", () => { it("Check FiskerMagnaCreate permission", () => { expect( - hasRole([Roles.CREATE], Permissions.FiskerMagnaCreate, [Providers.FISKER]) + hasRole([Roles.CREATE, Roles.DELETE], Permissions.FiskerMagnaCreate, [Providers.FISKER]) ).toEqual(true); expect( hasRole([Roles.MAGNAGROUP], Permissions.FiskerMagnaCreate, [Providers.MAGNA])