2023-04-26 21:29:50 +03:00
|
|
|
|
import React, { useEffect, useState } from "react";
|
2023-05-31 08:36:15 +03:00
|
|
|
|
import { useDispatch, useSelector } from "react-redux";
|
2023-04-26 21:29:50 +03:00
|
|
|
|
import { Link, Navigate, useNavigate } from "react-router-dom";
|
2023-05-31 08:36:15 +03:00
|
|
|
|
|
2023-04-26 21:29:50 +03:00
|
|
|
|
import {
|
|
|
|
|
getPartnerRequestId,
|
|
|
|
|
getPartnerRequests,
|
|
|
|
|
setPartnerRequestId,
|
|
|
|
|
setPartnerRequestInfo,
|
2023-05-30 10:54:47 +03:00
|
|
|
|
} from "@redux/outstaffingSlice";
|
2023-05-31 08:36:15 +03:00
|
|
|
|
|
2023-05-30 10:54:47 +03:00
|
|
|
|
import { urlForLocal } from "@utils/helper";
|
2023-02-23 14:57:26 +03:00
|
|
|
|
|
2023-05-31 08:36:15 +03:00
|
|
|
|
import { apiRequest } from "@api/request";
|
|
|
|
|
|
|
|
|
|
import { getCorrectDate } from "@components/Calendar/calendarHelper";
|
2023-05-30 10:54:47 +03:00
|
|
|
|
import { Footer } from "@components/Common/Footer/Footer";
|
|
|
|
|
import { Loader } from "@components/Common/Loader/Loader";
|
|
|
|
|
import ModalLayout from "@components/Common/ModalLayout/ModalLayout";
|
2023-05-31 08:36:15 +03:00
|
|
|
|
import { Navigation } from "@components/Navigation/Navigation";
|
|
|
|
|
import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs";
|
|
|
|
|
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
|
2023-02-23 14:57:26 +03:00
|
|
|
|
|
2023-05-30 10:54:47 +03:00
|
|
|
|
import arrowSwitchDate from "assets/icons/arrows/arrowViewReport.png";
|
|
|
|
|
import backEndImg from "assets/images/QualificationInfo.png";
|
|
|
|
|
import middle from "assets/images/QualificationInfoMiddle.png";
|
|
|
|
|
import deleteBtn from "assets/images/deleteBtn.png";
|
2023-02-23 14:57:26 +03:00
|
|
|
|
|
2023-04-26 21:29:50 +03:00
|
|
|
|
import "./partnerBid.scss";
|
2023-02-23 14:57:26 +03:00
|
|
|
|
|
|
|
|
|
export const PartnerBid = () => {
|
2023-04-26 21:29:50 +03:00
|
|
|
|
if (localStorage.getItem("role_status") !== "18") {
|
|
|
|
|
return <Navigate to="/profile" replace />;
|
|
|
|
|
}
|
2023-04-19 22:42:46 +03:00
|
|
|
|
|
2023-04-26 21:29:50 +03:00
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
const requestId = useSelector(getPartnerRequestId);
|
|
|
|
|
const partnerRequests = useSelector(getPartnerRequests);
|
|
|
|
|
const navigate = useNavigate();
|
2023-04-18 13:58:36 +03:00
|
|
|
|
|
2023-04-26 21:29:50 +03:00
|
|
|
|
if (!requestId) {
|
|
|
|
|
return <Navigate to="/profile/requests" replace />;
|
|
|
|
|
}
|
2023-04-18 13:58:36 +03:00
|
|
|
|
|
2023-04-26 21:29:50 +03:00
|
|
|
|
useEffect(() => {
|
|
|
|
|
setLoader(true);
|
|
|
|
|
apiRequest(`/request/get-request?request_id=${requestId}`).then((el) => {
|
|
|
|
|
setRequestInfo(el);
|
|
|
|
|
dispatch(setPartnerRequestInfo(el));
|
|
|
|
|
setLoader(false);
|
|
|
|
|
});
|
|
|
|
|
}, [requestId]);
|
2023-04-18 13:58:36 +03:00
|
|
|
|
|
2023-04-26 21:29:50 +03:00
|
|
|
|
const deleteRequest = () => {
|
|
|
|
|
apiRequest("/request/update-request", {
|
|
|
|
|
method: "PUT",
|
|
|
|
|
data: {
|
|
|
|
|
user_id: localStorage.getItem("id"),
|
|
|
|
|
request_id: requestId,
|
|
|
|
|
status: 0,
|
|
|
|
|
},
|
2023-05-31 11:24:46 +03:00
|
|
|
|
}).then(() => {
|
2023-04-26 21:29:50 +03:00
|
|
|
|
navigate("/profile/requests");
|
|
|
|
|
});
|
|
|
|
|
};
|
2023-04-19 22:42:46 +03:00
|
|
|
|
|
2023-04-26 21:29:50 +03:00
|
|
|
|
const [requestInfo, setRequestInfo] = useState({});
|
|
|
|
|
const [loader, setLoader] = useState(false);
|
|
|
|
|
const [modalDelete, setModalDelete] = useState(false);
|
|
|
|
|
const [levels] = useState({
|
|
|
|
|
1: "Junior",
|
|
|
|
|
2: "Middle",
|
|
|
|
|
3: "Middle+",
|
|
|
|
|
4: "Senior",
|
|
|
|
|
});
|
|
|
|
|
return (
|
|
|
|
|
<div className="partnerBid">
|
|
|
|
|
<ProfileHeader />
|
|
|
|
|
<Navigation />
|
2023-05-05 16:10:25 +03:00
|
|
|
|
<ModalLayout active={modalDelete} setActive={setModalDelete}>
|
2023-04-26 21:29:50 +03:00
|
|
|
|
<div className="title-project modal-title-delete">
|
|
|
|
|
<h4>Подтверждение удаления</h4>
|
|
|
|
|
<p className="title-project__decs modal-decs">
|
|
|
|
|
Вы решили удалить заявку. После удаления ее нельзя будет
|
|
|
|
|
восстановить. Продолжаем?
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<div className="buttons-modal">
|
|
|
|
|
<button
|
|
|
|
|
className="buttons-modal__no"
|
|
|
|
|
onClick={() => setModalDelete(false)}
|
|
|
|
|
>
|
|
|
|
|
Нет
|
|
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
className="buttons-modal__yes"
|
|
|
|
|
onClick={() => deleteRequest()}
|
|
|
|
|
>
|
|
|
|
|
Да
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2023-05-05 16:10:25 +03:00
|
|
|
|
</ModalLayout>
|
2023-04-26 21:29:50 +03:00
|
|
|
|
|
|
|
|
|
<div className="container">
|
|
|
|
|
<ProfileBreadcrumbs
|
|
|
|
|
links={[
|
|
|
|
|
{ name: "Главная", link: "/profile" },
|
|
|
|
|
{ name: "Запросы и открытые позиции", link: "/profile/requests" },
|
|
|
|
|
{ name: "Просмотр заявки - PHP разработчик", link: "/profile/bid" },
|
|
|
|
|
]}
|
|
|
|
|
/>
|
|
|
|
|
<h2 className="partnerBid__title">Страница заявки </h2>
|
|
|
|
|
{loader && <Loader />}
|
|
|
|
|
{!loader && (
|
|
|
|
|
<>
|
|
|
|
|
<div className="partnerBid__qualification">
|
|
|
|
|
<h3>{requestInfo.title}</h3>
|
|
|
|
|
<div className="partnerBid__qualification__buttons">
|
|
|
|
|
<Link to="/profile/edit-request">Редактировать</Link>
|
|
|
|
|
<img
|
|
|
|
|
src={deleteBtn}
|
|
|
|
|
alt="delete"
|
|
|
|
|
onClick={() => setModalDelete(true)}
|
2023-02-27 16:50:32 +03:00
|
|
|
|
/>
|
2023-04-26 21:29:50 +03:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="partnerBid__switcher">
|
|
|
|
|
<div
|
|
|
|
|
className={
|
|
|
|
|
partnerRequests[
|
|
|
|
|
partnerRequests.findIndex((el) => el.id === requestId) - 1
|
|
|
|
|
]?.id
|
|
|
|
|
? "partnerBid__switcher__prev switchDate"
|
|
|
|
|
: "partnerBid__switcher__prev switchDate disable"
|
2023-04-18 13:58:36 +03:00
|
|
|
|
}
|
2023-04-26 21:29:50 +03:00
|
|
|
|
onClick={() => {
|
|
|
|
|
dispatch(
|
|
|
|
|
setPartnerRequestId(
|
|
|
|
|
partnerRequests[
|
|
|
|
|
partnerRequests.findIndex((el) => el.id === requestId) -
|
|
|
|
|
1
|
2023-12-05 14:15:04 +03:00
|
|
|
|
].id
|
|
|
|
|
)
|
2023-04-26 21:29:50 +03:00
|
|
|
|
);
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<img src={arrowSwitchDate} alt="arrow" />
|
|
|
|
|
</div>
|
|
|
|
|
<p>Дата заявки : {getCorrectDate(requestInfo.created_at)} </p>
|
|
|
|
|
<div
|
|
|
|
|
className={
|
|
|
|
|
partnerRequests[
|
|
|
|
|
partnerRequests.findIndex((el) => el.id === requestId) + 1
|
|
|
|
|
]?.id
|
|
|
|
|
? "partnerBid__switcher__next switchDate"
|
|
|
|
|
: "partnerBid__switcher__next switchDate disable"
|
|
|
|
|
}
|
|
|
|
|
onClick={() => {
|
|
|
|
|
dispatch(
|
|
|
|
|
setPartnerRequestId(
|
|
|
|
|
partnerRequests[
|
|
|
|
|
partnerRequests.findIndex((el) => el.id === requestId) +
|
|
|
|
|
1
|
2023-12-05 14:15:04 +03:00
|
|
|
|
].id
|
|
|
|
|
)
|
2023-04-26 21:29:50 +03:00
|
|
|
|
);
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<img src={arrowSwitchDate} alt="arrow" />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
{Boolean(Object.keys(requestInfo).length) && !loader && (
|
|
|
|
|
<>
|
|
|
|
|
<div className="table__wrapper">
|
|
|
|
|
<table>
|
|
|
|
|
<thead>
|
|
|
|
|
<tr>
|
|
|
|
|
<th>
|
|
|
|
|
<p>Требования к стеку разработчика</p>
|
|
|
|
|
</th>
|
|
|
|
|
<th>
|
|
|
|
|
<p>Квалификация</p>
|
|
|
|
|
</th>
|
|
|
|
|
</tr>
|
|
|
|
|
</thead>
|
|
|
|
|
<tbody>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>
|
|
|
|
|
<p>
|
|
|
|
|
{requestInfo.position.name}.
|
|
|
|
|
{requestInfo.skills.map((skill, index) => {
|
|
|
|
|
return (
|
|
|
|
|
<span key={skill.id}>
|
|
|
|
|
{skill.name}
|
|
|
|
|
{requestInfo.skills.length > index + 1
|
|
|
|
|
? ","
|
|
|
|
|
: "."}
|
|
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
);
|
|
|
|
|
})}
|
|
|
|
|
</p>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<div className="qualification__info">
|
|
|
|
|
<div className="img__wrapper">
|
|
|
|
|
<img src={backEndImg} alt="backEndImg" />
|
2023-04-19 22:42:46 +03:00
|
|
|
|
</div>
|
2023-04-26 21:29:50 +03:00
|
|
|
|
<p>{requestInfo.position.name}</p>
|
|
|
|
|
</div>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>
|
|
|
|
|
<p>{requestInfo.descr}</p>
|
|
|
|
|
</td>
|
|
|
|
|
<td>
|
|
|
|
|
<div className="qualification__info">
|
|
|
|
|
<div className="img__wrapper">
|
|
|
|
|
<img src={middle} alt="middleImg" />
|
2023-04-19 22:42:46 +03:00
|
|
|
|
</div>
|
2023-04-26 21:29:50 +03:00
|
|
|
|
<p className="middle">{requestInfo.level}</p>
|
|
|
|
|
</div>
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</tbody>
|
|
|
|
|
</table>
|
2023-02-23 14:57:26 +03:00
|
|
|
|
</div>
|
2023-04-26 21:29:50 +03:00
|
|
|
|
<div className="partnerBid__suitable">
|
|
|
|
|
<div className="partnerBid__suitable__title">
|
|
|
|
|
<p>Подходящие сотрудники по запросу</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="partnerBid__suitable__persons">
|
|
|
|
|
{requestInfo.result_profiles.length &&
|
|
|
|
|
requestInfo.result_profiles.map((person, index) => {
|
|
|
|
|
return (
|
|
|
|
|
<div key={index} className="partnerBid__suitable__person">
|
|
|
|
|
<img src={urlForLocal(person.photo)} alt="avatar" />
|
|
|
|
|
<p>
|
|
|
|
|
{person.fio} - {person.position_title},{" "}
|
|
|
|
|
{levels[person.level]}
|
|
|
|
|
</p>
|
|
|
|
|
<Link
|
|
|
|
|
className="partnerBid__suitable__person__more"
|
|
|
|
|
to={`/candidate/${person.id}`}
|
|
|
|
|
>
|
|
|
|
|
Подробнее
|
|
|
|
|
</Link>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
})}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
<Footer />
|
|
|
|
|
</div>
|
|
|
|
|
);
|
2023-02-23 14:57:26 +03:00
|
|
|
|
};
|