working, just need to prettify

This commit is contained in:
padamsen_fisker
2024-01-15 17:15:09 -05:00
parent e85f55d36d
commit 421a8480dd
3 changed files with 239 additions and 2 deletions

View File

@@ -331,6 +331,27 @@ export const VehicleProvider = ({ children }) => {
}
};
const addFlashpackVersion = async (model, year, flashpack, carFlashpackVersions, token) => {
try {
setBusy(true);
const data = {
"car_model": model,
"car_year": year,
"flashpack": flashpack,
"car_flashpack_versions": carFlashpackVersions,
}
const result = await api.addFlashpackVersion(data, token)
if (result.error)
throw new Error(`Add flashpack version error. ${result.message}`);
return result;
} finally {
setBusy(false)
}
}
const deleteFlashpackVersion = async (model, year, flashpack, token) => {
let result;
try {
@@ -388,6 +409,7 @@ export const VehicleProvider = ({ children }) => {
totalFlashpackECUMappings,
flashpackECUMappings,
getFlashpackECUMappings,
addFlashpackVersion,
deleteFlashpackVersion,
}}
>

View File

@@ -0,0 +1,215 @@
import {
Button,
TextField
} from "@material-ui/core";
import React, { useEffect, useState } from "react";
import { Redirect } from "react-router";
import { logger } from "../../../services/monitoring";
import { useStatusContext } from "../../Contexts/StatusContext";
import { useVehicleContext, VehicleProvider } from "../../Contexts/VehicleContext";
import { useUserContext } from "../../Contexts/UserContext";
import useStyles from "../../useStyles";
const MainForm = () => {
const {
token: {
idToken: { jwtToken: token },
},
} = useUserContext();
const classes = useStyles();
const [redirect, setRedirect] = useState(null);
const { setMessage, setTitle, setSitePath } = useStatusContext();
const [carModel, setCarModel] = useState("");
const [carYear, setCarYear] = useState(0);
const [flashpack, setFlashpack] = useState("");
const [mappingInputs, setMappingInputs] = useState([{ ecuName: "", ecuVersion: "" }]);
const {
addFlashpackVersion,
busy,
} = useVehicleContext();
useEffect(() => {
setTitle(`Add Flashpack Version`);
setSitePath([
{
label: `Add Flashpack Version`,
link: `/tools/flashpack/add`,
},
]);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const onCarModelChange = (event) => {
setCarModel(event.target.value);
}
const onCarYearChange = (event) => {
setCarYear(event.target.value);
}
const onFlashpackChange = (event) => {
setFlashpack(event.target.value);
}
const onSubmit = async (event) => {
try {
event.preventDefault();
const carFlashpackVersions = []
for (let i = 0; i < mappingInputs.length; i++) {
carFlashpackVersions.push({
"car_model": carModel,
"car_year": parseInt(carYear),
"flashpack": flashpack,
"car_ecu_name": mappingInputs[i].ecuName,
"car_ecu_version": mappingInputs[i].ecuVersion,
})
}
const result = await addFlashpackVersion(carModel, parseInt(carYear), flashpack, carFlashpackVersions, token);
if (!result || result.error) return;
setMessage(`Added ${carYear} ${carModel} ${flashpack}`);
setRedirect(`/tools/flashpacks`);
} catch (e) {
setMessage(e.message);
logger.warn(e.stack);
}
};
if (redirect && redirect.length > 0) {
return <Redirect to={redirect} />;
}
// code for handling the dynamic input fields adapted from
// https://blog.stackademic.com/how-to-dynamically-add-input-fields-on-button-click-in-reactjs-ddf8d8fe495b
const handleAddMappingInput = () => {
setMappingInputs([...mappingInputs, { ecuName: "", ecuVersion: "", }]);
};
const handleChange = (event, index) => {
let { name, value } = event.target;
let onChangeValue = [...mappingInputs];
onChangeValue[index][name] = value;
setMappingInputs(onChangeValue);
};
const handleDeleteMappingInput = (index) => {
const newArray = [...mappingInputs];
newArray.splice(index, 1);
setMappingInputs(newArray);
};
return (
<div className={classes.paper}>
<form className={classes.form} noValidate action="{onSubmit}">
<div>
<TextField
id="carModel"
name="carModel"
label="Model"
variant="outlined"
margin="normal"
inputProps={{
maxLength: "255",
}}
required
fullWidth
value={carModel}
onChange={onCarModelChange}
type="text"
/>
<TextField
id="carYear"
name="carYear"
label="Year"
variant="outlined"
margin="normal"
inputProps={{
maxLength: "255",
}}
required
fullWidth
value={carYear}
onChange={onCarYearChange}
type="number"
/>
<TextField
id="flashpack"
name="flashpack"
label="Flashpack Number"
variant="outlined"
margin="normal"
inputProps={{
maxLength: "255",
}}
required
fullWidth
value={flashpack}
onChange={onFlashpackChange}
type="text"
/>
<div className="container">
{mappingInputs.map((item, index) => (
<div className="input_container" key={index}>
<TextField
id="ecuName"
name="ecuName"
label="ECU Name"
variant="outlined"
margin="normal"
inputProps={{
maxLength: "255",
}}
value={item.ecuName}
onChange={(event) => handleChange(event, index)}
type="text"
/>
<TextField
id="ecuVersion"
name="ecuVersion"
label="ECU Version"
variant="outlined"
margin="normal"
inputProps={{
maxLength: "255",
}}
value={item.ecuVersion}
onChange={(event) => handleChange(event, index)}
type="text"
/>
{mappingInputs.length > 1 && (
<button onClick={() => handleDeleteMappingInput(index)}>Delete</button>
)}
{index === mappingInputs.length - 1 && (
<button onClick={() => handleAddMappingInput()}>Add</button>
)}
</div>
))}
<div className="body"> {JSON.stringify(mappingInputs)} </div>
</div>
</div>
<Button
type="submit"
disabled={busy}
fullWidth
variant="contained"
color="primary"
className={classes.submit}
onClick={onSubmit}
>
{busy ? "Submitting..." : "Submit"}
</Button>
</form>
</div>
);
};
const FlashpackAdd = () => (
<VehicleProvider>
<MainForm />
</VehicleProvider>
);
export default FlashpackAdd;