This commit is contained in:
Андрей Дувакин 2024-10-05 14:00:28 +05:00
parent 0ded5844eb
commit 3a750eda6d
5 changed files with 253 additions and 2 deletions

View File

@ -7,6 +7,7 @@ import Cities from "./pages/Cities.jsx";
import FederalDistricts from "./pages/FederalDistricts.jsx"; import FederalDistricts from "./pages/FederalDistricts.jsx";
import Roles from "./pages/Roles.jsx"; import Roles from "./pages/Roles.jsx";
import Statuses from "./pages/Statuses.jsx"; import Statuses from "./pages/Statuses.jsx";
import Trucks from "./pages/Trucks.jsx";
const RoutesComponent = () => ( const RoutesComponent = () => (
<Routes> <Routes>
@ -17,7 +18,8 @@ const RoutesComponent = () => (
<Route path="/cities" element={<Cities />} /> <Route path="/cities" element={<Cities />} />
<Route path="/federal_districts" element={<FederalDistricts />} /> <Route path="/federal_districts" element={<FederalDistricts />} />
<Route path="/roles" element={<Roles />} /> <Route path="/roles" element={<Roles />} />
<Route path="/statuses" element={<Statuses />} /> <Route path="/statuses" element={<Statuses />} />{" "}
<Route path="/trucks" element={<Trucks />} />
</Route> </Route>
</Routes> </Routes>
); );

View File

@ -340,3 +340,62 @@ export const deleteStatus = async (id) => {
throw error; throw error;
} }
}; };
export const getTrucks = async () => {
try {
const response = await axios.get(`${API_URL}/trucks`, {
headers: {
Authorization: `Bearer ${getAuthToken()}`,
Accept: "application/json",
},
});
return response.data;
} catch (error) {
console.log("Ошибка при загрузке грузовиков:", error);
throw error;
}
};
export const createTruck = async (truckData) => {
try {
const response = await axios.post(`${API_URL}/trucks`, truckData, {
headers: {
Authorization: `Bearer ${getAuthToken()}`,
"Content-Type": "application/json",
},
});
return response.data;
} catch (error) {
console.log("Ошибка при создании грузовика:", error);
throw error;
}
};
export const updateTruck = async (id, truckData) => {
try {
const response = await axios.put(`${API_URL}/trucks/${id}`, truckData, {
headers: {
Authorization: `Bearer ${getAuthToken()}`,
"Content-Type": "application/json",
},
});
return response.data;
} catch (error) {
console.log("Ошибка при обновлении грузовика:", error);
throw error;
}
};
export const deleteTruck = async (id) => {
try {
await axios.delete(`${API_URL}/trucks/${id}`, {
headers: {
Authorization: `Bearer ${getAuthToken()}`,
Accept: "application/json",
},
});
} catch (error) {
console.log("Ошибка при удалении грузовика:", error);
throw error;
}
};

View File

@ -50,6 +50,11 @@ const Header = () => {
Статусы Статусы
</Link> </Link>
</li> </li>
<li className="nav-item">
<Link className="nav-link" to="/trucks">
Грузовики
</Link>
</li>
</ul> </ul>
<div className="d-flex align-items-center ml-auto"> <div className="d-flex align-items-center ml-auto">
{isAuthenticated ? ( {isAuthenticated ? (

View File

@ -33,7 +33,6 @@ const Accessories = () => {
const fetchAccessories = async () => { const fetchAccessories = async () => {
try { try {
const data = await getAccessories(); const data = await getAccessories();
console.log(data);
setAccessories(data); setAccessories(data);
} catch (error) { } catch (error) {
console.error("Ошибка при загрузке аксессуаров:", error); console.error("Ошибка при загрузке аксессуаров:", error);

186
src/pages/Trucks.jsx Normal file
View File

@ -0,0 +1,186 @@
import React, { useState, useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { getAuthToken } from "../api.jsx";
import { getTrucks, createTruck, updateTruck, deleteTruck } from "../api.jsx";
const Trucks = () => {
const [trucks, setTrucks] = useState([]);
const [newTruck, setNewTruck] = useState({
name: "",
capacity: "",
volume: "",
});
const [editingTruckId, setEditingTruckId] = useState(null);
const [error, setError] = useState(null);
const navigate = useNavigate();
useEffect(() => {
fetchTrucks();
}, []);
const fetchTrucks = async () => {
try {
const data = await getTrucks();
setTrucks(data);
} catch (error) {
console.error("Ошибка при загрузке грузовиков:", error);
}
};
const handleInputChange = (e) => {
const { name, value } = e.target;
setNewTruck({ ...newTruck, [name]: value });
};
const handleSubmit = async (e) => {
e.preventDefault();
if (!newTruck.name || !newTruck.capacity || !newTruck.volume) {
setError("Пожалуйста, заполните все поля.");
return;
}
try {
if (editingTruckId) {
await updateTruck(editingTruckId, newTruck);
} else {
await createTruck(newTruck);
}
fetchTrucks();
resetForm();
} catch (error) {
console.error("Ошибка при добавлении или обновлении грузовика:", error);
}
};
const handleEdit = (truck) => {
setNewTruck({
name: truck.name,
capacity: truck.capacity,
volume: truck.volume,
});
setEditingTruckId(truck.id);
};
const handleDelete = async (truckId) => {
try {
await deleteTruck(truckId);
fetchTrucks();
} catch (error) {
console.error("Ошибка при удалении грузовика:", error);
}
};
const resetForm = () => {
setNewTruck({
name: "",
capacity: "",
volume: "",
});
setEditingTruckId(null);
};
if (getAuthToken() === null) {
navigate("/login");
}
return (
<div className="container mt-4">
<h3>Грузовики</h3>
<form onSubmit={handleSubmit}>
<div className="form-group">
<label htmlFor="truckName">Название грузовика</label>
<input
type="text"
className="form-control"
id="truckName"
name="name"
placeholder="Введите название грузовика"
value={newTruck.name}
onChange={handleInputChange}
/>
</div>
<div className="form-group">
<label htmlFor="truckCapacity">Грузоподъемность (тонны)</label>
<input
type="number"
className="form-control"
id="truckCapacity"
name="capacity"
placeholder="Введите грузоподъемность"
value={newTruck.capacity}
onChange={handleInputChange}
/>
</div>
<div className="form-group">
<label htmlFor="truckVolume">Объем (кубометры)</label>
<input
type="number"
className="form-control"
id="truckVolume"
name="volume"
placeholder="Введите объем"
value={newTruck.volume}
onChange={handleInputChange}
/>
</div>
<div className="btn-group">
<button type="submit" className="btn btn-primary">
{editingTruckId ? "Обновить" : "Создать"}
</button>
<button
type="button"
className="btn btn-secondary"
onClick={resetForm}
>
Отменить
</button>
</div>
{error && (
<div className="alert alert-danger mt-3" role="alert">
{error}
</div>
)}
</form>
<h3 className="mt-5">Список грузовиков</h3>
<table className="table table-bordered">
<thead>
<tr>
<th>Название</th>
<th>Грузоподъемность</th>
<th>Объем</th>
<th>Действия</th>
</tr>
</thead>
<tbody>
{trucks.map((truck) => (
<tr key={truck.id}>
<td>{truck.name}</td>
<td>{truck.capacity}</td>
<td>{truck.volume}</td>
<td>
<div className="btn-group">
<button
className="btn btn-warning"
onClick={() => handleEdit(truck)}
>
Изменить
</button>
<button
className="btn btn-danger"
onClick={() => handleDelete(truck.id)}
>
Удалить
</button>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
export default Trucks;