From 08f7d13f01f8caf041d5cb575b4d209e332c4f53 Mon Sep 17 00:00:00 2001 From: MaxOvs19 Date: Wed, 24 May 2023 13:49:09 +0300 Subject: [PATCH 01/15] Fixed img in components --- config/webpack/common.js | 90 +++-- .../{Achievement.js => Achievement.jsx} | 0 .../AuthBox/{AuthBox.js => AuthBox.jsx} | 14 +- .../{AuthHeader.js => AuthHeader.jsx} | 2 +- src/components/AuthHeader/authHeader.scss | 2 +- src/components/Calendar/Calendar.js | 78 ---- src/components/Calendar/Calendar.jsx | 88 +++++ src/components/Calendar/CalendarComponent.js | 92 ----- src/components/Calendar/CalendarComponent.jsx | 101 +++++ src/components/Calendar/calendar.scss | 4 +- .../Calendar/calendarComponent.scss | 101 ----- src/components/Candidate/Candidate.js | 13 +- ...ndidateSidebar.js => CandidateSidebar.jsx} | 4 +- src/components/CardControl/CardControl.js | 41 +- .../CategoriesItem/CategoriesItem.js | 43 ++- .../FrequentlyAskedQuestionsItem.jsx | 11 +- src/components/Outstaffing/Outstaffing.js | 136 +++---- .../Outstaffing/images/back_end.png | Bin 15671 -> 0 bytes src/components/Outstaffing/images/design.png | Bin 19430 -> 0 bytes .../Outstaffing/images/front_end.png | Bin 14699 -> 0 bytes .../features/quiz/CardAviableTest.js | 48 +-- src/constants/router-path.js | 2 - src/images/arrowRight.png | Bin 240 -> 0 bytes src/images/arrowRight.svg | 9 + src/images/back-end.webp | Bin 0 -> 2994 bytes src/images/design.webp | Bin 0 -> 3192 bytes src/images/front-end.webp | Bin 0 -> 2406 bytes src/images/gitItemImg.png | Bin 1028 -> 0 bytes src/images/gitItemImg.svg | 9 + src/images/userIcon.png | Bin 499 -> 0 bytes src/images/userIcon.svg | 4 + .../AuthForCandidate/AuthForCandidate.jsx | 361 +++++++++--------- .../AuthForDevelopers/AuthForDevelopers.jsx | 28 +- src/pages/AuthForPartners/AuthForPartners.js | 25 +- .../FrequentlyAskedQuestion.jsx | 22 +- .../FrequentlyAskedQuestions.jsx | 79 ++-- .../PartnerEmployees/PartnerEmployees.js | 145 +++---- .../PartnerСategories/PartnerСategories.js | 335 ++++++++-------- .../RegistrationForCandidate.js | 132 ++++--- src/pages/Summary/Summary.js | 206 +++++----- 40 files changed, 1133 insertions(+), 1092 deletions(-) rename src/components/Achievement/{Achievement.js => Achievement.jsx} (100%) rename src/components/AuthBox/{AuthBox.js => AuthBox.jsx} (95%) rename src/components/AuthHeader/{AuthHeader.js => AuthHeader.jsx} (96%) delete mode 100644 src/components/Calendar/Calendar.js create mode 100644 src/components/Calendar/Calendar.jsx delete mode 100644 src/components/Calendar/CalendarComponent.js create mode 100644 src/components/Calendar/CalendarComponent.jsx rename src/components/CandidateSidebar/{CandidateSidebar.js => CandidateSidebar.jsx} (98%) delete mode 100644 src/components/Outstaffing/images/back_end.png delete mode 100644 src/components/Outstaffing/images/design.png delete mode 100644 src/components/Outstaffing/images/front_end.png delete mode 100644 src/constants/router-path.js delete mode 100644 src/images/arrowRight.png create mode 100644 src/images/arrowRight.svg create mode 100644 src/images/back-end.webp create mode 100644 src/images/design.webp create mode 100644 src/images/front-end.webp delete mode 100644 src/images/gitItemImg.png create mode 100644 src/images/gitItemImg.svg delete mode 100644 src/images/userIcon.png create mode 100644 src/images/userIcon.svg diff --git a/config/webpack/common.js b/config/webpack/common.js index a2d2b439..722e3f13 100644 --- a/config/webpack/common.js +++ b/config/webpack/common.js @@ -1,45 +1,44 @@ -const paths = require('../paths'); +const paths = require("../paths"); -const webpack = require('webpack'); +const webpack = require("webpack"); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); - -const Dotenv = require('dotenv-webpack'); +const CopyWebpackPlugin = require("copy-webpack-plugin"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const Dotenv = require("dotenv-webpack"); const plugins = [ - '@babel/plugin-proposal-class-properties', - '@babel/plugin-syntax-dynamic-import', - '@babel/plugin-transform-runtime' + "@babel/plugin-proposal-class-properties", + "@babel/plugin-syntax-dynamic-import", + "@babel/plugin-transform-runtime", ]; -if (process.env.NODE_ENV === 'development') { - plugins.push('react-refresh/babel'); +if (process.env.NODE_ENV === "development") { + plugins.push("react-refresh/babel"); } const babelLoader = { - loader: 'babel-loader', + loader: "babel-loader", options: { presets: [ // "react-app", - '@babel/preset-env', - '@babel/preset-react', + "@babel/preset-env", + "@babel/preset-react", ], - plugins: plugins - } + plugins: plugins, + }, }; module.exports = { entry: `${paths.src}/index.js`, output: { path: paths.build, - filename: '[name].bundle.js', - publicPath: '/', + filename: "[name].bundle.js", + publicPath: "/", // publicPath: 'https://itguild.info', asyncChunks: true, clean: true, - crossOriginLoading: 'anonymous', + crossOriginLoading: "anonymous", module: true, environment: { arrowFunction: true, @@ -47,57 +46,56 @@ module.exports = { const: true, destructuring: true, dynamicImport: false, - forOf: true - } + forOf: true, + }, }, resolve: { alias: { - '@': `${paths.src}/modules` + "@": `${paths.src}/modules`, }, - extensions: ['.mjs', '.js', '.jsx', '.ts', '.tsx', '.json'] + extensions: [".mjs", ".js", ".jsx", ".ts", ".tsx", ".json"], }, experiments: { topLevelAwait: true, - outputModule: true + outputModule: true, }, module: { rules: [ - // JavaScript, React { test: /\.m?jsx?$/i, exclude: /node_modules/, - use: babelLoader + use: babelLoader, }, // TypeScript { test: /.tsx?$/i, exclude: /node_modules/, - use: [babelLoader, 'ts-loader'] + use: [babelLoader, "ts-loader"], }, // CSS, SASS { test: /\.(c|sa|sc)ss$/i, use: [ - 'style-loader', + "style-loader", { - loader: 'css-loader', - options: {importLoaders: 1} + loader: "css-loader", + options: { importLoaders: 1 }, }, - 'sass-loader' - ] + "sass-loader", + ], }, // MD { test: /\.md$/i, - use: ['html-loader', 'markdown-loader'] + use: ["html-loader", "markdown-loader"], }, // static files { - test: /\.(jpe?g|png|gif|svg|eot|ttf|woff2|woff?)$/i, - type: 'asset/resource' - } - ] + test: /\.(jpe?g|png|gif|webp|svg|eot|ttf|woff2|woff?)$/i, + type: "asset/resource", + }, + ], }, plugins: [ new webpack.ProgressPlugin(), @@ -107,10 +105,10 @@ module.exports = { { from: `${paths.public}`, globOptions: { - ignore: ["**/index.html"] - } - } - ] + ignore: ["**/index.html"], + }, + }, + ], }), new HtmlWebpackPlugin({ @@ -119,11 +117,11 @@ module.exports = { }), new webpack.ProvidePlugin({ - React: 'react' + React: "react", }), new Dotenv({ - path: '.env' - }) - ] -}; \ No newline at end of file + path: ".env", + }), + ], +}; diff --git a/src/components/Achievement/Achievement.js b/src/components/Achievement/Achievement.jsx similarity index 100% rename from src/components/Achievement/Achievement.js rename to src/components/Achievement/Achievement.jsx diff --git a/src/components/AuthBox/AuthBox.js b/src/components/AuthBox/AuthBox.jsx similarity index 95% rename from src/components/AuthBox/AuthBox.js rename to src/components/AuthBox/AuthBox.jsx index 6954fb7e..dfa327d9 100644 --- a/src/components/AuthBox/AuthBox.js +++ b/src/components/AuthBox/AuthBox.jsx @@ -1,20 +1,18 @@ import React, { useEffect, useRef, useState } from "react"; -import { Link, useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; + import { useDispatch, useSelector } from "react-redux"; - -import { Loader } from "../Loader/Loader"; - import { auth, selectAuth, setUserInfo } from "../../redux/outstaffingSlice"; import { loading } from "../../redux/loaderSlice"; import { setRole } from "../../redux/roleSlice"; import { selectIsLoading } from "../../redux/loaderSlice"; -import ModalErrorLogin from "../../components/UI/ModalErrorLogin/ModalErrorLogin"; - +import ModalRegistration from "../UI/ModalRegistration/ModalRegistration"; +import ModalErrorLogin from "../UI/ModalErrorLogin/ModalErrorLogin"; +import { Loader } from "../Loader/Loader"; import { apiRequest } from "../../api/request"; import ellipse from "../../images/ellipse.png"; -import ModalRegistration from "../UI/ModalRegistration/ModalRegistration"; import "./authBox.scss"; @@ -78,7 +76,7 @@ export const AuthBox = ({ title }) => { Войти в систему
- + . {title}
diff --git a/src/components/AuthHeader/AuthHeader.js b/src/components/AuthHeader/AuthHeader.jsx similarity index 96% rename from src/components/AuthHeader/AuthHeader.js rename to src/components/AuthHeader/AuthHeader.jsx index 1b072eed..b4728874 100644 --- a/src/components/AuthHeader/AuthHeader.js +++ b/src/components/AuthHeader/AuthHeader.jsx @@ -2,7 +2,7 @@ import React from "react"; import { NavLink } from "react-router-dom"; import { scrollToForm } from "../../helper"; -import userIcon from "../../images/userIcon.png"; +import userIcon from "../../images/userIcon.svg"; import "./authHeader.scss"; diff --git a/src/components/AuthHeader/authHeader.scss b/src/components/AuthHeader/authHeader.scss index a5a968f2..c54781ef 100644 --- a/src/components/AuthHeader/authHeader.scss +++ b/src/components/AuthHeader/authHeader.scss @@ -53,7 +53,7 @@ } .candidate { - color: #1458DD; + color: #1458dd; } } } diff --git a/src/components/Calendar/Calendar.js b/src/components/Calendar/Calendar.js deleted file mode 100644 index 9b35e7be..00000000 --- a/src/components/Calendar/Calendar.js +++ /dev/null @@ -1,78 +0,0 @@ -import React, {useEffect, useState} from 'react' -import {useSelector} from 'react-redux' -import {Link, Navigate, useNavigate} from 'react-router-dom' - -import CalendarComponent from './CalendarComponent' -import {currentMonth} from './calendarHelper' -import {Footer} from '../Footer/Footer' -import {LogoutButton} from "../LogoutButton/LogoutButton"; - -import {selectCurrentCandidate} from '../../redux/outstaffingSlice' - -import rectangle from '../../images/rectangle_secondPage.png' - -import './calendar.scss' -import {urlForLocal} from "../../helper"; - - -const Calendar = () => { - if(localStorage.getItem('role_status') !== '18') { - return - } - - const candidateForCalendar = useSelector(selectCurrentCandidate); - - const [month, setMonth] = useState(''); - - const navigate = useNavigate(); - - useEffect(() => { - setMonth(currentMonth) - }, [month]); - - const {name, skillsName, photo} = candidateForCalendar; - - const abbreviatedName = name && name.substring(0, name.lastIndexOf(' ')); - - return ( -
-
-
-
-

- Добрый день, Александр ! -

- -
-
-
- {photo && img} -

{abbreviatedName}

-
-
-

{skillsName} разработчик

- img -
-
- - - -
-
-
- -
-
- { navigate('/report/0') }}/> -

- {month} : 60 часов -

-
-
-
-
-
- ) -}; - -export default Calendar diff --git a/src/components/Calendar/Calendar.jsx b/src/components/Calendar/Calendar.jsx new file mode 100644 index 00000000..0f704f32 --- /dev/null +++ b/src/components/Calendar/Calendar.jsx @@ -0,0 +1,88 @@ +import React, { useEffect, useState } from "react"; +import { useSelector } from "react-redux"; +import { Link, Navigate, useNavigate } from "react-router-dom"; + +import CalendarComponent from "./CalendarComponent"; +import { currentMonth } from "./calendarHelper"; +import { Footer } from "../Footer/Footer"; +import { LogoutButton } from "../LogoutButton/LogoutButton"; +import { urlForLocal } from "../../helper"; +import { selectCurrentCandidate } from "../../redux/outstaffingSlice"; + +import rectangle from "../../images/rectangle_secondPage.png"; + +import "./calendar.scss"; + +const Calendar = () => { + if (localStorage.getItem("role_status") !== "18") { + return ; + } + + const candidateForCalendar = useSelector(selectCurrentCandidate); + + const [month, setMonth] = useState(""); + + const navigate = useNavigate(); + + useEffect(() => { + setMonth(currentMonth); + }, [month]); + + const { name, skillsName, photo } = candidateForCalendar; + + const abbreviatedName = name && name.substring(0, name.lastIndexOf(" ")); + + return ( +
+
+
+
+

+ Добрый день, Александр ! +

+ +
+
+
+ {photo && ( + img + )} +

{abbreviatedName}

+
+
+

{skillsName} разработчик

+ img +
+
+ + + +
+
+
+ +
+
+ { + navigate("/report/0"); + }} + /> +

+ {month} : 60 часов +

+
+
+
+
+
+ ); +}; + +export default Calendar; diff --git a/src/components/Calendar/CalendarComponent.js b/src/components/Calendar/CalendarComponent.js deleted file mode 100644 index ddf41a3a..00000000 --- a/src/components/Calendar/CalendarComponent.js +++ /dev/null @@ -1,92 +0,0 @@ -import React, { useState, useEffect } from 'react' -import ellipse from '../../images/ellipse.png' -import rectangle from '../../images/rectangle__calendar.png' -import calendarIcon from '../../images/calendar_icon.png' -import moment from 'moment' -import 'moment/locale/ru' -import { calendarHelper, currentMonthAndDay, } from './calendarHelper' - -import './calendarComponent.scss' - -const CalendarComponent = ({ onSelect }) => { - const [value, setValue] = useState(moment()) - const [calendar, setCalendar] = useState([]) - - useEffect(() => { - setCalendar(calendarHelper(value)) - }, [value]) - - function beforeToday(day) { - return day.isBefore(new Date(), 'day') - } - - function isToday(day) { - return day.isSame(new Date(), 'day') - } - - function dayStyles(day) { - if (beforeToday(day)) return `before` - if (isToday(day)) return `today` - if (day.day() === 6 || day.day() === 0) return `selected` - return '' - } - - function prevMonth() { - return value.clone().subtract(1, 'month') - } - - function nextMonth() { - return value.clone().add(1, 'month'); - } - - return ( -
-
-

Мои отчеты

-
- - setValue(prevMonth())}>{prevMonth().format('MMMM')} -
-
- - setValue(nextMonth())}>{nextMonth().format('MMMM')} -
-
- -
- -
- -
-
-

Пн

-

Вт

-

Ср

-

Чт

-

Пт

-

Сб

-

Вс

-
- -
- {calendar.map((week) => - week.map((day) => ( - - )) - )} -
-
-
- ) -} - -export default CalendarComponent diff --git a/src/components/Calendar/CalendarComponent.jsx b/src/components/Calendar/CalendarComponent.jsx new file mode 100644 index 00000000..1e6b3bc5 --- /dev/null +++ b/src/components/Calendar/CalendarComponent.jsx @@ -0,0 +1,101 @@ +import React, { useState, useEffect } from "react"; +import { calendarHelper, currentMonthAndDay } from "./calendarHelper"; + +import ellipse from "../../images/ellipse.png"; +import rectangle from "../../images/rectangle__calendar.png"; +import calendarIcon from "../../images/calendar_icon.png"; + +import moment from "moment"; +import "moment/locale/ru"; + +import "./calendarComponent.scss"; + +const CalendarComponent = ({ onSelect }) => { + const [value, setValue] = useState(moment()); + const [calendar, setCalendar] = useState([]); + + useEffect(() => { + setCalendar(calendarHelper(value)); + }, [value]); + + function beforeToday(day) { + return day.isBefore(new Date(), "day"); + } + + function isToday(day) { + return day.isSame(new Date(), "day"); + } + + function dayStyles(day) { + if (beforeToday(day)) return `before`; + if (isToday(day)) return `today`; + if (day.day() === 6 || day.day() === 0) return `selected`; + return ""; + } + + function prevMonth() { + return value.clone().subtract(1, "month"); + } + + function nextMonth() { + return value.clone().add(1, "month"); + } + + return ( +
+
+

Мои отчеты

+
+ + setValue(prevMonth())}> + {prevMonth().format("MMMM")} + +
+
+ + setValue(nextMonth())}> + {nextMonth().format("MMMM")} + +
+
+ +
+ +
+ +
+
+

Пн

+

Вт

+

Ср

+

Чт

+

Пт

+

Сб

+

Вс

+
+ +
+ {calendar.map((week) => + week.map((day) => ( + + )) + )} +
+
+
+ ); +}; + +export default CalendarComponent; diff --git a/src/components/Calendar/calendar.scss b/src/components/Calendar/calendar.scss index 07dbf74e..6a04eb14 100644 --- a/src/components/Calendar/calendar.scss +++ b/src/components/Calendar/calendar.scss @@ -1,6 +1,6 @@ .calendar { margin-bottom: 40px; - font-family: 'LabGrotesque', sans-serif; + font-family: "LabGrotesque", sans-serif; &__header { display: flex; @@ -85,7 +85,7 @@ ); border: none; color: #ffffff; - font-family: 'Muller'; + font-family: "Muller"; font-size: 1.6em; letter-spacing: normal; text-align: center; diff --git a/src/components/Calendar/calendarComponent.scss b/src/components/Calendar/calendarComponent.scss index 5ae4d7ce..4beb3afe 100644 --- a/src/components/Calendar/calendarComponent.scss +++ b/src/components/Calendar/calendarComponent.scss @@ -210,12 +210,6 @@ padding: 28px 10px 48px 10px; &__header { - //h3 { - // position: absolute; - // top: -10%; - // left: 25%; - //} - &-box { margin-left: 20px; } @@ -233,101 +227,6 @@ } } -//@media (max-width: 768px) { -// .calendar-component__form > button { -// width: 70px; -// height: 40px; -// -// img { -// display: none; -// } -// } -//} - -//@media (max-width: 540.98px) { -// .calendar-component__form > button { -// width: 68px; -// height: 40px; -// } -//} -// -//@media (max-width: 520.98px) { -// .calendar-component__form > button { -// width: 66px; -// height: 40px; -// } -//} -// -//@media (max-width: 500.98px) { -// .calendar-component__form > button { -// width: 64px; -// height: 40px; -// } -//} -// -//@media (max-width: 480.98px) { -// .calendar-component__form > button { -// width: 60px; -// height: 40px; -// } -//} -// -//@media (max-width: 460.98px) { -// .calendar-component__form > button { -// width: 56px; -// height: 40px; -// } -//} -// -//@media (max-width: 440.98px) { -// .calendar-component__form > button { -// width: 52px; -// height: 40px; -// } -//} -// -//@media (max-width: 428.98px) { -// .calendar-component__form > button { -// width: 50px; -// height: 40px; -// } -//} -// -//@media (max-width: 414.98px) { -// .calendar-component__form > button { -// width: 49px; -// height: 40px; -// } -//} -// -//@media (max-width: 395.98px) { -// .calendar-component__form > button { -// width: 46px; -// height: 40px; -// } -//} -// -//@media (max-width: 350.98px) { -// .calendar-component__form > button { -// width: 44px; -// height: 40px; -// } -//} -// -//@media (max-width: 349.98px) { -// .calendar-component__form > button { -// width: 42px; -// height: 40px; -// } -//} -// -//@media (max-width: 346.98px) { -// .calendar-component__form > button { -// width: 40px; -// height: 40px; -// } -//} - .calendar__icon { margin-right: 10px; margin-top: -4px; diff --git a/src/components/Candidate/Candidate.js b/src/components/Candidate/Candidate.js index d22dfc28..2176f94b 100644 --- a/src/components/Candidate/Candidate.js +++ b/src/components/Candidate/Candidate.js @@ -7,6 +7,7 @@ import Sidebar from "../CandidateSidebar/CandidateSidebar"; import { ProfileHeader } from "../ProfileHeader/ProfileHeader"; import { ProfileBreadcrumbs } from "../ProfileBreadcrumbs/ProfileBreadcrumbs"; import { Footer } from "../Footer/Footer"; +import { Navigation } from "../Navigation/Navigation"; import { currentCandidate, @@ -16,17 +17,17 @@ import { import { apiRequest } from "../../api/request"; import { createMarkup } from "../../helper"; -import gitImgItem from "../../images/gitItemImg.png"; +import gitImgItem from "../../images/gitItemImg.svg"; + import rectangle from "../../images/rectangle_secondPage.png"; -import front from "../Outstaffing/images/front_end.png"; -import back from "../Outstaffing/images/back_end.png"; -import design from "../Outstaffing/images/design.png"; -import rightArrow from "../../images/arrowRight.png"; +import front from "../../images/front-end.webp"; +import back from "../../images/back-end.webp"; +import design from "../../images/design.webp"; +import rightArrow from "../../images/arrowRight.svg"; import { LEVELS, SKILLS } from "../../constants/constants"; import "./candidate.scss"; -import { Navigation } from "../Navigation/Navigation"; const Candidate = () => { if (localStorage.getItem("role_status") !== "18") { diff --git a/src/components/CandidateSidebar/CandidateSidebar.js b/src/components/CandidateSidebar/CandidateSidebar.jsx similarity index 98% rename from src/components/CandidateSidebar/CandidateSidebar.js rename to src/components/CandidateSidebar/CandidateSidebar.jsx index 2062cf02..32cf2e99 100644 --- a/src/components/CandidateSidebar/CandidateSidebar.js +++ b/src/components/CandidateSidebar/CandidateSidebar.jsx @@ -1,8 +1,8 @@ import React, { useState } from "react"; -import { Link } from "react-router-dom"; -import { Achievement } from "../Achievement/Achievement"; +import { Achievement } from "../Achievement/Achievement"; import ModalAspt from "../UI/ModalAspt/ModalAspt"; + import { urlForLocal } from "../../helper"; import { LEVELS, SKILLS } from "../../constants/constants"; diff --git a/src/components/CardControl/CardControl.js b/src/components/CardControl/CardControl.js index 3458ebea..7db33a28 100644 --- a/src/components/CardControl/CardControl.js +++ b/src/components/CardControl/CardControl.js @@ -1,20 +1,23 @@ -import React from 'react' -import rightArrow from "../../images/arrowRight.png" -import { Link } from 'react-router-dom' -import './CardControl.scss' +import React from "react"; +import { Link } from "react-router-dom"; -export const CardControl = ({title,path,description, img}) => { - return ( - -
- itemImg -

{title}

-
-
-

-
- arrow -
-
- ) -} +import rightArrow from "../../images/arrowRight.svg"; + +import "./CardControl.scss"; + +export const CardControl = ({ title, path, description, img }) => { + return ( + +
+ itemImg +

{title}

+
+
+

+
+ arrow +
+
+ + ); +}; diff --git a/src/components/CategoriesItem/CategoriesItem.js b/src/components/CategoriesItem/CategoriesItem.js index 97b472b3..2800c4ff 100644 --- a/src/components/CategoriesItem/CategoriesItem.js +++ b/src/components/CategoriesItem/CategoriesItem.js @@ -1,25 +1,30 @@ import React from "react"; -import {Link} from "react-router-dom"; +import { Link } from "react-router-dom"; -import rightArrow from "../../images/arrowRight.png" +import rightArrow from "../../images/arrowRight.svg"; -import './categoriesItem.scss' +import "./categoriesItem.scss"; -export const CategoriesItem = ({img, title, skills, available, link}) => { - return( - -
- img -
{title}
-
-
-

{skills}

-
- arrow -
-
- - ) +export const CategoriesItem = ({ img, title, skills, available, link }) => { + return ( + +
+ img +
{title}
+
+
+

{skills}

+
+ arrow +
+
+ + ); }; -export default CategoriesItem +export default CategoriesItem; diff --git a/src/components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem.jsx b/src/components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem.jsx index 6b37482c..4de0c3a5 100644 --- a/src/components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem.jsx +++ b/src/components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem.jsx @@ -1,14 +1,17 @@ import React from "react"; -import "./FrequentlyAskedQuestionsItem.scss"; -import { FREQUENTLY_ASKED_QUESTION_ROUTE } from "../../constants/router-path"; import { Link } from "react-router-dom"; + import questionIcon from "./../../images/faq/question.svg"; +import "./FrequentlyAskedQuestionsItem.scss"; + export const FrequentlyAskedQuestionsItem = ({ rubric }) => { return (
-
+
+ +
{rubric?.title}
@@ -16,7 +19,7 @@ export const FrequentlyAskedQuestionsItem = ({ rubric }) => { {rubric?.questions?.map((question) => (

{question.title}

diff --git a/src/components/Outstaffing/Outstaffing.js b/src/components/Outstaffing/Outstaffing.js index bb8cb335..aa812032 100644 --- a/src/components/Outstaffing/Outstaffing.js +++ b/src/components/Outstaffing/Outstaffing.js @@ -1,28 +1,30 @@ -import React from 'react' -import {useSelector, useDispatch} from 'react-redux' +import React from "react"; +import { useSelector, useDispatch } from "react-redux"; -import OutstaffingBlock from '../OutstaffingBlock/OutstaffingBlock' -import TagSelect from '../Select/TagSelect' +import OutstaffingBlock from "../OutstaffingBlock/OutstaffingBlock"; +import TagSelect from "../Select/TagSelect"; -import {selectTags, getPositionId, setPositionId} from '../../redux/outstaffingSlice' - -import front from './images/front_end.png' -import back from './images/back_end.png' -import design from './images/design.png' - -import './outstaffing.scss' +import { + selectTags, + getPositionId, + setPositionId, +} from "../../redux/outstaffingSlice"; +import front from "../../images/front-end.webp"; +import back from "../../images/back-end.webp"; +import design from "../../images/design.webp"; +import "./outstaffing.scss"; const createSelectPositionHandler = - ({positionId, setPositionId, dispatch}) => - (id) => { - if (id === positionId) { - dispatch(setPositionId(null)) - } else { - dispatch(setPositionId(id)) - } - }; + ({ positionId, setPositionId, dispatch }) => + (id) => { + if (id === positionId) { + dispatch(setPositionId(null)); + } else { + dispatch(setPositionId(id)); + } + }; const Outstaffing = () => { const dispatch = useDispatch(); @@ -32,56 +34,56 @@ const Outstaffing = () => { const onSelectPosition = createSelectPositionHandler({ positionId, setPositionId, - dispatch + dispatch, }); return ( - <> -
-
-
- tag.name === 'skills_front') - } - img={front} - header='Frontend разработчики' - positionId='2' - isSelected={positionId === '2'} - onSelect={(id) => onSelectPosition(id)} - /> -
-
- tag.name === 'skills_back') - } - img={back} - header='Backend разработчики' - positionId='1' - isSelected={positionId === '1'} - onSelect={(id) => onSelectPosition(id)} - /> -
-
- tag.name === 'skills_design') - } - img={design} - header='Дизайн проектов' - positionId='5' - isSelected={positionId === '5'} - onSelect={(id) => onSelectPosition(id)} - /> -
+ <> +
+
+
+ tag.name === "skills_front") + } + img={front} + header="Frontend разработчики" + positionId="2" + isSelected={positionId === "2"} + onSelect={(id) => onSelectPosition(id)} + />
-
- - - ) +
+ tag.name === "skills_back") + } + img={back} + header="Backend разработчики" + positionId="1" + isSelected={positionId === "1"} + onSelect={(id) => onSelectPosition(id)} + /> +
+
+ tag.name === "skills_design") + } + img={design} + header="Дизайн проектов" + positionId="5" + isSelected={positionId === "5"} + onSelect={(id) => onSelectPosition(id)} + /> +
+
+
+ + + ); }; -export default Outstaffing +export default Outstaffing; diff --git a/src/components/Outstaffing/images/back_end.png b/src/components/Outstaffing/images/back_end.png deleted file mode 100644 index 53878fec57f0ad064f987a77eca2d66b92d489ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15671 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 diff --git a/src/components/Outstaffing/images/design.png b/src/components/Outstaffing/images/design.png deleted file mode 100644 index 903253b007d38103eb5f3612d968782723669ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19430 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ⅆ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 diff --git a/src/components/features/quiz/CardAviableTest.js b/src/components/features/quiz/CardAviableTest.js index cae6eff0..195672d0 100644 --- a/src/components/features/quiz/CardAviableTest.js +++ b/src/components/features/quiz/CardAviableTest.js @@ -1,34 +1,38 @@ -import React from 'react' -import { Link } from 'react-router-dom' -import rightArrow from "../../../images/arrowRight.png" -import StarRating from '../../StarRating/StarRating' +import React from "react"; +import { Link } from "react-router-dom"; +import rightArrow from "../../../images/arrowRight.svg"; +import StarRating from "../../StarRating/StarRating"; export const CardAvailableTest = ({ title, description, path, passedTest }) => { - - return ( -
- -
+
+ +
-

{title}

+

{title}

-
+

-
- arrow +
+ arrow
- {passedTest &&
-

- Получить отчет по тестированию -

- Отчет по тесту -
} + {passedTest && ( +
+

Получить отчет по тестированию

+ Отчет по тесту +
+ )}
- ) -} - + ); +}; diff --git a/src/constants/router-path.js b/src/constants/router-path.js deleted file mode 100644 index c32efe54..00000000 --- a/src/constants/router-path.js +++ /dev/null @@ -1,2 +0,0 @@ -export const FREQUENTLY_ASKED_QUESTIONS_ROUTE = "/frequently-asked-questions"; -export const FREQUENTLY_ASKED_QUESTION_ROUTE = "/frequently-asked-question"; diff --git a/src/images/arrowRight.png b/src/images/arrowRight.png deleted file mode 100644 index fab8d93922dcded80bd38713eb54be73c3236cf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&L!3HFEdh;y=Qk(@Ik;M!Q+`=Ht$S`Y;1W=H% zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFKz^&Ii(^Oy + + + + + + + + diff --git a/src/images/back-end.webp b/src/images/back-end.webp new file mode 100644 index 0000000000000000000000000000000000000000..b741daad72b455ba9fe516ef7341b9801395fd05 GIT binary patch literal 2994 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 literal 0 HcmV?d00001 diff --git a/src/images/design.webp b/src/images/design.webp new file mode 100644 index 0000000000000000000000000000000000000000..9a572ebe1a043e14790cf53bc733f0433732f159 GIT binary patch literal 3192 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 + + + + + + + + diff --git a/src/images/userIcon.png b/src/images/userIcon.png deleted file mode 100644 index f22b899a649533b98978384a349061bd273ba89c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmV z@=%ThL2KvEC%4bA?lp|ubGtusIXVTv5e!Pb4oJ{n+a0pB&bhaHfr(Yj5lqq1wsC#Ro506QTg zthi>UR1vg1?@JVTLSm0ek6PL95kZ4JIJ~0n$8MmXVVnWD2d|UX1$+@VaEVfyWpXTZ zlO_8V)ZW1999`x3j-e1Qq;IxuqrVi87gS6kCRNTGfP$!-Nu_|}T43%2pxGXmDT#5d z7&BVM3^!$4m1%-8taGG7vKusmVPnSqmjvVaUQM|UD^C4k8I@n9g3h#8ms8qC&(#X4 p5BQD*ZEZ}0e^ER9c!7UJ@d5mnjj@y_3flkx002ovPDHLkV1j+)%GLk? diff --git a/src/images/userIcon.svg b/src/images/userIcon.svg new file mode 100644 index 00000000..5b71af7d --- /dev/null +++ b/src/images/userIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/pages/AuthForCandidate/AuthForCandidate.jsx b/src/pages/AuthForCandidate/AuthForCandidate.jsx index 05bf8fe2..a6610a4c 100644 --- a/src/pages/AuthForCandidate/AuthForCandidate.jsx +++ b/src/pages/AuthForCandidate/AuthForCandidate.jsx @@ -1,188 +1,207 @@ -import React, {useEffect, useRef, useState} from "react"; -import {loading, selectIsLoading} from "../../redux/loaderSlice"; -import {apiRequest} from "../../api/request"; -import {auth, selectAuth, setUserInfo} from "../../redux/outstaffingSlice"; -import {setRole} from "../../redux/roleSlice"; -import {useDispatch, useSelector} from "react-redux"; +import React, { useEffect, useRef, useState } from "react"; +import { loading, selectIsLoading } from "../../redux/loaderSlice"; +import { apiRequest } from "../../api/request"; +import { auth, selectAuth, setUserInfo } from "../../redux/outstaffingSlice"; +import { setRole } from "../../redux/roleSlice"; +import { useDispatch, useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; import AuthHeader from "../../components/AuthHeader/AuthHeader"; import SideBar from "../../components/SideBar/SideBar"; -import CategoriesItem from "../../components/CategoriesItem/CategoriesItem" -import StepsForCandidate from "../../components/StepsForCandidate/StepsForCandidate" -import {Footer} from "../../components/Footer/Footer"; +import CategoriesItem from "../../components/CategoriesItem/CategoriesItem"; +import StepsForCandidate from "../../components/StepsForCandidate/StepsForCandidate"; +import { Footer } from "../../components/Footer/Footer"; -import BackEndImg from "../../pages/PartnerСategories/images/personalBackEnd.png" -import FrontendImg from "../../pages/PartnerСategories/images/PersonalFrontend.png" -import ArchitectureImg from "../../pages/PartnerСategories/images/PersonalArchitecture.png" -import DesignImg from "../../pages/PartnerСategories/images/PersonalDesign.png" -import TestImg from "../../pages/PartnerСategories/images/PersonalTesters.png" -import AdminImg from "../../pages/PartnerСategories/images/PersonalAdmin.png" -import ManageImg from "../../pages/PartnerСategories/images/PersonalMng.png" -import CopyImg from "../../pages/PartnerСategories/images/PersonalCopy.png" -import SmmImg from "../../pages/PartnerСategories/images/PersonalSMM.png" +import BackEndImg from "../../pages/PartnerСategories/images/personalBackEnd.png"; +import FrontendImg from "../../pages/PartnerСategories/images/PersonalFrontend.png"; +import ArchitectureImg from "../../pages/PartnerСategories/images/PersonalArchitecture.png"; +import DesignImg from "../../pages/PartnerСategories/images/PersonalDesign.png"; +import TestImg from "../../pages/PartnerСategories/images/PersonalTesters.png"; +import AdminImg from "../../pages/PartnerСategories/images/PersonalAdmin.png"; +import ManageImg from "../../pages/PartnerСategories/images/PersonalMng.png"; +import CopyImg from "../../pages/PartnerСategories/images/PersonalCopy.png"; +import SmmImg from "../../pages/PartnerСategories/images/PersonalSMM.png"; -import authImg from "../../images/authCandidateFormImg.png" -import arrowBtn from "../../images/arrowRight.png"; +import authImg from "../../images/authCandidateFormImg.png"; +import arrowBtn from "../../images/arrowRight.svg"; -import './authForCandidate.scss'; +import "./authForCandidate.scss"; export const AuthForCandidate = () => { + const isLoading = useSelector(selectIsLoading); + const ref = useRef(); + const dispatch = useDispatch(); + const isAuth = useSelector(selectAuth); + let navigate = useNavigate(); + const getToken = localStorage.getItem("auth_token"); - const isLoading = useSelector(selectIsLoading); - const ref = useRef(); - const dispatch = useDispatch(); - const isAuth = useSelector(selectAuth); - let navigate = useNavigate(); - const getToken = localStorage.getItem("auth_token"); + const [personalInfoItems] = useState([ + { + title: "Backend разработчики", + link: "/registration-candidate", + description: + "Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript", + available: true, + img: BackEndImg, + }, + { + title: "Frontend разработчики", + link: "/registration-candidate", + description: + "Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript", + available: true, + img: FrontendImg, + }, + { + title: "Архитектура проектов", + link: "/registration-candidate", + description: "Потоки данных ER ERP CRM CQRS UML BPMN", + available: true, + img: ArchitectureImg, + }, + { + title: "Дизайн проектов", + link: "/registration-candidate", + description: + "Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript", + available: true, + img: DesignImg, + }, + { + title: "Тестирование проектов", + link: "/registration-candidate", + description: "SQL Postman TestRail Kibana Ручное тестирование", + available: false, + img: TestImg, + }, + { + title: "Администрирование проектов", + link: "/registration-candidate", + description: "DevOps ELK Kubernetes Docker Bash Apache Oracle Git", + available: false, + img: AdminImg, + }, + { + title: "Управление проектом", + link: "/registration-candidate", + description: "Scrum Kanban Agile Miro CustDev", + available: false, + img: ManageImg, + }, + { + title: "Копирайтинг проектов", + link: "/registration-candidate", + description: "Теги Заголовок H1 Дескриптор Абзац Сценарий", + available: false, + img: CopyImg, + }, + { + title: "Реклама и SMM", + link: "/registration-candidate", + description: + "Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript", + available: false, + img: SmmImg, + }, + ]); - const [personalInfoItems] = useState([ - { - title: 'Backend разработчики', - link: '/registration-candidate', - description: 'Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript', - available: true, - img: BackEndImg - }, - { - title: 'Frontend разработчики', - link: '/registration-candidate', - description: 'Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript', - available: true, - img: FrontendImg - }, - { - title: 'Архитектура проектов', - link: '/registration-candidate', - description: 'Потоки данных ER ERP CRM CQRS UML BPMN', - available: true, - img: ArchitectureImg - }, - { - title: 'Дизайн проектов', - link: '/registration-candidate', - description: 'Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript', - available: true, - img: DesignImg - }, - { - title: 'Тестирование проектов', - link: '/registration-candidate', - description: 'SQL Postman TestRail Kibana Ручное тестирование', - available: false, - img: TestImg - }, - { - title: 'Администрирование проектов', - link: '/registration-candidate', - description: 'DevOps ELK Kubernetes Docker Bash Apache Oracle Git', - available: false, - img: AdminImg - }, - { - title: 'Управление проектом', - link: '/registration-candidate', - description: 'Scrum Kanban Agile Miro CustDev', - available: false, - img: ManageImg - }, - { - title: 'Копирайтинг проектов', - link: '/registration-candidate', - description: 'Теги Заголовок H1 Дескриптор Абзац Сценарий', - available: false, - img: CopyImg - }, - { - title: 'Реклама и SMM', - link: '/registration-candidate', - description: 'Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript', - available: false, - img: SmmImg - }, - ]); + useEffect(() => { + if (isAuth || getToken) { + navigate("/profile"); + } + }, [getToken]); - useEffect(() => { - if (isAuth || getToken) { - navigate("/profile"); + const submitHandler = () => { + let formData = new FormData(ref.current); + if (!isLoading) { + dispatch(loading(true)); + apiRequest("/user/login", { + method: "POST", + data: formData, + }).then((res) => { + if (!res.access_token) { + dispatch(loading(false)); + } else { + localStorage.setItem("auth_token", res.access_token); + localStorage.setItem("id", res.id); + localStorage.setItem("cardId", res.card_id); + localStorage.setItem("role_status", res.status); + localStorage.setItem( + "access_token_expired_at", + res.access_token_expired_at + ); + dispatch(auth(true)); + dispatch(setUserInfo(res)); + dispatch(loading(false)); + dispatch(setRole("ROLE_PARTNER")); } - }, [getToken]); + }); + } + }; - const submitHandler = () => { - let formData = new FormData(ref.current); - if (!isLoading) { - dispatch(loading(true)); - apiRequest("/user/login", { - method: "POST", - data: formData, - }).then((res) => { - if (!res.access_token) { - dispatch(loading(false)); - } else { - localStorage.setItem("auth_token", res.access_token); - localStorage.setItem("id", res.id); - localStorage.setItem("cardId", res.card_id); - localStorage.setItem("role_status", res.status); - localStorage.setItem( - "access_token_expired_at", - res.access_token_expired_at - ); - dispatch(auth(true)); - dispatch(setUserInfo(res)); - dispatch(loading(false)); - dispatch(setRole("ROLE_PARTNER")); - } - }); - } - }; + return ( +
+ +
+
+
+

Войти, уже есть доступ

+ img +

+ если вы получили доступ пройдя 2 шага для входа или хотите узнать + свои результаты в кабинете +

+
+ + + - return( -
- -
-
-
-

Войти, уже есть доступ

- img -

если вы получили доступ пройдя 2 шага для входа или хотите узнать свои результаты в кабинете

-
- - - - - - - - -
-
-

Хочу в команду Айти специалистов

-
- -
-

Для нас не имеет значение Ваша локация.

-
- - {personalInfoItems.map((item, index) => { - return - }) - - } -
-
-
- -
+ + + +
- ) +
+

+ Хочу в команду Айти специалистов +

+
+ # +
+

+ Для нас не имеет значение Ваша локация. +

+
+ + {personalInfoItems.map((item, index) => { + return ( + + ); + })} +
+
+
+ +
+
+ ); }; diff --git a/src/pages/AuthForDevelopers/AuthForDevelopers.jsx b/src/pages/AuthForDevelopers/AuthForDevelopers.jsx index 55fa8c17..12baed45 100644 --- a/src/pages/AuthForDevelopers/AuthForDevelopers.jsx +++ b/src/pages/AuthForDevelopers/AuthForDevelopers.jsx @@ -1,24 +1,22 @@ -import React, { useEffect, useState } from "react"; - -import { AuthBox } from "../../components/AuthBox/AuthBox"; - +import React, { useEffect } from "react"; import { useSelector } from "react-redux"; -import arrow from "../../images/arrow__login_page.png"; -import medium from "../../images/medium_male_big.png"; -import cross from "../../images/cross.png"; -import text from "../../images/Body_Text.png"; -import arrowBtn from "../../images/arrowRight.png"; -import vector from "../../images/Vector_Smart_Object.png"; -import vectorBlack from "../../images/Vector_Smart_Object_black.png"; - -import { selectAuth } from "../../redux/outstaffingSlice"; -import { Link, useNavigate } from "react-router-dom"; -import { scrollToForm } from "../../helper"; import { Footer } from "../../components/Footer/Footer"; import SideBar from "../../components/SideBar/SideBar"; import AuthHeader from "../../components/AuthHeader/AuthHeader"; import SliderWorkers from "../../components/SliderWorkers/SliderWorkers"; +import { AuthBox } from "../../components/AuthBox/AuthBox"; +import { selectAuth } from "../../redux/outstaffingSlice"; +import { Link, useNavigate } from "react-router-dom"; +import { scrollToForm } from "../../helper"; + +import arrow from "../../images/arrow__login_page.png"; +import medium from "../../images/medium_male_big.png"; +import cross from "../../images/cross.png"; +import text from "../../images/Body_Text.png"; +import arrowBtn from "../../images/arrowRight.svg"; +import vector from "../../images/Vector_Smart_Object.png"; +import vectorBlack from "../../images/Vector_Smart_Object_black.png"; import "./authForDevelopers.scss"; diff --git a/src/pages/AuthForPartners/AuthForPartners.js b/src/pages/AuthForPartners/AuthForPartners.js index 3d0dc919..855a2074 100644 --- a/src/pages/AuthForPartners/AuthForPartners.js +++ b/src/pages/AuthForPartners/AuthForPartners.js @@ -1,16 +1,4 @@ import React, { useEffect } from "react"; -import arrow from "../../images/arrow__login_page.png"; -import authImg from "../../images/auth_img.png"; -import cross from "../../images/cross.png"; -import text from "../../images/Body_Text.png"; -import arrowBtn from "../../images/arrowRight.png"; -import vector from "../../images/Vector_Smart_Object.png"; -import vectorBlack from "../../images/Vector_Smart_Object_black.png"; - -import { useSelector } from "react-redux"; -import { selectAuth } from "../../redux/outstaffingSlice"; -import { Link, useNavigate } from "react-router-dom"; -import { scrollToForm } from "../../helper"; import { Footer } from "../../components/Footer/Footer"; import { AuthBox } from "../../components/AuthBox/AuthBox"; @@ -18,6 +6,19 @@ import SideBar from "../../components/SideBar/SideBar"; import AuthHeader from "../../components/AuthHeader/AuthHeader"; import SliderWorkers from "../../components/SliderWorkers/SliderWorkers"; +import { useSelector } from "react-redux"; +import { selectAuth } from "../../redux/outstaffingSlice"; +import { Link, useNavigate } from "react-router-dom"; +import { scrollToForm } from "../../helper"; + +import arrow from "../../images/arrow__login_page.png"; +import authImg from "../../images/auth_img.png"; +import cross from "../../images/cross.png"; +import text from "../../images/Body_Text.png"; +import arrowBtn from "../../images/arrowRight.svg"; +import vector from "../../images/Vector_Smart_Object.png"; +import vectorBlack from "../../images/Vector_Smart_Object_black.png"; + import "./authForPartners.scss"; const AuthForPartners = () => { diff --git a/src/pages/FrequentlyAskedQuestion/FrequentlyAskedQuestion.jsx b/src/pages/FrequentlyAskedQuestion/FrequentlyAskedQuestion.jsx index e51a8dcc..cb26f36a 100644 --- a/src/pages/FrequentlyAskedQuestion/FrequentlyAskedQuestion.jsx +++ b/src/pages/FrequentlyAskedQuestion/FrequentlyAskedQuestion.jsx @@ -1,19 +1,18 @@ +import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router"; + import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; import SideBar from "../../components/SideBar/SideBar"; import AuthHeader from "../../components/AuthHeader/AuthHeader"; import { Footer } from "../../components/Footer/Footer"; -import arrowBtn from "../../images/arrowRight.png"; + +import arrowBtn from "../../images/arrowRight.svg"; + import "./FrequentlyAskedQuestion.scss"; -import { useEffect, useState } from "react"; -import { - FREQUENTLY_ASKED_QUESTIONS_ROUTE, - FREQUENTLY_ASKED_QUESTION_ROUTE, -} from "../../constants/router-path"; export const FrequentlyAskedQuestion = () => { const params = useParams(); - const navigate = useNavigate() + const navigate = useNavigate(); const [question, setQuestion] = useState({ id: params.id, title: "Это фриланс-платформа?", @@ -35,16 +34,19 @@ export const FrequentlyAskedQuestion = () => { { name: "Главная", link: "/auth" }, { name: "FAQ (часто задаваемые вопросы)", - link: FREQUENTLY_ASKED_QUESTIONS_ROUTE, + link: "/frequently-asked-questions", }, { name: question.title, - link: FREQUENTLY_ASKED_QUESTION_ROUTE + "/" + params.id, + link: `/frequently-asked-question/${params.id}`, }, ]} />
{question.title}
-
navigate(-1)}> +
navigate(-1)} + >
diff --git a/src/pages/FrequentlyAskedQuestions/FrequentlyAskedQuestions.jsx b/src/pages/FrequentlyAskedQuestions/FrequentlyAskedQuestions.jsx index c3cbbf2a..20e927fb 100644 --- a/src/pages/FrequentlyAskedQuestions/FrequentlyAskedQuestions.jsx +++ b/src/pages/FrequentlyAskedQuestions/FrequentlyAskedQuestions.jsx @@ -1,78 +1,83 @@ import React from "react"; -import "./FrequentlyAskedQuestions.scss"; + +import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; +import { Footer } from "../../components/Footer/Footer"; +import { FrequentlyAskedQuestionsItem } from "../../components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem"; + import AuthHeader from "../../components/AuthHeader/AuthHeader"; import SideBar from "../../components/SideBar/SideBar"; import arrow from "./../../images/faq/arrow.svg"; -import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; -import { Footer } from "../../components/Footer/Footer"; -import { FREQUENTLY_ASKED_QUESTIONS_ROUTE } from "../../constants/router-path"; -import { FrequentlyAskedQuestionsItem } from "../../components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem"; +import "./FrequentlyAskedQuestions.scss"; export const FrequentlyAskedQuestions = () => { - const rubrics = [ { - title: 'Общие вопросы ', + title: "Общие вопросы ", questions: [ { id: 1, - title: 'Это фриланс-платформа?' + title: "Это фриланс-платформа?", }, { id: 2, - title: 'Чем вы отличаетесь от традиционного процесса выбора исполнителя?' + title: + "Чем вы отличаетесь от традиционного процесса выбора исполнителя?", }, { id: 3, - title: 'Это фриланс-платформа?' + title: "Это фриланс-платформа?", }, { id: 4, - title: 'Чем вы отличаетесь от традиционного процесса выбора исполнителя?' - } - ] + title: + "Чем вы отличаетесь от традиционного процесса выбора исполнителя?", + }, + ], }, { - title: 'Поиск специалиста', + title: "Поиск специалиста", questions: [ { id: 11, - title: 'Это фриланс-платформа?' + title: "Это фриланс-платформа?", }, { id: 22, - title: 'Чем вы отличаетесь от традиционного процесса выбора исполнителя?' + title: + "Чем вы отличаетесь от традиционного процесса выбора исполнителя?", }, { id: 33, - title: 'Это фриланс-платформа?' + title: "Это фриланс-платформа?", }, { id: 44, - title: 'Чем вы отличаетесь от традиционного процесса выбора исполнителя?' - } - ] + title: + "Чем вы отличаетесь от традиционного процесса выбора исполнителя?", + }, + ], }, { - title: 'Бронирование специалиста', + title: "Бронирование специалиста", questions: [ { id: 11, - title: 'Это фриланс-платформа?' - } - ] + title: "Это фриланс-платформа?", + }, + ], }, { - title: 'Работа с выбранным специалистом', + title: "Работа с выбранным специалистом", questions: [ { id: 11, - title: 'Чем вы отличаетесь от традиционного процесса выбора исполнителя?' - } - ] + title: + "Чем вы отличаетесь от традиционного процесса выбора исполнителя?", + }, + ], }, - ] + ]; return (
@@ -83,7 +88,10 @@ export const FrequentlyAskedQuestions = () => {
@@ -98,13 +106,12 @@ export const FrequentlyAskedQuestions = () => {
- { - rubrics.map((rubric,index)=>) - } -
+ {rubrics.map((rubric, index) => ( + + ))} +
-
+
); }; - diff --git a/src/pages/PartnerEmployees/PartnerEmployees.js b/src/pages/PartnerEmployees/PartnerEmployees.js index 1cc064ce..c32d1523 100644 --- a/src/pages/PartnerEmployees/PartnerEmployees.js +++ b/src/pages/PartnerEmployees/PartnerEmployees.js @@ -1,74 +1,85 @@ -import React from 'react'; -import {Link, Navigate} from "react-router-dom"; -import {useSelector} from "react-redux"; -import {getPartnerEmployees} from "../../redux/outstaffingSlice"; +import React from "react"; +import { Link, Navigate } from "react-router-dom"; +import { useSelector } from "react-redux"; +import { getPartnerEmployees } from "../../redux/outstaffingSlice"; -import {ProfileHeader} from "../../components/ProfileHeader/ProfileHeader"; -import {ProfileBreadcrumbs} from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs" -import {Footer} from "../../components/Footer/Footer"; +import { ProfileHeader } from "../../components/ProfileHeader/ProfileHeader"; +import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; +import { Footer } from "../../components/Footer/Footer"; -import imgInfo from "./emplInfo.png" -import rightArrow from "../../images/arrowRight.png" +import imgInfo from "./emplInfo.png"; +import rightArrow from "../../images/arrowRight.svg"; -import "./partnerEmployees.scss" +import "./partnerEmployees.scss"; export const PartnerEmployees = () => { - const partnerEmployees = useSelector(getPartnerEmployees); - if(localStorage.getItem('role_status') !== '18' || !partnerEmployees.length) { - return - } - return( -
- -
- -

Backend разработчики

-
- {partnerEmployees.map((person) => { - return
-
- avatar -

{person.name}

-
-
-
-
{person.qualification}
- {person.level} -
- img -

Данные и резюме

- - arrow - -
-
-
- Проект: -
{person.project}
-
-
-

Открытые задачи

- {person.tasks_in_progress} -
-
-

Отработанных часов в марте

- {person.month_hours} -
-
-
-
-
- }) - - } + const partnerEmployees = useSelector(getPartnerEmployees); + if ( + localStorage.getItem("role_status") !== "18" || + !partnerEmployees.length + ) { + return ; + } + return ( +
+ +
+ +

Backend разработчики

+
+ {partnerEmployees.map((person) => { + return ( +
+
+ avatar +

{person.name}

-
-
+
+
+
{person.qualification}
+ {person.level} +
+ img +

Данные и резюме

+ + arrow + +
+
+
+ Проект: +
{person.project}
+
+
+

Открытые задачи

+ + {person.tasks_in_progress} + +
+
+

+ Отработанных часов в марте +

+ {person.month_hours} +
+
+
+
+
+ ); + })}
- ) -} +
+
+
+ ); +}; diff --git a/src/pages/PartnerСategories/PartnerСategories.js b/src/pages/PartnerСategories/PartnerСategories.js index 00704371..243a7f24 100644 --- a/src/pages/PartnerСategories/PartnerСategories.js +++ b/src/pages/PartnerСategories/PartnerСategories.js @@ -1,171 +1,186 @@ -import React, {useState} from 'react'; -import {Link} from "react-router-dom"; -import {Navigate} from "react-router-dom"; -import {useDispatch} from "react-redux"; +import React, { useState } from "react"; +import { Link } from "react-router-dom"; +import { Navigate } from "react-router-dom"; +import { useDispatch } from "react-redux"; -import {ProfileHeader} from "../../components/ProfileHeader/ProfileHeader"; -import {ProfileBreadcrumbs} from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs" -import {Footer} from "../../components/Footer/Footer"; +import { ProfileHeader } from "../../components/ProfileHeader/ProfileHeader"; +import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; +import { Footer } from "../../components/Footer/Footer"; -import {setPartnerEmployees} from "../../redux/outstaffingSlice"; +import { setPartnerEmployees } from "../../redux/outstaffingSlice"; -import BackEndImg from "./images/personalBackEnd.png" -import FrontendImg from "./images/PersonalFrontend.png" -import ArchitectureImg from "./images/PersonalArchitecture.png" -import DesignImg from "./images/PersonalDesign.png" -import TestImg from "./images/PersonalTesters.png" -import AdminImg from "./images/PersonalAdmin.png" -import ManageImg from "./images/PersonalMng.png" -import CopyImg from "./images/PersonalCopy.png" -import SmmImg from "./images/PersonalSMM.png" -import rightArrow from "../../images/arrowRight.png" +import BackEndImg from "./images/personalBackEnd.png"; +import FrontendImg from "./images/PersonalFrontend.png"; +import ArchitectureImg from "./images/PersonalArchitecture.png"; +import DesignImg from "./images/PersonalDesign.png"; +import TestImg from "./images/PersonalTesters.png"; +import AdminImg from "./images/PersonalAdmin.png"; +import ManageImg from "./images/PersonalMng.png"; +import CopyImg from "./images/PersonalCopy.png"; +import SmmImg from "./images/PersonalSMM.png"; +import rightArrow from "../../images/arrowRight.svg"; import avatarImg from "../PartnerEmployees/avatarMok.png"; -import "./partnerСategories.scss" -import { Navigation } from '../../components/Navigation/Navigation'; +import "./partnerСategories.scss"; +import { Navigation } from "../../components/Navigation/Navigation"; export const PartnerCategories = () => { - const dispatch = useDispatch(); - if(localStorage.getItem('role_status') !== '18') { - return - } + const dispatch = useDispatch(); + if (localStorage.getItem("role_status") !== "18") { + return ; + } - const [personalInfoItems] = useState([ - { - title: 'Backend разработчики', - link: '/profile/categories/employees', - description: 'Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript', - available: true, - img: BackEndImg - }, - { - title: 'Frontend разработчики', - link: '/profile/categories/employees', - description: 'Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript', - available: true, - img: FrontendImg - }, - { - title: 'Архитектура проектов', - link: '/profile/categories/employees', - description: 'Потоки данных ER ERP CRM CQRS UML BPMN', - available: true, - img: ArchitectureImg - }, - { - title: 'Дизайн проектов', - link: '/profile/categories/employees', - description: 'Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript', - available: true, - img: DesignImg - }, - { - title: 'Тестирование проектов', - link: '/profile/add-request', - description: 'SQL Postman TestRail Kibana Ручное тестирование', - available: false, - img: TestImg - }, - { - title: 'Администрирование проектов', - link: '/profile/add-request', - description: 'DevOps ELK Kubernetes Docker Bash Apache Oracle Git', - available: false, - img: AdminImg - }, - { - title: 'Управление проектом', - link: '/profile/add-request', - description: 'Scrum Kanban Agile Miro CustDev', - available: false, - img: ManageImg - }, - { - title: 'Копирайтинг проектов', - link: '/profile/add-request', - description: 'Теги Заголовок H1 Дескриптор Абзац Сценарий', - available: false, - img: CopyImg - }, - { - title: 'Реклама и SMM', - link: '/profile/add-request', - description: 'Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript', - available: false, - img: SmmImg - }, - ]) + const [personalInfoItems] = useState([ + { + title: "Backend разработчики", + link: "/profile/categories/employees", + description: + "Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript", + available: true, + img: BackEndImg, + }, + { + title: "Frontend разработчики", + link: "/profile/categories/employees", + description: + "Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript", + available: true, + img: FrontendImg, + }, + { + title: "Архитектура проектов", + link: "/profile/categories/employees", + description: "Потоки данных ER ERP CRM CQRS UML BPMN", + available: true, + img: ArchitectureImg, + }, + { + title: "Дизайн проектов", + link: "/profile/categories/employees", + description: + "Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript", + available: true, + img: DesignImg, + }, + { + title: "Тестирование проектов", + link: "/profile/add-request", + description: "SQL Postman TestRail Kibana Ручное тестирование", + available: false, + img: TestImg, + }, + { + title: "Администрирование проектов", + link: "/profile/add-request", + description: "DevOps ELK Kubernetes Docker Bash Apache Oracle Git", + available: false, + img: AdminImg, + }, + { + title: "Управление проектом", + link: "/profile/add-request", + description: "Scrum Kanban Agile Miro CustDev", + available: false, + img: ManageImg, + }, + { + title: "Копирайтинг проектов", + link: "/profile/add-request", + description: "Теги Заголовок H1 Дескриптор Абзац Сценарий", + available: false, + img: CopyImg, + }, + { + title: "Реклама и SMM", + link: "/profile/add-request", + description: + "Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript", + available: false, + img: SmmImg, + }, + ]); - const [mokPersons] = useState([ - { - personAvatar: avatarImg, - name: "Макаренко Дмитрий", - qualification: "PHP Backend - разработчик", - level: "Middle", - project: "Админка НВД Консалтинг", - tasks_in_progress: 5, - month_hours: 140, - id: 1 - }, - { - personAvatar: avatarImg, - name: "Макаренко Дмитрий", - qualification: "PHP Backend - разработчик", - level: "Middle", - project: "Админка НВД Консалтинг", - tasks_in_progress: 5, - month_hours: 140, - id: 2 - }, - { - personAvatar: avatarImg, - name: "Макаренко Дмитрий", - qualification: "PHP Backend - разработчик", - level: "Middle", - project: "Админка НВД Консалтинг", - tasks_in_progress: 5, - month_hours: 140, - id: 3 - }, - ]) - return ( -
- - -
- -

Данные персонала

-
- {personalInfoItems.map((item, index) => { - return { - dispatch(setPartnerEmployees(mokPersons)) - }}> -
- {item.title} -

{item.title}

-
-
-

{item.description}

-
- arrow -
-
- {!item.available && -
-

У вас нет персонала из категории

- -
- } - - })} + const [mokPersons] = useState([ + { + personAvatar: avatarImg, + name: "Макаренко Дмитрий", + qualification: "PHP Backend - разработчик", + level: "Middle", + project: "Админка НВД Консалтинг", + tasks_in_progress: 5, + month_hours: 140, + id: 1, + }, + { + personAvatar: avatarImg, + name: "Макаренко Дмитрий", + qualification: "PHP Backend - разработчик", + level: "Middle", + project: "Админка НВД Консалтинг", + tasks_in_progress: 5, + month_hours: 140, + id: 2, + }, + { + personAvatar: avatarImg, + name: "Макаренко Дмитрий", + qualification: "PHP Backend - разработчик", + level: "Middle", + project: "Админка НВД Консалтинг", + tasks_in_progress: 5, + month_hours: 140, + id: 3, + }, + ]); + return ( +
+ + +
+ +

Данные персонала

+
+ {personalInfoItems.map((item, index) => { + return ( + { + dispatch(setPartnerEmployees(mokPersons)); + }} + > +
+ {item.title} +

{item.title}

-
-
+
+

{item.description}

+
+ arrow +
+
+ {!item.available && ( +
+

У вас нет персонала из категории

+ +
+ )} + + ); + })}
- ) -} +
+
+
+ ); +}; diff --git a/src/pages/RegistrationForCandidate/RegistrationForCandidate.js b/src/pages/RegistrationForCandidate/RegistrationForCandidate.js index b78b122e..9dc4e994 100644 --- a/src/pages/RegistrationForCandidate/RegistrationForCandidate.js +++ b/src/pages/RegistrationForCandidate/RegistrationForCandidate.js @@ -1,72 +1,78 @@ -import React from 'react'; +import React from "react"; import AuthHeader from "../../components/AuthHeader/AuthHeader"; import SideBar from "../../components/SideBar/SideBar"; -import StepsForCandidate from "../../components/StepsForCandidate/StepsForCandidate" -import {Footer} from "../../components/Footer/Footer"; +import StepsForCandidate from "../../components/StepsForCandidate/StepsForCandidate"; +import { Footer } from "../../components/Footer/Footer"; -import BackEndImg from "../../pages/PartnerСategories/images/personalBackEnd.png" -import arrowBtn from "../../images/arrowRight.png"; +import BackEndImg from "../../pages/PartnerСategories/images/personalBackEnd.png"; +import arrowBtn from "../../images/arrowRight.svg"; -import './registationForCandidate.scss' +import "./registationForCandidate.scss"; export const RegistrationForCandidate = () => { - return( -
- -
-
-

Хочу в команду Айти специалистов

-
- -
-

Для нас не имеет значение Ваша локация.

- -
-
-
- img -

Backend разработчики

-
-

Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript

-
- img -
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
-
-
+ return ( +
+ +
+
+

+ Хочу в команду Айти специалистов +

+
+ +
+

+ Для нас не имеет значение Ваша локация. +

+ +
+
+
+ img +

Backend разработчики

+
+

+ Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript +

+
+ img +
- -
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
- ) -} +
+ +
+
+ ); +}; diff --git a/src/pages/Summary/Summary.js b/src/pages/Summary/Summary.js index a07e8b4a..13590417 100644 --- a/src/pages/Summary/Summary.js +++ b/src/pages/Summary/Summary.js @@ -1,122 +1,152 @@ -import React, {useEffect, useState} from 'react'; -import {useSelector} from "react-redux"; -import {ProfileHeader} from "../../components/ProfileHeader/ProfileHeader"; -import {getProfileInfo} from "../../redux/outstaffingSlice"; -import {ProfileBreadcrumbs} from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs" -import {Footer} from '../../components/Footer/Footer' -import { urlForLocal} from "../../helper"; +import React, { useEffect, useState } from "react"; +import { useSelector } from "react-redux"; +import { Navigate } from "react-router-dom"; + +import { ProfileHeader } from "../../components/ProfileHeader/ProfileHeader"; +import { getProfileInfo } from "../../redux/outstaffingSlice"; +import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; +import { Footer } from "../../components/Footer/Footer"; +import { urlForLocal } from "../../helper"; +import { apiRequest } from "../../api/request"; +import { Navigation } from "../../components/Navigation/Navigation"; import arrow from "../../images/right-arrow.png"; -import rightArrow from "../../images/arrowRight.png" -import gitImgItem from "../../images/gitItemImg.png" +import rightArrow from "../../images/arrowRight.svg"; +import gitImgItem from "../../images/gitItemImg.svg"; -import {apiRequest} from "../../api/request"; -import {Navigate} from "react-router-dom"; -import { Navigation } from '../../components/Navigation/Navigation'; - -import './summary.scss' +import "./summary.scss"; export const Summary = () => { - if(localStorage.getItem('role_status') === '18') { - return - } + if (localStorage.getItem("role_status") === "18") { + return ; + } const profileInfo = useSelector(getProfileInfo); const [openGit, setOpenGit] = useState(false); const [gitInfo, setGitInfo] = useState([]); useEffect(() => { - apiRequest(`/profile/portfolio-projects?card_id=${localStorage.getItem('cardId')}`) - .then(responseGit => setGitInfo(responseGit)) + apiRequest( + `/profile/portfolio-projects?card_id=${localStorage.getItem("cardId")}` + ).then((responseGit) => setGitInfo(responseGit)); }, []); return ( -
- - -
-
- -

Ваше резюме {openGit && - Git}

- {openGit &&
setOpenGit(false)}> - arrow +
+ + +
+
+ +

+ Ваше резюме {openGit && - Git} +

+ {openGit && ( +
setOpenGit(false)}> + arrow

Вернуться

-
} -
-
- avatar -

{profileInfo.fio}, {profileInfo.specification} разработчик

-
- {!openGit && - - }
+ )} +
+
+ avatar +

+ {profileInfo.fio}, {profileInfo.specification} разработчик +

+
+ {!openGit && ( + + )}
- {!openGit && -
-
+
+ {!openGit && ( +
+

Основной стек

-
-
- {profileInfo.skillValues && profileInfo.skillValues.map((skill, index) => - {skill.skill.name} - {profileInfo.skillValues.length > index + 1 && ','} +
+
+ {profileInfo.skillValues && + profileInfo.skillValues.map((skill, index) => ( + + {skill.skill.name} + {profileInfo.skillValues.length > index + 1 && ","} - )} + ))}
- } - {profileInfo.vc_text && !openGit && -
-
+ )} + {profileInfo.vc_text && !openGit && ( +
+
-

Описание опыта работы

- -
-
+

Описание опыта работы

+
+
- } - {openGit && -
-
+ )} + {openGit && ( +
+

Страница портфолио кода разработчика

- -
+ )}
- ) +
+
+ ); }; - From 2ad78834f3f651e8c280c5e543b12b3b834e5c74 Mon Sep 17 00:00:00 2001 From: MaxOvs19 Date: Wed, 24 May 2023 15:34:43 +0300 Subject: [PATCH 02/15] Fixed copmonents --- config/paths.js | 10 +- config/webpack/analyze.js | 12 +- config/webpack/dev.js | 19 +- config/webpack/prod.js | 111 +++-- src/components/Achievement/Achievement.jsx | 20 +- src/components/Calendar/CalendarComponent.jsx | 2 +- .../Candidate/{Candidate.js => Candidate.jsx} | 1 - .../{CardControl.js => CardControl.jsx} | 0 src/components/CardControl/CardControl.scss | 128 +++--- .../{CategoriesItem.js => CategoriesItem.jsx} | 0 .../CategoriesItem/categoriesItem.scss | 7 +- .../{Description.js => Description.jsx} | 3 +- src/components/Footer/Footer.js | 49 -- src/components/Footer/Footer.jsx | 53 +++ src/components/Footer/footer.scss | 106 +---- src/components/Form/Form.js | 134 ------ src/components/Form/Form.jsx | 125 +++++ .../FrequentlyAskedQuestionsItem.scss | 10 +- src/components/Header/Header.js | 15 - src/components/Header/Header.jsx | 16 + src/components/Header/header.scss | 4 +- src/components/Loader/Loader.js | 12 - src/components/Loader/Loader.jsx | 17 + src/components/Loader/loader.scss | 1 + src/components/LogoutButton/LogoutButton.js | 33 -- src/components/LogoutButton/LogoutButton.jsx | 31 ++ src/components/LogoutButton/logoutButton.scss | 3 +- .../{Outstaffing.js => Outstaffing.jsx} | 1 - .../OutstaffingBlock/OutstaffingBlock.js | 118 ----- .../OutstaffingBlock/OutstaffingBlock.jsx | 126 ++++++ .../OutstaffingBlock/outstaffingBlock.scss | 12 +- .../ProfileBreadcrumbs/ProfileBreadcrumbs.js | 16 - .../ProfileBreadcrumbs/ProfileBreadcrumbs.jsx | 18 + .../profileBreadcrumbs.scss | 6 +- ...ProfileCalendar.js => ProfileCalendar.jsx} | 8 +- .../ProfileCalendarComponent.js | 24 +- src/components/ReportForm/ReportForm.js | 428 +++++++++++------- src/images/calendar_icon.png | Bin 260 -> 0 bytes src/images/cursorImg.png | Bin 645 -> 0 bytes src/images/cursorImg.svg | 3 + src/pages/PartnerRequests/PartnerRequests.js | 2 +- 41 files changed, 837 insertions(+), 847 deletions(-) rename src/components/Candidate/{Candidate.js => Candidate.jsx} (99%) rename src/components/CardControl/{CardControl.js => CardControl.jsx} (100%) rename src/components/CategoriesItem/{CategoriesItem.js => CategoriesItem.jsx} (100%) rename src/components/Description/{Description.js => Description.jsx} (97%) delete mode 100644 src/components/Footer/Footer.js create mode 100644 src/components/Footer/Footer.jsx delete mode 100644 src/components/Form/Form.js create mode 100644 src/components/Form/Form.jsx delete mode 100644 src/components/Header/Header.js create mode 100644 src/components/Header/Header.jsx delete mode 100644 src/components/Loader/Loader.js create mode 100644 src/components/Loader/Loader.jsx delete mode 100644 src/components/LogoutButton/LogoutButton.js create mode 100644 src/components/LogoutButton/LogoutButton.jsx rename src/components/Outstaffing/{Outstaffing.js => Outstaffing.jsx} (99%) delete mode 100644 src/components/OutstaffingBlock/OutstaffingBlock.js create mode 100644 src/components/OutstaffingBlock/OutstaffingBlock.jsx delete mode 100644 src/components/ProfileBreadcrumbs/ProfileBreadcrumbs.js create mode 100644 src/components/ProfileBreadcrumbs/ProfileBreadcrumbs.jsx rename src/components/ProfileCalendar/{ProfileCalendar.js => ProfileCalendar.jsx} (95%) delete mode 100644 src/images/calendar_icon.png delete mode 100644 src/images/cursorImg.png create mode 100644 src/images/cursorImg.svg diff --git a/config/paths.js b/config/paths.js index a11d1e69..56021c30 100644 --- a/config/paths.js +++ b/config/paths.js @@ -1,7 +1,7 @@ -const path = require('path'); +const path = require("path"); module.exports = { - public: path.resolve(__dirname, '../public'), - src: path.resolve(__dirname, '../src'), - build: path.resolve(__dirname, '../build'), - '@node_modules': path.resolve(__dirname, '../node_modules'), + public: path.resolve(__dirname, "../public"), + src: path.resolve(__dirname, "../src"), + build: path.resolve(__dirname, "../build"), + "@node_modules": path.resolve(__dirname, "../node_modules"), }; diff --git a/config/webpack/analyze.js b/config/webpack/analyze.js index 9718b610..3932d696 100644 --- a/config/webpack/analyze.js +++ b/config/webpack/analyze.js @@ -1,10 +1,10 @@ -const { merge } = require('webpack-merge'); +const { merge } = require("webpack-merge"); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') - .BundleAnalyzerPlugin; +const BundleAnalyzerPlugin = + require("webpack-bundle-analyzer").BundleAnalyzerPlugin; -const prod = require('./prod'); +const prod = require("./prod"); module.exports = merge(prod, { - plugins: [new BundleAnalyzerPlugin()] -}); \ No newline at end of file + plugins: [new BundleAnalyzerPlugin()], +}); diff --git a/config/webpack/dev.js b/config/webpack/dev.js index bd080cdf..e6f78bfb 100644 --- a/config/webpack/dev.js +++ b/config/webpack/dev.js @@ -1,14 +1,14 @@ -const paths = require('../paths'); +const paths = require("../paths"); -const webpack = require('webpack'); -const {merge} = require('webpack-merge'); +const webpack = require("webpack"); +const { merge } = require("webpack-merge"); -const common = require('./common'); +const common = require("./common"); module.exports = merge(common, { - target : 'web', - mode: 'development', - devtool: 'eval-cheap-source-map', + target: "web", + mode: "development", + devtool: "eval-cheap-source-map", devServer: { compress: true, @@ -17,7 +17,6 @@ module.exports = merge(common, { historyApiFallback: true, // open: true, port: 3000, - }, - plugins: [new webpack.HotModuleReplacementPlugin()] -}); \ No newline at end of file + plugins: [new webpack.HotModuleReplacementPlugin()], +}); diff --git a/config/webpack/prod.js b/config/webpack/prod.js index a08140ba..d40296dd 100644 --- a/config/webpack/prod.js +++ b/config/webpack/prod.js @@ -1,62 +1,59 @@ -const paths = require('../paths'); -const {merge} = require('webpack-merge'); -const common = require('./common'); - -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const paths = require("../paths"); +const { merge } = require("webpack-merge"); +const common = require("./common"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = merge(common, { - mode: 'production', - target :'browserslist', - entry: { - index: { - import: `${paths.src}/index.js`, - dependOn: ['react', 'helpers'] - }, - react: ['react', 'react-dom', 'prop-types'], - helpers: ['immer', 'nanoid'] + mode: "production", + target: "browserslist", + entry: { + index: { + import: `${paths.src}/index.js`, + dependOn: ["react", "helpers"], }, - devtool: false, - output: { - filename: 'js/[name].[hash:8].bundle.js', - publicPath: '/', - assetModuleFilename: '[hash][ext][query]' - }, - module: { - rules: [ - { - test: /\.(c|sa|sc)ss$/i, - use: [ - MiniCssExtractPlugin.loader, - { - loader: 'css-loader', - options: {importLoaders: 1} - }, - 'postcss-loader', - 'sass-loader' - ] - }, - { - test: /\.(jpe?g|png|gif|svg)$/i, - type: 'asset/resource' - // type: 'asset' - }, - - ] - }, - plugins: [ - new MiniCssExtractPlugin({ - filename: '[name].[contenthash].css', - chunkFilename: '[id].css' - }), - + react: ["react", "react-dom", "prop-types"], + helpers: ["immer", "nanoid"], + }, + devtool: false, + output: { + filename: "js/[name].[hash:8].bundle.js", + publicPath: "/", + assetModuleFilename: "[hash][ext][query]", + }, + module: { + rules: [ + { + test: /\.(c|sa|sc)ss$/i, + use: [ + MiniCssExtractPlugin.loader, + { + loader: "css-loader", + options: { importLoaders: 1 }, + }, + "postcss-loader", + "sass-loader", + ], + }, + { + test: /\.(jpe?g|png|gif|svg|webp)$/i, + type: "asset/resource", + // type: 'asset' + }, ], - optimization: { - runtimeChunk: 'single' - }, - performance: { - hints: 'warning', - maxEntrypointSize: 512000, - maxAssetSize: 512000 - } -}); \ No newline at end of file + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: "[name].[contenthash].css", + chunkFilename: "[id].css", + }), + ], + optimization: { + runtimeChunk: "single", + }, + performance: { + hints: "warning", + maxEntrypointSize: 512000, + maxAssetSize: 512000, + }, +}); diff --git a/src/components/Achievement/Achievement.jsx b/src/components/Achievement/Achievement.jsx index 2e89f3d6..e9d4e32a 100644 --- a/src/components/Achievement/Achievement.jsx +++ b/src/components/Achievement/Achievement.jsx @@ -1,19 +1,19 @@ -import React from 'react' +import React from "react"; -import './achievement.scss' +import "./achievement.scss"; export const Achievement = ({ achievement }) => { return ( -
-
- achievement +
+
+ achievement
-
-
{achievement.title}
-
+
+
{achievement.title}
+
{achievement.description}
- ) -} + ); +}; diff --git a/src/components/Calendar/CalendarComponent.jsx b/src/components/Calendar/CalendarComponent.jsx index 1e6b3bc5..f3baeb88 100644 --- a/src/components/Calendar/CalendarComponent.jsx +++ b/src/components/Calendar/CalendarComponent.jsx @@ -3,7 +3,7 @@ import { calendarHelper, currentMonthAndDay } from "./calendarHelper"; import ellipse from "../../images/ellipse.png"; import rectangle from "../../images/rectangle__calendar.png"; -import calendarIcon from "../../images/calendar_icon.png"; +import calendarIcon from "../../images/calendar.svg"; import moment from "moment"; import "moment/locale/ru"; diff --git a/src/components/Candidate/Candidate.js b/src/components/Candidate/Candidate.jsx similarity index 99% rename from src/components/Candidate/Candidate.js rename to src/components/Candidate/Candidate.jsx index 2176f94b..8e52dbd2 100644 --- a/src/components/Candidate/Candidate.js +++ b/src/components/Candidate/Candidate.jsx @@ -18,7 +18,6 @@ import { apiRequest } from "../../api/request"; import { createMarkup } from "../../helper"; import gitImgItem from "../../images/gitItemImg.svg"; - import rectangle from "../../images/rectangle_secondPage.png"; import front from "../../images/front-end.webp"; import back from "../../images/back-end.webp"; diff --git a/src/components/CardControl/CardControl.js b/src/components/CardControl/CardControl.jsx similarity index 100% rename from src/components/CardControl/CardControl.js rename to src/components/CardControl/CardControl.jsx diff --git a/src/components/CardControl/CardControl.scss b/src/components/CardControl/CardControl.scss index df4d85a0..f7d68f91 100644 --- a/src/components/CardControl/CardControl.scss +++ b/src/components/CardControl/CardControl.scss @@ -1,73 +1,73 @@ -.control-card{ - 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; +.control-card { + 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); - } + &: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: 1175px) { + width: 48%; + max-width: none; + } - @media (max-width: 925px) { - width: 100%; - padding: 15px 25px; - } + @media (max-width: 925px) { + width: 100%; + padding: 15px 25px; + } - &__about { - display: flex; - column-gap: 20px; - align-items: center; - margin-bottom: 30px; + &__about { + display: flex; + column-gap: 20px; + align-items: center; + margin-bottom: 30px; - @media (max-width: 925px) { - margin-bottom: 15px; - } + @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; - } - } + 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; + &__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; + 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; - } - } - } \ No newline at end of file + span { + color: #52b709; + font-weight: 700; + } + } + &Link { + width: 48px; + height: 48px; + background: #ddeec6; + border-radius: 50px; + display: flex; + justify-content: center; + align-items: center; + } + } +} diff --git a/src/components/CategoriesItem/CategoriesItem.js b/src/components/CategoriesItem/CategoriesItem.jsx similarity index 100% rename from src/components/CategoriesItem/CategoriesItem.js rename to src/components/CategoriesItem/CategoriesItem.jsx diff --git a/src/components/CategoriesItem/categoriesItem.scss b/src/components/CategoriesItem/categoriesItem.scss index 55805cfd..eabcad44 100644 --- a/src/components/CategoriesItem/categoriesItem.scss +++ b/src/components/CategoriesItem/categoriesItem.scss @@ -2,7 +2,7 @@ display: flex; flex-direction: column; padding: 33px 32px 25px 28px; - background: #FFFFFF; + background: #ffffff; border-radius: 12px; transition: all 0.3s ease; position: relative; @@ -18,7 +18,6 @@ pointer-events: none; } - &__title { display: flex; align-items: center; @@ -43,7 +42,7 @@ p { max-width: 181px; margin-bottom: 0; - color: #6F6F6F; + color: #6f6f6f; font-weight: 400; font-size: 12px; line-height: 20px; @@ -55,7 +54,7 @@ justify-content: center; width: 48px; height: 48px; - background: #DDEEC6; + background: #ddeec6; border-radius: 50px; } } diff --git a/src/components/Description/Description.js b/src/components/Description/Description.jsx similarity index 97% rename from src/components/Description/Description.js rename to src/components/Description/Description.jsx index 031a07be..19e32042 100644 --- a/src/components/Description/Description.js +++ b/src/components/Description/Description.jsx @@ -9,9 +9,8 @@ import { selectProfiles } from "../../redux/outstaffingSlice"; import { urlForLocal } from "../../helper"; -import male from "../../images/medium_male.png"; import rectangle from "../../images/rectangle_secondPage.png"; -import cursorImg from "../../images/cursorImg.png"; +import cursorImg from "../../images/cursorImg.svg"; import "./description.scss"; diff --git a/src/components/Footer/Footer.js b/src/components/Footer/Footer.js deleted file mode 100644 index 77347884..00000000 --- a/src/components/Footer/Footer.js +++ /dev/null @@ -1,49 +0,0 @@ -import React from 'react' - -import logo from '../../images/logoGuild.png' -import vk from '../../images/vkLogo.svg' -import tg from '../../images/tgFooter.png' -import email from '../../images/emailLogo.svg' - -import './footer.scss' - -export const Footer = () => { - return ( -
-
-
-
- logo -

Подберем и документально оформим IT-специалистов, после чего передадим исполнителей под ваше руководство. - Вы получаете полное управление над сотрудниками, имея возможность контролировать и заменять IT штат.

-
- © {new Date().getFullYear()} - Все права защищены -
-
-
-
- -

Войти в команду

-
- -
-
-
-
- ) -} diff --git a/src/components/Footer/Footer.jsx b/src/components/Footer/Footer.jsx new file mode 100644 index 00000000..040abb8d --- /dev/null +++ b/src/components/Footer/Footer.jsx @@ -0,0 +1,53 @@ +import React from "react"; + +import logo from "../../images/logoGuild.png"; +import vk from "../../images/vkLogo.svg"; +import tg from "../../images/tgFooter.png"; +import email from "../../images/emailLogo.svg"; + +import "./footer.scss"; + +export const Footer = () => { + return ( +
+
+
+
+ logo +

+ Подберем и документально оформим IT-специалистов, после чего + передадим исполнителей под ваше руководство. Вы получаете полное + управление над сотрудниками, имея возможность контролировать и + заменять IT штат. +

+
+ © {new Date().getFullYear()} - Все права защищены +
+
+
+
+ +

Войти в команду

+
+ +
+
+
+
+ ); +}; diff --git a/src/components/Footer/footer.scss b/src/components/Footer/footer.scss index 59f2c49d..e129c7f7 100644 --- a/src/components/Footer/footer.scss +++ b/src/components/Footer/footer.scss @@ -4,7 +4,6 @@ footer { } .footer { - &__top { display: flex; align-items: start; @@ -21,7 +20,7 @@ footer { font-weight: 400; font-size: 12px; line-height: 16px; - color: #5B6871; + color: #5b6871; @media (max-width: 620px) { margin-left: 0; @@ -82,7 +81,7 @@ footer { font-weight: 400; font-size: 12px; line-height: 16px; - color: #5B6871; + color: #5b6871; } } @@ -90,7 +89,7 @@ footer { font-weight: 400; font-size: 10px; line-height: 16px; - color: #5B6871; + color: #5b6871; margin-left: 150px; @media (max-width: 720px) { @@ -98,7 +97,7 @@ footer { } &:hover { - color: #5B6871; + color: #5b6871; text-decoration: none; } } @@ -115,101 +114,4 @@ footer { margin-left: 0; } } - //margin-top: -3rem; - // - //&__left { - // display: flex; - // align-items: center; - //} - // - //&__description { - // padding: 0 100px 0 34px; - // - // span { - // color: #18586e; - // font-family: 'GT Eesti Pro Display'; - // font-size: 1.6em; - // font-weight: 400; - // font-style: normal; - // letter-spacing: normal; - // line-height: 16.81px; - // text-align: left; - // } - //} - // - //&__icon { - // text-align: end; - // - // img { - // margin-left: 20px; - // } - //} - // - //&__right { - // display: flex; - // flex-direction: column; - // align-items: left; - //} - // - //&__phone { - // color: #003b65; - // font-family: 'CeraPro'; - // font-size: 2.1em; - // letter-spacing: normal; - // line-height: 25px; - // text-align: left; - //} - // - //&__working-hours { - // color: #003b65; - // font-family: 'CeraPro'; - // font-size: 1.2em; - // font-weight: 400; - // font-style: normal; - // letter-spacing: normal; - // line-height: normal; - // margin-left: 24px; - //} - // - //&__copyright { - // padding: 1rem 1rem 1rem 5.6rem; - // font-family: 'Muller'; - // font-weight: 300; - // font-size: 1.2em; - //} } - -//@media (max-width: 1199px) { -// .footer { -// &__left { -// margin-bottom: 20px; -// } -// } -//} -// -//@media (max-width: 575.98px) { -// .footer { -// &__left { -// margin-top: 80px; -// } -// -// &__description { -// padding: 0; -// margin-left: 10px; -// -// span { -// font-size: 1.2em; -// } -// } -// -// &__icon { -// img { -// margin-left: 10px; -// } -// } -// -// &__right { -// margin-bottom: 20px; -// } -// } -//} diff --git a/src/components/Form/Form.js b/src/components/Form/Form.js deleted file mode 100644 index af4d5b11..00000000 --- a/src/components/Form/Form.js +++ /dev/null @@ -1,134 +0,0 @@ -import React, {useEffect, useState} from 'react' -import {useParams, useNavigate} from 'react-router-dom' -import {Loader} from '../Loader/Loader' -import PhoneInput from 'react-phone-input-2' -import 'react-phone-input-2/lib/style.css' -import './form.scss' - -import {apiRequest} from "../../api/request"; - -import Swal from 'sweetalert2' -import withReactContent from 'sweetalert2-react-content' - -const SweetAlert = withReactContent(Swal); - -const Form = () => { - - const navigate = useNavigate(); - - const urlParams = useParams(); - - const [status, setStatus] = useState(null); - const [data, setData] = useState({ - email: '', - phone: '', - comment: '' - }); - const [isFetching, setIsFetching] = useState(false); - - const handleModal = (status) => { - SweetAlert.fire({ - text: status !== 200 || 201 - ? 'Какие-то неполадки =(' - : 'Форма отправлена', - preConfirm: () => - status !== 200 || 201 ? () => { - setStatus(null) - } : () => { - setStatus(null); - navigate(`/candidate/${urlParams.id}`) - } - }); - }; - - useEffect(() => { - if (status) { - handleModal(status) - } - }, [status]); - - const handleChange = (e) => { - const {id, value} = e.target; - - setData((prev) => ({ - ...prev, - [id]: value - })) - }; - - const handleSubmit = (e) => { - e.preventDefault(); - - setIsFetching(true); - const formData = new FormData(); - formData.append('profile_id', urlParams.id); - formData.append('Email', data.email); - formData.append('phone', data.phone); - formData.append('comment', data.comment); - - apiRequest('/interview-request/create-interview-request', { - method: 'POST', - params: { - profile_id: urlParams.id, - ...data - } - }).then((res) => { - setStatus(res); - setIsFetching(false) - } - ) - }; - - return ( -
-
-
- - - - - - handleChange({target: {value: e, id: 'phone'}}) - } - /> - {/* */} - - - - - -
-
- ) -}; - -export default Form diff --git a/src/components/Form/Form.jsx b/src/components/Form/Form.jsx new file mode 100644 index 00000000..0c1c1231 --- /dev/null +++ b/src/components/Form/Form.jsx @@ -0,0 +1,125 @@ +import React, { useEffect, useState } from "react"; +import { useParams, useNavigate } from "react-router-dom"; +import PhoneInput from "react-phone-input-2"; + +import { apiRequest } from "../../api/request"; +import { Loader } from "../Loader/Loader"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; + +import "react-phone-input-2/lib/style.css"; +import "./form.scss"; + +const SweetAlert = withReactContent(Swal); + +const Form = () => { + const navigate = useNavigate(); + + const urlParams = useParams(); + + const [status, setStatus] = useState(null); + const [data, setData] = useState({ + email: "", + phone: "", + comment: "", + }); + const [isFetching, setIsFetching] = useState(false); + + const handleModal = (status) => { + SweetAlert.fire({ + text: + status !== 200 || 201 ? "Какие-то неполадки =(" : "Форма отправлена", + preConfirm: () => + status !== 200 || 201 + ? () => { + setStatus(null); + } + : () => { + setStatus(null); + navigate(`/candidate/${urlParams.id}`); + }, + }); + }; + + useEffect(() => { + if (status) { + handleModal(status); + } + }, [status]); + + const handleChange = (e) => { + const { id, value } = e.target; + + setData((prev) => ({ + ...prev, + [id]: value, + })); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + + setIsFetching(true); + const formData = new FormData(); + formData.append("profile_id", urlParams.id); + formData.append("Email", data.email); + formData.append("phone", data.phone); + formData.append("comment", data.comment); + + apiRequest("/interview-request/create-interview-request", { + method: "POST", + params: { + profile_id: urlParams.id, + ...data, + }, + }).then((res) => { + setStatus(res); + setIsFetching(false); + }); + }; + + return ( +
+
+
+ + + + + + handleChange({ target: { value: e, id: "phone" } }) + } + /> + + + + + +
+
+ ); +}; + +export default Form; diff --git a/src/components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem.scss b/src/components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem.scss index 247dfe02..ac6ad084 100644 --- a/src/components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem.scss +++ b/src/components/FrequentlyAskedQuestionsItem/FrequentlyAskedQuestionsItem.scss @@ -7,23 +7,23 @@ margin: 0 0 -5px 29px; } - &__icon-question { - - } &__title { font-weight: 700; @include adaptiv-value("font-size", 28, 22, 1); line-height: 79%; color: #1458dd; } + &__body { position: relative; z-index: 2; display: block; + &:not(:last-child) { margin: 0 0 13px 0; } - p { + + p { word-break: break-word; background: #ffffff; border-radius: 12px; @@ -40,4 +40,4 @@ align-items: center; } } -} \ No newline at end of file +} diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js deleted file mode 100644 index 4616bf17..00000000 --- a/src/components/Header/Header.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; -import {LogoutButton} from "../LogoutButton/LogoutButton"; - -import './header.scss' - -export const Header = () => { - return ( -
-

- Аутстаффинг it-персонала -

- -
- ) -}; \ No newline at end of file diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx new file mode 100644 index 00000000..b8202c0a --- /dev/null +++ b/src/components/Header/Header.jsx @@ -0,0 +1,16 @@ +import React from "react"; + +import { LogoutButton } from "../LogoutButton/LogoutButton"; + +import "./header.scss"; + +export const Header = () => { + return ( +
+

+ Аутстаффинг it-персонала +

+ +
+ ); +}; diff --git a/src/components/Header/header.scss b/src/components/Header/header.scss index 423ca653..cb6cc2e3 100644 --- a/src/components/Header/header.scss +++ b/src/components/Header/header.scss @@ -9,7 +9,7 @@ flex: 1; text-align: center; color: #52b709; - font-family: 'GT Eesti Pro Display', sans-serif; + font-family: "GT Eesti Pro Display", sans-serif; font-size: 5em; font-weight: 700; font-style: normal; @@ -23,4 +23,4 @@ line-height: normal; } } -} \ No newline at end of file +} diff --git a/src/components/Loader/Loader.js b/src/components/Loader/Loader.js deleted file mode 100644 index b95eb504..00000000 --- a/src/components/Loader/Loader.js +++ /dev/null @@ -1,12 +0,0 @@ -import SVGLoader from 'react-loader-spinner' -import './loader.scss' -import React from "react"; - - -export const Loader = ({width = 50, height = 50, style}) => { - return ( -
- -
- ) -}; diff --git a/src/components/Loader/Loader.jsx b/src/components/Loader/Loader.jsx new file mode 100644 index 00000000..d61acb83 --- /dev/null +++ b/src/components/Loader/Loader.jsx @@ -0,0 +1,17 @@ +import React from "react"; +import SVGLoader from "react-loader-spinner"; + +import "./loader.scss"; + +export const Loader = ({ width = 50, height = 50, style }) => { + return ( +
+ +
+ ); +}; diff --git a/src/components/Loader/loader.scss b/src/components/Loader/loader.scss index 8793f929..bfb8b104 100644 --- a/src/components/Loader/loader.scss +++ b/src/components/Loader/loader.scss @@ -5,6 +5,7 @@ justify-content: center; align-items: center; position: relative; + &:hover { path { fill: #6aaf5c; diff --git a/src/components/LogoutButton/LogoutButton.js b/src/components/LogoutButton/LogoutButton.js deleted file mode 100644 index 3f435b84..00000000 --- a/src/components/LogoutButton/LogoutButton.js +++ /dev/null @@ -1,33 +0,0 @@ -import React, {useState} from 'react' -import {useNavigate} from 'react-router-dom' -import {useSelector} from 'react-redux' -import {useLogout} from "../../hooks/useLogout"; - -import {Loader} from '../Loader/Loader' - -import {getRole} from '../../redux/roleSlice' - -import './logoutButton.scss' - - -export const LogoutButton = () => { - const [isLoggingOut, setIsLoggingOut] = useState(false); - - const userRole = useSelector(getRole); - const navigate = useNavigate(); - const {logout} = useLogout(); - - return ( - - ) -}; diff --git a/src/components/LogoutButton/LogoutButton.jsx b/src/components/LogoutButton/LogoutButton.jsx new file mode 100644 index 00000000..7f52adf8 --- /dev/null +++ b/src/components/LogoutButton/LogoutButton.jsx @@ -0,0 +1,31 @@ +import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { useSelector } from "react-redux"; + +import { useLogout } from "../../hooks/useLogout"; +import { Loader } from "../Loader/Loader"; +import { getRole } from "../../redux/roleSlice"; + +import "./logoutButton.scss"; + +export const LogoutButton = () => { + const [isLoggingOut, setIsLoggingOut] = useState(false); + + const userRole = useSelector(getRole); + const navigate = useNavigate(); + const { logout } = useLogout(); + + return ( + + ); +}; diff --git a/src/components/LogoutButton/logoutButton.scss b/src/components/LogoutButton/logoutButton.scss index 3a615a66..3c793886 100644 --- a/src/components/LogoutButton/logoutButton.scss +++ b/src/components/LogoutButton/logoutButton.scss @@ -1,5 +1,4 @@ .logout-button { - position: relative; z-index: 100; display: flex; @@ -14,7 +13,7 @@ background-color: #6aaf5c; color: #ffffff; border: 3px solid #6aaf5c; - font-family: 'Muller', sans-serif; + font-family: "Muller", sans-serif; text-align: center; &:hover { diff --git a/src/components/Outstaffing/Outstaffing.js b/src/components/Outstaffing/Outstaffing.jsx similarity index 99% rename from src/components/Outstaffing/Outstaffing.js rename to src/components/Outstaffing/Outstaffing.jsx index aa812032..fd1fa6e8 100644 --- a/src/components/Outstaffing/Outstaffing.js +++ b/src/components/Outstaffing/Outstaffing.jsx @@ -3,7 +3,6 @@ import { useSelector, useDispatch } from "react-redux"; import OutstaffingBlock from "../OutstaffingBlock/OutstaffingBlock"; import TagSelect from "../Select/TagSelect"; - import { selectTags, getPositionId, diff --git a/src/components/OutstaffingBlock/OutstaffingBlock.js b/src/components/OutstaffingBlock/OutstaffingBlock.js deleted file mode 100644 index a171cd19..00000000 --- a/src/components/OutstaffingBlock/OutstaffingBlock.js +++ /dev/null @@ -1,118 +0,0 @@ -import React from 'react' -import OutsideClickHandler from 'react-outside-click-handler' -import {useDispatch, useSelector} from 'react-redux' -import { - selectItems, - selectedItems, - profiles, -} from '../../redux/outstaffingSlice' - -import {apiRequest} from "../../api/request"; - -import './outstaffingBlock.scss' - - -const handlePositionClick = ( - { - dispatch, - positionId, - isSelected, - onSelect, - apiRequest - }) => { - if (isSelected) { - apiRequest('/profile', { - params: { - limit: 1000 - }, - }).then((profileArr) => { - dispatch(profiles(profileArr)); - dispatch(selectedItems([])); - onSelect(positionId) - }) - } else { - apiRequest('/profile', { - params: { - limit: '1000', - position_id: positionId - }, - }).then((res) => { - dispatch(profiles(res)); - dispatch(selectedItems([])); - onSelect(positionId) - }) - } -}; - -const OutstaffingBlock = ( - { - dataTags = [], - selected, - img, - header, - positionId, - isSelected, - onSelect - }) => { - - - const dispatch = useDispatch(); - - const itemsArr = useSelector(selectItems); - - - const handleBlockClick = (item, id) => { - if (!itemsArr.find((el) => item === el.value)) { - dispatch(selectedItems([...itemsArr, {id, value: item, label: item}])) - } - }; - - let classes; - - dataTags.forEach((el) => { - if (el.name === 'skills_back') { - classes = 'back' - } else if (el.name === 'skills_design') { - classes = 'des' - } else if (el.name === 'skills_front') { - classes = 'front' - } - }); - - return ( - isSelected && onSelect(null)}> -
-
handlePositionClick( - { - dispatch, - positionId, - isSelected, - onSelect, - apiRequest - }) - }> -

{header}

- img -
-
-

# Популярный стек

- {dataTags && ( -
    - {dataTags.map((item) => ( -
  • handleBlockClick(item.value, item.id)} - > - {item.value} -
  • - ))} -
- )} -
-
-
- ) -}; - -export default OutstaffingBlock diff --git a/src/components/OutstaffingBlock/OutstaffingBlock.jsx b/src/components/OutstaffingBlock/OutstaffingBlock.jsx new file mode 100644 index 00000000..65ee2429 --- /dev/null +++ b/src/components/OutstaffingBlock/OutstaffingBlock.jsx @@ -0,0 +1,126 @@ +import React from "react"; +import OutsideClickHandler from "react-outside-click-handler"; +import { useDispatch, useSelector } from "react-redux"; +import { + selectItems, + selectedItems, + profiles, +} from "../../redux/outstaffingSlice"; + +import { apiRequest } from "../../api/request"; + +import "./outstaffingBlock.scss"; + +const handlePositionClick = ({ + dispatch, + positionId, + isSelected, + onSelect, + apiRequest, +}) => { + if (isSelected) { + apiRequest("/profile", { + params: { + limit: 1000, + }, + }).then((profileArr) => { + dispatch(profiles(profileArr)); + dispatch(selectedItems([])); + onSelect(positionId); + }); + } else { + apiRequest("/profile", { + params: { + limit: "1000", + position_id: positionId, + }, + }).then((res) => { + dispatch(profiles(res)); + dispatch(selectedItems([])); + onSelect(positionId); + }); + } +}; + +const OutstaffingBlock = ({ + dataTags = [], + selected, + img, + header, + positionId, + isSelected, + onSelect, +}) => { + const dispatch = useDispatch(); + + const itemsArr = useSelector(selectItems); + + const handleBlockClick = (item, id) => { + if (!itemsArr.find((el) => item === el.value)) { + dispatch(selectedItems([...itemsArr, { id, value: item, label: item }])); + } + }; + + let classes; + + dataTags.forEach((el) => { + if (el.name === "skills_back") { + classes = "back"; + } else if (el.name === "skills_design") { + classes = "des"; + } else if (el.name === "skills_front") { + classes = "front"; + } + }); + + return ( + isSelected && onSelect(null)}> +
+
+ handlePositionClick({ + dispatch, + positionId, + isSelected, + onSelect, + apiRequest, + }) + } + > +

{header}

+ img +
+
+

# Популярный стек

+ {dataTags && ( +
    + {dataTags.map((item) => ( +
  • handleBlockClick(item.value, item.id)} + > + {item.value} +
  • + ))} +
+ )} +
+
+
+ ); +}; + +export default OutstaffingBlock; diff --git a/src/components/OutstaffingBlock/outstaffingBlock.scss b/src/components/OutstaffingBlock/outstaffingBlock.scss index 40440084..074b85a4 100644 --- a/src/components/OutstaffingBlock/outstaffingBlock.scss +++ b/src/components/OutstaffingBlock/outstaffingBlock.scss @@ -1,15 +1,15 @@ body { - font-family: 'LabGrotesque', sans-serif !important; + font-family: "LabGrotesque", sans-serif !important; } .container { max-width: 1160px !important; } .catalog { - background: #F1F1F1; + background: #f1f1f1; height: 100%; min-height: 100vh; - font-family: 'LabGrotesque', sans-serif; + font-family: "LabGrotesque", sans-serif; padding-top: 23px; &__title { @@ -37,7 +37,7 @@ body { } & > p { - font-family: 'GT Eesti Pro Display'; + font-family: "GT Eesti Pro Display"; font-size: 1.2em; font-weight: 300; font-style: normal; @@ -60,7 +60,7 @@ body { right: 13%; top: 30%; max-width: 130px; - font-family: 'GT Eesti Pro Display'; + font-family: "GT Eesti Pro Display"; font-size: 18px; font-weight: 400; font-style: normal; @@ -85,7 +85,7 @@ body { &__items { li { - font-family: 'GT Eesti Pro Display'; + font-family: "GT Eesti Pro Display"; font-size: 1.8em; font-weight: 100; font-style: normal; diff --git a/src/components/ProfileBreadcrumbs/ProfileBreadcrumbs.js b/src/components/ProfileBreadcrumbs/ProfileBreadcrumbs.js deleted file mode 100644 index 7ef5f280..00000000 --- a/src/components/ProfileBreadcrumbs/ProfileBreadcrumbs.js +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react' -import {Link} from "react-router-dom"; - -import './profileBreadcrumbs.scss' - -export const ProfileBreadcrumbs = ({ links }) => { - return ( -
- {links.map((link, index) => { - return {link.name} - }) - - } -
- ) -} diff --git a/src/components/ProfileBreadcrumbs/ProfileBreadcrumbs.jsx b/src/components/ProfileBreadcrumbs/ProfileBreadcrumbs.jsx new file mode 100644 index 00000000..1de2b38b --- /dev/null +++ b/src/components/ProfileBreadcrumbs/ProfileBreadcrumbs.jsx @@ -0,0 +1,18 @@ +import React from "react"; +import { Link } from "react-router-dom"; + +import "./profileBreadcrumbs.scss"; + +export const ProfileBreadcrumbs = ({ links }) => { + return ( +
+ {links.map((link, index) => { + return ( + + {link.name} + + ); + })} +
+ ); +}; diff --git a/src/components/ProfileBreadcrumbs/profileBreadcrumbs.scss b/src/components/ProfileBreadcrumbs/profileBreadcrumbs.scss index 9992152d..ec39e890 100644 --- a/src/components/ProfileBreadcrumbs/profileBreadcrumbs.scss +++ b/src/components/ProfileBreadcrumbs/profileBreadcrumbs.scss @@ -7,7 +7,7 @@ } a { - color: #5B6871; + color: #5b6871; font-weight: 400; font-size: 12px; line-height: 16px; @@ -31,11 +31,11 @@ } &:after { - content: ''; + content: ""; background-image: url("../../images/BreadcrumbsArrow.png"); background-repeat: no-repeat; width: 7px; - height:10px; + height: 10px; position: absolute; right: -14px; } diff --git a/src/components/ProfileCalendar/ProfileCalendar.js b/src/components/ProfileCalendar/ProfileCalendar.jsx similarity index 95% rename from src/components/ProfileCalendar/ProfileCalendar.js rename to src/components/ProfileCalendar/ProfileCalendar.jsx index 67f3f9ee..39d71645 100644 --- a/src/components/ProfileCalendar/ProfileCalendar.js +++ b/src/components/ProfileCalendar/ProfileCalendar.jsx @@ -1,20 +1,16 @@ import React, { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; +import { Link, Navigate } from "react-router-dom"; import { getReports } from "../Calendar/calendarHelper"; -import { Link, Navigate } from "react-router-dom"; import moment from "moment"; - import { ProfileCalendarComponent } from "./ProfileCalendarComponent"; import { Loader } from "../Loader/Loader"; import { ProfileHeader } from "../ProfileHeader/ProfileHeader"; -import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; +import { ProfileBreadcrumbs } from "../ProfileBreadcrumbs/ProfileBreadcrumbs"; import { Footer } from "../Footer/Footer"; import { Navigation } from "../Navigation/Navigation"; -import { ViewReport } from "../../pages/ViewReport/ViewReport"; - import { urlForLocal } from "../../helper"; - import { apiRequest } from "../../api/request"; import { getProfileInfo } from "../../redux/outstaffingSlice"; import { diff --git a/src/components/ProfileCalendar/ProfileCalendarComponent.js b/src/components/ProfileCalendar/ProfileCalendarComponent.js index f3397f75..22468c77 100644 --- a/src/components/ProfileCalendar/ProfileCalendarComponent.js +++ b/src/components/ProfileCalendar/ProfileCalendarComponent.js @@ -1,23 +1,25 @@ import React, { useState, useEffect } from "react"; -import arrow from "../../images/arrowCalendar.png"; -import rectangle from "../../images/rectangle__calendar.png"; -import calendarIcon from "../../images/calendar_icon.png"; -import moment from "moment"; +import { useDispatch } from "react-redux"; +import { Link } from "react-router-dom"; + +import { + setReportDate, + setRequestDate, + setSendRequest, +} from "../../redux/reportSlice"; import { calendarHelper, currentMonthAndDay, getReports, hourOfNum, } from "../Calendar/calendarHelper"; -import { - setReportDate, - setRequestDate, - setSendRequest, -} from "../../redux/reportSlice"; -import { useDispatch } from "react-redux"; -import { Link } from "react-router-dom"; import ShortReport from "../ShortReport/ShortReport"; +import arrow from "../../images/arrowCalendar.png"; +import rectangle from "../../images/rectangle__calendar.png"; +import calendarIcon from "../../images/calendar.svg"; +import moment from "moment"; + import "moment/locale/ru"; import "./../Calendar/calendarComponent.scss"; diff --git a/src/components/ReportForm/ReportForm.js b/src/components/ReportForm/ReportForm.js index b1a5f3f8..31389b42 100644 --- a/src/components/ReportForm/ReportForm.js +++ b/src/components/ReportForm/ReportForm.js @@ -1,81 +1,100 @@ -import React, {useState, useEffect} from 'react' -import {useSelector} from 'react-redux' -import {Link, Navigate, useNavigate} from 'react-router-dom' -import DatePicker, { registerLocale } from "react-datepicker" -import {getCorrectDate, getCreatedDate, hourOfNum} from '../Calendar/calendarHelper' -import ru from "date-fns/locale/ru" +import React, { useState, useEffect } from "react"; +import { useSelector } from "react-redux"; +import { Link, Navigate, useNavigate } from "react-router-dom"; +import DatePicker, { registerLocale } from "react-datepicker"; +import { + getCorrectDate, + getCreatedDate, + hourOfNum, +} from "../Calendar/calendarHelper"; +import ru from "date-fns/locale/ru"; registerLocale("ru", ru); -import {Loader} from '../Loader/Loader' -import {Footer} from "../Footer/Footer"; -import {ProfileHeader} from "../ProfileHeader/ProfileHeader"; -import {ProfileBreadcrumbs} from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs" +import { Loader } from "../Loader/Loader"; +import { Footer } from "../Footer/Footer"; +import { ProfileHeader } from "../ProfileHeader/ProfileHeader"; +import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; -import {apiRequest} from "../../api/request"; +import { apiRequest } from "../../api/request"; -import {getReportDate} from '../../redux/reportSlice' +import { getReportDate } from "../../redux/reportSlice"; -import calendarIcon from '../../images/calendar_icon.png' -import ellipse from '../../images/ellipse.png' -import remove from '../../images/remove.png' +import calendarIcon from "../../images/calendar.svg"; +import ellipse from "../../images/ellipse.png"; +import remove from "../../images/remove.png"; import arrow from "../../images/right-arrow.png"; -import './reportForm.scss' +import "./reportForm.scss"; import "react-datepicker/dist/react-datepicker.css"; -import { Navigation } from '../Navigation/Navigation' +import { Navigation } from "../Navigation/Navigation"; const ReportForm = () => { - if(localStorage.getItem('role_status') === '18') { - return + if (localStorage.getItem("role_status") === "18") { + return ; } - const navigate= useNavigate(); + const navigate = useNavigate(); const reportDate = useSelector(getReportDate); useEffect(() => { - initListeners() - }, []) + initListeners(); + }, []); const [isFetching, setIsFetching] = useState(false); - const [reportSuccess, setReportSuccess] = useState(''); - const [startDate, setStartDate] = useState(reportDate ? new Date (reportDate._d) : new Date()); + const [reportSuccess, setReportSuccess] = useState(""); + const [startDate, setStartDate] = useState( + reportDate ? new Date(reportDate._d) : new Date() + ); const [datePickerOpen, setDatePickerOpen] = useState(false); - const [inputs, setInputs] = useState([{task: '', hours_spent: '', minutes_spent: 0}]); - const [troublesInputValue, setTroublesInputValue] = useState(''); - const [scheduledInputValue, setScheduledInputValue] = useState(''); + const [inputs, setInputs] = useState([ + { task: "", hours_spent: "", minutes_spent: 0 }, + ]); + const [troublesInputValue, setTroublesInputValue] = useState(""); + const [scheduledInputValue, setScheduledInputValue] = useState(""); const addInput = () => { - setInputs((prev) => [...prev, {task: '', hours_spent: '', minutes_spent: 0}]) + setInputs((prev) => [ + ...prev, + { task: "", hours_spent: "", minutes_spent: 0 }, + ]); }; const initListeners = () => { - document.addEventListener('click', closeByClickingOut) - } + document.addEventListener("click", closeByClickingOut); + }; const closeByClickingOut = (event) => { - const path = event.path || (event.composedPath && event.composedPath()) + const path = event.path || (event.composedPath && event.composedPath()); - if (event && !path.find((div) => div.classList && (div.classList.contains('report-form__block-img') || div.classList.contains('react-datepicker-popper')))) { - setDatePickerOpen(false) + if ( + event && + !path.find( + (div) => + div.classList && + (div.classList.contains("report-form__block-img") || + div.classList.contains("react-datepicker-popper")) + ) + ) { + setDatePickerOpen(false); } - } + }; const totalHours = inputs.reduce((a, b) => a + b.hours_spent, 0); const deleteInput = (indexRemove) => { - setInputs((prev) => prev.filter((el, index) => index !== indexRemove)) + setInputs((prev) => prev.filter((el, index) => index !== indexRemove)); }; const handler = () => { for (let input of inputs) { - if(!input.task || !input.hours_spent) { - setReportSuccess('Заполните задачи'); - setTimeout(() => setReportSuccess(''), 2000) - return + if (!input.task || !input.hours_spent) { + setReportSuccess("Заполните задачи"); + setTimeout(() => setReportSuccess(""), 2000); + return; } } - apiRequest('/reports/create', { - method: 'POST', + apiRequest("/reports/create", { + method: "POST", data: { tasks: inputs, difficulties: troublesInputValue, @@ -84,156 +103,223 @@ const ReportForm = () => { status: 1, }, }).then((res) => { - setReportSuccess('Отчет отправлен'); + setReportSuccess("Отчет отправлен"); setTimeout(() => { - setReportSuccess('') - navigate('/profile/calendar'); - }, 1000) + setReportSuccess(""); + navigate("/profile/calendar"); + }, 1000); setInputs(() => []); - setTroublesInputValue(''); - setScheduledInputValue(''); + setTroublesInputValue(""); + setScheduledInputValue(""); setIsFetching(false); - setInputs(() => [{task: '', hours_spent: '', minutes_spent: 0}]); - }) + setInputs(() => [{ task: "", hours_spent: "", minutes_spent: 0 }]); + }); }; return ( -
- - -
- -

Ваши отчеты - добавить отчет

-
-
- -

Вернуться

- -
+
+ + +
+ +

+ Ваши отчеты - добавить отчет +

+
+
+ + +

Вернуться

+
+
-
-
-
-

Добавление отчета за день

-

Дата заполнения отчета:

-
-
setDatePickerOpen(true)}> - - {getCorrectDate(startDate)} -
- { - setDatePickerOpen(false) - setStartDate(date) - }} +
+
+
+

Добавление отчета за день

+

Дата заполнения отчета:

+
+
setDatePickerOpen(true)} + > + -
- - Какие задачи были выполнены? -
+ {getCorrectDate(startDate)}
+ { + setDatePickerOpen(false); + setStartDate(date); + }} + /> +
+ + Какие задачи были выполнены? +
+
-
-
-
-

- Краткое описание задачи -

-

Количество часов

-
+
+
+
+

+ Краткое описание задачи +

+

+ Количество часов +

+
- {inputs.map((input, index) => { - return ( -
-
- {index + 1}. -
-
- setInputs(inputs.map((input, inputIndex) => { - return index === inputIndex - ? { - ...input, - task: e.target.value - } - : input - }))}/> -
-
- setInputs(inputs.map((input, inputIndex) => { - return index === inputIndex - ? { - ...input, - hours_spent: Number(e.target.value) - } - : input - }))}/> -
- {index > 0 && -
- deleteInput(index)} src={remove} alt=''/> -
+ {inputs.map((input, index) => { + return ( + +
{index + 1}.
+
+ - ) - })} + name="text" + type="text" + onChange={(e) => + setInputs( + inputs.map((input, inputIndex) => { + return index === inputIndex + ? { + ...input, + task: e.target.value, + } + : input; + }) + ) + } + /> +
+
+ + setInputs( + inputs.map((input, inputIndex) => { + return index === inputIndex + ? { + ...input, + hours_spent: Number(e.target.value), + } + : input; + }) + ) + } + /> +
+ {index > 0 && ( +
+ deleteInput(index)} + src={remove} + alt="" + /> +
+ )} +
+ ); + })} -
-

+

- Добавить еще +
+

+ + +

+ Добавить еще +
+
+
+ +
+
+
+
+ + Какие сложности возникли?
+ setTroublesInputValue(e.target.value)} + /> +
+ + Что планируется сделать завтра? +
+ setScheduledInputValue(e.target.value)} + />
- -
-
-
-
- - Какие сложности возникли? +
+
+
+
+ +

+ Всего за день :{" "} + + {totalHours} {hourOfNum(totalHours)} + +

+ {reportSuccess && ( +

+ {reportSuccess} +

+ )}
- setTroublesInputValue(e.target.value)}/> -
- - Что планируется сделать завтра? -
- setScheduledInputValue(e.target.value)}/>
-
-
-
- -

- Всего за день : {totalHours} {hourOfNum(totalHours)} -

- {reportSuccess && -

{reportSuccess}

- } -
-
-
-
-
-
-
- ) +
+
+
+ ); }; -export default ReportForm +export default ReportForm; diff --git a/src/images/calendar_icon.png b/src/images/calendar_icon.png deleted file mode 100644 index 9d6969270c5604c4b69b3a640a55753ee424e038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6XVU3I`u$~eSlAhE0CrH zY*ua32kI9s3GxeO5UQK?=l?(6Zyydgd@)+b`1#x!E}L!L%Zz{uf;?RuLn`L1?ei3B zP!M3Ao$3F@~-#nyf#T4H||N+JKOJm{`>v!@YS1!Gg`tOBpA?$T1Vf!9^500 zmDOi`1bD=`g#w!^tIzT5&o3WxhTyBH5+rJm*R9IiW*c&b(8Ww|y zcC6f>1oov%VAMDb5zvVW4^OIV&0=nlisSvy0V|7Pd=&}l`yw!r_K=l@F$^J4Fp2V{ z!tUk~thrE}9P!JN1TRqD+yQBoYs2e4U{&8h}Mk~;~{1R>D60!WbdY@t@A;h7+g zP)IBv_rLy_EnGyE2F0_bY*aUCg?Fi95Cw&3Sk@37c~uGS*m9bsX@!XJfBgEEs>~6Y zRK@f4PXc!IQ3xrgX3fX~g{Q&g<0nr|mSS@snd%X@$mY?3w{iCO_vz%`%vsZ_qTz+Z f + + diff --git a/src/pages/PartnerRequests/PartnerRequests.js b/src/pages/PartnerRequests/PartnerRequests.js index d41eb22e..d0c65b6d 100644 --- a/src/pages/PartnerRequests/PartnerRequests.js +++ b/src/pages/PartnerRequests/PartnerRequests.js @@ -14,7 +14,7 @@ import { Footer } from "../../components/Footer/Footer"; import { apiRequest } from "../../api/request"; -import cursorImg from "../../images/cursorImg.png"; +import cursorImg from "../../images/cursorImg.svg"; import "./partnerRequests.scss"; import { Navigation } from "../../components/Navigation/Navigation"; From f88b22cb84d33bc883f0120d26ce40a8e167fb46 Mon Sep 17 00:00:00 2001 From: MaxOvs19 Date: Wed, 24 May 2023 19:23:24 +0300 Subject: [PATCH 03/15] Fixed full components --- src/components/Navigation/Navigation.js | 103 --- src/components/Navigation/Navigation.jsx | 107 ++++ ...ponent.js => ProfileCalendarComponent.jsx} | 0 src/components/ProfileHeader/ProfileHeader.js | 61 -- .../ProfileHeader/ProfileHeader.jsx | 57 ++ .../ProfileHeader/profileHeader.scss | 8 +- .../{ReportForm.js => ReportForm.jsx} | 9 +- src/components/Select/TagSelect.css | 86 --- src/components/Select/TagSelect.js | 86 --- src/components/Select/TagSelect.jsx | 79 +++ src/components/Select/tagSelect.scss | 81 +++ src/components/ShortReport/ShortReport.jsx | 6 +- .../SliderWorkers/SliderWorkers.jsx | 3 +- src/components/StarRating/StarRating.js | 121 ++-- src/components/StarRating/StarRating.scss | 87 ++- .../StepsForCandidate/StepsForCandidate.js | 20 - .../StepsForCandidate/StepsForCandidate.jsx | 20 + .../StepsForCandidate/stepForCandidate.scss | 6 +- src/components/TaskItem/TaskItem.js | 16 - src/components/TaskItem/TaskItem.jsx | 16 + src/components/TaskItem/taskItem.scss | 8 +- src/components/UI/CardArticle/CardArticle.jsx | 3 +- src/components/UI/ModalAspt/ModalAspt.jsx | 4 +- .../ModalRegistration/ModalRegistration.jsx | 2 +- src/components/UI/ModalTicket/ModalTicket.jsx | 377 +++++++---- .../UI/TicketFullScreen/TicketFullScreen.jsx | 589 ++++++++++-------- .../UI/TrackerModal/TrackerModal.jsx | 133 ++-- src/images/TgLogo.svg | 9 - src/images/category.png | Bin 593 -> 0 bytes src/images/category.svg | 6 + .../{right-arrow.png => left-arrow.png} | Bin src/images/remove.png | Bin 15212 -> 0 bytes src/images/remove.svg | 8 + src/images/watch.png | Bin 475 -> 0 bytes src/images/watch.svg | 12 + src/pages/Article/Article.jsx | 2 +- src/pages/FormPage/FormPage.js | 142 ++--- .../SingleReportPage/SingleReportPage.js | 185 +++--- src/pages/Summary/Summary.js | 2 +- src/pages/ViewReport/ViewReport.jsx | 4 +- 40 files changed, 1362 insertions(+), 1096 deletions(-) delete mode 100644 src/components/Navigation/Navigation.js create mode 100644 src/components/Navigation/Navigation.jsx rename src/components/ProfileCalendar/{ProfileCalendarComponent.js => ProfileCalendarComponent.jsx} (100%) delete mode 100644 src/components/ProfileHeader/ProfileHeader.js create mode 100644 src/components/ProfileHeader/ProfileHeader.jsx rename src/components/ReportForm/{ReportForm.js => ReportForm.jsx} (98%) delete mode 100644 src/components/Select/TagSelect.css delete mode 100644 src/components/Select/TagSelect.js create mode 100644 src/components/Select/TagSelect.jsx create mode 100644 src/components/Select/tagSelect.scss delete mode 100644 src/components/StepsForCandidate/StepsForCandidate.js create mode 100644 src/components/StepsForCandidate/StepsForCandidate.jsx delete mode 100644 src/components/TaskItem/TaskItem.js create mode 100644 src/components/TaskItem/TaskItem.jsx delete mode 100644 src/images/TgLogo.svg delete mode 100644 src/images/category.png create mode 100644 src/images/category.svg rename src/images/{right-arrow.png => left-arrow.png} (100%) delete mode 100644 src/images/remove.png create mode 100644 src/images/remove.svg delete mode 100644 src/images/watch.png create mode 100644 src/images/watch.svg diff --git a/src/components/Navigation/Navigation.js b/src/components/Navigation/Navigation.js deleted file mode 100644 index 45132792..00000000 --- a/src/components/Navigation/Navigation.js +++ /dev/null @@ -1,103 +0,0 @@ -import React, { useEffect, useState } from 'react' -import { NavLink } from 'react-router-dom' -import { urlForLocal } from '../../helper' -import { apiRequest } from '../../api/request'; -import { useDispatch, useSelector } from 'react-redux'; -import { getProfileInfo, setProfileInfo } from '../../redux/outstaffingSlice'; - -import avatarMok from "../../pages/PartnerTreaties/Images/avatarMok.png" - -export const Navigation = () => { - const dispatch = useDispatch(); - - - const profileInfo = useSelector(getProfileInfo); - const [user] = useState(localStorage.getItem('role_status') === '18' ? 'partner' : 'developer') - const [navInfo] = useState({ - developer: [ - { - path: '/summary', - name: 'Резюме' - }, - { - path: '/calendar', - name: 'Отчетность' - }, - { - path: '/tracker', - name: 'Трекер' - }, - { - path: '/payouts', - name: 'Выплаты' - }, - { - path: '/settings', - name: 'Настройки' - }, - ], - partner: [ - { - path: '/catalog', - name: 'Каталог' - }, - { - path: '/requests', - name: 'Запросы' - }, - { - path: '/categories', - name: 'Персонал' - }, - { - path: '/tracker', - name: 'Трекер' - }, - { - path: '/treaties', - name: 'Договора' - }, - { - path: '/settings', - name: 'Настройки' - }, - ] - }) - - useEffect(() => { - if (localStorage.getItem('role_status') === '18') { - return - } - apiRequest(`/profile/${localStorage.getItem('cardId')}`) - .then((profileInfo) => - dispatch(setProfileInfo(profileInfo)) - ); - - }, [dispatch]); - - return ( -
-
- - -
-

- {user === 'developer' ? - profileInfo?.fio : - '' - } -

- - avatar - -
-
-
- ) -} diff --git a/src/components/Navigation/Navigation.jsx b/src/components/Navigation/Navigation.jsx new file mode 100644 index 00000000..d8721287 --- /dev/null +++ b/src/components/Navigation/Navigation.jsx @@ -0,0 +1,107 @@ +import React, { useEffect, useState } from "react"; +import { NavLink } from "react-router-dom"; +import { urlForLocal } from "../../helper"; +import { apiRequest } from "../../api/request"; +import { useDispatch, useSelector } from "react-redux"; +import { getProfileInfo, setProfileInfo } from "../../redux/outstaffingSlice"; + +import avatarMok from "../../pages/PartnerTreaties/Images/avatarMok.png"; + +export const Navigation = () => { + const dispatch = useDispatch(); + + const profileInfo = useSelector(getProfileInfo); + const [user] = useState( + localStorage.getItem("role_status") === "18" ? "partner" : "developer" + ); + const [navInfo] = useState({ + developer: [ + { + path: "/summary", + name: "Резюме", + }, + { + path: "/calendar", + name: "Отчетность", + }, + { + path: "/tracker", + name: "Трекер", + }, + { + path: "/payouts", + name: "Выплаты", + }, + { + path: "/settings", + name: "Настройки", + }, + ], + partner: [ + { + path: "/catalog", + name: "Каталог", + }, + { + path: "/requests", + name: "Запросы", + }, + { + path: "/categories", + name: "Персонал", + }, + { + path: "/tracker", + name: "Трекер", + }, + { + path: "/treaties", + name: "Договора", + }, + { + path: "/settings", + name: "Настройки", + }, + ], + }); + + useEffect(() => { + if (localStorage.getItem("role_status") === "18") { + return; + } + apiRequest(`/profile/${localStorage.getItem("cardId")}`).then( + (profileInfo) => dispatch(setProfileInfo(profileInfo)) + ); + }, [dispatch]); + + return ( +
+
+ + +
+

+ {user === "developer" ? profileInfo?.fio : ""} +

+ + avatar + +
+
+
+ ); +}; diff --git a/src/components/ProfileCalendar/ProfileCalendarComponent.js b/src/components/ProfileCalendar/ProfileCalendarComponent.jsx similarity index 100% rename from src/components/ProfileCalendar/ProfileCalendarComponent.js rename to src/components/ProfileCalendar/ProfileCalendarComponent.jsx diff --git a/src/components/ProfileHeader/ProfileHeader.js b/src/components/ProfileHeader/ProfileHeader.js deleted file mode 100644 index d17872e2..00000000 --- a/src/components/ProfileHeader/ProfileHeader.js +++ /dev/null @@ -1,61 +0,0 @@ -import React, {useEffect, useState} from 'react'; -import {useNavigate, NavLink} from "react-router-dom"; -import {useDispatch, useSelector} from "react-redux"; - -import {Loader} from '../Loader/Loader' -import {apiRequest} from "../../api/request"; -import {auth, setProfileInfo} from "../../redux/outstaffingSlice"; -import {getRole} from "../../redux/roleSlice"; -import './profileHeader.scss' - - - -export const ProfileHeader = () => { - const navigate = useNavigate(); - const dispatch = useDispatch(); - - - const userRole = useSelector(getRole); - const [user] = useState(localStorage.getItem('role_status') === '18' ? 'partner' : 'developer') - - const [isLoggingOut, setIsLoggingOut] = useState(false); - - useEffect(() => { - if (localStorage.getItem('role_status') === '18') { - return - } - apiRequest(`/profile/${localStorage.getItem('cardId')}`) - .then((profileInfo) => - dispatch(setProfileInfo(profileInfo)) - ); - - }, [dispatch]); - - const handler = () => { - setIsLoggingOut(true); - localStorage.clear(); - dispatch(auth(false)); - setIsLoggingOut(false); - navigate(userRole === 'ROLE_DEV' ? '/authdev' : '/auth') - }; - - return ( -
-
-
- itguild. - - {user === 'developer' ? - 'для разработчиков' : - 'для партнеров' - } - - - -
-
-
- ) -}; diff --git a/src/components/ProfileHeader/ProfileHeader.jsx b/src/components/ProfileHeader/ProfileHeader.jsx new file mode 100644 index 00000000..f0fc4bf8 --- /dev/null +++ b/src/components/ProfileHeader/ProfileHeader.jsx @@ -0,0 +1,57 @@ +import React, { useEffect, useState } from "react"; +import { useNavigate, NavLink } from "react-router-dom"; +import { useDispatch, useSelector } from "react-redux"; + +import { Loader } from "../Loader/Loader"; +import { apiRequest } from "../../api/request"; +import { auth, setProfileInfo } from "../../redux/outstaffingSlice"; +import { getRole } from "../../redux/roleSlice"; + +import "./profileHeader.scss"; + +export const ProfileHeader = () => { + const navigate = useNavigate(); + const dispatch = useDispatch(); + + const userRole = useSelector(getRole); + const [user] = useState( + localStorage.getItem("role_status") === "18" ? "partner" : "developer" + ); + + const [isLoggingOut, setIsLoggingOut] = useState(false); + + useEffect(() => { + if (localStorage.getItem("role_status") === "18") { + return; + } + apiRequest(`/profile/${localStorage.getItem("cardId")}`).then( + (profileInfo) => dispatch(setProfileInfo(profileInfo)) + ); + }, [dispatch]); + + const handler = () => { + setIsLoggingOut(true); + localStorage.clear(); + dispatch(auth(false)); + setIsLoggingOut(false); + navigate(userRole === "ROLE_DEV" ? "/authdev" : "/auth"); + }; + + return ( +
+
+
+ + itguild. + + {user === "developer" ? "для разработчиков" : "для партнеров"} + + + +
+
+
+ ); +}; diff --git a/src/components/ProfileHeader/profileHeader.scss b/src/components/ProfileHeader/profileHeader.scss index 2a6f409d..92b1fa14 100644 --- a/src/components/ProfileHeader/profileHeader.scss +++ b/src/components/ProfileHeader/profileHeader.scss @@ -2,10 +2,10 @@ width: 100%; display: flex; flex-direction: column; - font-family: 'LabGrotesque', sans-serif; + font-family: "LabGrotesque", sans-serif; &__head { - background: #E1FCCF; + background: #e1fccf; } &__container { @@ -26,7 +26,7 @@ color: black; span { - color: #52B709; + color: #52b709; } &:hover { @@ -45,7 +45,7 @@ } &__info { - background: #FFFFFF; + background: #ffffff; } &__nav { diff --git a/src/components/ReportForm/ReportForm.js b/src/components/ReportForm/ReportForm.jsx similarity index 98% rename from src/components/ReportForm/ReportForm.js rename to src/components/ReportForm/ReportForm.jsx index 31389b42..82c2197d 100644 --- a/src/components/ReportForm/ReportForm.js +++ b/src/components/ReportForm/ReportForm.jsx @@ -13,20 +13,19 @@ registerLocale("ru", ru); import { Loader } from "../Loader/Loader"; import { Footer } from "../Footer/Footer"; import { ProfileHeader } from "../ProfileHeader/ProfileHeader"; -import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; +import { ProfileBreadcrumbs } from "../ProfileBreadcrumbs/ProfileBreadcrumbs"; import { apiRequest } from "../../api/request"; - +import { Navigation } from "../Navigation/Navigation"; import { getReportDate } from "../../redux/reportSlice"; import calendarIcon from "../../images/calendar.svg"; import ellipse from "../../images/ellipse.png"; -import remove from "../../images/remove.png"; -import arrow from "../../images/right-arrow.png"; +import remove from "../../images/remove.svg"; +import arrow from "../../images/left-arrow.png"; import "./reportForm.scss"; import "react-datepicker/dist/react-datepicker.css"; -import { Navigation } from "../Navigation/Navigation"; const ReportForm = () => { if (localStorage.getItem("role_status") === "18") { diff --git a/src/components/Select/TagSelect.css b/src/components/Select/TagSelect.css deleted file mode 100644 index 6e778c7e..00000000 --- a/src/components/Select/TagSelect.css +++ /dev/null @@ -1,86 +0,0 @@ -.search { - margin-top: 73px; -} -.search__title { - font-family: 'GT Eesti Pro Display', sans-serif; - font-size: 2.4em; - font-weight: 500; - font-style: normal; - letter-spacing: normal; - line-height: normal; - text-align: center; - margin-bottom: 40px; -} - -.search__box { - display: flex; - justify-content: space-between; -} - -@media (max-width: 575.98px) { - .search__box { - flex-direction: column; - align-items: center; - } -} - -.search__box > button { - color: white; - width: 131px; - height: 40px; - border-radius: 10px; - border: none; - font-family: 'Muller', sans-serif; - font-size: 1.6em; - letter-spacing: 0.8px; - text-align: center; - background-color: #73c141; -} - -.search__box > button:hover { - background: rgba(0, 0, 0, 0); - color: #73c141; - box-shadow: inset 0 0 0 3px #73c141; -} - -@media (max-width: 575.98px) { - .search__box > button { - margin-top: 20px; - } -} - -.select { - width: 85%; -} - -[class$='-placeholder'] { - display: none; -} - -[class$='-control'] { - border-color: #e8e8e8 !important; - box-shadow: 0 0 0 0 #e8e8e8 !important; -} - -[class$='-value__label'] { - font-size: 1.4em !important; -} - -[class$='-option'] { - font-size: 1.6em !important; - color: gray !important; -} - -.search__submit { - font-weight: bold; -} - -.search__submit:hover .loader path { - fill: #6aaf5c; -} - -@media (max-width: 990px) { - .select { - margin-right: 1rem; - } -} \ No newline at end of file diff --git a/src/components/Select/TagSelect.js b/src/components/Select/TagSelect.js deleted file mode 100644 index 77e3a3ed..00000000 --- a/src/components/Select/TagSelect.js +++ /dev/null @@ -1,86 +0,0 @@ -import React, {useState} from 'react' -import {useSelector, useDispatch} from 'react-redux' -import Select from 'react-select' -import {Loader} from '../Loader/Loader' -import {apiRequest} from "../../api/request"; -import { - selectedItems, - selectItems, - selectTags, - profiles, - setPositionId -} from '../../redux/outstaffingSlice' - -import './TagSelect.css' - - -const TagSelect = () => { - - const [searchLoading, setSearchLoading] = useState(false); - const dispatch = useDispatch(); - - - const itemsArr = useSelector(selectItems); - const tagsArr = useSelector(selectTags); - - const handleSubmit = ({dispatch, setSearchLoading}) => { - setSearchLoading(true); - - dispatch(setPositionId(null)); - const filterItemsId = itemsArr.map((item) => item.id).join(); - const params = filterItemsId ? {skill: filterItemsId} : ''; - - - apiRequest('/profile', { - params: {...params, limit: 1000}, - }).then((res) => { - dispatch(profiles(res)); - setSearchLoading(false) - }) - - // dispatch(selectedItems([])); - }; - - return ( - <> -
-
-
-

- Найти специалиста по навыкам -

-
- dispatch(selectedItems(value))} + isMulti + name="tags" + className="select" + classNamePrefix="select" + options={ + tagsArr && + tagsArr.flat().map((item) => { + return { + id: item.id, + value: item.value, + label: item.value, + }; + }) + } + /> + +
+
+
+
+ + ); +}; + +export default TagSelect; diff --git a/src/components/Select/tagSelect.scss b/src/components/Select/tagSelect.scss new file mode 100644 index 00000000..b2b80f8b --- /dev/null +++ b/src/components/Select/tagSelect.scss @@ -0,0 +1,81 @@ +.search { + margin-top: 73px; + + &__title { + font-family: "GT Eesti Pro Display", sans-serif; + font-size: 2.4em; + font-weight: 500; + font-style: normal; + letter-spacing: normal; + line-height: normal; + text-align: center; + margin-bottom: 40px; + } + + &__box { + display: flex; + justify-content: space-between; + + button { + color: white; + width: 131px; + height: 40px; + border-radius: 10px; + border: none; + font-family: "Muller", sans-serif; + font-size: 1.6em; + letter-spacing: 0.8px; + text-align: center; + background-color: #73c141; + + &:hover { + background: rgba(0, 0, 0, 0); + color: #73c141; + box-shadow: inset 0 0 0 3px #73c141; + } + + @media (max-width: 575.98px) { + margin-top: 20px; + } + } + + @media (max-width: 575.98px) { + flex-direction: column; + align-items: center; + } + } + + &__submit { + font-weight: bold; + } + + .select { + width: 85%; + + @media (max-width: 990px) { + margin-right: 1rem; + } + } +} + +[class$="-placeholder"] { + display: none; +} + +[class$="-control"] { + border-color: #e8e8e8 !important; + box-shadow: 0 0 0 0 #e8e8e8 !important; +} + +[class$="-value__label"] { + font-size: 1.4em !important; +} + +[class$="-option"] { + font-size: 1.6em !important; + color: gray !important; +} + +.search__submit:hover .loader path { + fill: #6aaf5c; +} diff --git a/src/components/ShortReport/ShortReport.jsx b/src/components/ShortReport/ShortReport.jsx index 84eedd60..14e4333a 100644 --- a/src/components/ShortReport/ShortReport.jsx +++ b/src/components/ShortReport/ShortReport.jsx @@ -1,4 +1,6 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { Link } from "react-router-dom"; import { apiRequest } from "../../api/request"; import { @@ -11,8 +13,6 @@ import { getSendRequest, setSendRequest, } from "../../redux/reportSlice"; -import { useDispatch, useSelector } from "react-redux"; -import { Link } from "react-router-dom"; import { Loader } from "../Loader/Loader"; import "./shortReport.scss"; diff --git a/src/components/SliderWorkers/SliderWorkers.jsx b/src/components/SliderWorkers/SliderWorkers.jsx index 28f3f155..7a67ced9 100644 --- a/src/components/SliderWorkers/SliderWorkers.jsx +++ b/src/components/SliderWorkers/SliderWorkers.jsx @@ -1,12 +1,11 @@ import React, { useState } from "react"; import Slider from "react-slick"; - +import { Link } from "react-router-dom"; import mockWorker from "../../images/mokPerson.png"; import "./sliderWorkers.scss"; import "slick-carousel/slick/slick.css"; import "slick-carousel/slick/slick-theme.css"; -import { Link } from "react-router-dom"; export const SliderWorkers = ({ title, titleInfo, subTitle }) => { const [workers] = useState([ diff --git a/src/components/StarRating/StarRating.js b/src/components/StarRating/StarRating.js index 58cdc0bd..9175d00f 100644 --- a/src/components/StarRating/StarRating.js +++ b/src/components/StarRating/StarRating.js @@ -1,44 +1,85 @@ -import React, { useEffect, useState } from 'react' -import './StarRating.scss' +import React, { useEffect, useState } from "react"; +import "./StarRating.scss"; -const StarRating = ({ countStars=1, countActiveStars=1, color='#52B709', size=61 }) => { - const [shadedStars, setShadedStars] = useState([]) - const [noShadedStars, setNoShadedStars] = useState([]) - const percent = (Math.abs(countActiveStars)) >= countStars ? 100 : (countActiveStars * 100 / countStars) - useEffect(() => { - for (let index = 0; index < countStars; index++) { - setShadedStars(prev => [...prev, '★']) - setNoShadedStars(prev => [...prev, '☆']) - } - }, []) +const StarRating = ({ + countStars = 1, + countActiveStars = 1, + color = "#52B709", + size = 61, +}) => { + const [shadedStars, setShadedStars] = useState([]); + const [noShadedStars, setNoShadedStars] = useState([]); + const percent = + Math.abs(countActiveStars) >= countStars + ? 100 + : (countActiveStars * 100) / countStars; + useEffect(() => { + for (let index = 0; index < countStars; index++) { + setShadedStars((prev) => [...prev, "★"]); + setNoShadedStars((prev) => [...prev, "☆"]); + } + }, []); - const ratingStyle = { - "--size": size+'px' - } - const activeStyle = { - "--width": percent + '%', - "--color": color, - "--content": shadedStars.join('') - } - const bodyStyle = { - "--content": noShadedStars.join(''), - "--color": color - } + const ratingStyle = { + "--size": size + "px", + }; + const activeStyle = { + "--width": percent + "%", + "--color": color, + "--content": shadedStars.join(""), + }; + const bodyStyle = { + "--content": noShadedStars.join(""), + "--color": color, + }; - return ( -
-
-
-
- - - - - -
-
-
- ) -} + return ( +
+
+
+
+ + + + + +
+
+
+ ); +}; -export default React.memo(StarRating); \ No newline at end of file +export default React.memo(StarRating); diff --git a/src/components/StarRating/StarRating.scss b/src/components/StarRating/StarRating.scss index 913b35b6..26730287 100644 --- a/src/components/StarRating/StarRating.scss +++ b/src/components/StarRating/StarRating.scss @@ -1,45 +1,44 @@ -.rating{ - display: flex; - align-items: center; - font-size: var(--size); - line-height: 0.75; - &__body{ - position: relative; - &::before{ - content: attr(data-content); - display: block; - color: var(--color); - } - } - &__active{ - position: absolute; - height: 100%; - width: var(--width); - top: 0; - left: 0; - overflow: hidden; - &::before{ - content: attr(data-content); - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - color: var(--color); - } - } - &__items{ - display: flex; - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; - } - &__item{ - flex: 0 0 20%; - height: 100%; - opacity: 0; - } +.rating { + display: flex; + align-items: center; + font-size: var(--size); + line-height: 0.75; + &__body { + position: relative; + &::before { + content: attr(data-content); + display: block; + color: var(--color); + } + } + &__active { + position: absolute; + height: 100%; + width: var(--width); + top: 0; + left: 0; + overflow: hidden; + &::before { + content: attr(data-content); + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + color: var(--color); + } + } + &__items { + display: flex; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + } + &__item { + flex: 0 0 20%; + height: 100%; + opacity: 0; + } } - diff --git a/src/components/StepsForCandidate/StepsForCandidate.js b/src/components/StepsForCandidate/StepsForCandidate.js deleted file mode 100644 index 8656d458..00000000 --- a/src/components/StepsForCandidate/StepsForCandidate.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; - -import './stepForCandidate.scss' - -export const StepsForCandidate = ({step}) => { - return( -
-
- 2 -

шага для твоего входа в команду

-
-
-

{step}

- из 2 -
-
- ) -}; - -export default StepsForCandidate diff --git a/src/components/StepsForCandidate/StepsForCandidate.jsx b/src/components/StepsForCandidate/StepsForCandidate.jsx new file mode 100644 index 00000000..d3fe3748 --- /dev/null +++ b/src/components/StepsForCandidate/StepsForCandidate.jsx @@ -0,0 +1,20 @@ +import React from "react"; + +import "./stepForCandidate.scss"; + +export const StepsForCandidate = ({ step }) => { + return ( +
+
+ 2 +

шага для твоего входа в команду

+
+
+

{step}

+ из 2 +
+
+ ); +}; + +export default StepsForCandidate; diff --git a/src/components/StepsForCandidate/stepForCandidate.scss b/src/components/StepsForCandidate/stepForCandidate.scss index 1e703639..b78009b4 100644 --- a/src/components/StepsForCandidate/stepForCandidate.scss +++ b/src/components/StepsForCandidate/stepForCandidate.scss @@ -4,7 +4,7 @@ align-items: center; justify-content: space-between; top: -100px; - padding:0 55px 0 85px; + padding: 0 55px 0 85px; width: 100%; @media (max-width: 965px) { @@ -20,7 +20,7 @@ font-weight: 900; font-size: 258px; line-height: 32px; - color: #52B709; + color: #52b709; } p { @@ -41,7 +41,7 @@ display: flex; align-items: center; p { - background: #DDEEC6; + background: #ddeec6; border-radius: 44px; padding: 8px 26px; font-weight: 400; diff --git a/src/components/TaskItem/TaskItem.js b/src/components/TaskItem/TaskItem.js deleted file mode 100644 index 9a9c2467..00000000 --- a/src/components/TaskItem/TaskItem.js +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react' - -import './taskItem.scss' - -export const TaskItem = ({ index, text, hours }) => { - return ( -
-
{index}.
-
{text}
-
-
{hours}
-
Количество часов
-
-
- ) -} diff --git a/src/components/TaskItem/TaskItem.jsx b/src/components/TaskItem/TaskItem.jsx new file mode 100644 index 00000000..258f0d5d --- /dev/null +++ b/src/components/TaskItem/TaskItem.jsx @@ -0,0 +1,16 @@ +import React from "react"; + +import "./taskItem.scss"; + +export const TaskItem = ({ index, text, hours }) => { + return ( +
+
{index}.
+
{text}
+
+
{hours}
+
Количество часов
+
+
+ ); +}; diff --git a/src/components/TaskItem/taskItem.scss b/src/components/TaskItem/taskItem.scss index 0a6f10f5..9f965c5b 100644 --- a/src/components/TaskItem/taskItem.scss +++ b/src/components/TaskItem/taskItem.scss @@ -6,7 +6,7 @@ &__index { margin-top: 0.2rem; color: #282828; - font-family: 'GT Eesti Pro Display'; + font-family: "GT Eesti Pro Display"; font-size: 20px; font-weight: 700; line-height: 48.74px; @@ -19,7 +19,7 @@ max-width: 525px; margin-left: 1.6rem; color: #000000; - font-family: 'GT Eesti Pro Display'; + font-family: "GT Eesti Pro Display"; font-size: 15px; font-weight: 400; letter-spacing: normal; @@ -49,7 +49,7 @@ ); color: #ffffff; - font-family: 'Muller Extra Bold'; + font-family: "Muller Extra Bold"; font-size: 16px; font-weight: 400; text-align: left; @@ -61,7 +61,7 @@ width: 69px; height: 25px; color: #000000; - font-family: 'GT Eesti Pro Display - Thin'; + font-family: "GT Eesti Pro Display - Thin"; font-size: 13px; font-weight: 400; letter-spacing: normal; diff --git a/src/components/UI/CardArticle/CardArticle.jsx b/src/components/UI/CardArticle/CardArticle.jsx index be8ca4b1..e6a62e98 100644 --- a/src/components/UI/CardArticle/CardArticle.jsx +++ b/src/components/UI/CardArticle/CardArticle.jsx @@ -1,7 +1,8 @@ import React from "react"; -import cardCalendar from "../../../images/cardCalendar.svg"; import { Link } from "react-router-dom"; +import cardCalendar from "../../../images/cardCalendar.svg"; + import "./cardArticle.scss"; export const CardArticle = ({ images, title, data, id }) => { diff --git a/src/components/UI/ModalAspt/ModalAspt.jsx b/src/components/UI/ModalAspt/ModalAspt.jsx index aa60b69e..569c95a2 100644 --- a/src/components/UI/ModalAspt/ModalAspt.jsx +++ b/src/components/UI/ModalAspt/ModalAspt.jsx @@ -4,8 +4,8 @@ import { Link } from "react-router-dom"; import ModalLayout from "../ModalLayout/ModalLayout"; import avatar from "../../../images/mokPerson.png"; -import logoTg from "../../../images/TgLogo.svg"; -import arrow from "../../../images/right-arrow.png"; +import logoTg from "../../../images/tgLogo.svg"; +import arrow from "../../../images/left-arrow.png"; import interview from "../../../images/interviewLogo.svg"; import "./modalAspt.scss"; diff --git a/src/components/UI/ModalRegistration/ModalRegistration.jsx b/src/components/UI/ModalRegistration/ModalRegistration.jsx index da4f497a..8d4958a7 100644 --- a/src/components/UI/ModalRegistration/ModalRegistration.jsx +++ b/src/components/UI/ModalRegistration/ModalRegistration.jsx @@ -1,6 +1,6 @@ import React from "react"; -import telegramLogo from "../../../images/TgLogo.svg"; +import telegramLogo from "../../../images/tgLogo.svg"; import doc from "../../../images/doc.svg"; import anyMoment from "../../../images/anyMoment.svg"; diff --git a/src/components/UI/ModalTicket/ModalTicket.jsx b/src/components/UI/ModalTicket/ModalTicket.jsx index e2e3fe72..4b9f754f 100644 --- a/src/components/UI/ModalTicket/ModalTicket.jsx +++ b/src/components/UI/ModalTicket/ModalTicket.jsx @@ -1,17 +1,18 @@ -import React, {useEffect, useState} from "react"; +import React, { useEffect, useState } from "react"; import { Link } from "react-router-dom"; + import TrackerModal from "../TrackerModal/TrackerModal"; import { apiRequest } from "../../../api/request"; import { useDispatch } from "react-redux"; +import { urlForLocal } from "../../../helper"; import { modalToggle, setProjectBoardFetch, } from "../../../redux/projectsTrackerSlice"; +import { getCorrectDate } from "../../../components/Calendar/calendarHelper"; -import {getCorrectDate} from '../../../components/Calendar/calendarHelper' - -import category from "../../../images/category.png"; -import watch from "../../../images/watch.png"; +import category from "../../../images/category.svg"; +import watch from "../../../images/watch.svg"; import file from "../../../images/fileModal.svg"; import arrow from "../../../images/arrowStart.png"; import link from "../../../images/link.svg"; @@ -24,7 +25,6 @@ import fullScreen from "../../../images/inFullScreen.svg"; import close from "../../../images/closeProjectPersons.svg"; import "./ModalTicket.scss"; -import {urlForLocal} from "../../../helper"; export const ModalTiсket = ({ active, @@ -32,20 +32,24 @@ export const ModalTiсket = ({ task, projectId, projectName, - projectUsers + projectUsers, }) => { const dispatch = useDispatch(); const [addSubtask, setAddSubtask] = useState(false); const [editOpen, setEditOpen] = useState(false); - const [inputsValue, setInputsValue] = useState({title: task.title, description: task.description, comment: ''}); + const [inputsValue, setInputsValue] = useState({ + title: task.title, + description: task.description, + comment: "", + }); const [comments, setComments] = useState([]); - const [commentsEditOpen, setCommentsEditOpen] = useState({}) - const [commentsEditText, setCommentsEditText] = useState({}) - const [dropListOpen, setDropListOpen] = useState(false) - const [dropListMembersOpen, setDropListMembersOpen] = useState(false) - const [executor, setExecutor] = useState(task.executor) - const [members, setMembers] = useState(task.taskUsers) - const [users, setUsers] = useState([]) + const [commentsEditOpen, setCommentsEditOpen] = useState({}); + const [commentsEditText, setCommentsEditText] = useState({}); + const [dropListOpen, setDropListOpen] = useState(false); + const [dropListMembersOpen, setDropListMembersOpen] = useState(false); + const [executor, setExecutor] = useState(task.executor); + const [members, setMembers] = useState(task.taskUsers); + const [users, setUsers] = useState([]); function deleteTask() { apiRequest("/task/update-task", { @@ -66,7 +70,7 @@ export const ModalTiсket = ({ data: { task_id: task.id, title: inputsValue.title, - description: inputsValue.description + description: inputsValue.description, }, }).then((res) => { dispatch(setProjectBoardFetch(projectId)); @@ -79,39 +83,42 @@ export const ModalTiсket = ({ data: { text: inputsValue.comment, entity_type: 2, - entity_id: task.id - } + entity_id: task.id, + }, }).then((res) => { - let newComment = res - newComment.created_at = new Date() - setInputsValue((prevValue) => ({...prevValue, comment: ''})) - setComments((prevValue) => ([...prevValue, newComment])) - setCommentsEditOpen((prevValue) => ({...prevValue, [res.id]: false})) - setCommentsEditText((prevValue) => ({...prevValue, [res.id]: res.text})) - }) + let newComment = res; + newComment.created_at = new Date(); + setInputsValue((prevValue) => ({ ...prevValue, comment: "" })); + setComments((prevValue) => [...prevValue, newComment]); + setCommentsEditOpen((prevValue) => ({ ...prevValue, [res.id]: false })); + setCommentsEditText((prevValue) => ({ + ...prevValue, + [res.id]: res.text, + })); + }); } function deleteComment(commentId) { apiRequest("/comment/update", { method: "PUT", data: { comment_id: commentId, - status: 0 - } + status: 0, + }, }).then((res) => { - setComments((prevValue) => prevValue.filter((item) => item.id !== commentId)) - }) + setComments((prevValue) => + prevValue.filter((item) => item.id !== commentId) + ); + }); } function editComment(commentId) { - apiRequest("/comment/update", { method: "PUT", data: { comment_id: commentId, - text: commentsEditText[commentId] - } - }).then((res) => { - }) + text: commentsEditText[commentId], + }, + }).then((res) => {}); } function taskExecutor(person) { @@ -119,11 +126,11 @@ export const ModalTiсket = ({ method: "PUT", data: { task_id: task.id, - executor_id: person.user_id + executor_id: person.user_id, }, }).then((res) => { - setDropListOpen(false) - setExecutor(res.executor) + setDropListOpen(false); + setExecutor(res.executor); }); } @@ -132,10 +139,10 @@ export const ModalTiсket = ({ method: "PUT", data: { task_id: task.id, - executor_id: 0 + executor_id: 0, }, }).then((res) => { - setExecutor(null) + setExecutor(null); }); } @@ -144,11 +151,11 @@ export const ModalTiсket = ({ method: "POST", data: { task_id: task.id, - user_id: person.user_id + user_id: person.user_id, }, }).then((res) => { - setDropListMembersOpen(false) - setMembers((prevValue) => ([...prevValue, res])) + setDropListMembersOpen(false); + setMembers((prevValue) => [...prevValue, res]); }); } @@ -157,31 +164,40 @@ export const ModalTiсket = ({ method: "DELETE", data: { task_id: task.id, - user_id: person.user_id + user_id: person.user_id, }, }).then((res) => { - setMembers(members.filter((item) => item.user_id !== person.user_id)) + setMembers(members.filter((item) => item.user_id !== person.user_id)); }); } useEffect(() => { - apiRequest(`/comment/get-by-entity?entity_type=2&entity_id=${task.id}`).then((res) => { - setComments(res) + apiRequest( + `/comment/get-by-entity?entity_type=2&entity_id=${task.id}` + ).then((res) => { + setComments(res); res.forEach((item) => { - setCommentsEditOpen((prevValue) => ({...prevValue, [item.id]: false})) - setCommentsEditText((prevValue) => ({...prevValue, [item.id]: item.text})) - }) - }) - }, []) + setCommentsEditOpen((prevValue) => ({ + ...prevValue, + [item.id]: false, + })); + setCommentsEditText((prevValue) => ({ + ...prevValue, + [item.id]: item.text, + })); + }); + }); + }, []); useEffect(() => { - let ids = members.map((user) => user.user_id) - setUsers(projectUsers.reduce((acc, cur) => { - if (!ids.includes(cur.user_id)) acc.push(cur) - return acc - }, [])) - }, [members]) - + let ids = members.map((user) => user.user_id); + setUsers( + projectUsers.reduce((acc, cur) => { + if (!ids.includes(cur.user_id)) acc.push(cur); + return acc; + }, []) + ); + }, [members]); return (
Задача - {editOpen ? { - setInputsValue((prevValue) => ({...prevValue, title: e.target.value})) - }} /> :
{inputsValue.title}
} + {editOpen ? ( + { + setInputsValue((prevValue) => ({ + ...prevValue, + title: e.target.value, + })); + }} + /> + ) : ( +
{inputsValue.title}
+ )}
- {editOpen ? { - setInputsValue((prevValue) => ({...prevValue, description: e.target.value})) - }}/> :

{inputsValue.description}

} + {editOpen ? ( + { + setInputsValue((prevValue) => ({ + ...prevValue, + description: e.target.value, + })); + }} + /> + ) : ( +

{inputsValue.description}

+ )} {/**/}
@@ -237,97 +273,163 @@ export const ModalTiсket = ({

- { - setInputsValue((prevValue) => ({...prevValue, comment: e.target.value})) - }} /> + { + setInputsValue((prevValue) => ({ + ...prevValue, + comment: e.target.value, + })); + }} + />
-
+
{comments.map((comment) => { - return
-
- {getCorrectDate(comment.created_at)} -
- edit { - if (commentsEditOpen[comment.id]) { - editComment(comment.id) + return ( +
+
+ {getCorrectDate(comment.created_at)} +
({...prevValue, [comment.id]: !prevValue[comment.id]})) - }} /> + > + edit { + if (commentsEditOpen[comment.id]) { + editComment(comment.id); + } + setCommentsEditOpen((prevValue) => ({ + ...prevValue, + [comment.id]: !prevValue[comment.id], + })); + }} + /> +
+ delete deleteComment(comment.id)} + />
- delete deleteComment(comment.id)} /> + {commentsEditOpen[comment.id] ? ( + { + setCommentsEditText((prevValue) => ({ + ...prevValue, + [comment.id]: e.target.value, + })); + }} + /> + ) : ( +

{commentsEditText[comment.id]}

+ )}
- {commentsEditOpen[comment.id] ? { - setCommentsEditText((prevValue) => ({...prevValue, [comment.id]: e.target.value})) - }} /> :

{commentsEditText[comment.id]}

} -
- }) - - } + ); + })}
setActive(false)}> - {task.title} + {task.title}

Создатель : {task.user?.fio}

- {executor ? -
+ {executor ? ( +

Исполнитель: {executor.fio}

- avatar - deleteTaskExecutor()} /> -
: + avatar + deleteTaskExecutor()} + /> +
+ ) : (
Добавить исполнителя - {dropListOpen && -
- setDropListOpen(false)} /> + {dropListOpen && ( +
+ setDropListOpen(false)} + /> {projectUsers.map((person) => { - return
taskExecutor(person)}> - {person.user.fio} - -
- }) - } + return ( +
taskExecutor(person)} + > + {person.user.fio} + +
+ ); + })}
- } + )}
- } + )} - {Boolean(members.length) && -
-

Участники:

-
+ {Boolean(members.length) && ( +
+

Участники:

+
{members.map((member) => { - return
-

{member.fio}

- - deleteMember(member)} /> -
- }) - } + return ( +
+

{member.fio}

+ + deleteMember(member)} + /> +
+ ); + })}
-
- } +
+ )}
Добавить участников - {dropListMembersOpen && -
- setDropListMembersOpen(false)} /> - {users.length ? users.map((person) => { - return
addMember(person)}> - {person.user.fio} - -
- }) :

Нет пользователей

- } -
- } + {dropListMembersOpen && ( +
+ setDropListMembersOpen(false)} + /> + {users.length ? ( + users.map((person) => { + return ( +
addMember(person)} + > + {person.user.fio} + +
+ ); + }) + ) : ( +

Нет пользователей

+ )} +
+ )}
@@ -344,16 +446,19 @@ export const ModalTiсket = ({
-
{ - if(editOpen) { - setEditOpen(!editOpen) - editTask() - } else { - setEditOpen(!editOpen) - } - }}> +
{ + if (editOpen) { + setEditOpen(!editOpen); + editTask(); + } else { + setEditOpen(!editOpen); + } + }} + > -

{editOpen ? 'сохранить' : 'редактировать'}

+

{editOpen ? "сохранить" : "редактировать"}

diff --git a/src/components/UI/TicketFullScreen/TicketFullScreen.jsx b/src/components/UI/TicketFullScreen/TicketFullScreen.jsx index 6be108e7..1daa4d22 100644 --- a/src/components/UI/TicketFullScreen/TicketFullScreen.jsx +++ b/src/components/UI/TicketFullScreen/TicketFullScreen.jsx @@ -6,23 +6,24 @@ import { Footer } from "../../Footer/Footer"; import { Link, useParams, useNavigate } from "react-router-dom"; import TrackerModal from "../TrackerModal/TrackerModal"; import { Navigation } from "../../Navigation/Navigation"; -import {Loader} from "../../Loader/Loader"; +import { Loader } from "../../Loader/Loader"; -import {useDispatch, useSelector} from "react-redux"; +import { useDispatch, useSelector } from "react-redux"; import { deletePersonOnProject, modalToggle, setProjectBoardFetch, setToggleTab, getProjectBoard, - getBoarderLoader + getBoarderLoader, } from "../../../redux/projectsTrackerSlice"; import { apiRequest } from "../../../api/request"; +import { urlForLocal } from "../../../helper"; +import { getCorrectDate } from "../../Calendar/calendarHelper"; import project from "../../../images/trackerProject.svg"; -import watch from "../../../images/watch.png"; +import watch from "../../../images/watch.svg"; import file from "../../../images/fileModal.svg"; -import task from "../../../images/tasksMock.png"; import send from "../../../images/send.svg"; import arrow2 from "../../../images/arrowStart.png"; import plus from "../../../images/plus.svg"; @@ -34,11 +35,9 @@ import link from "../../../images/link.svg"; import archive2 from "../../../images/archive.svg"; import del from "../../../images/delete.svg"; import edit from "../../../images/edit.svg"; +import close from "../../../images/closeProjectPersons.svg"; import "./ticketFullScreen.scss"; -import close from "../../../images/closeProjectPersons.svg"; -import {urlForLocal} from "../../../helper"; -import {getCorrectDate} from "../../Calendar/calendarHelper"; export const TicketFullScreen = ({}) => { const [modalAddWorker, setModalAddWorker] = useState(false); @@ -52,23 +51,35 @@ export const TicketFullScreen = ({}) => { const [inputsValue, setInputsValue] = useState({}); const [loader, setLoader] = useState(true); const [comments, setComments] = useState([]); - const [commentsEditOpen, setCommentsEditOpen] = useState({}) - const [commentsEditText, setCommentsEditText] = useState({}) - const [personListOpen, setPersonListOpen] = useState(false) + const [commentsEditOpen, setCommentsEditOpen] = useState({}); + const [commentsEditText, setCommentsEditText] = useState({}); + const [personListOpen, setPersonListOpen] = useState(false); useEffect(() => { apiRequest(`/task/get-task?task_id=${ticketId.id}`).then((taskInfo) => { setTaskInfo(taskInfo); - setInputsValue({title: taskInfo.title, description: taskInfo.description, comment: ''}) - apiRequest(`/comment/get-by-entity?entity_type=2&entity_id=${taskInfo.id}`).then((res) => { - setComments(res) + setInputsValue({ + title: taskInfo.title, + description: taskInfo.description, + comment: "", + }); + apiRequest( + `/comment/get-by-entity?entity_type=2&entity_id=${taskInfo.id}` + ).then((res) => { + setComments(res); res.forEach((item) => { - setCommentsEditOpen((prevValue) => ({...prevValue, [item.id]: false})) - setCommentsEditText((prevValue) => ({...prevValue, [item.id]: item.text})) - }) - }) + setCommentsEditOpen((prevValue) => ({ + ...prevValue, + [item.id]: false, + })); + setCommentsEditText((prevValue) => ({ + ...prevValue, + [item.id]: item.text, + })); + }); + }); dispatch(setProjectBoardFetch(taskInfo.project_id)); - setLoader(boardLoader) + setLoader(boardLoader); }); }, []); @@ -90,10 +101,9 @@ export const TicketFullScreen = ({}) => { data: { task_id: taskInfo.id, title: inputsValue.title, - description: inputsValue.description + description: inputsValue.description, }, - }).then((res) => { - }); + }).then((res) => {}); } function createComment() { @@ -102,16 +112,19 @@ export const TicketFullScreen = ({}) => { data: { text: inputsValue.comment, entity_type: 2, - entity_id: taskInfo.id - } + entity_id: taskInfo.id, + }, }).then((res) => { - let newComment = res - newComment.created_at = new Date() - setInputsValue((prevValue) => ({...prevValue, comment: ''})) - setComments((prevValue) => ([...prevValue, newComment])) - setCommentsEditOpen((prevValue) => ({...prevValue, [res.id]: false})) - setCommentsEditText((prevValue) => ({...prevValue, [res.id]: res.text})) - }) + let newComment = res; + newComment.created_at = new Date(); + setInputsValue((prevValue) => ({ ...prevValue, comment: "" })); + setComments((prevValue) => [...prevValue, newComment]); + setCommentsEditOpen((prevValue) => ({ ...prevValue, [res.id]: false })); + setCommentsEditText((prevValue) => ({ + ...prevValue, + [res.id]: res.text, + })); + }); } function deleteComment(commentId) { @@ -119,11 +132,13 @@ export const TicketFullScreen = ({}) => { method: "PUT", data: { comment_id: commentId, - status: 0 - } + status: 0, + }, }).then((res) => { - setComments((prevValue) => prevValue.filter((item) => item.id !== commentId)) - }) + setComments((prevValue) => + prevValue.filter((item) => item.id !== commentId) + ); + }); } function editComment(commentId) { @@ -131,10 +146,9 @@ export const TicketFullScreen = ({}) => { method: "PUT", data: { comment_id: commentId, - text: commentsEditText[commentId] - } - }).then((res) => { - }) + text: commentsEditText[commentId], + }, + }).then((res) => {}); } function deletePerson(userId) { @@ -142,10 +156,10 @@ export const TicketFullScreen = ({}) => { method: "DELETE", data: { project_id: projectBoard.id, - user_id: userId + user_id: userId, }, }).then((res) => { - dispatch(deletePersonOnProject(userId)) + dispatch(deletePersonOnProject(userId)); }); } @@ -195,223 +209,308 @@ export const TicketFullScreen = ({}) => {

Архив

- {loader ? : - <> -
-
-
-

Проект : {projectBoard.name}

+ {loader ? ( + + ) : ( + <> +
+
+
+

Проект : {projectBoard.name}

- + -
- {/*avatar*/} - {/*avatar*/} - {projectBoard.projectUsers?.length} - { - setPersonListOpen(true) - }} - > - + - -

добавить участника

- {personListOpen && -
- close setPersonListOpen(false)} /> -
{projectBoard.projectUsers?.length}участник
-
В проекте - “{projectBoard.name}”
-
- {projectBoard.projectUsers?.map((person) => { - return
- avatar - {person.user.fio} - delete deletePerson(person.user_id)}/> +
+ {/*avatar*/} + {/*avatar*/} + + {projectBoard.projectUsers?.length} + + { + setPersonListOpen(true); + }} + > + + + +

добавить участника

+ {personListOpen && ( +
+ close setPersonListOpen(false)} + /> +
+ {projectBoard.projectUsers?.length} + участник +
+
+ В проекте - “{projectBoard.name}” +
+
+ {projectBoard.projectUsers?.map((person) => { + return ( +
+ avatar + {person.user.fio} + delete deletePerson(person.user_id)} + /> +
+ ); + })} +
+
{ + dispatch(modalToggle("addWorker")); + setModalAddWorker(true); + setPersonListOpen(false); + }} + > + + +

Добавить участников

+
- }) - } + )}
-
{ - dispatch(modalToggle("addWorker")); - setModalAddWorker(true); - setPersonListOpen(false) - }} - > - + -

Добавить участников

+
+ Учавствую + arrow
-
- } -
-
- Учавствую - arrow -
-
- Мои - arrow -
- -
-

Вернуться на проекты

- arrow -
- -
-
-
-
-
-
- Задача - {editOpen ? { - setInputsValue((prevValue) => ({...prevValue, title: e.target.value})) - }} /> :
{inputsValue.title}
} -
- {editOpen ? { - setInputsValue((prevValue) => ({...prevValue, description: e.target.value})) - }}/> :

{inputsValue.description}

} - {/**/} -
-
-

- -

-

- - {0} - Файлов -

-
-
- { - setInputsValue((prevValue) => ({...prevValue, comment: e.target.value})) - }} /> - -
-
- {comments.map((comment) => { - return
-
- {getCorrectDate(comment.created_at)} -
- edit { - if (commentsEditOpen[comment.id]) { - editComment(comment.id) - } - setCommentsEditOpen((prevValue) => ({...prevValue, [comment.id]: !prevValue[comment.id]})) - }} /> -
- delete deleteComment(comment.id)} /> +
+ Мои + arrow +
+ +
+

Вернуться на проекты

+ arrow
- {commentsEditOpen[comment.id] ? { - setCommentsEditText((prevValue) => ({...prevValue, [comment.id]: e.target.value})) - }} /> :

{commentsEditText[comment.id]}

} + +
+
+
+
+
+
+ Задача + {editOpen ? ( + { + setInputsValue((prevValue) => ({ + ...prevValue, + title: e.target.value, + })); + }} + /> + ) : ( +
{inputsValue.title}
+ )} +
+ {editOpen ? ( + { + setInputsValue((prevValue) => ({ + ...prevValue, + description: e.target.value, + })); + }} + /> + ) : ( +

{inputsValue.description}

+ )} + {/**/}
- }) - - } -
-
-
-
-
-

- Создатель : {taskInfo.user?.fio} -

-
- {Boolean(taskInfo.taskUsers?.length) && - taskInfo.taskUsers.map((worker, index) => { - return ( -
- -

{worker.name}

-
- ); - })} +
+

+ +

+

+ + {0} + Файлов +

+
+
+ { + setInputsValue((prevValue) => ({ + ...prevValue, + comment: e.target.value, + })); + }} + /> + +
+
+ {comments.map((comment) => { + return ( +
+
+ {getCorrectDate(comment.created_at)} +
+ edit { + if (commentsEditOpen[comment.id]) { + editComment(comment.id); + } + setCommentsEditOpen((prevValue) => ({ + ...prevValue, + [comment.id]: !prevValue[comment.id], + })); + }} + /> +
+ delete deleteComment(comment.id)} + /> +
+ {commentsEditOpen[comment.id] ? ( + { + setCommentsEditText((prevValue) => ({ + ...prevValue, + [comment.id]: e.target.value, + })); + }} + /> + ) : ( +

{commentsEditText[comment.id]}

+ )} +
+ ); + })} +
+
+
+
+

+ Создатель : {taskInfo.user?.fio} +

+
+ {Boolean(taskInfo.taskUsers?.length) && + taskInfo.taskUsers.map((worker, index) => { + return ( +
+ +

{worker.name}

+
+ ); + })} +
-
- + Добавить исполнителя +
+
+ + Добавить участников +
+
+ +
+
+ + Длительность : +

{"0:00:00"}

+
+ + +
+ +
+
{ - dispatch(modalToggle("addWorker")); - setModalAddWorker(true); + if (editOpen) { + setEditOpen(!editOpen); + editTask(); + } else { + setEditOpen(!editOpen); + } }} - > - + - - Добавить исполнителя -
-
- - Добавить участников + > + +

{editOpen ? "сохранить" : "редактировать"}

+
+
+ +

ссылка на проект

+
+
+ +

в архив

+
+
+ +

удалить

+
+
- -
-
- - Длительность : -

{"0:00:00"}

-
- - -
- -
-
{ - if(editOpen) { - setEditOpen(!editOpen) - editTask() - } else { - setEditOpen(!editOpen) - } - }}> - -

{editOpen ? 'сохранить' : 'редактировать'}

-
-
- -

ссылка на проект

-
-
- -

в архив

-
-
- -

удалить

-
-
-
-
- - } + + )}