WEB_logistics/src/pages/Roles.jsx
2024-10-05 13:46:13 +05:00

153 lines
3.8 KiB
JavaScript

import React, { useState, useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { getAuthToken } from "../api.jsx";
import { getRoles, createRole, updateRole, deleteRole } from "../api.jsx";
const Roles = () => {
const [roles, setRoles] = useState([]);
const [newRole, setNewRole] = useState({
name: "",
});
const [editingRoleId, setEditingRoleId] = useState(null);
const [error, setError] = useState(null);
const navigate = useNavigate();
useEffect(() => {
fetchRoles();
}, []);
const fetchRoles = async () => {
try {
const data = await getRoles();
setRoles(data);
} catch (error) {
console.error("Ошибка при загрузке ролей:", error);
}
};
const handleInputChange = (e) => {
const { name, value } = e.target;
setNewRole({ ...newRole, [name]: value });
};
const handleSubmit = async (e) => {
e.preventDefault();
if (!newRole.name) {
setError("Пожалуйста, заполните все поля.");
return;
}
try {
if (editingRoleId) {
await updateRole(editingRoleId, newRole);
} else {
await createRole(newRole);
}
fetchRoles();
resetForm();
} catch (error) {
console.error("Ошибка при добавлении или обновлении роли:", error);
}
};
const handleEdit = (role) => {
setNewRole({
name: role.name,
});
setEditingRoleId(role.id);
};
const handleDelete = async (roleId) => {
try {
await deleteRole(roleId);
fetchRoles();
} catch (error) {
console.error("Ошибка при удалении роли:", error);
}
};
const resetForm = () => {
setNewRole({
name: "",
});
setEditingRoleId(null);
};
if (getAuthToken() === null) {
navigate("/login");
}
return (
<div className="container mt-4">
<h3>Роли</h3>
<form onSubmit={handleSubmit}>
<div className="form-group">
<label htmlFor="roleName">Название роли</label>
<input
type="text"
className="form-control"
id="roleName"
name="name"
placeholder="Введите название роли"
value={newRole.name}
onChange={handleInputChange}
/>
</div>
<div className="btn-group">
<button type="submit" className="btn btn-primary">
{editingRoleId ? "Обновить" : "Создать"}
</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>
</tr>
</thead>
<tbody>
{roles.map((role) => (
<tr key={role.id}>
<td>{role.name}</td>
<td>
<div className="btn-group">
<button
className="btn btn-warning"
onClick={() => handleEdit(role)}
>
Изменить
</button>
<button
className="btn btn-danger"
onClick={() => handleDelete(role.id)}
>
Удалить
</button>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
);
};
export default Roles;