CEC-3672 Update manifest version on deploy (#277)

* CEC-3672 Add versions to CarUpdatesContext
Stub out getSoftwareVersions and updateManifestVersion

* CEC-3672 update version on deploy

* Validate version before updating
This commit is contained in:
John Wu
2023-02-09 11:51:23 -08:00
committed by GitHub
parent f863f37a9a
commit 9cf84fc426
10 changed files with 240 additions and 75 deletions

View File

@@ -1,18 +1,19 @@
import { Button, FormControlLabel, Grid, Switch, Typography } from "@material-ui/core";
import clsx from "clsx";
import SendIcon from "@material-ui/icons/Send";
import React, { useEffect, useState } from "react";
import { Redirect, useParams } from "react-router";
import { logger } from "../../../services/monitoring";
import { LocalDateTimeString } from "../../../utils/dates";
import { Permissions } from "../../../utils/roles";
import { CarUpdatesProvider, useCarUpdatesContext } from "../../Contexts/CarUpdatesContext";
import { CarUpdatesProvider, SELECT_VERSION, useCarUpdatesContext } from "../../Contexts/CarUpdatesContext";
import { FleetProvider } from "../../Contexts/FleetContext";
import { ManifestsProvider, useManifestsContext } from "../../Contexts/ManifestsContext";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useUserContext } from "../../Contexts/UserContext";
import { VehicleProvider } from "../../Contexts/VehicleContext";
import CarSelectionTable from "../../Controls/CarSelectionTable";
import { DropDownList } from "../../Controls/DropDownList";
import FleetSelectionTable from "../../Controls/FleetSelectionTable";
import { RoleWrap } from "../../Controls/RoleWrap";
import SearchField from "../../Controls/SearchField";
@@ -25,7 +26,7 @@ const MainForm = () => {
const [updateType, setUpdateType] = useState(CAR_UPDATE);
const {manifest_id} = useParams();
const {getManifests, manifests, busy} = useManifestsContext();
const {deployCarUpdates, deployFleetUpdates} = useCarUpdatesContext();
const {deployCarUpdates, deployFleetUpdates, getSoftwareVersions, versions, updateManifestVersion} = useCarUpdatesContext();
const {
groups,
providers,
@@ -39,6 +40,7 @@ const MainForm = () => {
const [createDate, setCreateDate] = useState("");
const [selected, setSelected] = useState([]);
const [search, setSearch] = useState("");
const [softwareVersion, setSoftwareVersion] = useState(SELECT_VERSION);
const [redirect, setRedirect] = useState("");
const classes = useStyles();
@@ -77,6 +79,8 @@ const MainForm = () => {
const data = {
manifest_id: parseInt(manifest_id),
}
await updateManifestVersion(manifest_id, softwareVersion, token);
if (updateType === CAR_UPDATE) {
data.vins = selected;
await deployCarUpdates(data, token);
@@ -96,13 +100,18 @@ const MainForm = () => {
const getData = async () => {
try {
getManifests({id: parseInt(manifest_id)}, token);
await getManifests({id: parseInt(manifest_id)}, token);
await getSoftwareVersions(token);
} catch (e) {
setMessage(e.message);
logger.warn(e.stack);
}
};
const changeVersion = (e) => {
setSoftwareVersion(e.target.value);
}
useEffect(() => {
getData();
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -162,16 +171,22 @@ const MainForm = () => {
<Grid item md={4} className={classes.textCenterAlign}>
<SearchField classes={classes} onSearch={handleSearch}/>
</Grid>
<Grid item md={4} className={classes.textRightAlign}>
<Grid item md={4} container justifyContent="flex-end">
<DropDownList
label="Software Version"
labelField="version"
valueField="version"
value={softwareVersion}
data={versions}
classes={classes}
onChange={changeVersion} />
<Button
type="submit"
disabled={busy || selected.length === 0}
variant="contained"
disabled={busy || selected.length === 0 || softwareVersion === SELECT_VERSION}
color="primary"
className={clsx(classes.formControl, classes.textField)}
onClick={onSubmit}
>
{busy ? "Deploying..." : "Deploy"}
<SendIcon />
</Button>
</Grid>
</Grid>

View File

@@ -113,12 +113,11 @@ exports[`Manifest Details Component Render 1`] = `
</div>
</div>
<div
class="MuiFormControl-root makeStyles-form-0 MuiFormControl-marginNormal MuiFormControl-fullWidth"
class="MuiFormControl-root MuiFormControl-marginNormal"
>
<label
class="MuiFormLabel-root MuiInputLabel-root makeStyles-whiteBackground-0 MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-outlined"
data-shrink="false"
for="manifest-type"
>
Type
</label>
@@ -128,8 +127,6 @@ exports[`Manifest Details Component Render 1`] = `
<select
aria-invalid="false"
class="MuiSelect-root MuiSelect-select MuiSelect-outlined MuiInputBase-input MuiOutlinedInput-input"
id="send-manifest-type"
name="manifest-type"
>
<option
value="standard"
@@ -169,14 +166,13 @@ exports[`Manifest Details Component Render 1`] = `
</div>
</div>
<div
class="MuiFormControl-root makeStyles-form-0 MuiFormControl-marginNormal MuiFormControl-fullWidth"
class="MuiFormControl-root MuiFormControl-marginNormal"
>
<label
class="MuiFormLabel-root MuiInputLabel-root makeStyles-whiteBackground-0 MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-shrink MuiInputLabel-outlined MuiFormLabel-filled"
data-shrink="true"
for="manifest-active"
>
Type
Active
</label>
<div
class="MuiInputBase-root MuiOutlinedInput-root MuiInputBase-formControl"
@@ -184,18 +180,16 @@ exports[`Manifest Details Component Render 1`] = `
<select
aria-invalid="false"
class="MuiSelect-root MuiSelect-select MuiSelect-outlined MuiInputBase-input MuiOutlinedInput-input"
id="send-manifest-active"
name="manifest-active"
>
<option
value="true"
>
active
Active
</option>
<option
value="false"
>
archived
Archived
</option>
</select>
<svg

View File

@@ -1,17 +1,23 @@
import { Button, FormControl, TextField } from "@material-ui/core";
import React, { useEffect, useState } from "react";
import { useParams } from "react-router-dom";
import { Redirect } from "react-router";
import useStyles from "../../useStyles";
import { useParams } from "react-router-dom";
import { ManifestsProvider, useManifestsContext } from "../../Contexts/ManifestsContext";
import { useUserContext } from "../../Contexts/UserContext";
import { useStatusContext } from "../../Contexts/StatusContext";
import { Button, FormControl, InputLabel, Select, TextField } from "@material-ui/core";
import { useUserContext } from "../../Contexts/UserContext";
import { DropDownList } from "../../Controls/DropDownList";
import useStyles from "../../useStyles";
const manifestTypes = [
{ value: "standard", label: "Standard" },
{ value: "forced", label: "Forced" },
];
const activeStates = [
{value: true, label: "Active" },
{value: false, label: "Archived" },
];
const emptyManifest = {
name: "",
version: "",
@@ -138,53 +144,8 @@ const MainForm = () => {
fullWidth
onChange={changeName}
/>
<FormControl
className={classes.form}
variant="outlined"
fullWidth
margin="normal"
>
<InputLabel htmlFor="manifest-type" className={classes.whiteBackground}>
Type
</InputLabel>
<Select
native
value={type}
variant="outlined"
inputProps={{
name: "manifest-type",
id: "send-manifest-type",
}}
onChange={changeType}
>
{manifestTypes.map((item, index) => (
<option key={index} value={item.value}>{item.label}</option>
))}
</Select>
</FormControl>
<FormControl
className={classes.form}
variant="outlined"
fullWidth
margin="normal"
>
<InputLabel htmlFor="manifest-active" className={classes.whiteBackground}>
Type
</InputLabel>
<Select
native
value={active}
variant="outlined"
inputProps={{
name: "manifest-active",
id: "send-manifest-active",
}}
onChange={changeActive}
>
<option key={0} value={true}>active</option>
<option key={1} value={false}>archived</option>
</Select>
</FormControl>
<DropDownList label="Type" data={manifestTypes} classes={classes} onChange={changeType} value={type} />
<DropDownList label="Active" data={activeStates} classes={classes} onChange={changeActive} value={active}/>
<Button
type="submit"
aria-label="send command"