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

@ -22,6 +22,7 @@ export const AuthProvider = ({ children }) => {
setRole(userData.user.role_name); setRole(userData.user.role_name);
localStorage.setItem("token", userData.token); localStorage.setItem("token", userData.token);
localStorage.setItem("user", JSON.stringify(userData.user)); localStorage.setItem("user", JSON.stringify(userData.user));
localStorage.setItem("role", JSON.stringify(userData.user.role_name));
localStorage.setItem("isAuthenticated", true); localStorage.setItem("isAuthenticated", true);
}; };
@ -31,6 +32,7 @@ export const AuthProvider = ({ children }) => {
localStorage.removeItem("token"); localStorage.removeItem("token");
localStorage.removeItem("isAuthenticated"); localStorage.removeItem("isAuthenticated");
localStorage.removeItem("user"); localStorage.removeItem("user");
localStorage.removeItem("role");
}; };
useEffect(() => { 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"; import { useAuth } from "../AuthContext";
const Header = () => { const Header = () => {
const { isAuthenticated, role, logout } = useAuth(); const { isAuthenticated, logout } = useAuth();
const navigate = useNavigate(); const navigate = useNavigate();
const user = JSON.parse(localStorage.getItem("user")); const user = JSON.parse(localStorage.getItem("user"));
const role = JSON.parse(localStorage.getItem("role"));
const handleLogout = () => { const handleLogout = () => {
logout(); logout();

View File

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