Compare commits
10 Commits
summary_fi
...
page_under
Author | SHA1 | Date | |
---|---|---|---|
988b5e65b0 | |||
a6981f90b2 | |||
399abc6668 | |||
db5896d29b | |||
4697383bf3 | |||
687d9661a3 | |||
3f7bab3353 | |||
dc065f3bdd | |||
a561ed83c4 | |||
268ff58ccd |
3
src/assets/icons/report.svg
Normal file
3
src/assets/icons/report.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.62109 12.928H2.62109C2.44428 12.928 2.27471 12.8577 2.14969 12.7327C2.02467 12.6077 1.95443 12.4381 1.95443 12.2613V2.92798C1.95443 2.75117 2.02467 2.5816 2.14969 2.45657C2.27471 2.33155 2.44428 2.26131 2.62109 2.26131H5.95443V4.26131C5.95443 4.79174 6.16514 5.30045 6.54021 5.67553C6.91529 6.0506 7.42399 6.26131 7.95443 6.26131H9.95443V9.59465C9.95443 9.77146 10.0247 9.94103 10.1497 10.066C10.2747 10.1911 10.4443 10.2613 10.6211 10.2613C10.7979 10.2613 10.9675 10.1911 11.0925 10.066C11.2175 9.94103 11.2878 9.77146 11.2878 9.59465V5.59465C11.2878 5.59465 11.2878 5.59465 11.2878 5.55465C11.2808 5.4934 11.2674 5.43307 11.2478 5.37465V5.31465C11.2157 5.2461 11.1729 5.18309 11.1211 5.12798L7.12109 1.12798C7.06598 1.07612 7.00297 1.03337 6.93443 1.00131C6.91237 0.997451 6.88982 0.997451 6.86776 1.00131C6.80294 0.966647 6.73327 0.941927 6.66109 0.927979H2.62109C2.09066 0.927979 1.58195 1.13869 1.20688 1.51377C0.831807 1.88884 0.621094 2.39755 0.621094 2.92798V12.2613C0.621094 12.7917 0.831807 13.3005 1.20688 13.6755C1.58195 14.0506 2.09066 14.2613 2.62109 14.2613H6.62109C6.7979 14.2613 6.96747 14.1911 7.0925 14.0661C7.21752 13.941 7.28776 13.7715 7.28776 13.5946C7.28776 13.4178 7.21752 13.2483 7.0925 13.1232C6.96747 12.9982 6.7979 12.928 6.62109 12.928ZM7.28776 3.20131L9.01443 4.92798H7.95443C7.77762 4.92798 7.60805 4.85774 7.48302 4.73272C7.358 4.60769 7.28776 4.43812 7.28776 4.26131V3.20131ZM3.95443 8.92798H7.95443C8.13124 8.92798 8.30081 8.85774 8.42583 8.73272C8.55086 8.60769 8.62109 8.43812 8.62109 8.26131C8.62109 8.0845 8.55086 7.91493 8.42583 7.78991C8.30081 7.66488 8.13124 7.59465 7.95443 7.59465H3.95443C3.77762 7.59465 3.60805 7.66488 3.48302 7.78991C3.358 7.91493 3.28776 8.0845 3.28776 8.26131C3.28776 8.43812 3.358 8.60769 3.48302 8.73272C3.60805 8.85774 3.77762 8.92798 3.95443 8.92798ZM6.62109 10.2613H3.95443C3.77762 10.2613 3.60805 10.3315 3.48302 10.4566C3.358 10.5816 3.28776 10.7512 3.28776 10.928C3.28776 11.1048 3.358 11.2744 3.48302 11.3994C3.60805 11.5244 3.77762 11.5946 3.95443 11.5946H6.62109C6.7979 11.5946 6.96747 11.5244 7.0925 11.3994C7.21752 11.2744 7.28776 11.1048 7.28776 10.928C7.28776 10.7512 7.21752 10.5816 7.0925 10.4566C6.96747 10.3315 6.7979 10.2613 6.62109 10.2613ZM3.95443 6.26131H4.62109C4.7979 6.26131 4.96747 6.19107 5.0925 6.06605C5.21752 5.94103 5.28776 5.77146 5.28776 5.59465C5.28776 5.41783 5.21752 5.24827 5.0925 5.12324C4.96747 4.99822 4.7979 4.92798 4.62109 4.92798H3.95443C3.77762 4.92798 3.60805 4.99822 3.48302 5.12324C3.358 5.24827 3.28776 5.41783 3.28776 5.59465C3.28776 5.77146 3.358 5.94103 3.48302 6.06605C3.60805 6.19107 3.77762 6.26131 3.95443 6.26131ZM13.0944 10.4546C13.0325 10.3922 12.9587 10.3426 12.8775 10.3087C12.7962 10.2749 12.7091 10.2574 12.6211 10.2574C12.5331 10.2574 12.4459 10.2749 12.3647 10.3087C12.2835 10.3426 12.2097 10.3922 12.1478 10.4546L9.95443 12.6546L9.09443 11.788C9.03227 11.7258 8.95848 11.6765 8.87726 11.6429C8.79605 11.6092 8.709 11.5919 8.62109 11.5919C8.53319 11.5919 8.44614 11.6092 8.36493 11.6429C8.28371 11.6765 8.20992 11.7258 8.14776 11.788C8.0856 11.8501 8.03629 11.9239 8.00265 12.0051C7.96901 12.0864 7.9517 12.1734 7.9517 12.2613C7.9517 12.3492 7.96901 12.4363 8.00265 12.5175C8.03629 12.5987 8.0856 12.6725 8.14776 12.7346L9.48109 14.068C9.54307 14.1305 9.6168 14.1801 9.69804 14.2139C9.77928 14.2478 9.86642 14.2652 9.95443 14.2652C10.0424 14.2652 10.1296 14.2478 10.2108 14.2139C10.2921 14.1801 10.3658 14.1305 10.4278 14.068L13.0944 11.4013C13.1569 11.3393 13.2065 11.2656 13.2404 11.1844C13.2742 11.1031 13.2916 11.016 13.2916 10.928C13.2916 10.84 13.2742 10.7528 13.2404 10.6716C13.2065 10.5904 13.1569 10.5166 13.0944 10.4546Z" fill="#52B709"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
3
src/assets/images/VacancyItemImg.svg
Normal file
3
src/assets/images/VacancyItemImg.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M11.3333 10.6666H4.66667C4.44565 10.6666 4.23369 10.7544 4.07741 10.9107C3.92113 11.067 3.83333 11.2789 3.83333 11.5C3.83333 11.721 3.92113 11.9329 4.07741 12.0892C4.23369 12.2455 4.44565 12.3333 4.66667 12.3333H11.3333C11.5543 12.3333 11.7663 12.2455 11.9226 12.0892C12.0789 11.9329 12.1667 11.721 12.1667 11.5C12.1667 11.2789 12.0789 11.067 11.9226 10.9107C11.7663 10.7544 11.5543 10.6666 11.3333 10.6666ZM11.3333 7.33329H6.33333C6.11232 7.33329 5.90036 7.42109 5.74408 7.57737C5.5878 7.73365 5.5 7.94561 5.5 8.16663C5.5 8.38764 5.5878 8.5996 5.74408 8.75588C5.90036 8.91216 6.11232 8.99996 6.33333 8.99996H11.3333C11.5543 8.99996 11.7663 8.91216 11.9226 8.75588C12.0789 8.5996 12.1667 8.38764 12.1667 8.16663C12.1667 7.94561 12.0789 7.73365 11.9226 7.57737C11.7663 7.42109 11.5543 7.33329 11.3333 7.33329ZM14.6667 2.33329H12.1667V1.49996C12.1667 1.27895 12.0789 1.06698 11.9226 0.910704C11.7663 0.754423 11.5543 0.666626 11.3333 0.666626C11.1123 0.666626 10.9004 0.754423 10.7441 0.910704C10.5878 1.06698 10.5 1.27895 10.5 1.49996V2.33329H8.83333V1.49996C8.83333 1.27895 8.74554 1.06698 8.58926 0.910704C8.43297 0.754423 8.22101 0.666626 8 0.666626C7.77899 0.666626 7.56702 0.754423 7.41074 0.910704C7.25446 1.06698 7.16667 1.27895 7.16667 1.49996V2.33329H5.5V1.49996C5.5 1.27895 5.4122 1.06698 5.25592 0.910704C5.09964 0.754423 4.88768 0.666626 4.66667 0.666626C4.44565 0.666626 4.23369 0.754423 4.07741 0.910704C3.92113 1.06698 3.83333 1.27895 3.83333 1.49996V2.33329H1.33333C1.11232 2.33329 0.900358 2.42109 0.744078 2.57737C0.587797 2.73365 0.5 2.94561 0.5 3.16663V14.8333C0.5 15.4963 0.763392 16.1322 1.23223 16.6011C1.70107 17.0699 2.33696 17.3333 3 17.3333H13C13.663 17.3333 14.2989 17.0699 14.7678 16.6011C15.2366 16.1322 15.5 15.4963 15.5 14.8333V3.16663C15.5 2.94561 15.4122 2.73365 15.2559 2.57737C15.0996 2.42109 14.8877 2.33329 14.6667 2.33329ZM13.8333 14.8333C13.8333 15.0543 13.7455 15.2663 13.5893 15.4225C13.433 15.5788 13.221 15.6666 13 15.6666H3C2.77899 15.6666 2.56702 15.5788 2.41074 15.4225C2.25446 15.2663 2.16667 15.0543 2.16667 14.8333V3.99996H3.83333V4.83329C3.83333 5.05431 3.92113 5.26627 4.07741 5.42255C4.23369 5.57883 4.44565 5.66663 4.66667 5.66663C4.88768 5.66663 5.09964 5.57883 5.25592 5.42255C5.4122 5.26627 5.5 5.05431 5.5 4.83329V3.99996H7.16667V4.83329C7.16667 5.05431 7.25446 5.26627 7.41074 5.42255C7.56702 5.57883 7.77899 5.66663 8 5.66663C8.22101 5.66663 8.43297 5.57883 8.58926 5.42255C8.74554 5.26627 8.83333 5.05431 8.83333 4.83329V3.99996H10.5V4.83329C10.5 5.05431 10.5878 5.26627 10.7441 5.42255C10.9004 5.57883 11.1123 5.66663 11.3333 5.66663C11.5543 5.66663 11.7663 5.57883 11.9226 5.42255C12.0789 5.26627 12.1667 5.05431 12.1667 4.83329V3.99996H13.8333V14.8333Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
9
src/assets/images/emptyPage.svg
Normal file
9
src/assets/images/emptyPage.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 1.1 MiB |
22
src/components/EmptyBlock/EmptyBlock.jsx
Normal file
22
src/components/EmptyBlock/EmptyBlock.jsx
Normal file
@ -0,0 +1,22 @@
|
||||
import React from "react";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
import empty from "assets/images/emptyPage.svg";
|
||||
|
||||
import "./emptyBlock.scss";
|
||||
|
||||
export const EmptyBlock = () => {
|
||||
return (
|
||||
<>
|
||||
<div className="empty-block">
|
||||
<h4 className="empty-block__title">
|
||||
Данная страница находится в разработке
|
||||
</h4>
|
||||
<Link className="empty-block__back" to="/profile">
|
||||
На главную
|
||||
</Link>
|
||||
</div>
|
||||
<img src={empty} alt="img" className="empty-block__img" />
|
||||
</>
|
||||
);
|
||||
};
|
53
src/components/EmptyBlock/emptyBlock.scss
Normal file
53
src/components/EmptyBlock/emptyBlock.scss
Normal file
@ -0,0 +1,53 @@
|
||||
.empty-block {
|
||||
position: relative;
|
||||
border-radius: 8px;
|
||||
border: 0.5px solid;
|
||||
border-image-source: linear-gradient(137.79deg, #FFFFFF 9.15%, #F4F4F4 76.22%);
|
||||
background: linear-gradient(110.06deg, rgba(255, 255, 255, 0.34) 0%, rgba(239, 239, 239, 0.34) 99.25%);
|
||||
display: flex;
|
||||
box-shadow: 10px 9px 14.3px 0px #00000008;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-top: 22px;
|
||||
padding: 95px 0 40px;
|
||||
flex-direction: column;
|
||||
z-index: 2;
|
||||
backdrop-filter: blur(5px);
|
||||
|
||||
&__img {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
top: 30px;
|
||||
transform: translate(-50%);
|
||||
left: 50%;
|
||||
}
|
||||
|
||||
&__title {
|
||||
color: #000000;
|
||||
font-weight: 700;
|
||||
font-size: 22px;
|
||||
line-height: 32px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
&__back {
|
||||
max-width: 150px;
|
||||
width: 100%;
|
||||
background: #52B709;
|
||||
border-radius: 44px;
|
||||
color: #FFFFFF;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 40px;
|
||||
transition: all 0.3s ease;
|
||||
|
||||
&:hover {
|
||||
color: white;
|
||||
scale: 1.1;
|
||||
}
|
||||
}
|
||||
}
|
53
src/components/VacancyItem/VacancyItem.jsx
Normal file
53
src/components/VacancyItem/VacancyItem.jsx
Normal file
@ -0,0 +1,53 @@
|
||||
import React from "react";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
import titleImg from "assets/images/VacancyItemImg.svg";
|
||||
|
||||
import "./vacancyItem.scss";
|
||||
|
||||
export const VacancyItem = ({
|
||||
vacancy: { name, description, level, price, location, count }
|
||||
}) => {
|
||||
return (
|
||||
<div className="vacancy__item">
|
||||
<div className="vacancy__item__head">
|
||||
<div className="vacancy__item__title">
|
||||
<span className="vacancy__item__img">
|
||||
<img src={titleImg} alt="img" />
|
||||
</span>
|
||||
<h4>{name}</h4>
|
||||
</div>
|
||||
<p className="vacancy__item__description">{description}</p>
|
||||
</div>
|
||||
<div className="vacancy__item__block">
|
||||
<div className="vacancy__item__block--left">
|
||||
<div className="vacancy__item__info">
|
||||
<span>Грейд:</span>
|
||||
<p>{level}</p>
|
||||
</div>
|
||||
<div className="vacancy__item__info">
|
||||
<span>Ставка:</span>
|
||||
<p>{price}</p>
|
||||
</div>
|
||||
<Link
|
||||
to={"/profile/open-requests/12"}
|
||||
className="vacancy__item__more"
|
||||
>
|
||||
Все требования по вакансии
|
||||
</Link>
|
||||
</div>
|
||||
<div className="vacancy__item__block--right">
|
||||
<div className="vacancy__item__info">
|
||||
<span>Локация:</span>
|
||||
<p>{location}</p>
|
||||
</div>
|
||||
<div className="vacancy__item__info">
|
||||
<span>Кол-во человек:</span>
|
||||
<p>{count}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button className="vacancy__item__btn">Откликнуться</button>
|
||||
</div>
|
||||
);
|
||||
};
|
113
src/components/VacancyItem/vacancyItem.scss
Normal file
113
src/components/VacancyItem/vacancyItem.scss
Normal file
@ -0,0 +1,113 @@
|
||||
.vacancy__item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
max-width: 325px;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
|
||||
&__head {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: white;
|
||||
border: 1px solid #DDDFE4;
|
||||
border-radius: 8px;
|
||||
padding: 24px 20px 8px;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
&__title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 18px;
|
||||
|
||||
h4 {
|
||||
font-weight: 500;
|
||||
color: #2E3A59;
|
||||
font-size: 20px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&__img {
|
||||
background: #52B709;
|
||||
border-radius: 4px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&__description {
|
||||
margin-top: 10px;
|
||||
color: #2E3A59;
|
||||
font-size: 14px;
|
||||
line-height: 17.5px;
|
||||
}
|
||||
|
||||
&__block {
|
||||
display: flex;
|
||||
position: relative;
|
||||
top: -12px;
|
||||
z-index: 1;
|
||||
|
||||
&--left {
|
||||
background: #EBEBEB;
|
||||
border: 1px solid #DDDFE4;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
padding: 20px 20px 12px;
|
||||
row-gap: 14px;
|
||||
}
|
||||
|
||||
&--right {
|
||||
background: #EBEBEB;
|
||||
border: 1px solid #DDDFE4;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
padding: 20px 20px 12px;
|
||||
row-gap: 14px;
|
||||
height: 70%;
|
||||
}
|
||||
}
|
||||
|
||||
&__info {
|
||||
color: #000000;
|
||||
font-size: 14px;
|
||||
span {
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
|
||||
&__more {
|
||||
font-size: 12px;
|
||||
text-decoration: underline;
|
||||
max-width: 97px;
|
||||
cursor: pointer;
|
||||
color: #000000;
|
||||
|
||||
&:hover {
|
||||
color: #000000;
|
||||
}
|
||||
}
|
||||
|
||||
&__btn {
|
||||
position: absolute;
|
||||
max-width: 150px;
|
||||
width: 100%;
|
||||
border: none;
|
||||
background: #52B709;
|
||||
border-radius: 44px;
|
||||
right: 5px;
|
||||
padding: 10px 0;
|
||||
font-size: 14px;
|
||||
color: #FFFFFF;
|
||||
bottom: 17px;
|
||||
cursor: pointer;
|
||||
z-index: 3;
|
||||
}
|
||||
}
|
17
src/components/VacancyTab/VacancyTab.jsx
Normal file
17
src/components/VacancyTab/VacancyTab.jsx
Normal file
@ -0,0 +1,17 @@
|
||||
import React from "react";
|
||||
|
||||
import "./vacancyTab.scss";
|
||||
|
||||
export const VacancyTab = ({ title, active, count, setActive }) => {
|
||||
return (
|
||||
<div
|
||||
className={
|
||||
active === title ? "vacancy__tab vacancy__tab--active" : "vacancy__tab"
|
||||
}
|
||||
onClick={setActive}
|
||||
>
|
||||
<p className="vacancy__tab__title">{title}</p>
|
||||
<span className="vacancy__tab__count">{count}</span>
|
||||
</div>
|
||||
);
|
||||
};
|
25
src/components/VacancyTab/vacancyTab.scss
Normal file
25
src/components/VacancyTab/vacancyTab.scss
Normal file
@ -0,0 +1,25 @@
|
||||
.vacancy__tab {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
background: #FFFFFF;
|
||||
border-radius: 8px;
|
||||
padding: 10px 8px 10px 16px;
|
||||
border: 2px solid white;
|
||||
max-width: 178px;
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
|
||||
&__title {
|
||||
color: #2E3A59;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
&__count {
|
||||
color: #1458DD;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
&--active {
|
||||
border: 2px solid #52B709;
|
||||
}
|
||||
}
|
@ -1,13 +1,319 @@
|
||||
import React from "react";
|
||||
import React, { useState } from "react";
|
||||
|
||||
import { Footer } from "@components/Common/Footer/Footer";
|
||||
import { Navigation } from "@components/Navigation/Navigation";
|
||||
import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs";
|
||||
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
|
||||
import { VacancyItem } from "@components/VacancyItem/VacancyItem";
|
||||
import { VacancyTab } from "@components/VacancyTab/VacancyTab";
|
||||
|
||||
import "./OpenRequest.scss";
|
||||
|
||||
export const OpenRequest = () => {
|
||||
const vacancy = [
|
||||
{
|
||||
name: "Frontend",
|
||||
count: 15,
|
||||
items: [
|
||||
{
|
||||
name: "Laravel Middle+/Senior 1",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 2",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 3",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 4",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 5",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 6",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Backend",
|
||||
count: 8,
|
||||
items: [
|
||||
{
|
||||
name: "Laravel Middle+/Senior 7",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 8",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Дизайн",
|
||||
count: 0,
|
||||
items: [
|
||||
{
|
||||
name: "Laravel Middle+/Senior 9",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 10",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Аналитика",
|
||||
count: 0,
|
||||
items: [
|
||||
{
|
||||
name: "Laravel Middle+/Senior 11",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 12",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 13",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "Тестирование",
|
||||
count: 0,
|
||||
items: [
|
||||
{
|
||||
name: "Laravel Middle+/Senior 14",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 15",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior 16",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
},
|
||||
{
|
||||
name: "Laravel Middle+/Senior",
|
||||
description:
|
||||
"Проект представляет из себя монолит с большим техдолгом, нужен php разработчик с опытом распила монолита на модули/микросервисы",
|
||||
level: "Middle+/Senior",
|
||||
location: "РФ, РБ",
|
||||
price: "1500 руб. час",
|
||||
count: "1 сотрудник"
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
const [activeTab, setActiveTab] = useState("Frontend");
|
||||
return (
|
||||
<div className="open-request">
|
||||
<ProfileHeader />
|
||||
@ -19,11 +325,34 @@ export const OpenRequest = () => {
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{
|
||||
name: "Работа в IT открытые запросы",
|
||||
link: "/profile/open-request"
|
||||
link: "/profile/open-requests"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
<h2 className="summary__title">Работа в IT открытые запросы</h2>
|
||||
<div className="vacancy__tabs">
|
||||
{vacancy.map((item, index) => {
|
||||
return (
|
||||
<VacancyTab
|
||||
title={item.name}
|
||||
count={item.count}
|
||||
active={activeTab}
|
||||
setActive={() => setActiveTab(item.name)}
|
||||
key={index}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
<div className="vacancy__items">
|
||||
{vacancy.map((item) => {
|
||||
if (item.name === activeTab) {
|
||||
return item.items.map((vacancy, index) => {
|
||||
return <VacancyItem key={index} vacancy={vacancy} />;
|
||||
});
|
||||
}
|
||||
return null;
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
|
@ -0,0 +1,23 @@
|
||||
.open-request {
|
||||
background: #F0F0F0;
|
||||
|
||||
&-content {
|
||||
padding-top: 23px;
|
||||
}
|
||||
}
|
||||
|
||||
.vacancy {
|
||||
&__tabs {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
margin-top: 29px;
|
||||
}
|
||||
|
||||
&__items {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
row-gap: 24px;
|
||||
column-gap: 22.5px;
|
||||
margin-top: 30px;
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@ import { useTheme } from "@table-library/react-table-library/theme";
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { Link, Navigate } from "react-router-dom";
|
||||
|
||||
import { LEVELS, SKILLS } from "@utils/constants";
|
||||
import { urlForLocal } from "@utils/helper";
|
||||
|
||||
import { apiRequest } from "@api/request";
|
||||
@ -17,6 +18,7 @@ import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadc
|
||||
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
|
||||
|
||||
import rightArrow from "assets/icons/arrows/arrowRight.svg";
|
||||
import report from "assets/icons/report.svg";
|
||||
|
||||
// import PartnerPersonCard from "@components/PartnerPersonCard/PartnerPersonCard";
|
||||
// import { useDispatch } from "react-redux";
|
||||
@ -44,9 +46,21 @@ export const PartnerCategories = () => {
|
||||
const theme = useTheme(getTheme());
|
||||
const [nodes, setNodes] = useState([]);
|
||||
const [initialNodes, setInitialNodes] = useState([]);
|
||||
const [activeTab, setActiveTab] = useState("Все");
|
||||
|
||||
const [search, setSearch] = useState("");
|
||||
|
||||
const tabs = [
|
||||
{
|
||||
name: "Фронтенд",
|
||||
value: 2
|
||||
},
|
||||
{
|
||||
name: "Бэкенд",
|
||||
value: 1
|
||||
}
|
||||
];
|
||||
|
||||
const COLUMNS = [
|
||||
{
|
||||
label: "",
|
||||
@ -59,19 +73,28 @@ export const PartnerCategories = () => {
|
||||
)
|
||||
},
|
||||
{
|
||||
label: "ФИО",
|
||||
renderCell: (item) => <p>{item?.employee.fio}</p>,
|
||||
sort: { sortKey: "NAME" }
|
||||
label: "Данные",
|
||||
renderCell: (item) => (
|
||||
<div className="table__info">
|
||||
<p>{item?.employee.fio}</p>
|
||||
<span>
|
||||
{LEVELS[item?.resume.userCard.level]} /{" "}
|
||||
{SKILLS[item?.resume.userCard.position_id]}
|
||||
</span>
|
||||
</div>
|
||||
)
|
||||
// sort: { sortKey: "NAME" }
|
||||
},
|
||||
{
|
||||
label: "Резюме",
|
||||
label: "Участвует в проекте",
|
||||
renderCell: (item) => (
|
||||
<Link className="table__link" to={`/candidate/${item.user_id}`}>
|
||||
Резюме
|
||||
<div className="img__wrapper">
|
||||
<img src={rightArrow} alt="arrow" />
|
||||
</div>
|
||||
</Link>
|
||||
<div className="table__project">
|
||||
{item.resume.userCard.at_project ? (
|
||||
<div>item.resume.userCard.at_project</div>
|
||||
) : (
|
||||
<span>Нет проектов</span>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
},
|
||||
{
|
||||
@ -81,12 +104,17 @@ export const PartnerCategories = () => {
|
||||
className="table__link"
|
||||
to={`/profile/employees/report/${item.user_id}`}
|
||||
>
|
||||
<img src={report} alt="report" />
|
||||
Подробный отчет
|
||||
<div className="img__wrapper">
|
||||
<img src={rightArrow} alt="arrow" />
|
||||
</div>
|
||||
</Link>
|
||||
)
|
||||
},
|
||||
{
|
||||
label: <span className="table__action">Действие</span>,
|
||||
renderCell: () => <div className="table__more"></div>
|
||||
}
|
||||
];
|
||||
|
||||
@ -115,9 +143,23 @@ export const PartnerCategories = () => {
|
||||
useEffect(() => {
|
||||
setLoader(true);
|
||||
apiRequest("/project/my-employee").then((el) => {
|
||||
setLoader(false);
|
||||
setNodes(el?.managerEmployees);
|
||||
setInitialNodes(el.managerEmployees);
|
||||
const fetchResumes = async () => {
|
||||
const promises = el.managerEmployees.map(async (manager) => {
|
||||
const resume = await apiRequest(`/resume?userId=${manager.user_id}`);
|
||||
return { ...manager, resume }; // Возвращаем объект с добавленным ключом resume
|
||||
});
|
||||
|
||||
try {
|
||||
const updatedManagers = await Promise.all(promises);
|
||||
setInitialNodes(updatedManagers);
|
||||
setNodes(updatedManagers);
|
||||
setLoader(false);
|
||||
} catch (error) {
|
||||
console.error("Ошибка при получении резюме:", error);
|
||||
}
|
||||
};
|
||||
|
||||
fetchResumes();
|
||||
});
|
||||
}, []);
|
||||
|
||||
@ -266,6 +308,44 @@ export const PartnerCategories = () => {
|
||||
onChange={handleSearch}
|
||||
/>
|
||||
</label>
|
||||
<div className="table__tabs">
|
||||
<div
|
||||
onClick={() => {
|
||||
setActiveTab("Все");
|
||||
setNodes(initialNodes);
|
||||
}}
|
||||
className={
|
||||
activeTab === "Все"
|
||||
? "table__tab table__tab--active"
|
||||
: "table__tab"
|
||||
}
|
||||
>
|
||||
Все
|
||||
</div>
|
||||
{tabs.map((tab) => {
|
||||
return (
|
||||
<div
|
||||
onClick={() => {
|
||||
setActiveTab(tab.name);
|
||||
setNodes(
|
||||
initialNodes.filter(
|
||||
(item) =>
|
||||
item.resume.userCard.position_id === tab.value
|
||||
)
|
||||
);
|
||||
}}
|
||||
className={
|
||||
activeTab === tab.name
|
||||
? "table__tab table__tab--active"
|
||||
: "table__tab"
|
||||
}
|
||||
key={tab.value}
|
||||
>
|
||||
{tab.name}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
<CompactTable
|
||||
columns={COLUMNS}
|
||||
data={data}
|
||||
|
@ -178,10 +178,56 @@
|
||||
}
|
||||
}
|
||||
|
||||
&__tabs {
|
||||
display: flex;
|
||||
margin: 0 auto 30px 18px;
|
||||
padding: 4px 8px;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
font-size: 16px;
|
||||
background: rgba(240, 242, 245, 1);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
&__tab {
|
||||
padding: 8px 12px;
|
||||
cursor: pointer;
|
||||
color: rgba(46, 58, 89, 1);
|
||||
font-size: 15px;
|
||||
|
||||
&--active {
|
||||
background: rgba(255, 255, 255, 1);
|
||||
font-size: 16px;
|
||||
border-radius: 5px;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
&:nth-child(2) {
|
||||
border-right: 1px solid rgba(224, 226, 229, 1);
|
||||
border-left: 1px solid rgba(224, 226, 229, 1);
|
||||
}
|
||||
}
|
||||
|
||||
&__avatar {
|
||||
max-width: 45px;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin-left: 18px;
|
||||
}
|
||||
|
||||
&__info {
|
||||
p {
|
||||
color: rgba(46, 58, 89, 1);
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
line-height: 17.5px;
|
||||
}
|
||||
span {
|
||||
color: rgba(155, 171, 197, 1);
|
||||
font-size: 14px;
|
||||
line-height: 17.5px;
|
||||
}
|
||||
}
|
||||
|
||||
&__link {
|
||||
display: flex;
|
||||
column-gap: 10px;
|
||||
@ -199,11 +245,56 @@
|
||||
justify-content: center;
|
||||
|
||||
img {
|
||||
width: 14px;
|
||||
width: 8px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&__project {
|
||||
color: rgba(46, 58, 89, 1);
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
line-height: 17.5px;
|
||||
}
|
||||
|
||||
&__action {
|
||||
color: rgba(155, 171, 197, 1);
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
&__more {
|
||||
position: relative;
|
||||
height: 30px;
|
||||
cursor: pointer;
|
||||
width: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
flex-direction: column;
|
||||
&:before {
|
||||
content: '';
|
||||
display: flex;
|
||||
top: 2px;
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
background: rgba(155, 171, 197, 1);
|
||||
border-radius: 50px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
&:after {
|
||||
content: '';
|
||||
display: flex;
|
||||
bottom: 2px;
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
background: rgba(155, 171, 197, 1);
|
||||
border-radius: 50px;
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
&__pagination {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
@ -251,6 +342,7 @@
|
||||
}
|
||||
|
||||
table {
|
||||
--data-table-library_grid-template-columns: minmax(0px, 0.5fr) minmax(0px, 1.5fr) minmax(0px, 1fr) minmax(0px, 1fr) minmax(0px, 1fr) !important;
|
||||
th {
|
||||
border-top: 0;
|
||||
border-bottom: 1px solid #EDEDED;
|
||||
|
@ -1,7 +1,9 @@
|
||||
import React from "react";
|
||||
|
||||
import { Footer } from "@components/Common/Footer/Footer";
|
||||
import { EmptyBlock } from "@components/EmptyBlock/EmptyBlock";
|
||||
import { Navigation } from "@components/Navigation/Navigation";
|
||||
import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs";
|
||||
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
|
||||
|
||||
import "./payouts.scss";
|
||||
@ -11,7 +13,16 @@ export const Payouts = () => {
|
||||
<div className="payouts">
|
||||
<ProfileHeader />
|
||||
<Navigation />
|
||||
<div className="container"></div>
|
||||
<div className="container">
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Выплаты и финансы ", link: "/profile/payouts" }
|
||||
]}
|
||||
/>
|
||||
<h3 className="payouts__title">Выплаты и финансы </h3>
|
||||
<EmptyBlock />
|
||||
</div>
|
||||
<Footer />
|
||||
</div>
|
||||
);
|
||||
|
@ -9,5 +9,13 @@
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1;
|
||||
margin-top: 23px;
|
||||
}
|
||||
|
||||
&__title {
|
||||
font-weight: 700;
|
||||
font-size: 22px;
|
||||
line-height: 32px;
|
||||
color: #000000;
|
||||
}
|
||||
}
|
||||
|
104
src/pages/Vacancy/Vacancy.jsx
Normal file
104
src/pages/Vacancy/Vacancy.jsx
Normal file
@ -0,0 +1,104 @@
|
||||
import React from "react";
|
||||
|
||||
import { Footer } from "@components/Common/Footer/Footer";
|
||||
import { Navigation } from "@components/Navigation/Navigation";
|
||||
import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs";
|
||||
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
|
||||
|
||||
import titleImg from "assets/images/VacancyItemImg.svg";
|
||||
|
||||
import "./vacancy.scss";
|
||||
|
||||
export const Vacancy = () => {
|
||||
return (
|
||||
<div className="vacancy">
|
||||
<ProfileHeader />
|
||||
<Navigation />
|
||||
<div className="container">
|
||||
<div className="vacancy-content">
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{
|
||||
name: "Работа в IT открытые запросы",
|
||||
link: "/profile/open-requests"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
<h2 className="opening__title">Laravel Middle+/Senior</h2>
|
||||
<div className="opening">
|
||||
<div className="opening__head">
|
||||
<span className="opening__img">
|
||||
<img src={titleImg} alt="img" />
|
||||
</span>
|
||||
<h4 className="opening__name">
|
||||
Проект представляет из себя монолит с большим техдолгом, нужен
|
||||
php разработчик с опытом распила монолита на модули/микросервисы
|
||||
</h4>
|
||||
</div>
|
||||
<div className="opening__info">
|
||||
<div className="opening__description">
|
||||
<span>Требования :</span>
|
||||
<ul>
|
||||
<li>
|
||||
Опыт разработки на Golang 2+ года и общий опыт разработки 3+
|
||||
года;
|
||||
</li>
|
||||
<li>
|
||||
Понимание устройства языка Go (многопоточность, шедулер,
|
||||
кодогенерация);
|
||||
</li>
|
||||
<li>
|
||||
Опыт работы с брокерами сообщений (Kafka, RabbitMQ, Nuts и
|
||||
etc);
|
||||
</li>
|
||||
<li>
|
||||
Опыт работы с реляционными БД (PostgreSQL, ClickHouse и
|
||||
etc);
|
||||
</li>
|
||||
<li>
|
||||
Знание сетевого стека и основных сетевых протоколов на
|
||||
высоком уровне;
|
||||
</li>
|
||||
<li>
|
||||
Опыт работы с различными средствами автоматизации для
|
||||
процессов разработки (Nexus, Gitlab registry etc)
|
||||
(необходимо для понимания предметной области);
|
||||
</li>
|
||||
<li>
|
||||
Понимание работы прокси и опыт работы с различными решениями
|
||||
(Nginx, Haproxy, Squid).
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div className="opening__blocks">
|
||||
<div className="opening__block">
|
||||
<div className="opening__block__info">
|
||||
<span>Грейд:</span>
|
||||
<p>Middle+/Senior</p>
|
||||
</div>
|
||||
<div className="opening__block__info">
|
||||
<span>Ставка:</span>
|
||||
<p>1500 руб. час</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="opening__block">
|
||||
<div className="opening__block__info">
|
||||
<span>Локация:</span>
|
||||
<p>РФ, РБ</p>
|
||||
</div>
|
||||
<div className="opening__block__info">
|
||||
<span>Кол-во человек:</span>
|
||||
<p>1 сотрудник</p>
|
||||
</div>
|
||||
</div>
|
||||
<button className="opening__btn">Откликнуться</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</div>
|
||||
);
|
||||
};
|
131
src/pages/Vacancy/vacancy.scss
Normal file
131
src/pages/Vacancy/vacancy.scss
Normal file
@ -0,0 +1,131 @@
|
||||
.vacancy {
|
||||
background: #F1F1F1;
|
||||
height: 100vh;
|
||||
|
||||
&-content {
|
||||
padding-top: 23px;
|
||||
}
|
||||
}
|
||||
|
||||
.opening {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
|
||||
&__head {
|
||||
display: flex;
|
||||
border: 1px solid #DDDFE4;
|
||||
border-radius: 8px;
|
||||
background: white;
|
||||
height: 60px;
|
||||
align-items: center;
|
||||
column-gap: 25px;
|
||||
padding: 0 23px;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
&__name {
|
||||
color: #2E3A59;
|
||||
font-size: 14px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
&__img {
|
||||
background: #52B709;
|
||||
border-radius: 4px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
&__info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
&__description {
|
||||
background: white;
|
||||
border: 1px solid #DDDFE4;
|
||||
padding: 24px 24px;
|
||||
border-radius: 8px;
|
||||
position: relative;
|
||||
top: -12px;
|
||||
z-index: 1;
|
||||
|
||||
span {
|
||||
color: #000000;
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
font-size: 14px;
|
||||
color: #2E3A59;
|
||||
line-height: 17.5px;
|
||||
max-width: 600px;
|
||||
}
|
||||
li {
|
||||
position: relative;
|
||||
padding-left: 20px;
|
||||
}
|
||||
li::before {
|
||||
content: '*';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
color: black;
|
||||
}
|
||||
}
|
||||
|
||||
&__blocks {
|
||||
display: flex;
|
||||
position: relative;
|
||||
top: -12px;
|
||||
height: 50%;
|
||||
}
|
||||
|
||||
&__block {
|
||||
border-radius: 8px;
|
||||
border: 1px solid #DDDFE4;
|
||||
background: #EBEBEB;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 24px 21px 12px;
|
||||
row-gap: 14px;
|
||||
|
||||
&:nth-child(2) {
|
||||
border-left: none;
|
||||
}
|
||||
|
||||
&__info {
|
||||
font-size: 14px;
|
||||
span {
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&__title {
|
||||
font-weight: 700;
|
||||
font-size: 22px;
|
||||
color: #000000;
|
||||
margin: 11px 0;
|
||||
}
|
||||
|
||||
&__btn {
|
||||
max-width: 150px;
|
||||
width: 100%;
|
||||
background: #52B709;
|
||||
border-radius: 44px;
|
||||
height: 40px;
|
||||
color: #FFFFFF;
|
||||
font-size: 14px;
|
||||
border: none;
|
||||
position: absolute;
|
||||
right: 25%;
|
||||
bottom: -40%;
|
||||
}
|
||||
}
|
@ -13,6 +13,7 @@ import { QuizReportPage } from "@pages/Quiz/QuizReportPage";
|
||||
import Statistics from "@pages/Statistics/Statistics";
|
||||
import { Summary } from "@pages/Summary/Summary";
|
||||
import { Tracker } from "@pages/Tracker/Tracker";
|
||||
import { Vacancy } from "@pages/Vacancy/Vacancy";
|
||||
import { ViewReport } from "@pages/ViewReport/ViewReport";
|
||||
|
||||
import TicketFullScreen from "@components/Modal/Tracker/TicketFullScreen/TicketFullScreen";
|
||||
@ -36,6 +37,7 @@ export const DeveloperPage = () => {
|
||||
<Route exact path="calendar/report" element={<ReportForm />} />
|
||||
<Route exact path="calendar/view/:date/:id" element={<ViewReport />} />
|
||||
<Route exact path="open-requests" element={<OpenRequest />} />
|
||||
<Route exact path="open-requests/:id" element={<Vacancy />} />
|
||||
<Route exact path="summary" element={<Summary />} />
|
||||
<Route exact path="tracker" element={<Tracker />} />
|
||||
<Route exact path="statistics/:id" element={<Statistics />} />
|
||||
|
Reference in New Issue
Block a user