._.
This commit is contained in:
parent
0ded5844eb
commit
3a750eda6d
@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
59
src/api.jsx
59
src/api.jsx
@ -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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@ -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 ? (
|
||||||
|
|||||||
@ -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
186
src/pages/Trucks.jsx
Normal 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;
|
||||||
Loading…
x
Reference in New Issue
Block a user