CEC-5542 - Indicate how many fleet vehicles are what flashpack versions

This commit is contained in:
padamsen_fisker
2024-04-23 15:30:32 -04:00
parent a59a3df85e
commit 3bf93a8940
7 changed files with 156 additions and 3 deletions

View File

@@ -20,7 +20,7 @@ export default forwardRef(({
if (data.error) { if (data.error) {
setMessage(`${data.error}: ${data.message}`); setMessage(`${data.error}: ${data.message}`);
} else if (selectAll) { } else if (selectAll) {
setMessage(`Updating flashpack number all VINs in ${fleet}`); setMessage(`Updating flashpack numbers for all VINs in fleet: ${fleet}`);
} else if (ids.length === 1) { } else if (ids.length === 1) {
setMessage(`Updating flashpack number for ${ids[0]}`); setMessage(`Updating flashpack number for ${ids[0]}`);
} else { } else {

View File

@@ -26,6 +26,8 @@ export const FleetProvider = ({ children }) => {
const [fleetCANFilters, setFleetCANFilters] = useState([]); const [fleetCANFilters, setFleetCANFilters] = useState([]);
const [totalFleetCANFilters, setTotalFleetCANFilters] = useState(0); const [totalFleetCANFilters, setTotalFleetCANFilters] = useState(0);
const [fleetFlashpackInfo, setFleetFlashpackInfo] = useState([]);
const addFleet = async (f, token) => { const addFleet = async (f, token) => {
try { try {
setBusy(true); setBusy(true);
@@ -351,6 +353,25 @@ export const FleetProvider = ({ children }) => {
} }
}; };
const getFleetFlashpackInfo = async (name, token) => {
try {
setBusy(true);
validateFleetName(name);
const result = await api.getFlashpackVersionInfoFleet(name, token);
if (result.error) {
throw new Error(`Get flashpack version fleet into error. ${result.message}`);
}
setFleetFlashpackInfo(result);
return result;
} finally {
setBusy(false);
}
}
useEffect(() => { useEffect(() => {
setCarUpdateIds(() => fleetVehicles setCarUpdateIds(() => fleetVehicles
.filter((vehicle) => vehicle.car_update_status && vehicle.car_update_status !== "installed") .filter((vehicle) => vehicle.car_update_status && vehicle.car_update_status !== "installed")
@@ -384,7 +405,10 @@ export const FleetProvider = ({ children }) => {
getFleetCANFilters, getFleetCANFilters,
addFleetCANFilter, addFleetCANFilter,
updateFleetCANFilter, updateFleetCANFilter,
deleteFleetCANFilter deleteFleetCANFilter,
fleetFlashpackInfo,
getFleetFlashpackInfo,
}} }}
> >
{children} {children}

View File

@@ -198,6 +198,27 @@ exports[`FleetDetailsTab Render 1`] = `
</div> </div>
</div> </div>
</div> </div>
<div
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
>
<div
class="makeStyles-paper-0 makeStyles-tableSize-0"
>
<div
class="MuiGrid-root makeStyles-root-0 MuiGrid-container MuiGrid-spacing-xs-2"
>
<div
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
>
<p>
<b>
Flashpack Information
</b>
</p>
</div>
</div>
</div>
</div>
<div /> <div />
</div> </div>
</div> </div>

View File

@@ -3,6 +3,11 @@ import { Redirect } from "react-router";
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { import {
Grid, Grid,
Table,
TableBody,
TableCell,
TableFooter,
TableRow,
Tooltip, Tooltip,
} from "@material-ui/core"; } from "@material-ui/core";
import EditIcon from "@material-ui/icons/Edit" import EditIcon from "@material-ui/icons/Edit"
@@ -16,11 +21,23 @@ import useStyles from "../../../useStyles";
import { logger } from "../../../../services/monitoring"; import { logger } from "../../../../services/monitoring";
import DeleteConfirmation from "../../../DeleteConfirmation"; import DeleteConfirmation from "../../../DeleteConfirmation";
import BulkActions from "../../../BulkActions"; import BulkActions from "../../../BulkActions";
import TableHeaderSortable from "../../../Table/HeaderSortable";
const tableColumns = [
{
id: "flashpack",
label: "Flashpack",
},
{
id: "vehicles",
label: "# of Vehicles in Fleet",
},
];
const MainForm = ({ name }) => { const MainForm = ({ name }) => {
const classes = useStyles(); const classes = useStyles();
const { setMessage } = useStatusContext(); const { setMessage } = useStatusContext();
const { fleet, getFleet, deleteFleet } = useFleetContext(); const { fleet, getFleet, deleteFleet, fleetFlashpackInfo, getFleetFlashpackInfo } = useFleetContext();
const [redirect, setRedirect] = useState(null); const [redirect, setRedirect] = useState(null);
const [showDeleteModal, setShowDeleteModal] = useState(false) const [showDeleteModal, setShowDeleteModal] = useState(false)
const { token: { idToken: { jwtToken: token } } } = useUserContext(); const { token: { idToken: { jwtToken: token } } } = useUserContext();
@@ -32,6 +49,7 @@ const MainForm = ({ name }) => {
try { try {
if (!name || !token) return; if (!name || !token) return;
await getFleet(name, token); await getFleet(name, token);
await getFleetFlashpackInfo(name, token);
} catch (e) { } catch (e) {
setMessage(e.message); setMessage(e.message);
logger.warn(e.stack); logger.warn(e.stack);
@@ -104,6 +122,43 @@ const MainForm = ({ name }) => {
<BulkActions ids={fleet.vehicles} actions={["addTags", "updateConfig", "sms"]} /> <BulkActions ids={fleet.vehicles} actions={["addTags", "updateConfig", "sms"]} />
</Grid> </Grid>
</Grid> </Grid>
<Grid item md={12} className={classes.textCenterAlign}>
<div className={clsx(classes.paper, classes.tableSize)}>
<Grid container className={classes.root} spacing={2}>
<Grid item md={12} className={classes.textCenterAlign}>
<p>
<b>Flashpack Information</b>
</p>
</Grid>
</Grid>
{fleetFlashpackInfo && (<Table size="small" >
<TableHeaderSortable
classes={classes}
orderBy={"flashpack"}
order={"asc"}
columnData={tableColumns}
onSortRequest={() => { return null }}
/>
<TableBody>
{
fleetFlashpackInfo.data && Object.entries(fleetFlashpackInfo.data).map(([flashpack, occurrences]) => (
<TableRow key={`${flashpack}-${occurrences.toString()}`}>
<TableCell align="center">{flashpack}</TableCell>
<TableCell align="center">{occurrences.toString()}</TableCell>
</TableRow>
))
}
</TableBody>
<TableFooter>
<TableRow>
{!fleetFlashpackInfo || fleetFlashpackInfo.length === 0 ? (
<TableCell colSpan={8} align="center">No flashpack info for fleet</TableCell>
) : <></>}
</TableRow>
</TableFooter>
</Table>)}
</div>
</Grid>
<DeleteConfirmation message={name} open={showDeleteModal} close={() => setShowDeleteModal(false)} deleteFunction={onDelete} /> <DeleteConfirmation message={name} open={showDeleteModal} close={() => setShowDeleteModal(false)} deleteFunction={onDelete} />
</div > </div >
); );

View File

@@ -206,6 +206,27 @@ exports[`DetailsTab Render 1`] = `
</div> </div>
</div> </div>
</div> </div>
<div
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
>
<div
class="makeStyles-paper-0 makeStyles-tableSize-0"
>
<div
class="MuiGrid-root makeStyles-root-0 MuiGrid-container MuiGrid-spacing-xs-2"
>
<div
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
>
<p>
<b>
Flashpack Information
</b>
</p>
</div>
</div>
</div>
</div>
<div /> <div />
</div> </div>
</div> </div>

View File

@@ -295,6 +295,27 @@ exports[`FleetStatus Render 1`] = `
</div> </div>
</div> </div>
</div> </div>
<div
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
>
<div
class="makeStyles-paper-0 makeStyles-tableSize-0"
>
<div
class="MuiGrid-root makeStyles-root-0 MuiGrid-container MuiGrid-spacing-xs-2"
>
<div
class="MuiGrid-root makeStyles-textCenterAlign-0 MuiGrid-item MuiGrid-grid-md-12"
>
<p>
<b>
Flashpack Information
</b>
</p>
</div>
</div>
</div>
</div>
<div /> <div />
</div> </div>
</div> </div>

View File

@@ -143,6 +143,17 @@ const fleetsAPI = {
}) })
.then(fetchRespHandler) .then(fetchRespHandler)
.catch(errorHandler), .catch(errorHandler),
getFlashpackVersionInfoFleet: async (name, token) =>
fetch(`${API_ENDPOINT}/flashpack_version_info_fleet/${name}`, {
method: "GET",
headers: Object.assign(
{ "Content-Type": "application/json" },
getAuthHeaderOptions(token)
),
})
.then(fetchRespHandler)
.catch(errorHandler),
}; };
export default fleetsAPI; export default fleetsAPI;