progress; delete and list
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
@@ -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(),
|
||||||
});
|
});
|
||||||
@@ -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,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 (
|
return (
|
||||||
<Table>
|
<div>
|
||||||
<TableHeaderSortable
|
<Table>
|
||||||
classes={classes}
|
<TableHeaderSortable
|
||||||
orderBy={orderBy}
|
classes={classes}
|
||||||
order={order}
|
orderBy={orderBy}
|
||||||
columnData={tableColumns}
|
order={order}
|
||||||
onSortRequest={handleSort}
|
columnData={tableColumns}
|
||||||
|
onSortRequest={handleSort}
|
||||||
|
/>
|
||||||
|
<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>
|
||||||
|
<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>
|
||||||
|
<DeleteConfirmation
|
||||||
|
message={rowToDelete && rowToDelete.rxswin ? rowToDelete.rxswin : ""}
|
||||||
|
open={showDeleteModal}
|
||||||
|
close={() => setShowDeleteModal(false)}
|
||||||
|
deleteFunction={sendDelete}
|
||||||
/>
|
/>
|
||||||
<TableBody>
|
</div>
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
Reference in New Issue
Block a user