This commit is contained in:
Андрей Дувакин 2024-10-05 13:18:36 +05:00
parent 18641da6c9
commit a33b0615fd
4 changed files with 221 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import Home from "./pages/Home.jsx";
import Accessories from "./pages/Accessories.jsx";
import PrivateRoute from "./components/PrivateRoute";
import Cities from "./pages/Cities.jsx";
import FederalDistricts from "./pages/FederalDistricts.jsx";
const RoutesComponent = () => (
<Routes>
@ -12,6 +13,7 @@ const RoutesComponent = () => (
<Route path="/" element={<Home />} />
<Route path="/accessories" element={<Accessories />} />
<Route path="/cities" element={<Cities />} />
<Route path="/federal_districts" element={<FederalDistricts />} />
</Route>
</Routes>
);

View File

@ -170,3 +170,55 @@ export const getFederalDistricts = async () => {
throw error;
}
};
export const createFederalDistrict = async (districtData) => {
try {
const response = await axios.post(
`${API_URL}/federal-districts`,
districtData,
{
headers: {
Authorization: `Bearer ${getAuthToken()}`,
"Content-Type": "application/json",
},
}
);
return response.data;
} catch (error) {
console.log("Ошибка при создании федерального округа:", error);
throw error;
}
};
export const updateFederalDistrict = async (id, districtData) => {
try {
const response = await axios.put(
`${API_URL}/federal-districts/${id}`,
districtData,
{
headers: {
Authorization: `Bearer ${getAuthToken()}`,
"Content-Type": "application/json",
},
}
);
return response.data;
} catch (error) {
console.log("Ошибка при обновлении федерального округа:", error);
throw error;
}
};
export const deleteFederalDistrict = async (id) => {
try {
await axios.delete(`${API_URL}/federal-districts/${id}`, {
headers: {
Authorization: `Bearer ${getAuthToken()}`,
Accept: "application/json",
},
});
} catch (error) {
console.log("Ошибка при удалении федерального округа:", error);
throw error;
}
};

View File

@ -35,6 +35,11 @@ const Header = () => {
Города
</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/federal_districts">
Федеральные округа
</Link>
</li>
</ul>
<div className="d-flex align-items-center ml-auto">
{isAuthenticated ? (

View File

@ -0,0 +1,162 @@
import React, { useState, useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { getAuthToken } from "../api.jsx";
import {
getFederalDistricts,
createFederalDistrict,
updateFederalDistrict,
deleteFederalDistrict,
} from "../api.jsx";
const FederalDistricts = () => {
const [districts, setDistricts] = useState([]);
const [newDistrict, setNewDistrict] = useState({
name: "",
});
const [editingDistrictId, setEditingDistrictId] = useState(null);
const [error, setError] = useState(null);
const navigate = useNavigate();
useEffect(() => {
fetchFederalDistricts();
}, []);
const fetchFederalDistricts = async () => {
try {
const data = await getFederalDistricts();
setDistricts(data);
} catch (error) {
console.error("Ошибка при загрузке федеральных округов:", error);
}
};
const handleInputChange = (e) => {
const { name, value } = e.target;
setNewDistrict({ ...newDistrict, [name]: value });
};
const handleSubmit = async (e) => {
e.preventDefault();
if (!newDistrict.name) {
setError("Пожалуйста, заполните все поля.");
return;
}
try {
if (editingDistrictId) {
await updateFederalDistrict(editingDistrictId, newDistrict);
} else {
await createFederalDistrict(newDistrict);
}
fetchFederalDistricts();
resetForm();
} catch (error) {
console.error(
"Ошибка при добавлении или обновлении федерального округа:",
error
);
}
};
const handleEdit = (district) => {
setNewDistrict({
name: district.name,
});
setEditingDistrictId(district.id);
};
const handleDelete = async (districtId) => {
try {
await deleteFederalDistrict(districtId);
fetchFederalDistricts();
} catch (error) {
console.error("Ошибка при удалении федерального округа:", error);
}
};
const resetForm = () => {
setNewDistrict({
name: "",
});
setEditingDistrictId(null);
};
if (getAuthToken() === null) {
navigate("/login");
}
return (
<div className="container mt-4">
<h3>Федеральные округа</h3>
<form onSubmit={handleSubmit}>
<div className="form-group">
<label htmlFor="districtName">Название округа</label>
<input
type="text"
className="form-control"
id="districtName"
name="name"
placeholder="Введите название округа"
value={newDistrict.name}
onChange={handleInputChange}
/>
</div>
<div className="btn-group">
<button type="submit" className="btn btn-primary">
{editingDistrictId ? "Обновить" : "Создать"}
</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>ID</th>
<th>Название</th>
<th>Действия</th>
</tr>
</thead>
<tbody>
{districts.map((district) => (
<tr key={district.id}>
<td>{district.id}</td>
<td>{district.name}</td>
<td>
<div className="btn-group">
<button
className="btn btn-warning"
onClick={() => handleEdit(district)}
>
Изменить
</button>
<button
className="btn btn-danger"
onClick={() => handleDelete(district.id)}
>
Удалить
</button>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
export default FederalDistricts;