-
This commit is contained in:
Никита Губарь 2024-02-15 13:30:13 +03:00
commit 954f696044
79 changed files with 420 additions and 491 deletions

View File

@ -3,14 +3,14 @@ import {
BrowserRouter as Router,
Route,
Routes,
Navigate,
Navigate
} from "react-router-dom";
import { getNotification } from "@redux/outstaffingSlice";
import Auth from "./pages/Auth/Auth";
import CatalogSpecialists from "@pages/CatalogSpecialists/CatalogSpecialists";
import { TrackerIntro } from "@pages/TrackerIntro/TrackerIntro"
import { TrackerIntro } from "@pages/TrackerIntro/TrackerIntro";
import { CompanyInfo } from "@pages/CompanyInfo/CompanyInfo";
import { TrackerAuth } from "@pages/TrackerAuth/TrackerAuth";
import { TrackerRegistration } from "@pages/TrackerRegistration/TrackerRegistration";
@ -57,7 +57,7 @@ import "./assets/fonts/stylesheet.css";
import "bootstrap/dist/css/bootstrap.min.css";
const App = () => {
const notification = useSelector(getNotification)
const notification = useSelector(getNotification);
return (
<>
<Router>
@ -65,10 +65,22 @@ const App = () => {
<Route exact path="/auth" element={<Auth />} />
<Route exact path="/tracker-intro" element={<TrackerIntro />} />
<Route exact path="/tracker-auth" element={<TrackerAuth />} />
<Route exact path="/tracker-registration" element={<TrackerRegistration />} />
<Route
exact
path="/tracker-registration"
element={<TrackerRegistration />}
/>
<Route exact path="/company" element={<CompanyInfo />} />
<Route exact path="/registration-setting" element={<RegistrationSetting />} />
<Route exact path="/catalog-specialists" element={<CatalogSpecialists />} />
<Route
exact
path="/registration-setting"
element={<RegistrationSetting />}
/>
<Route
exact
path="/catalog-specialists"
element={<CatalogSpecialists />}
/>
<Route exact path="/worker/:id" element={<FreeDevelopers />} />
<Route
@ -113,18 +125,26 @@ const App = () => {
<Route exact path="catalog" element={<Home />} />
<Route exact path="calendar" element={<ProfileCalendar />} />
<Route exact path="calendar/report" element={<ReportForm />} />
<Route exact path="calendar/view/:date/:id" element={<ViewReport />} />
<Route
exact
path="calendar/view/:date/:id"
element={<ViewReport />}
/>
<Route exact path="summary" element={<Summary />} />
<Route exact path="tracker" element={<Tracker />} />
<Route exact path="statistics/:id" element={<Statistics/>}/>
<Route exact path="statistics/:id" element={<Statistics />} />
<Route exact path="payouts" element={<Payouts />} />
<Route exact path="settings" element={<PartnerSettings />} />
<Route exact path="requests" element={<PartnerRequests />} />
<Route exact path="add-request" element={<PartnerAddRequest />} />
<Route exact path="edit-request" element={<PartnerAddRequest />} />
<Route exact path="bid" element={<PartnerBid />} />
<Route exact path="requests-add" element={<PartnerAddRequest />} />
<Route exact path="requests-edit" element={<PartnerAddRequest />} />
<Route exact path="requests-bid" element={<PartnerBid />} />
<Route exact path="employees" element={<PartnerCategories />} />
<Route exact path="employees/report/:uuid" element={<PartnerEmployeeReport />} />
<Route
exact
path="employees/report/:uuid"
element={<PartnerEmployeeReport />}
/>
<Route exact path="treaties" element={<PartnerTreaties />} />
<Route exact path="quiz">
<Route index element={<QuizPage />} />
@ -139,7 +159,6 @@ const App = () => {
/>
</Route>
<Route exact path="profile-candidate/:id">
<Route index element={<ProfileCandidate />} />
</Route>
@ -147,9 +166,7 @@ const App = () => {
<Route path="*" element={<Navigate to="/auth" replace />} />
</Routes>
</Router>
{notification.show &&
<Notification />
}
{notification.show && <Notification />}
</>
);
};

View File

@ -79,8 +79,8 @@ const Calendar = () => {
</p>
</div>
</div>
<Footer />
</section>
<Footer />
</div>
);
};

View File

@ -1,6 +1,5 @@
.calendar {
margin-bottom: 40px;
font-family: "LabGrotesque", sans-serif;
&__header {
display: flex;
@ -136,10 +135,6 @@
line-height: normal;
}
}
footer {
margin-top: 2rem !important;
}
}
@media (max-width: 575.98px) {

View File

@ -3,7 +3,6 @@
margin: 10px 0;
background-color: #f9f9f9;
padding: 20px 30px;
font-family: "LabGrotesque", sans-serif;
&__header {
display: flex;

View File

@ -233,8 +233,8 @@ const Candidate = () => {
)}
</div>
</div>
<Footer />
</div>
<Footer />
</div>
);
};

View File

@ -148,12 +148,6 @@
}
}
}
footer {
margin-top: 2.5rem !important;
position: relative;
z-index: -2;
}
}
@media (max-width: 375.98px) {

View File

@ -6,7 +6,6 @@
border-radius: 44px;
color: white;
font-style: normal;
font-family: "LabGrotesque", sans-serif;
border: none;
transition: 0.5s;

View File

@ -8,7 +8,7 @@ export const Loader = ({ width = 50, height = 50, style }) => {
<div className="loader">
<SVGLoader
type="Circles"
color={style ? style : `#fff`}
color={style ? style : `green`}
height={height}
width={width}
/>

View File

@ -5,7 +5,6 @@
justify-content: center;
align-items: center;
position: relative;
//&:hover {
// path {
// fill: #6aaf5c;

View File

@ -18,7 +18,6 @@
}
&__empty {
font-family: "LabGrotesque", sans-serif;
font-style: normal;
font-weight: 700;
font-size: 16px;

View File

@ -92,8 +92,8 @@ export const FreeDevelopers = () => {
</BaseButton>
</div>
</div>
<Footer />
</div>
<Footer />
</section>
);
};

View File

@ -1,5 +1,4 @@
.free-dev {
font-family: "LabGrotesque", sans-serif;
overflow: hidden;
position: relative;
background-color: #f1f1f1;

View File

@ -77,7 +77,6 @@
line-height: 32px;
color: #1458dd;
margin: 0;
font-family: "LabGrotesque", sans-serif;
}
h2 {
@ -780,7 +779,6 @@
.react-datepicker__current-month {
font-size: 18px;
font-family: "LabGrotesque", sans-serif;
text-transform: capitalize;
}
@ -823,7 +821,6 @@
.react-datepicker__day {
font-size: 16px;
width: 35px;
font-family: "LabGrotesque", sans-serif;
border-radius: 50px;
padding: 7px;
}
@ -832,7 +829,6 @@
font-size: 18px;
width: 35px;
font-weight: 500;
font-family: "LabGrotesque", sans-serif;
}
.react-datepicker__triangle {

View File

@ -30,6 +30,7 @@ import { useNotification } from "@hooks/useNotification";
import { getCorrectDate } from "@components/Calendar/calendarHelper";
import BaseButton from "@components/Common/BaseButton/BaseButton";
import { Loader } from "@components/Common/Loader/Loader";
import ModalLayout from "@components/Common/ModalLayout/ModalLayout";
import arrowRight from "assets/icons/arrows/arrowRightCreateTask.svg";
@ -90,6 +91,7 @@ export const TrackerModal = ({
const [deadLineDate, setDeadLineDate] = useState("");
const [datePickerOpen, setDatePickerOpen] = useState(false);
const [startDate, setStartDate] = useState(new Date());
const [loader, setLoader] = useState(false);
const priority = [
{
@ -138,6 +140,8 @@ export const TrackerModal = ({
return;
}
setLoader(true);
apiRequest("/task/create-task", {
method: "POST",
data: {
@ -158,6 +162,7 @@ export const TrackerModal = ({
text: "Задача с таким именем уже существует",
type: "error"
});
setLoader(false);
} else {
for (let i = 0; i < taskTags.length; i++) {
apiRequest("/mark/attach", {
@ -185,9 +190,11 @@ export const TrackerModal = ({
setDescriptionTicket("");
setSelectedExecutorTask("Выберите исполнителя");
setSelectedPriority(null);
setLoader(false);
});
} else {
setActive(false);
setLoader(false);
setValueTicket("");
setDescriptionTicket("");
dispatch(setProjectBoardFetch(projectBoard.id));
@ -703,9 +710,13 @@ export const TrackerModal = ({
</div>
</div>
</div>
<BaseButton styles={"button-add"} onClick={createTicket}>
Создать
</BaseButton>
{loader ? (
<Loader style={"green"} />
) : (
<BaseButton styles={"button-add"} onClick={createTicket}>
Создать
</BaseButton>
)}
</div>
</>
)}

View File

@ -172,7 +172,8 @@
.executor {
display: flex;
justify-content: space-between;
column-gap: 5px;
align-items: center;
&:hover {
font-weight: 600;
}
@ -650,7 +651,6 @@
.react-datepicker__current-month {
font-size: 18px;
font-family: "LabGrotesque", sans-serif;
text-transform: capitalize;
padding-bottom: 8px;
}
@ -694,7 +694,6 @@
.react-datepicker__day {
font-size: 16px;
width: 35px;
font-family: "LabGrotesque", sans-serif;
border-radius: 50px;
padding: 7px;
}
@ -703,7 +702,6 @@
font-size: 18px;
width: 35px;
font-weight: 500;
font-family: "LabGrotesque", sans-serif;
}
.react-datepicker__triangle {

View File

@ -45,6 +45,7 @@ export const Navigation = () => {
partner: [
{
path: "/catalog",
active: "candidate",
name: "Каталог"
},
{
@ -53,6 +54,7 @@ export const Navigation = () => {
},
{
path: "/employees",
active: "calendar",
name: "Персонал"
},
{
@ -80,7 +82,12 @@ export const Navigation = () => {
key={index}
end
to={link.path === "/Quiz" ? link.path : `/profile${link.path}`}
className={currentPath.includes(link.path) ? "active" : ""}
className={
currentPath.includes(link.path) ||
currentPath.includes(link.active)
? "active"
: ""
}
>
{link.name}
</NavLink>

View File

@ -5,7 +5,7 @@
position: fixed;
bottom: 25px;
right: 25px;
z-index: 20;
z-index: 10000;
&__info {
display: flex;

View File

@ -1,7 +1,3 @@
body {
font-family: "LabGrotesque", sans-serif !important;
}
.container {
max-width: 1160px !important;
}
@ -9,7 +5,6 @@ body {
background: #f1f1f1;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
padding-top: 23px;
&__title {

View File

@ -1,12 +1,15 @@
.profile__calendar {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
.container {
max-width: 1160px;
margin-top: 23px;
display: flex;
flex-direction: column;
flex: 1;
@media (max-width: 570px) {
margin-top: 0;

View File

@ -3,6 +3,8 @@
height: 80px;
background: #e1fccf;
padding: 20px;
display: flex;
flex-direction: column;
&__head {
background: #e1fccf;

View File

@ -135,7 +135,7 @@ export const ProjectTicket = ({ project, index }) => {
<img src={edit}></img>
<p>редактировать</p>
</div>
<div onClick={copyProjectLink(project.id)}>
<div onClick={() => copyProjectLink(project.id)}>
<img src={link}></img>
<p>скопировать ссылку</p>
</div>

View File

@ -1,8 +1,6 @@
.report-form {
background: #f1f1f1;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
.container {
max-width: 1160px;
@ -430,7 +428,6 @@
.react-datepicker__current-month {
font-size: 14px;
font-family: "LabGrotesque", sans-serif;
text-transform: capitalize;
}
@ -442,13 +439,11 @@
.react-datepicker__day {
font-size: 14px;
width: 35px;
font-family: "LabGrotesque", sans-serif;
}
.react-datepicker__day-name {
font-size: 14px;
width: 35px;
font-family: "LabGrotesque", sans-serif;
}
.react-datepicker__triangle {

View File

@ -6,15 +6,13 @@ body {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
font-family: "LabGrotesque", sans-serif !important;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
monospace;
}

View File

@ -91,10 +91,10 @@ const Auth = () => {
</div>
</div>
</div>
<Footer />
</div>
</div>
<SideBar />
<Footer />
</section>
);
};

View File

@ -1,10 +1,10 @@
.auth-partners {
font-family: "LabGrotesque", sans-serif;
background-color: #f1f1f1;
overflow: hidden;
position: relative;
&__background {
background-color: #f1f1f1;
position: relative;
}

View File

@ -115,7 +115,7 @@ export const AuthForCandidate = () => {
resetModal={setModalReset}
title="Войти, если есть доступ"
description="Если вы получили доступ, пройдя
2 шага для входа или хотите узнать
2 шага для входа, или хотите узнать
свои результаты в кабинете"
/>
<div className="auth-candidate__start">

View File

@ -1,5 +1,4 @@
.auth-candidate {
font-family: "LabGrotesque", sans-serif;
overflow: hidden;
position: relative;
background-color: #f1f1f1;
@ -62,8 +61,4 @@
}
}
}
footer {
margin-top: 10px;
}
}

View File

@ -90,12 +90,10 @@ export const Blog = () => {
);
})}
</div>
<div className="blog__load-more">
<button>Загрузить еще</button>
</div>
</div>
<Footer />
</div>
);

View File

@ -200,9 +200,9 @@ const CatalogSpecialists = () => {
);
})}
</div>
<Footer />
</div>
<SideBar />
<Footer />
</section>
);
};

View File

@ -1,8 +1,8 @@
.catalog-specialists {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
&__wrapper {
padding-top: 24px;

View File

@ -103,8 +103,8 @@ export const CompanyInfo = () => {
</div>
</div>
</div>
<Footer />
</div>
<Footer />
</div>
);
};

View File

@ -1,6 +1,5 @@
.company-info {
&__content {
font-family: "LabGrotesque", sans-serif;
background-color: #f1f1f1;
padding-top: 60px;

View File

@ -96,8 +96,8 @@ const FormPage = () => {
</div>
</div>
</div>
<Footer />
</div>
<Footer />
</div>
);
};

View File

@ -124,10 +124,6 @@
right: 2.5rem;
}
.form-page footer {
margin-top: 6rem !important;
}
@media (max-width: 991px) {
.form-page {
&__separator {

View File

@ -2,9 +2,7 @@
.frequently-asked-question {
background: #f5f5f5;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
display: flex;
flex-direction: column;

View File

@ -1,8 +1,6 @@
.frequently-asked-questions {
background: #f5f5f5;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
display: flex;
flex-direction: column;

View File

@ -69,9 +69,9 @@ const Home = () => {
<h2 className="catalog__title">Каталог специалистов</h2>
<Outstaffing />
<Description onLoadMore={loadMore} isLoadingMore={isLoadingMore} />
<Footer />
</div>
</div>
<Footer />
</>
);
};

View File

@ -49,13 +49,14 @@ export const PartnerAddRequest = () => {
const [inputs, setInputs] = useState({ title: "", description: "" });
if (
currentUrl[0] === "/profile/edit-request" &&
currentUrl[0] === "/profile/requests-edit" &&
!Object.keys(partnerRequestInfo).length
) {
return <Navigate to="/profile/requests" replace />;
}
useEffect(() => {
initListeners();
apiRequest(`/profile/positions-list`).then((el) =>
setSpecializationList(el)
);
@ -68,7 +69,7 @@ export const PartnerAddRequest = () => {
useEffect(() => {
if (
currentUrl[0] === "/profile/edit-request" &&
currentUrl[0] === "/profile/requests-edit" &&
Object.keys(partnerRequestInfo).length
) {
setInputs({
@ -101,7 +102,7 @@ export const PartnerAddRequest = () => {
};
const handler = () => {
if (currentUrl[0] === "/profile/edit-request") {
if (currentUrl[0] === "/profile/requests-edit") {
apiRequest("/request/update-request", {
method: "PUT",
data: {
@ -141,6 +142,31 @@ export const PartnerAddRequest = () => {
}
};
const initListeners = () => {
document.addEventListener("click", closeByClickingOut);
};
const closeByClickingOut = (event) => {
const path = event.path || (event.composedPath && event.composedPath());
if (
event &&
!path.find(
(div) =>
div.classList &&
(div.classList.contains("form__block__section__selects") ||
div.classList.contains("form__block__dropDown") ||
div.classList.contains("form__block__skills") ||
div.classList.contains("form__block__section__select"))
)
) {
setOpenSkillsSelect(false);
setOpenSpecializationListOpen(false);
setOpenLevelList(false);
setOpenCountList(false);
}
};
return (
<div className="partner-add-request">
<ProfileHeader />
@ -154,7 +180,7 @@ export const PartnerAddRequest = () => {
name: `${
editRequest ? "Редактирование заявки" : "Создание новой заявки"
}`,
link: "/profile/add-request"
link: "/profile/requests-add"
}
]}
/>

View File

@ -1,8 +1,8 @@
.partner-add-request {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
.container {
max-width: 1160px;
@ -314,10 +314,6 @@
}
}
footer {
margin-top: 70px;
}
&__info {
background: #ffffff;
border-radius: 12px;

View File

@ -107,7 +107,10 @@ export const PartnerBid = () => {
links={[
{ name: "Главная", link: "/profile" },
{ name: "Запросы и открытые позиции", link: "/profile/requests" },
{ name: "Просмотр заявки - PHP разработчик", link: "/profile/bid" }
{
name: "Просмотр заявки - PHP разработчик",
link: "/profile/requests-bid"
}
]}
/>
<h2 className="partner-bid__title">Страница заявки </h2>
@ -117,7 +120,7 @@ export const PartnerBid = () => {
<div className="partner-bid__qualification">
<h3>{requestInfo.title}</h3>
<div className="partner-bid__qualification__buttons">
<Link to="/profile/edit-request">Редактировать</Link>
<Link to="/profile/requests-edit">Редактировать</Link>
<img
src={deleteBtn}
alt="delete"

View File

@ -1,11 +1,13 @@
.partner-bid {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
.container {
max-width: 1160px;
display: flex;
flex-direction: column;
flex: 1;
margin-top: 23px;
@media (max-width: 570px) {
@ -536,8 +538,4 @@
background: #52b709;
}
}
footer {
margin-top: 70px;
}
}

View File

@ -1,10 +1,13 @@
.employee-report {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
.container {
display: flex;
flex-direction: column;
flex: 1;
margin-top: 23px;
}

View File

@ -1,8 +1,8 @@
.partner-employees {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
&__title {
color: #000000;
@ -167,15 +167,13 @@
}
.container {
max-width: 1160px;
display: flex;
flex-direction: column;
flex: 1;
margin-top: 23px;
@media (max-width: 570px) {
margin-top: 0;
}
}
footer {
margin-top: 70px;
}
}

View File

@ -60,7 +60,7 @@ export const PartnerRequests = () => {
return (
<Link
key={index}
to={"/profile/bid"}
to={"/profile/requests-bid"}
className="partner-requests__section__item"
onClick={() => {
dispatch(setPartnerRequestId(item.id));
@ -85,7 +85,7 @@ export const PartnerRequests = () => {
параметры: количество сотрудников, стек, уровень специалиста
</p>
<BaseButton>
<Link to={"/profile/add-request"}>
<Link to={"/profile/requests-add"}>
<span>+</span>
Создать запрос
</Link>
@ -100,7 +100,7 @@ export const PartnerRequests = () => {
<img src={cursorImg} alt="cursor" />
<p>У вас ещё нет запросов на сотрудников</p>
<BaseButton>
<Link to={"/profile/add-request"}>
<Link to={"/profile/requests-add"}>
<span>+</span>
Создать запрос
</Link>

View File

@ -1,11 +1,13 @@
.partner-requests {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
.container {
max-width: 1160px;
display: flex;
flex-direction: column;
flex: 1;
margin-top: 23px;
@media (max-width: 570px) {
@ -352,8 +354,4 @@
}
}
}
footer {
margin-top: 70px;
}
}

View File

@ -1,8 +1,8 @@
.settings {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
background: #f1f1f1;
.info-personal__title {
color: #000000;
@ -12,7 +12,9 @@
}
&__page {
min-height: 750px;
display: flex;
flex-direction: column;
flex: 1;
max-width: 1160px !important;
margin-top: 23px;
}
@ -129,7 +131,10 @@
}
.partner-settings {
margin-bottom: 110px;
display: flex;
flex-direction: column;
flex: 1;
margin-bottom: 10px;
&__body {
display: flex;

View File

@ -1,8 +1,8 @@
.treaties {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
&__title {
font-weight: 700;
@ -378,15 +378,13 @@
}
.container {
max-width: 1160px;
display: flex;
flex-direction: column;
flex: 1;
margin-top: 23px;
@media (max-width: 570px) {
margin-top: 0;
}
}
footer {
margin-top: 70px;
}
}

View File

@ -1,8 +1,8 @@
.partner-categories {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
&__title {
color: #000000;
@ -144,15 +144,13 @@
}
.container {
max-width: 1160px;
display: flex;
flex-direction: column;
flex: 1;
margin-top: 23px;
@media (max-width: 570px) {
margin-top: 0;
}
}
footer {
margin-top: 70px;
}
}

View File

@ -2,12 +2,15 @@ import React from "react";
import { Navigation } from "@components/Navigation/Navigation";
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
import { Footer } from "@components/common/Footer/Footer";
export const Payouts = () => {
return (
<div className="payouts">
<ProfileHeader />
<Navigation />
<div className="container"></div>
<Footer />
</div>
);
};

View File

@ -1,8 +1,8 @@
.profile {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
&__title {
font-weight: 700;
@ -48,92 +48,17 @@
@media (max-width: 1175px) {
justify-content: center;
}
// .item {
// max-width: 353px;
// width: 100%;
// padding: 35px 45px 15px 30px;
// background: #FFFFFF;
// border-radius: 12px;
// text-decoration: none;
// cursor: pointer;
// transition: all 0.3s ease;
// &:hover {
// box-shadow: 6px 5px 20px rgb(87 98 80 / 21%);
// transform: scale(1.02);
// }
// @media (max-width: 1175px) {
// width: 48%;
// max-width: none;
// }
// @media (max-width: 925px) {
// width: 100%;
// padding: 15px 25px;
// }
// &__about {
// display: flex;
// column-gap: 20px;
// align-items: center;
// margin-bottom: 30px;
// @media (max-width: 925px) {
// margin-bottom: 15px;
// }
// h3 {
// color: #000000;
// font-weight: 500;
// font-size: 18px;
// line-height: 22px;
// max-width: 125px;
// margin-bottom: 0;
// }
// }
// &__info {
// display: flex;
// justify-content: space-between;
// align-items: center;
// p {
// font-weight: 700;
// font-size: 12px;
// line-height: 20px;
// color: #000000;
// margin-bottom: 0;
// span {
// color: #52B709;
// font-weight: 700;
// }
// }
// &Link {
// width: 48px;
// height: 48px;
// background: #DDEEC6;
// border-radius: 50px;
// display: flex;
// justify-content: center;
// align-items: center;
// }
// }
// }
}
.container {
max-width: 1160px;
margin-top: 23px;
display: flex;
flex-direction: column;
flex: 1;
@media (max-width: 570px) {
margin-top: 0;
}
}
footer {
margin-top: 70px;
}
}

View File

@ -1,166 +1,159 @@
.profile-candidate{
background: #F1F1F1;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
display: flex;
flex-direction: column;
//max-width: 1200px;
&__container{
max-width: 1160px;
margin: 0 auto 42px auto;
flex: 1 1 auto;
padding: 0 15px;
}
&__title{
margin: 0 0 31px 0;
}
&__row{
display: flex;
gap: 30px;
flex-wrap: wrap;
}
// &__column{
// flex: 1 1 60%;
// }
&__tests{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
flex: 1 1 60%;
gap: 30px;
}
&__cards{
display: flex;
gap: 29px;
width: 100%;
@media (max-width: 660px) {
flex-wrap: wrap;
}
}
&__head-bottom{
margin: 0 0 27px 0;
//max-width: 1160px;
}
.profile-candidate {
background: #f1f1f1;
display: flex;
flex-direction: column;
min-height: 100vh;
&__container {
display: flex;
flex-direction: column;
margin: 0 auto 42px auto;
flex: 1 1 auto;
padding: 0 15px;
}
&__title {
margin: 0 0 31px 0;
}
&__row {
display: flex;
gap: 30px;
flex-wrap: wrap;
}
// &__column{
// flex: 1 1 60%;
// }
&__tests {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
flex: 1 1 60%;
gap: 30px;
}
&__cards {
display: flex;
gap: 29px;
width: 100%;
@media (max-width: 660px) {
flex-wrap: wrap;
}
}
&__head-bottom {
margin: 0 0 27px 0;
//max-width: 1160px;
}
}
.instructions-candidate{
flex: 1 1 auto;
background: #FFFFFF;
border-radius: 12px;
&__container{
padding: 40px 18px 32px 36px;
display: flex;
flex-direction: column;
gap: 29px;
@media (max-width: 660px) {
padding: 20px;
}
}
&__note{
display: flex;
align-items: center;
gap: 22px;
&:not(:last-child){
margin: 0 0 30px 0;
}
}
&__icon{
width: 25px;
height: 30px;
}
&__title{
color: #52B709;
font-weight: 900;
font-size: 14px;
line-height: 171%;
margin: 0 0 20px 0;
}
&__text{
font-weight: 400;
font-size: 12px;
line-height: 200%;
color: #000000;
max-width: 235px;
span{
color: #406128;
font-weight: 700;
text-decoration: underline;
}
}
.instructions-candidate {
flex: 1 1 auto;
background: #ffffff;
border-radius: 12px;
&__container {
padding: 40px 18px 32px 36px;
display: flex;
flex-direction: column;
gap: 29px;
@media (max-width: 660px) {
padding: 20px;
}
}
&__note {
display: flex;
align-items: center;
gap: 22px;
&:not(:last-child) {
margin: 0 0 30px 0;
}
}
&__icon {
width: 25px;
height: 30px;
}
&__title {
color: #52b709;
font-weight: 900;
font-size: 14px;
line-height: 171%;
margin: 0 0 20px 0;
}
&__text {
font-weight: 400;
font-size: 12px;
line-height: 200%;
color: #000000;
max-width: 235px;
span {
color: #406128;
font-weight: 700;
text-decoration: underline;
}
}
}
.info-candidate{
width: 100%;
background: #fff;
border-radius: 12px;
padding: 20px 45px;
display: flex;
align-items: center;
gap: 47px;
@media (max-width:560px) {
padding: 20px;
}
&__img{
flex: 0 0 88px;
height: 88px;
img{
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
}
&__info{
width: 100%;
}
&__title{
font-weight: 500;
font-size: 16px;
line-height: 200%;
color: #000000;
margin: 0 0 12px 0;
}
.info-candidate {
width: 100%;
background: #fff;
border-radius: 12px;
padding: 20px 45px;
display: flex;
align-items: center;
gap: 47px;
@media (max-width: 560px) {
padding: 20px;
}
&__img {
flex: 0 0 88px;
height: 88px;
img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
}
&__info {
width: 100%;
}
&__title {
font-weight: 500;
font-size: 16px;
line-height: 200%;
color: #000000;
margin: 0 0 12px 0;
}
&__decor{
background: #52B709;
border-radius: 12px;
height: 8px;
width: 60%;
}
&__decor {
background: #52b709;
border-radius: 12px;
height: 8px;
width: 60%;
}
}
.bottom-head{
margin: 0 0 40px 0;
height: 66px;
background: #FFF;
&__container{
max-width: 1160px;
margin: 0 auto;
padding: 0 15px;
height: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
&__img{
flex: 0 0 37px;
height: 37px;
img{
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
}
&__title{
font-weight: 500;
font-size: 18px;
line-height: 178%;
color: #807777;
}
.bottom-head {
margin: 0 0 40px 0;
height: 66px;
background: #fff;
&__container {
margin: 0 auto;
padding: 0 15px;
height: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
&__img {
flex: 0 0 37px;
height: 37px;
img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
}
&__title {
font-weight: 500;
font-size: 18px;
line-height: 178%;
color: #807777;
}
}

View File

@ -7,6 +7,7 @@ import { apiRequest } from "@api/request";
import CategoriesItem from "@components/CategoriesItem/CategoriesItem";
import { Footer } from "@components/Common/Footer/Footer";
import { Loader } from "@components/Common/Loader/Loader";
import { Navigation } from "@components/Navigation/Navigation";
import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs";
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
@ -27,7 +28,8 @@ import BackEndImg from "assets/images/partnerProfile/personalBackEnd.svg";
import "./quiz-page.scss";
export const QuizPage = () => {
const [questionnaires, setQuestionnaires] = useState(null);
const [questionnaires, setQuestionnaires] = useState([]);
const [loader, setLoader] = useState(false);
const dispatch = useDispatch();
const [personalInfoItems] = useState([
{
@ -102,8 +104,12 @@ export const QuizPage = () => {
const [selectedCategory, setSetSelectedCategory] = useState(false);
useEffect(() => {
setLoader(true);
apiRequest(`/user-questionnaire/questionnaires-list?user_id=${userId}`)
.then((res) => setQuestionnaires(res))
.then((res) => {
setQuestionnaires(res);
setLoader(false);
})
.catch((e) => console.log(e));
}, []);
@ -122,7 +128,9 @@ export const QuizPage = () => {
<div className="quiz-page__title main-title">
{!selectedCategory ? "Тестирование" : "Замена специализации"}
</div>
{!selectedCategory && (
{loader ? (
<Loader />
) : (
<>
{/*<div className="quiz-page__specialization">*/}
{/* <SelectedCategory setSelectedCategory={setSetSelectedCategory} />*/}

View File

@ -7,6 +7,7 @@ import { selectedTest } from "@redux/quizSlice";
import { apiRequest } from "@api/request";
import { Footer } from "@components/Common/Footer/Footer";
import { Loader } from "@components/Common/Loader/Loader";
import { Navigation } from "@components/Navigation/Navigation";
import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs";
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
@ -23,16 +24,19 @@ export const QuizReportPage = () => {
navigate("/Quiz");
}
const [testInfo, setTestInfo] = useState({});
const [loader, setLoader] = useState(false);
useEffect(() => {
setLoader(true);
apiRequest(
`/user-questionnaire/questionnaire-completed?user_questionnaire_uuid=${params.uuid}`
).then((res) => {
setTestInfo(res);
setLoader(false);
});
}, []);
const [testInfo, setTestInfo] = useState({});
return (
<div className="quiz-report-page">
<ProfileHeader />
@ -46,13 +50,19 @@ export const QuizReportPage = () => {
{ name: "Отчет по тестированию", link: "/profile/quiz" }
]}
/>
<div className="quiz-report-page__title main-title">
Отчет по тестированию позиции {testInfo.questionnaire_title}
</div>
<div className="quiz-report-page__report-quiz">
<QuizReport info={testInfo} />
</div>
<AlertResult info={testInfo} />
{loader ? (
<Loader />
) : (
<>
<div className="quiz-report-page__title main-title">
Отчет по тестированию позиции {testInfo.questionnaire_title}
</div>
<div className="quiz-report-page__report-quiz">
<QuizReport info={testInfo} />
</div>
<AlertResult info={testInfo} />
</>
)}
</div>
<Footer />
</div>

View File

@ -1,13 +1,12 @@
.quiz-page {
background: #f1f1f1;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
display: flex;
flex-direction: column;
&__container {
max-width: 1160px;
display: flex;
flex-direction: column;
margin: 23px auto 42px auto;
flex: 1 1 auto;
width: 100%;
@ -64,9 +63,7 @@
.interjacent-page-quiz {
background: #f1f1f1;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
display: flex;
flex-direction: column;
@ -79,7 +76,7 @@
}
&__container {
max-width: 1160px;
display: flex;
margin: 23px auto 42px auto;
flex: 1 1 auto;
width: 100%;
@ -96,14 +93,12 @@
.passing-tests-page {
background: #f1f1f1;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
display: flex;
flex-direction: column;
&__container {
max-width: 1160px;
display: flex;
margin: 23px auto 42px auto;
flex: 1 1 auto;
width: 100%;
@ -136,14 +131,13 @@
.quiz-report-page {
background: #f1f1f1;
height: 100%;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
display: flex;
flex-direction: column;
&__container {
max-width: 1160px;
display: flex;
flex-direction: column;
margin: 23px auto 42px auto;
flex: 1 1 auto;
width: 100%;

View File

@ -1,5 +1,4 @@
.registration-candidate {
font-family: "LabGrotesque", sans-serif;
position: relative;
background-color: #f1f1f1;
@ -188,8 +187,4 @@
}
}
}
footer {
margin-top: 80px;
}
}

View File

@ -212,8 +212,8 @@ export const RegistrationSetting = () => {
</button>
)}
</div>
<Footer />
</div>
<Footer />
</div>
);
};

View File

@ -1,6 +1,5 @@
.registration-setting {
&__content {
font-family: "LabGrotesque", sans-serif;
background-color: #f1f1f1;
color: #000000;
padding: 50px 0 0;

View File

@ -105,7 +105,10 @@ const Statistics = () => {
<div className="statistics-header__menu">
<h1>Статистика проекта</h1>
<img src={link} alt="#" />
<span className="return-text" onClick={copyProjectLink("62")}>
<span
className="return-text"
onClick={() => copyProjectLink("62")}
>
ссылка на проект
</span>
</div>

View File

@ -1,9 +1,8 @@
.statistics {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
position: relative;
&-header {
display: flex;

View File

@ -1,8 +1,8 @@
.summary {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
&__content {
display: flex;
@ -509,12 +509,10 @@
}
}
footer {
margin-top: 10px;
}
.container {
max-width: 1160px;
display: flex;
flex-direction: column;
flex: 1;
margin-top: 23px;
@media (max-width: 570px) {

View File

@ -1,8 +1,8 @@
.tracker {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
position: relative;
.container {
@ -18,14 +18,6 @@
margin-top: 23px;
}
footer {
margin-top: 70px;
.row {
margin-right: 0px;
}
}
&__title {
font-weight: 700;
font-size: 22px;
@ -34,9 +26,9 @@
}
&__tabs {
min-height: 600px;
display: flex;
flex-direction: column;
flex: 1;
&__head {
display: flex;

View File

@ -38,8 +38,8 @@ export const TrackerAuth = () => {
<ModalReset setModalReset={setModalReset} />
</ModalLayout>
)}
<Footer />
</div>
<Footer />
</div>
);
};

View File

@ -1,10 +1,16 @@
.tracker-auth {
display: flex;
flex-direction: column;
min-height: 100vh;
background-color: #f1f1f1;
&__content {
font-family: "LabGrotesque", sans-serif;
background-color: #f1f1f1;
display: flex;
flex-direction: column;
flex: 1;
color: #000000;
padding: 50px 0 0;
min-height: 100vh;
@media (max-width: 1375px) {
padding-top: 100px;
@ -25,7 +31,7 @@
margin-bottom: 46px;
color: #000000;
span {
color: #52B709;
color: #52b709;
position: relative;
img {
position: absolute;

View File

@ -102,8 +102,8 @@ export const TrackerIntro = () => {
</div>
</div>
</div>
<Footer />
</div>
<Footer />
</div>
);
};

View File

@ -1,7 +1,6 @@
.tracker-intro {
background-color: #f1f1f1;
&__content {
font-family: "LabGrotesque", sans-serif;
background-color: #f1f1f1;
color: #000000;
@media (max-width: 1375px) {

View File

@ -149,8 +149,8 @@ export const TrackerRegistration = () => {
/>
</ModalLayout>
)}
<Footer />
</div>
<Footer />
</div>
);
};

View File

@ -1,6 +1,5 @@
.tracker-registration {
&__content {
font-family: "LabGrotesque", sans-serif;
background-color: #f1f1f1;
color: #000000;
padding: 50px 0 0;

View File

@ -269,8 +269,8 @@ export const ViewReport = () => {
)}
</div>
)}
<Footer />
</div>
<Footer />
</div>
);
};

View File

@ -1,11 +1,13 @@
.view-report {
background: #f1f1f1;
height: 100%;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: "LabGrotesque", sans-serif;
.container {
max-width: 1160px;
display: flex;
flex-direction: column;
flex: 1;
margin-top: 23px;
@media (max-width: 570px) {
@ -424,12 +426,4 @@
}
}
}
footer {
margin-top: 70px;
@media (max-width: 575px) {
margin-top: 0;
}
}
}

View File

@ -2,34 +2,33 @@ export function createMarkup(text) {
return { __html: text.split("</p>").join("</p>") };
}
// export function transformHtml(text) {
// let startHtml = {
// __html: text.split("<h3> || <h2>").join("<br><h2>").split("<br>"),
// };
// startHtml = startHtml.__html.filter(
// (el) => (el !== null && el !== "") || el === 0
// );
// const finalHtml = startHtml.map(
// (item) =>
// `<div class='experience__block'>
// <div class="summary__sections__head">
// <h3>Описание опыта работы</h3>
// <button>Редактировать</button>
// </div>
// <div class="experience__content">${item.split("<h3>")[0]}</div>
// </div>`
// );
// return { __html: finalHtml.join("") };
// }
//
// export const setToken = () => {
// const url = new URL(window.location.href);
// const urlT = url.searchParams.get("token");
// urlT ? sessionStorage.setItem('token', 'Bearer ' + urlT) : '';
// const tParam = urlT || sessionStorage.getItem('token');
// return tParam ? {"Authorization": tParam} : false
//
// };
export function transformHtml(text) {
let startHtml = {
__html: text.split("<h3> || <h2>").join("<br><h2>").split("<br>")
};
startHtml = startHtml.__html.filter(
(el) => (el !== null && el !== "") || el === 0
);
const finalHtml = startHtml.map(
(item) =>
`<div class='experience__block'>
<div class="summary__sections__head">
<h3>Описание опыта работы</h3>
<button>Редактировать</button>
</div>
<div class="experience__content">${item.split("<h3>")[0]}</div>
</div>`
);
return { __html: finalHtml.join("") };
}
export const setToken = () => {
const url = new URL(window.location.href);
const urlT = url.searchParams.get("token");
urlT ? sessionStorage.setItem("token", "Bearer " + urlT) : "";
const tParam = urlT || sessionStorage.getItem("token");
return tParam ? { Authorization: tParam } : false;
};
export const getToken = () => {
const tParam = `Bearer ${localStorage.getItem("auth_token")}`;