This commit is contained in:
2024-07-21 16:37:39 +03:00
parent 268ff58ccd
commit a561ed83c4
10 changed files with 733 additions and 2 deletions

View File

@ -1,13 +1,289 @@
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 { VacancyTab } from "@components/VacancyTab/VacancyTab";
import { VacancyItem } from "@components/VacancyItem/VacancyItem";
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 +295,28 @@ 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 />

View File

@ -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;
}
}

View File

@ -0,0 +1,83 @@
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>
);
};

View 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%;
}
}

View File

@ -2,6 +2,7 @@ import React from "react";
import { Route, Routes } from "react-router-dom";
import { OpenRequest } from "@pages/OpenRequests/OpenRequest";
import { Vacancy } from "@pages/Vacancy/Vacancy"
import { PartnerSettings } from "@pages/PartnerSettings/PartnerSettings";
import { PartnerTreaties } from "@pages/PartnerTreaties/PartnerTreaties";
import { Payouts } from "@pages/Payouts/Payouts";
@ -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 />} />