This commit is contained in:
Андрей Дувакин 2024-10-07 17:37:57 +05:00
parent e7977ffd66
commit ce5d15c03f
4 changed files with 113 additions and 39 deletions

View File

@ -19,18 +19,20 @@ export const AuthProvider = ({ children }) => {
const login = (userData) => {
setIsAuthenticated(true);
setRole(userData.user.role_name);
setRole(userData.user.role_name);
localStorage.setItem("token", userData.token);
localStorage.setItem("user", JSON.stringify(userData.user));
localStorage.setItem("role", JSON.stringify(userData.user.role_name));
localStorage.setItem("isAuthenticated", true);
};
const logout = () => {
setIsAuthenticated(false);
setRole(null);
setRole(null);
localStorage.removeItem("token");
localStorage.removeItem("isAuthenticated");
localStorage.removeItem("user");
localStorage.removeItem("role");
};
useEffect(() => {

View File

@ -0,0 +1,94 @@
import React, { useState } from "react";
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
const AddOrderModal = ({ show, onHide, onSubmit }) => {
const [deadline, setDeadline] = useState(new Date());
const [robotsCount, setRobotsCount] = useState(2000);
const [formError, setFormError] = useState("");
const handleSubmit = () => {
if (!deadline || robotsCount <= 0) {
setFormError("Пожалуйста, заполните все поля корректно.");
return;
}
setFormError("");
onSubmit({ deadline, robotsCount });
};
if (!show) {
return null;
}
return (
<div
className="modal fade show d-block"
tabIndex="-1"
role="dialog"
style={{ backgroundColor: "rgba(0, 0, 0, 0.5)" }}
>
<div className="modal-dialog modal-dialog-centered" role="document">
<div className="modal-content">
<div className="modal-header">
<h5 className="modal-title">Добавить новый заказ</h5>
<button
type="button"
className="btn-close"
aria-label="Close"
onClick={onHide}
>
<span>&times;</span>
</button>
</div>
<div className="modal-body">
{formError && <p className="text-danger">{formError}</p>}
<div className="mb-3">
<label htmlFor="robotsCount" className="form-label">
Количество роботов:
</label>
<input
type="number"
className="form-control"
id="robotsCount"
value={robotsCount}
onChange={(e) => setRobotsCount(Number(e.target.value))}
min="1"
placeholder="Введите количество роботов"
/>
</div>
<div className="mb-3">
<label htmlFor="deadline" className="form-label">
Дедлайн:
</label>
<DatePicker
selected={deadline}
onChange={(date) => setDeadline(date)}
className="form-control"
dateFormat="P"
placeholderText="Выберите дату дедлайна"
/>
</div>
</div>
<div className="modal-footer">
<button
type="button"
className="btn btn-secondary"
onClick={onHide}
>
Отмена
</button>
<button
type="button"
className="btn btn-primary"
onClick={handleSubmit}
>
Подтвердить
</button>
</div>
</div>
</div>
</div>
);
};
export default AddOrderModal;

View File

@ -3,9 +3,10 @@ import { Link, useNavigate } from "react-router-dom";
import { useAuth } from "../AuthContext";
const Header = () => {
const { isAuthenticated, role, logout } = useAuth();
const { isAuthenticated, logout } = useAuth();
const navigate = useNavigate();
const user = JSON.parse(localStorage.getItem("user"));
const role = JSON.parse(localStorage.getItem("role"));
const handleLogout = () => {
logout();

View File

@ -3,8 +3,7 @@ import { useNavigate } from "react-router-dom";
import DeliveryOrdersList from "../components/DeliveryOrdersList.jsx";
import { getTotalOrders, calculateTotalOrder } from "../api.jsx";
import { getStatuses } from "../api.jsx";
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
import AddOrderModal from "../components/AddOrderModal.jsx";
const Home = () => {
const [statuses, setStatuses] = useState([]);
@ -13,8 +12,7 @@ const Home = () => {
const [loadingStatuses, setLoadingStatuses] = useState(true);
const [loadingOrders, setLoadingOrders] = useState(true);
const [loadingCreateOrder, setLoadingCreateOrder] = useState(false);
const [deliveryOrdersCount, setDeliveryOrdersCount] = useState(0);
const [deadline, setDeadline] = useState(new Date());
const [showModal, setShowModal] = useState(false);
const navigate = useNavigate();
const user = JSON.parse(localStorage.getItem("user"));
@ -51,16 +49,17 @@ const Home = () => {
}
};
const handleCreateOrder = async () => {
const handleCreateOrder = async ({ deadline, robotsCount }) => {
setLoadingCreateOrder(true);
try {
await calculateTotalOrder();
await calculateTotalOrder({ deadline, robotsCount });
alert("Начался расчет маршрутов. Заказ скоро появится в списке заказов.");
fetchTotalOrders();
} catch (error) {
console.error("Ошибка при расчете заказа:", error);
} finally {
setLoadingCreateOrder(false);
setShowModal(false);
}
};
@ -78,36 +77,13 @@ const Home = () => {
return (
<div className="container mt-4">
<div className="mb-3">
<label htmlFor="deadline" className="form-label">
Дедлайн:
</label>
<DatePicker
selected={deadline}
onChange={(date) => setDeadline(date)}
className="form-control"
dateFormat="P"
placeholderText="Выберите дату дедлайна"
/>
</div>
<div className="d-flex align-items-center mb-3">
<button
className="btn btn-primary"
onClick={handleCreateOrder}
onClick={() => setShowModal(true)}
disabled={loadingCreateOrder || loadingStatuses}
>
{loadingCreateOrder ? (
<>
<span
className="spinner-border spinner-border-sm"
role="status"
aria-hidden="true"
></span>
Загрузка...
</>
) : (
"+ Создать"
)}
+ Создать
</button>
{loadingCreateOrder && (
<span className="ms-2 text-muted">
@ -141,10 +117,6 @@ const Home = () => {
<p>
<strong>Количество роботов:</strong> {order.count_robots}
</p>
<p>
<strong>Количество подзаказов:</strong>{" "}
{deliveryOrdersCount || 0}
</p>
<p>
<strong>Создатель:</strong>{" "}
{order.user_login || "Неизвестный пользователь"}
@ -153,13 +125,18 @@ const Home = () => {
<DeliveryOrdersList
totalOrderId={order.id}
onSubOrderClick={handleSubOrderClick}
setDeliveryOrdersCount={setDeliveryOrdersCount}
/>
</div>
)}
</div>
))
)}
<AddOrderModal
show={showModal}
onHide={() => setShowModal(false)}
onSubmit={handleCreateOrder}
/>
</div>
);
};