Compare commits
3 Commits
d6c268766b
...
5d03502e5c
Author | SHA1 | Date | |
---|---|---|---|
|
5d03502e5c | ||
|
a143e274f4 | ||
|
05f966b877 |
@ -3,6 +3,7 @@
|
||||
"semi": true,
|
||||
"printWidth": 80,
|
||||
"useTabs": false,
|
||||
"trailingComma" : "none",
|
||||
"importOrder": [
|
||||
"^@react/(.*)$",
|
||||
"^@redux/(.*)$",
|
||||
|
904
package-lock.json
generated
904
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
module.exports = {
|
||||
"postcss-preset-env": {
|
||||
browsers: "last 2 versions",
|
||||
},
|
||||
browsers: "last 2 versions"
|
||||
}
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
import axios from "axios";
|
||||
|
||||
export default axios.create({
|
||||
baseURL: process.env.REACT_APP_API_URL,
|
||||
baseURL: process.env.REACT_APP_API_URL
|
||||
});
|
||||
|
@ -6,7 +6,7 @@ const instance = axios.create({
|
||||
baseURL: process.env.REACT_APP_API_URL,
|
||||
validateStatus(status) {
|
||||
return status;
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
export const apiRequest = (
|
||||
@ -17,8 +17,8 @@ export const apiRequest = (
|
||||
data,
|
||||
headers = {
|
||||
"Access-Control-Allow-Origin": "*",
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
} = {}
|
||||
) => {
|
||||
const fullHeaders = { ...headers, ...getToken() };
|
||||
@ -30,7 +30,7 @@ export const apiRequest = (
|
||||
method,
|
||||
params,
|
||||
data,
|
||||
headers: { ...fullHeaders },
|
||||
headers: { ...fullHeaders }
|
||||
})
|
||||
.then(
|
||||
(response) =>
|
||||
|
12
src/assets/icons/eyePassword.svg
Normal file
12
src/assets/icons/eyePassword.svg
Normal file
@ -0,0 +1,12 @@
|
||||
<svg width="25" height="18" viewBox="0 0 25 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_2043_1123)">
|
||||
<path d="M11.6493 0.935456C15.282 0.935456 17.9765 2.19 20.3438 4.24091C21.6965 5.40818 22.8202 6.78273 23.8129 8.27727C24.1511 8.79 24.1293 9.17182 23.802 9.66273C22.1438 12.1718 20.1256 14.3209 17.4093 15.6736C13.1874 17.7682 9.10744 17.3755 5.23472 14.7682C3.16199 13.3718 1.54744 11.5391 0.227443 9.43364C0.02017 9.10637 0.00926094 8.83364 0.227443 8.50637C1.9729 5.72455 4.19835 3.44455 7.20926 2.01546C8.74744 1.29546 10.3729 0.913638 11.6493 0.935456ZM12.0638 1.93909C10.4711 1.93909 8.95472 2.28818 7.52562 2.97546C4.8529 4.26273 2.86744 6.28091 1.27472 8.73546C1.14381 8.94273 1.20926 9.08455 1.31835 9.24818C2.6929 11.3755 4.39472 13.1864 6.59835 14.4518C9.98017 16.3827 13.4493 16.5245 16.9511 14.79C19.482 13.5355 21.3584 11.55 22.8856 9.21546C23.0165 9.00818 22.9838 8.86637 22.8638 8.68091C21.882 7.15364 20.6929 5.79 19.2856 4.64455C17.1802 2.94273 14.8129 1.95 12.0747 1.93909H12.0638Z" fill="black"/>
|
||||
<path d="M12.1078 3.42285C15.1296 3.43376 17.6496 5.96467 17.6278 8.98649C17.606 11.9974 15.0969 14.4956 12.0969 14.4956C9.07504 14.4956 6.55504 11.9647 6.56595 8.95376C6.56595 5.92103 9.08595 3.42285 12.1187 3.43376L12.1078 3.42285ZM12.086 13.4701C14.5623 13.4701 16.5914 11.4629 16.6023 8.98649C16.6023 6.48831 14.595 4.44831 12.0969 4.44831C9.6205 4.44831 7.59141 6.45558 7.5805 8.93194C7.5805 11.4301 9.59868 13.4701 12.086 13.4701Z" fill="black"/>
|
||||
<path d="M9.56593 8.85532C9.57684 8.75714 9.58775 8.5935 9.63139 8.44078C9.70775 8.09169 9.94775 7.90623 10.2314 7.96078C10.5259 8.02623 10.6678 8.26623 10.6132 8.62623C10.4932 9.45532 10.8859 10.1535 11.6059 10.3826C12.2059 10.579 12.7296 10.4371 13.155 10.0008C13.5805 9.5535 13.7005 9.01896 13.4823 8.44078C13.2641 7.88441 12.8387 7.56805 12.2496 7.46987C12.195 7.46987 12.1514 7.46987 12.0968 7.46987C11.7696 7.43714 11.5732 7.24078 11.5841 6.94623C11.595 6.6626 11.8241 6.45532 12.1514 6.46623C13.0023 6.50987 13.6896 6.88078 14.1696 7.58987C14.7587 8.45169 14.7259 9.64078 14.0932 10.4699C13.4168 11.3644 12.2932 11.7026 11.2459 11.3317C10.2314 10.9717 9.54412 9.98987 9.56593 8.87714V8.85532Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_2043_1123">
|
||||
<rect width="24" height="16.08" fill="white" transform="translate(0.0639648 0.935547)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
@ -1,3 +1,13 @@
|
||||
<svg width="23" height="24" viewBox="0 0 23 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.71013 5.69514C8.6174 5.31138 8.85422 4.92619 9.23656 4.83488C13.7847 3.74066 18.3427 5.8963 22.791 11.2347C23.0107 11.4987 23.0121 11.8824 22.7924 12.1464C21.7224 13.4403 20.5783 14.6045 19.3927 15.6031C19.2586 15.7158 19.096 15.7714 18.9334 15.7714C18.7308 15.7714 18.5296 15.6844 18.3884 15.5175C18.133 15.2165 18.173 14.7671 18.474 14.5117C19.4541 13.6857 20.4056 12.7384 21.3087 11.6913C17.3655 7.13747 13.4209 5.30139 9.57039 6.22157C9.17093 6.31287 8.80143 6.07748 8.71013 5.69514ZM11.3223 8.05764C11.2695 8.44854 11.542 8.80805 11.9315 8.86084C13.1997 9.03203 14.2027 10.0364 14.3753 11.3018C14.4224 11.6599 14.7291 11.9195 15.08 11.9195C15.1114 11.9195 15.1442 11.9181 15.177 11.9138C15.5665 11.861 15.8404 11.5015 15.7876 11.1106C15.5308 9.20893 14.0243 7.70241 12.1226 7.44562C11.7374 7.39426 11.3736 7.66675 11.3223 8.05764ZM22.7482 21.886C23.0264 22.1642 23.0264 22.6164 22.7482 22.8946C22.6084 23.0344 22.4258 23.1043 22.2431 23.1043C22.0605 23.1043 21.8779 23.0344 21.7381 22.896L16.4068 17.5647C14.7861 18.3936 13.1612 18.8301 11.5391 18.8301C7.76998 18.8301 4.00795 16.5989 0.295862 12.1492C0.0761609 11.8853 0.0747342 11.5001 0.294435 11.2362C1.98214 9.20608 3.69695 7.65819 5.40463 6.56111L0.340088 1.49657C0.0618946 1.21838 0.0618946 0.766135 0.340088 0.487942C0.61828 0.209749 1.07052 0.209749 1.34872 0.487942L22.7482 21.886ZM8.69016 11.6913C8.69016 13.2648 9.96984 14.5445 11.5434 14.5445C12.0556 14.5445 12.552 14.3962 12.9857 14.1422L9.09104 10.2475C8.83567 10.6812 8.69016 11.172 8.69016 11.6913ZM15.3525 16.509L14.0172 15.1737C13.2996 15.6816 12.4336 15.9712 11.5434 15.9712C9.18377 15.9712 7.26353 14.0509 7.26353 11.6913C7.26353 10.7882 7.54885 9.93509 8.05959 9.21607L6.43465 7.59113C4.89532 8.53128 3.33316 9.89086 1.77813 11.6913C6.38757 17.0169 10.8415 18.6004 15.3525 16.509Z" fill="black"/>
|
||||
<svg width="24" height="18" viewBox="0 0 24 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_2043_1117)">
|
||||
<path d="M11.5853 1.12598C15.218 1.12598 17.9126 2.38052 20.2798 4.43143C21.6326 5.5987 22.7562 6.97325 23.7489 8.46779C24.0871 8.98052 24.0653 9.36234 23.738 9.85325C22.0798 12.3623 20.0617 14.5114 17.3453 15.8642C13.1235 17.9587 9.04348 17.566 5.17075 14.9587C3.09802 13.5732 1.48348 11.7296 0.163478 9.62416C-0.0437948 9.29689 -0.0547039 9.02416 0.163478 8.69689C1.90893 5.91507 4.13439 3.63507 7.1453 2.21689C8.68348 1.48598 10.3089 1.11507 11.5853 1.13689V1.12598ZM11.9998 2.12961C10.4071 2.12961 8.89075 2.4787 7.46166 3.16598C4.78893 4.45325 2.80348 6.48234 1.21075 8.92598C1.07984 9.13325 1.1453 9.27507 1.25439 9.4387C2.62893 11.566 4.33075 13.3769 6.53439 14.6423C9.91621 16.5732 13.3853 16.7151 16.8871 14.9805C19.418 13.726 21.2944 11.7405 22.8217 9.40598C22.9526 9.1987 22.9198 9.05688 22.7998 8.87143C21.818 7.34416 20.6289 5.98052 19.2217 4.83507C17.1162 3.13325 14.7489 2.14052 12.0108 2.12961H11.9998Z" fill="black"/>
|
||||
<path d="M12.0438 3.62402C15.0656 3.63493 17.5856 6.16584 17.5638 9.18766C17.542 12.1986 15.0329 14.6968 12.0329 14.6968C9.01108 14.6968 6.49108 12.1658 6.50199 9.15493C6.50199 6.12221 9.02199 3.62402 12.0547 3.63493L12.0438 3.62402ZM12.022 13.6713C14.4984 13.6713 16.5274 11.664 16.5384 9.18766C16.5384 6.68948 14.5311 4.64948 12.0329 4.64948C9.55653 4.64948 7.52744 6.65675 7.51653 9.13311C7.51653 11.6313 9.53472 13.6713 12.022 13.6713Z" fill="black"/>
|
||||
<path d="M9.50197 9.05649C9.51288 8.95831 9.52379 8.79468 9.56742 8.64195C9.64379 8.29286 9.88379 8.1074 10.1674 8.16195C10.462 8.2274 10.6038 8.4674 10.5492 8.8274C10.4292 9.65649 10.822 10.3547 11.542 10.5838C12.142 10.7801 12.6656 10.6383 13.0911 10.2019C13.5165 9.75468 13.6365 9.22013 13.4183 8.64195C13.2002 8.08559 12.7747 7.76922 12.1856 7.67104C12.1311 7.67104 12.0874 7.67104 12.0329 7.67104C11.7056 7.63831 11.5092 7.44195 11.5202 7.1474C11.5311 6.86377 11.7602 6.65649 12.0874 6.6674C12.9383 6.71104 13.6256 7.08195 14.1056 7.79104C14.6947 8.65286 14.662 9.84195 14.0292 10.671C13.3529 11.5656 12.2292 11.9038 11.182 11.5329C10.1674 11.1729 9.48015 10.191 9.50197 9.07831V9.05649Z" fill="black"/>
|
||||
<path d="M2.61816 0.973633L21.9382 16.9773" stroke="black" stroke-miterlimit="10" stroke-linecap="round"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_2043_1117">
|
||||
<rect width="24" height="17.0945" fill="white" transform="translate(0 0.427734)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.4 KiB |
@ -12,7 +12,7 @@ const ArchiveTasksItem = ({ task, index }) => {
|
||||
<p
|
||||
className="date"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: task.description,
|
||||
__html: task.description
|
||||
}}
|
||||
/>
|
||||
</td>
|
||||
|
@ -15,6 +15,7 @@ import ModalResetPassword from "@components/Modal/ModalResetPassword/ModalResetP
|
||||
|
||||
import authHead from "assets/icons/authHead.svg";
|
||||
import eyePassword from "assets/icons/passwordIcon.svg";
|
||||
import eyeNoPassword from "assets/icons/eyePassword.svg";
|
||||
|
||||
import "./authBox.scss";
|
||||
|
||||
@ -50,7 +51,7 @@ export const AuthBox = ({ title }) => {
|
||||
dispatch(loading(true));
|
||||
apiRequest("/user/login", {
|
||||
method: "POST",
|
||||
data: formData,
|
||||
data: formData
|
||||
}).then((res) => {
|
||||
if (!res.access_token) {
|
||||
setError("Введены некорректные данные для входа");
|
||||
@ -85,8 +86,8 @@ export const AuthBox = ({ title }) => {
|
||||
</div>
|
||||
)}
|
||||
<form ref={ref} className="auth-box__form">
|
||||
<label htmlFor="login">Ваш e-mail</label>
|
||||
<input id="login" type="text" name="username" placeholder="Логин" />
|
||||
<label htmlFor="e-mail">Ваш e-mail</label>
|
||||
<input id="e-mail" type="text" name="email" placeholder="E-mail" />
|
||||
|
||||
<label htmlFor="password">Ваш пароль</label>
|
||||
<div className="inputWrapper">
|
||||
@ -99,7 +100,7 @@ export const AuthBox = ({ title }) => {
|
||||
<img
|
||||
onClick={() => setShowPassword(!showPassword)}
|
||||
className="eye"
|
||||
src={eyePassword}
|
||||
src={showPassword ? eyePassword : eyeNoPassword}
|
||||
alt="eye"
|
||||
/>
|
||||
</div>
|
||||
|
@ -86,7 +86,7 @@ export function getCorrectDate(day) {
|
||||
"сентября",
|
||||
"октября",
|
||||
"ноября",
|
||||
"декабря",
|
||||
"декабря"
|
||||
];
|
||||
return `${new Date(day).getDate()} ${
|
||||
months[new Date(day).getMonth()]
|
||||
|
@ -4,7 +4,7 @@ import { Link, Navigate, useNavigate, useParams } from "react-router-dom";
|
||||
|
||||
import {
|
||||
currentCandidate,
|
||||
selectCurrentCandidate,
|
||||
selectCurrentCandidate
|
||||
} from "@redux/outstaffingSlice";
|
||||
|
||||
import { LEVELS, SKILLS } from "@utils/constants";
|
||||
@ -58,7 +58,7 @@ const Candidate = () => {
|
||||
const styles = {
|
||||
classes: "",
|
||||
header: "",
|
||||
img: "",
|
||||
img: ""
|
||||
};
|
||||
|
||||
switch (Number(position_id)) {
|
||||
@ -100,14 +100,14 @@ const Candidate = () => {
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{
|
||||
name: "Каталог свободных специалистов",
|
||||
link: "/profile/catalog",
|
||||
link: "/profile/catalog"
|
||||
},
|
||||
{
|
||||
name: `${currentCandidateObj.specification} ${
|
||||
SKILLS[currentCandidateObj.position_id]
|
||||
}, ${LEVELS[currentCandidateObj.level]}`,
|
||||
link: `/candidate/${currentCandidateObj.id}`,
|
||||
},
|
||||
link: `/candidate/${currentCandidateObj.id}`
|
||||
}
|
||||
]}
|
||||
/>
|
||||
|
||||
|
@ -34,7 +34,7 @@ const CandidateSidebar = ({ candidate, setActiveSnippet, activeSnippet }) => {
|
||||
let levelAspt = {
|
||||
spec: candidate.specification,
|
||||
skils: SKILLS[candidate.position_id],
|
||||
level: LEVELS[candidate.level],
|
||||
level: LEVELS[candidate.level]
|
||||
};
|
||||
|
||||
return (
|
||||
|
@ -15,8 +15,8 @@ const FileTracker = ({ file, setDeletedTask, taskId }) => {
|
||||
file_id: file.id,
|
||||
entity_type: 2,
|
||||
entity_id: taskId,
|
||||
status: 0,
|
||||
},
|
||||
status: 0
|
||||
}
|
||||
}).then(() => {
|
||||
setDeletedTask(file);
|
||||
});
|
||||
|
@ -22,7 +22,7 @@ const Form = () => {
|
||||
const [data, setData] = useState({
|
||||
email: "",
|
||||
phone: "",
|
||||
comment: "",
|
||||
comment: ""
|
||||
});
|
||||
const [isFetching, setIsFetching] = useState(false);
|
||||
|
||||
@ -40,7 +40,7 @@ const Form = () => {
|
||||
: () => {
|
||||
setStatus(null);
|
||||
navigate(`/candidate/${urlParams.id}`);
|
||||
},
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@ -55,7 +55,7 @@ const Form = () => {
|
||||
|
||||
setData((prev) => ({
|
||||
...prev,
|
||||
[id]: value,
|
||||
[id]: value
|
||||
}));
|
||||
};
|
||||
|
||||
@ -73,8 +73,8 @@ const Form = () => {
|
||||
method: "POST",
|
||||
params: {
|
||||
profile_id: urlParams.id,
|
||||
...data,
|
||||
},
|
||||
...data
|
||||
}
|
||||
}).then((res) => {
|
||||
setStatus(res);
|
||||
setIsFetching(false);
|
||||
|
@ -23,7 +23,7 @@ export const FreeDevelopers = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/auth" },
|
||||
{ name: "Свободные разработчики", link: "/worker" },
|
||||
{ name: "Свободные разработчики", link: "/worker" }
|
||||
]}
|
||||
/>
|
||||
|
||||
|
@ -18,13 +18,13 @@ export const ModalRegistration = ({ active, setActive }) => {
|
||||
const [inputsValue, setInputsValue] = useState({
|
||||
userName: "",
|
||||
email: "",
|
||||
password: "",
|
||||
password: ""
|
||||
});
|
||||
|
||||
const [inputsError, setInputsError] = useState({
|
||||
name: false,
|
||||
email: false,
|
||||
password: false,
|
||||
password: false
|
||||
});
|
||||
|
||||
const [loader, setLoader] = useState(false);
|
||||
@ -68,22 +68,22 @@ export const ModalRegistration = ({ active, setActive }) => {
|
||||
data: {
|
||||
username: inputsValue.userName,
|
||||
email: inputsValue.email,
|
||||
password: inputsValue.password,
|
||||
},
|
||||
password: inputsValue.password
|
||||
}
|
||||
}).then((data) => {
|
||||
setLoader(false);
|
||||
if (!data) {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Аккаунт с таким логином или email уже существует",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
closeModal();
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Аккаунт успешно создан",
|
||||
type: "success",
|
||||
type: "success"
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -93,12 +93,12 @@ export const ModalRegistration = ({ active, setActive }) => {
|
||||
setInputsValue({
|
||||
userName: "",
|
||||
email: "",
|
||||
password: "",
|
||||
password: ""
|
||||
});
|
||||
setInputsError({
|
||||
name: false,
|
||||
email: false,
|
||||
password: false,
|
||||
password: false
|
||||
});
|
||||
setActive(false);
|
||||
};
|
||||
@ -122,11 +122,11 @@ export const ModalRegistration = ({ active, setActive }) => {
|
||||
setInputsError({
|
||||
name: false,
|
||||
email: false,
|
||||
password: false,
|
||||
password: false
|
||||
});
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
userName: e.target.value,
|
||||
userName: e.target.value
|
||||
}));
|
||||
}}
|
||||
value={inputsValue.userName}
|
||||
@ -143,11 +143,11 @@ export const ModalRegistration = ({ active, setActive }) => {
|
||||
setInputsError({
|
||||
name: false,
|
||||
email: false,
|
||||
password: false,
|
||||
password: false
|
||||
});
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
email: e.target.value,
|
||||
email: e.target.value
|
||||
}));
|
||||
}}
|
||||
value={inputsValue.email}
|
||||
@ -167,11 +167,11 @@ export const ModalRegistration = ({ active, setActive }) => {
|
||||
setInputsError({
|
||||
name: false,
|
||||
email: false,
|
||||
password: false,
|
||||
password: false
|
||||
});
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
password: e.target.value,
|
||||
password: e.target.value
|
||||
}));
|
||||
}}
|
||||
value={inputsValue.password}
|
||||
@ -188,11 +188,11 @@ export const ModalRegistration = ({ active, setActive }) => {
|
||||
setInputsError({
|
||||
name: false,
|
||||
email: false,
|
||||
password: false,
|
||||
password: false
|
||||
});
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
password: e.target.value,
|
||||
password: e.target.value
|
||||
}));
|
||||
}}
|
||||
value={inputsValue.password}
|
||||
|
@ -17,13 +17,13 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
const [inputsValue, setInputsValue] = useState({
|
||||
email: "",
|
||||
token: "",
|
||||
password: "",
|
||||
password: ""
|
||||
});
|
||||
|
||||
const [inputsError, setInputsError] = useState({
|
||||
email: false,
|
||||
password: false,
|
||||
token: false,
|
||||
token: false
|
||||
});
|
||||
|
||||
const validateEmail = (email) => {
|
||||
@ -40,7 +40,7 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
setInputsValue({
|
||||
email: "",
|
||||
token: "",
|
||||
password: "",
|
||||
password: ""
|
||||
});
|
||||
};
|
||||
|
||||
@ -51,22 +51,22 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
return showNotification({
|
||||
show: true,
|
||||
text: "Введите корректный e-mail",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
setLoader(true);
|
||||
apiRequest("/register/request-password-reset", {
|
||||
method: "POST",
|
||||
data: {
|
||||
email: inputsValue.email,
|
||||
},
|
||||
email: inputsValue.email
|
||||
}
|
||||
}).then((data) => {
|
||||
setLoader(false);
|
||||
if (data) {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Письмо отправлено Вам на почту",
|
||||
type: "success",
|
||||
type: "success"
|
||||
});
|
||||
setStep(true);
|
||||
}
|
||||
@ -77,12 +77,12 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
setInputsError((prevValue) => ({
|
||||
...prevValue,
|
||||
password: true,
|
||||
token: true,
|
||||
token: true
|
||||
}));
|
||||
return showNotification({
|
||||
show: true,
|
||||
text: "Введите данные",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
if (inputsValue.password.length < 6) {
|
||||
@ -94,15 +94,15 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
method: "POST",
|
||||
data: {
|
||||
token: inputsValue.token,
|
||||
password: inputsValue.password,
|
||||
},
|
||||
password: inputsValue.password
|
||||
}
|
||||
}).then((data) => {
|
||||
setLoader(false);
|
||||
if (data.code === 0) {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Введите корректные данные",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
setActive(false);
|
||||
@ -110,7 +110,7 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Пароль изменён",
|
||||
type: "success",
|
||||
type: "success"
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -133,12 +133,12 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
email: e.target.value,
|
||||
email: e.target.value
|
||||
}));
|
||||
setInputsError({
|
||||
email: false,
|
||||
password: false,
|
||||
token: false,
|
||||
token: false
|
||||
});
|
||||
}}
|
||||
placeholder="E-mail"
|
||||
@ -173,11 +173,11 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
setInputsError({
|
||||
email: false,
|
||||
password: false,
|
||||
token: false,
|
||||
token: false
|
||||
});
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
token: e.target.value,
|
||||
token: e.target.value
|
||||
}));
|
||||
}}
|
||||
value={inputsValue.token}
|
||||
@ -193,12 +193,12 @@ export const ModalResetPassword = ({ active, setActive }) => {
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
password: e.target.value,
|
||||
password: e.target.value
|
||||
}));
|
||||
setInputsError({
|
||||
email: false,
|
||||
password: false,
|
||||
token: false,
|
||||
token: false
|
||||
});
|
||||
}}
|
||||
placeholder="password"
|
||||
|
@ -15,7 +15,7 @@ import {
|
||||
caseOfNum,
|
||||
getCorrectRequestDate,
|
||||
getToken,
|
||||
urlForLocal,
|
||||
urlForLocal
|
||||
} from "@utils/helper";
|
||||
|
||||
import { apiRequest } from "@api/request";
|
||||
@ -56,7 +56,7 @@ export const ModalTiсket = ({
|
||||
projectName,
|
||||
projectUsers,
|
||||
projectOwnerId,
|
||||
projectMarks,
|
||||
projectMarks
|
||||
}) => {
|
||||
const dispatch = useDispatch();
|
||||
const [addSubtask, setAddSubtask] = useState(false);
|
||||
@ -64,7 +64,7 @@ export const ModalTiсket = ({
|
||||
const [inputsValue, setInputsValue] = useState({
|
||||
title: task.title,
|
||||
description: task.description,
|
||||
comment: "",
|
||||
comment: ""
|
||||
});
|
||||
const [comments, setComments] = useState([]);
|
||||
const [deadLine, setDeadLine] = useState(task.dead_line);
|
||||
@ -85,7 +85,7 @@ export const ModalTiсket = ({
|
||||
const [currentTimerCount, setCurrentTimerCount] = useState({
|
||||
hours: 0,
|
||||
minute: 0,
|
||||
seconds: 0,
|
||||
seconds: 0
|
||||
});
|
||||
const [timerId, setTimerId] = useState(null);
|
||||
const [taskFiles, setTaskFiles] = useState([]);
|
||||
@ -104,15 +104,15 @@ export const ModalTiсket = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: task.id,
|
||||
status: 0,
|
||||
},
|
||||
status: 0
|
||||
}
|
||||
}).then(() => {
|
||||
setActive(false);
|
||||
dispatch(setProjectBoardFetch(projectId));
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Задача успешно была перемещена в архив",
|
||||
type: "archive",
|
||||
type: "archive"
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -120,22 +120,22 @@ export const ModalTiсket = ({
|
||||
const priority = {
|
||||
2: "Высокий",
|
||||
1: "Средний",
|
||||
0: "Низкий",
|
||||
0: "Низкий"
|
||||
};
|
||||
|
||||
const priorityTypes = [
|
||||
{
|
||||
name: "Высокий",
|
||||
key: 2,
|
||||
key: 2
|
||||
},
|
||||
{
|
||||
name: "Средний",
|
||||
key: 1,
|
||||
key: 1
|
||||
},
|
||||
{
|
||||
name: "Низкий",
|
||||
key: 0,
|
||||
},
|
||||
key: 0
|
||||
}
|
||||
];
|
||||
|
||||
function archiveTask() {
|
||||
@ -147,7 +147,7 @@ export const ModalTiсket = ({
|
||||
return showNotification({
|
||||
show: true,
|
||||
text: "Заполните поля",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
apiRequest("/task/update-task", {
|
||||
@ -155,15 +155,15 @@ export const ModalTiсket = ({
|
||||
data: {
|
||||
task_id: task.id,
|
||||
title: inputsValue.title,
|
||||
description: inputsValue.description,
|
||||
},
|
||||
description: inputsValue.description
|
||||
}
|
||||
}).then((res) => {
|
||||
setEditOpen(!editOpen);
|
||||
dispatch(setProjectBoardFetch(projectId));
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Изменения сохранены",
|
||||
type: "success",
|
||||
type: "success"
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -176,8 +176,8 @@ export const ModalTiсket = ({
|
||||
data: {
|
||||
text: inputsValue.comment,
|
||||
entity_type: 2,
|
||||
entity_id: task.id,
|
||||
},
|
||||
entity_id: task.id
|
||||
}
|
||||
}).then((res) => {
|
||||
let newComment = res;
|
||||
setCommentSendDisable(false);
|
||||
@ -199,8 +199,8 @@ export const ModalTiсket = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
comment_id: subComment.id,
|
||||
status: 0,
|
||||
},
|
||||
status: 0
|
||||
}
|
||||
}).then(() => {});
|
||||
});
|
||||
}
|
||||
@ -234,8 +234,8 @@ export const ModalTiсket = ({
|
||||
data: {
|
||||
entity_type: 2,
|
||||
entity_id: task.id,
|
||||
created_at: getCorrectRequestDate(new Date()),
|
||||
},
|
||||
created_at: getCorrectRequestDate(new Date())
|
||||
}
|
||||
}).then((res) => {
|
||||
setTimerStart(true);
|
||||
setTimerInfo(res);
|
||||
@ -248,8 +248,8 @@ export const ModalTiсket = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
timer_id: timerInfo.id,
|
||||
stopped_at: getCorrectRequestDate(new Date()),
|
||||
},
|
||||
stopped_at: getCorrectRequestDate(new Date())
|
||||
}
|
||||
}).then(() => {
|
||||
setTimerStart(false);
|
||||
clearInterval(timerId);
|
||||
@ -261,8 +261,8 @@ export const ModalTiсket = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: task.id,
|
||||
executor_id: person.user_id,
|
||||
},
|
||||
executor_id: person.user_id
|
||||
}
|
||||
}).then((res) => {
|
||||
setExecutorId(person.user_id);
|
||||
setDropListOpen(false);
|
||||
@ -276,8 +276,8 @@ export const ModalTiсket = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: task.id,
|
||||
executor_id: 0,
|
||||
},
|
||||
executor_id: 0
|
||||
}
|
||||
}).then(() => {
|
||||
setExecutorId(null);
|
||||
setExecutor(null);
|
||||
@ -291,8 +291,8 @@ export const ModalTiсket = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: task.id,
|
||||
execution_priority: key,
|
||||
},
|
||||
execution_priority: key
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(setProjectBoardFetch(projectId));
|
||||
});
|
||||
@ -303,8 +303,8 @@ 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]);
|
||||
@ -317,8 +317,8 @@ export const ModalTiсket = ({
|
||||
method: "DELETE",
|
||||
data: {
|
||||
task_id: task.id,
|
||||
user_id: person.user_id,
|
||||
},
|
||||
user_id: person.user_id
|
||||
}
|
||||
}).then(() => {
|
||||
setMembers(members.filter((item) => item.user_id !== person.user_id));
|
||||
dispatch(setProjectBoardFetch(projectId));
|
||||
@ -351,7 +351,7 @@ export const ModalTiсket = ({
|
||||
setCurrentTimerCount({
|
||||
hours: Math.floor(timerSeconds / 60 / 60),
|
||||
minute: Math.floor((timerSeconds / 60) % 60),
|
||||
seconds: timerSeconds % 60,
|
||||
seconds: timerSeconds % 60
|
||||
});
|
||||
updateTimerHours = Math.floor(timerSeconds / 60 / 60);
|
||||
updateTimerMinute = Math.floor((timerSeconds / 60) % 60);
|
||||
@ -386,10 +386,10 @@ export const ModalTiсket = ({
|
||||
{
|
||||
user: {
|
||||
avatar: profileInfo.photo,
|
||||
fio: profileInfo.fio,
|
||||
fio: profileInfo.fio
|
||||
},
|
||||
user_id: profileInfo.id_user,
|
||||
},
|
||||
user_id: profileInfo.id_user
|
||||
}
|
||||
]);
|
||||
}
|
||||
}, []);
|
||||
@ -410,7 +410,7 @@ export const ModalTiсket = ({
|
||||
const res = await fetch("https://itguild.info/api/file/upload", {
|
||||
method: "POST",
|
||||
body: formData,
|
||||
headers: { ...getToken() },
|
||||
headers: { ...getToken() }
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
@ -430,8 +430,8 @@ export const ModalTiсket = ({
|
||||
file_id: id,
|
||||
entity_type: 2,
|
||||
entity_id: task.id,
|
||||
status: 1,
|
||||
},
|
||||
status: 1
|
||||
}
|
||||
}).then((res) => {
|
||||
setTaskFiles((prevValue) => [...prevValue, res]);
|
||||
// setUploadedFile(null);
|
||||
@ -470,7 +470,7 @@ export const ModalTiсket = ({
|
||||
return setCurrentTimerCount({
|
||||
hours: updateTimerHours,
|
||||
minute: updateTimerMinute,
|
||||
seconds: updateTimerSec,
|
||||
seconds: updateTimerSec
|
||||
});
|
||||
}
|
||||
|
||||
@ -496,7 +496,7 @@ export const ModalTiсket = ({
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Ссылка скопирована в буфер обмена",
|
||||
type: "copy",
|
||||
type: "copy"
|
||||
});
|
||||
}
|
||||
|
||||
@ -505,8 +505,8 @@ export const ModalTiсket = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: task.id,
|
||||
dead_line: getCorrectRequestDate(date),
|
||||
},
|
||||
dead_line: getCorrectRequestDate(date)
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(setProjectBoardFetch(projectId));
|
||||
});
|
||||
@ -518,8 +518,8 @@ export const ModalTiсket = ({
|
||||
data: {
|
||||
mark_id: tagId,
|
||||
entity_type: 2,
|
||||
entity_id: task.id,
|
||||
},
|
||||
entity_id: task.id
|
||||
}
|
||||
}).then((data) => {
|
||||
setSelectTagsOpen(false);
|
||||
setTaskTags((prevValue) => [...prevValue, data.mark]);
|
||||
@ -533,8 +533,8 @@ export const ModalTiсket = ({
|
||||
data: {
|
||||
mark_id: tagId,
|
||||
entity_type: 2,
|
||||
entity_id: task.id,
|
||||
},
|
||||
entity_id: task.id
|
||||
}
|
||||
}).then(() => {
|
||||
setTaskTags((prevValue) => prevValue.filter((tag) => tag.id !== tagId));
|
||||
dispatch(setProjectBoardFetch(projectId));
|
||||
@ -617,7 +617,7 @@ export const ModalTiсket = ({
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
title: e.target.value,
|
||||
title: e.target.value
|
||||
}));
|
||||
}}
|
||||
/>
|
||||
@ -640,14 +640,14 @@ export const ModalTiсket = ({
|
||||
"ImageToolbar",
|
||||
"ImageUpload",
|
||||
"MediaEmbed",
|
||||
"BlockQuote",
|
||||
],
|
||||
"BlockQuote"
|
||||
]
|
||||
}}
|
||||
onChange={(event, editor) => {
|
||||
const data = editor.getData();
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
description: data,
|
||||
description: data
|
||||
}));
|
||||
}}
|
||||
/>
|
||||
@ -729,7 +729,7 @@ export const ModalTiсket = ({
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
comment: e.target.value,
|
||||
comment: e.target.value
|
||||
}));
|
||||
}}
|
||||
/>
|
||||
|
@ -12,7 +12,7 @@ import {
|
||||
getBoarderLoader,
|
||||
modalToggle,
|
||||
setProjectBoardFetch,
|
||||
setToggleTab,
|
||||
setToggleTab
|
||||
} from "@redux/projectsTrackerSlice";
|
||||
|
||||
import {
|
||||
@ -20,7 +20,7 @@ import {
|
||||
caseOfNum,
|
||||
getCorrectRequestDate,
|
||||
getToken,
|
||||
urlForLocal,
|
||||
urlForLocal
|
||||
} from "@utils/helper";
|
||||
|
||||
import { apiRequest } from "@api/request";
|
||||
@ -77,7 +77,7 @@ export const TicketFullScreen = () => {
|
||||
const [currentTimerCount, setCurrentTimerCount] = useState({
|
||||
hours: 0,
|
||||
minute: 0,
|
||||
seconds: 0,
|
||||
seconds: 0
|
||||
});
|
||||
const profileInfo = useSelector(getProfileInfo);
|
||||
const [timerId, setTimerId] = useState(null);
|
||||
@ -102,22 +102,22 @@ export const TicketFullScreen = () => {
|
||||
const priority = {
|
||||
2: "Высокий",
|
||||
1: "Средний",
|
||||
0: "Низкий",
|
||||
0: "Низкий"
|
||||
};
|
||||
|
||||
const priorityTypes = [
|
||||
{
|
||||
name: "Высокий",
|
||||
key: 2,
|
||||
key: 2
|
||||
},
|
||||
{
|
||||
name: "Средний",
|
||||
key: 1,
|
||||
key: 1
|
||||
},
|
||||
{
|
||||
name: "Низкий",
|
||||
key: 0,
|
||||
},
|
||||
key: 0
|
||||
}
|
||||
];
|
||||
|
||||
useEffect(() => {
|
||||
@ -133,7 +133,7 @@ export const TicketFullScreen = () => {
|
||||
setInputsValue({
|
||||
title: taskInfo.title,
|
||||
description: taskInfo.description,
|
||||
comment: "",
|
||||
comment: ""
|
||||
});
|
||||
setTaskTags(taskInfo.mark);
|
||||
apiRequest(
|
||||
@ -168,7 +168,7 @@ export const TicketFullScreen = () => {
|
||||
setCurrentTimerCount({
|
||||
hours: Math.floor(timerSeconds / 60 / 60),
|
||||
minute: Math.floor((timerSeconds / 60) % 60),
|
||||
seconds: timerSeconds % 60,
|
||||
seconds: timerSeconds % 60
|
||||
});
|
||||
updateTimerHours = Math.floor(timerSeconds / 60 / 60);
|
||||
updateTimerMinute = Math.floor((timerSeconds / 60) % 60);
|
||||
@ -208,8 +208,8 @@ export const TicketFullScreen = () => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: ticketId.id,
|
||||
status: 0,
|
||||
},
|
||||
status: 0
|
||||
}
|
||||
}).then(() => {
|
||||
navigate(`/tracker/project/${taskInfo.project_id}`);
|
||||
});
|
||||
@ -224,7 +224,7 @@ export const TicketFullScreen = () => {
|
||||
return showNotification({
|
||||
show: true,
|
||||
text: "Заполните поля",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
apiRequest("/task/update-task", {
|
||||
@ -232,13 +232,13 @@ export const TicketFullScreen = () => {
|
||||
data: {
|
||||
task_id: taskInfo.id,
|
||||
title: inputsValue.title,
|
||||
description: inputsValue.description,
|
||||
},
|
||||
description: inputsValue.description
|
||||
}
|
||||
}).then(() => {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Изменения сохранены",
|
||||
type: "success",
|
||||
type: "success"
|
||||
});
|
||||
setEditOpen(!editOpen);
|
||||
});
|
||||
@ -252,8 +252,8 @@ export const TicketFullScreen = () => {
|
||||
data: {
|
||||
text: inputsValue.comment,
|
||||
entity_type: 2,
|
||||
entity_id: taskInfo.id,
|
||||
},
|
||||
entity_id: taskInfo.id
|
||||
}
|
||||
}).then((res) => {
|
||||
let newComment = res;
|
||||
setCommentSendDisable(false);
|
||||
@ -270,8 +270,8 @@ export const TicketFullScreen = () => {
|
||||
data: {
|
||||
entity_type: 2,
|
||||
entity_id: taskInfo.id,
|
||||
created_at: getCorrectRequestDate(new Date()),
|
||||
},
|
||||
created_at: getCorrectRequestDate(new Date())
|
||||
}
|
||||
}).then((res) => {
|
||||
setTimerStart(true);
|
||||
setTimerInfo(res);
|
||||
@ -284,8 +284,8 @@ export const TicketFullScreen = () => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
timer_id: timerInfo.id,
|
||||
stopped_at: getCorrectRequestDate(new Date()),
|
||||
},
|
||||
stopped_at: getCorrectRequestDate(new Date())
|
||||
}
|
||||
}).then(() => {
|
||||
setTimerStart(false);
|
||||
clearInterval(timerId);
|
||||
@ -297,8 +297,8 @@ export const TicketFullScreen = () => {
|
||||
method: "DELETE",
|
||||
data: {
|
||||
project_id: projectInfo.id,
|
||||
user_id: userId,
|
||||
},
|
||||
user_id: userId
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(deletePersonOnProject(userId));
|
||||
});
|
||||
@ -314,8 +314,8 @@ export const TicketFullScreen = () => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
comment_id: subComment.id,
|
||||
status: 0,
|
||||
},
|
||||
status: 0
|
||||
}
|
||||
}).then(() => {});
|
||||
});
|
||||
}
|
||||
@ -391,7 +391,7 @@ export const TicketFullScreen = () => {
|
||||
return setCurrentTimerCount({
|
||||
hours: updateTimerHours,
|
||||
minute: updateTimerMinute,
|
||||
seconds: updateTimerSec,
|
||||
seconds: updateTimerSec
|
||||
});
|
||||
}
|
||||
|
||||
@ -405,13 +405,13 @@ export const TicketFullScreen = () => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: taskInfo.id,
|
||||
executor_id: 0,
|
||||
},
|
||||
executor_id: 0
|
||||
}
|
||||
}).then(() => {
|
||||
setTaskInfo((prevState) => ({
|
||||
...prevState,
|
||||
executor_id: null,
|
||||
executor: null,
|
||||
executor: null
|
||||
}));
|
||||
});
|
||||
}
|
||||
@ -421,14 +421,14 @@ export const TicketFullScreen = () => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: taskInfo.id,
|
||||
executor_id: person.user_id,
|
||||
},
|
||||
executor_id: person.user_id
|
||||
}
|
||||
}).then((res) => {
|
||||
setDropListOpen(false);
|
||||
setTaskInfo((prevState) => ({
|
||||
...prevState,
|
||||
executor_id: res.executor_id,
|
||||
executor: res.executor,
|
||||
executor: res.executor
|
||||
}));
|
||||
});
|
||||
}
|
||||
@ -438,14 +438,14 @@ export const TicketFullScreen = () => {
|
||||
method: "DELETE",
|
||||
data: {
|
||||
task_id: taskInfo.id,
|
||||
user_id: person.user_id,
|
||||
},
|
||||
user_id: person.user_id
|
||||
}
|
||||
}).then(() => {
|
||||
setTaskInfo((prevState) => ({
|
||||
...prevState,
|
||||
taskUsers: taskInfo.taskUsers.filter(
|
||||
(item) => item.user_id !== person.user_id
|
||||
),
|
||||
)
|
||||
}));
|
||||
});
|
||||
}
|
||||
@ -455,13 +455,13 @@ export const TicketFullScreen = () => {
|
||||
method: "POST",
|
||||
data: {
|
||||
task_id: taskInfo.id,
|
||||
user_id: person.user_id,
|
||||
},
|
||||
user_id: person.user_id
|
||||
}
|
||||
}).then((res) => {
|
||||
setDropListMembersOpen(false);
|
||||
setTaskInfo((prevValue) => ({
|
||||
...prevValue,
|
||||
taskUsers: [...prevValue.taskUsers, res],
|
||||
taskUsers: [...prevValue.taskUsers, res]
|
||||
}));
|
||||
});
|
||||
}
|
||||
@ -471,8 +471,8 @@ export const TicketFullScreen = () => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: taskInfo.id,
|
||||
dead_line: getCorrectRequestDate(date),
|
||||
},
|
||||
dead_line: getCorrectRequestDate(date)
|
||||
}
|
||||
}).then(() => {});
|
||||
}
|
||||
|
||||
@ -482,7 +482,7 @@ export const TicketFullScreen = () => {
|
||||
const res = await fetch("https://itguild.info/api/file/upload", {
|
||||
method: "POST",
|
||||
body: formData,
|
||||
headers: { ...getToken() },
|
||||
headers: { ...getToken() }
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
@ -497,8 +497,8 @@ export const TicketFullScreen = () => {
|
||||
file_id: uploadedFile[0].id,
|
||||
entity_type: 2,
|
||||
entity_id: taskInfo.id,
|
||||
status: 1,
|
||||
},
|
||||
status: 1
|
||||
}
|
||||
}).then((res) => {
|
||||
setTaskFiles((prevValue) => [...prevValue, res]);
|
||||
setUploadedFile(null);
|
||||
@ -515,8 +515,8 @@ export const TicketFullScreen = () => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: taskInfo.id,
|
||||
execution_priority: key,
|
||||
},
|
||||
execution_priority: key
|
||||
}
|
||||
}).then(() => {});
|
||||
}
|
||||
|
||||
@ -552,8 +552,8 @@ export const TicketFullScreen = () => {
|
||||
data: {
|
||||
mark_id: tagId,
|
||||
entity_type: 2,
|
||||
entity_id: taskInfo.id,
|
||||
},
|
||||
entity_id: taskInfo.id
|
||||
}
|
||||
}).then(() => {
|
||||
setTaskTags((prevValue) => prevValue.filter((tag) => tag.id !== tagId));
|
||||
});
|
||||
@ -565,8 +565,8 @@ export const TicketFullScreen = () => {
|
||||
data: {
|
||||
mark_id: tagId,
|
||||
entity_type: 2,
|
||||
entity_id: taskInfo.id,
|
||||
},
|
||||
entity_id: taskInfo.id
|
||||
}
|
||||
}).then((data) => {
|
||||
setSelectTagsOpen(false);
|
||||
setTaskTags((prevValue) => [...prevValue, data.mark]);
|
||||
@ -639,7 +639,7 @@ export const TicketFullScreen = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Трекер", link: "/profile/tracker" },
|
||||
{ name: "Трекер", link: "/profile/tracker" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="tracker__title">Управление проектами с трекером</h2>
|
||||
@ -794,7 +794,7 @@ export const TicketFullScreen = () => {
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
title: e.target.value,
|
||||
title: e.target.value
|
||||
}));
|
||||
}}
|
||||
/>
|
||||
@ -819,14 +819,14 @@ export const TicketFullScreen = () => {
|
||||
"ImageToolbar",
|
||||
"ImageUpload",
|
||||
"MediaEmbed",
|
||||
"BlockQuote",
|
||||
],
|
||||
"BlockQuote"
|
||||
]
|
||||
}}
|
||||
onChange={(event, editor) => {
|
||||
const data = editor.getData();
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
description: data,
|
||||
description: data
|
||||
}));
|
||||
}}
|
||||
/>
|
||||
@ -834,7 +834,7 @@ export const TicketFullScreen = () => {
|
||||
<p
|
||||
className="fullDescription fullScreenDescription"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: inputsValue.description,
|
||||
__html: inputsValue.description
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
@ -917,7 +917,7 @@ export const TicketFullScreen = () => {
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
comment: e.target.value,
|
||||
comment: e.target.value
|
||||
}));
|
||||
}}
|
||||
/>
|
||||
|
@ -19,7 +19,7 @@ import {
|
||||
setColumnName,
|
||||
setColumnPriority,
|
||||
setProject,
|
||||
setProjectBoardFetch,
|
||||
setProjectBoardFetch
|
||||
} from "@redux/projectsTrackerSlice";
|
||||
|
||||
import { getCorrectRequestDate, urlForLocal } from "@utils/helper";
|
||||
@ -52,7 +52,7 @@ export const TrackerModal = ({
|
||||
projectId,
|
||||
priorityTask,
|
||||
projectUsers,
|
||||
projectMarks,
|
||||
projectMarks
|
||||
}) => {
|
||||
const dispatch = useDispatch();
|
||||
const projectBoard = useSelector(getProjectBoard);
|
||||
@ -93,16 +93,16 @@ export const TrackerModal = ({
|
||||
const priority = [
|
||||
{
|
||||
name: "Высокий",
|
||||
key: 2,
|
||||
key: 2
|
||||
},
|
||||
{
|
||||
name: "Средний",
|
||||
key: 1,
|
||||
key: 1
|
||||
},
|
||||
{
|
||||
name: "Низкий",
|
||||
key: 0,
|
||||
},
|
||||
key: 0
|
||||
}
|
||||
];
|
||||
|
||||
function createTab() {
|
||||
@ -118,8 +118,8 @@ export const TrackerModal = ({
|
||||
priority: projectBoard.columns.length
|
||||
? projectBoard.columns.at(-1).priority + 1
|
||||
: 1,
|
||||
title: valueColumn,
|
||||
},
|
||||
title: valueColumn
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(setProjectBoardFetch(projectBoard.id));
|
||||
});
|
||||
@ -132,7 +132,7 @@ export const TrackerModal = ({
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Введите название и описание",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
return;
|
||||
}
|
||||
@ -148,14 +148,14 @@ export const TrackerModal = ({
|
||||
column_id: selectedTab,
|
||||
execution_priority: selectedPriority ? selectedPriority.key : "",
|
||||
priority: priorityTask,
|
||||
dead_line: deadLineDate ? getCorrectRequestDate(deadLineDate) : "",
|
||||
},
|
||||
dead_line: deadLineDate ? getCorrectRequestDate(deadLineDate) : ""
|
||||
}
|
||||
}).then((res) => {
|
||||
if (res.status === 500) {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Задача с таким именем уже существует",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
} else {
|
||||
for (let i = 0; i < taskTags.length; i++) {
|
||||
@ -164,8 +164,8 @@ export const TrackerModal = ({
|
||||
data: {
|
||||
mark_id: taskTags[i].id,
|
||||
entity_type: 2,
|
||||
entity_id: res.id,
|
||||
},
|
||||
entity_id: res.id
|
||||
}
|
||||
}).then(() => {
|
||||
setTaskTags([]);
|
||||
});
|
||||
@ -175,8 +175,8 @@ export const TrackerModal = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: res.id,
|
||||
executor_id: selectedExecutorTask.user_id,
|
||||
},
|
||||
executor_id: selectedExecutorTask.user_id
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(setProjectBoardFetch(projectBoard.id));
|
||||
setActive(false);
|
||||
@ -195,7 +195,7 @@ export const TrackerModal = ({
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Задача создана",
|
||||
type: "success",
|
||||
type: "success"
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -206,8 +206,8 @@ export const TrackerModal = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
project_id: projectId,
|
||||
name: projectName,
|
||||
},
|
||||
name: projectName
|
||||
}
|
||||
}).then(() => {
|
||||
setActive(false);
|
||||
dispatch(editProjectName({ id: projectId, name: projectName }));
|
||||
@ -220,20 +220,20 @@ export const TrackerModal = ({
|
||||
const priorityColumns = [
|
||||
{
|
||||
column_id: column.id,
|
||||
priority: Number(columnPriority),
|
||||
},
|
||||
priority: Number(columnPriority)
|
||||
}
|
||||
];
|
||||
for (let i = column.priority; i < columnPriority; i++) {
|
||||
const currentColumn = {
|
||||
column_id: projectBoard.columns[i].id,
|
||||
priority: i,
|
||||
priority: i
|
||||
};
|
||||
priorityColumns.push(currentColumn);
|
||||
}
|
||||
for (let i = column.priority; i > columnPriority; i--) {
|
||||
const currentColumn = {
|
||||
column_id: projectBoard.columns[i - 2].id,
|
||||
priority: i,
|
||||
priority: i
|
||||
};
|
||||
priorityColumns.push(currentColumn);
|
||||
}
|
||||
@ -241,8 +241,8 @@ export const TrackerModal = ({
|
||||
method: "POST",
|
||||
data: {
|
||||
project_id: projectBoard.id,
|
||||
data: JSON.stringify(priorityColumns),
|
||||
},
|
||||
data: JSON.stringify(priorityColumns)
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(setProjectBoardFetch(projectBoard.id));
|
||||
});
|
||||
@ -256,8 +256,8 @@ export const TrackerModal = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
column_id: columnId,
|
||||
title: columnName,
|
||||
},
|
||||
title: columnName
|
||||
}
|
||||
}).then(() => {
|
||||
setActive(false);
|
||||
dispatch(editColumnName({ id: columnId, title: columnName }));
|
||||
@ -273,8 +273,8 @@ export const TrackerModal = ({
|
||||
data: {
|
||||
user_id: localStorage.getItem("id"),
|
||||
name: nameProject,
|
||||
status: 19,
|
||||
},
|
||||
status: 19
|
||||
}
|
||||
}).then((res) => {
|
||||
if (!Array.isArray(res.name)) {
|
||||
const result = { ...res, columns: [] };
|
||||
@ -285,7 +285,7 @@ export const TrackerModal = ({
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Проект с таким именем уже существует",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -297,8 +297,8 @@ export const TrackerModal = ({
|
||||
method: "POST",
|
||||
data: {
|
||||
user_id: selectedWorker.user_id,
|
||||
project_id: projectBoard.id,
|
||||
},
|
||||
project_id: projectBoard.id
|
||||
}
|
||||
}).then((el) => {
|
||||
dispatch(addPersonToProject(el));
|
||||
setActive(false);
|
||||
@ -332,10 +332,10 @@ export const TrackerModal = ({
|
||||
{
|
||||
user: {
|
||||
avatar: profileInfo.photo,
|
||||
fio: profileInfo.fio,
|
||||
fio: profileInfo.fio
|
||||
},
|
||||
user_id: profileInfo.id_user,
|
||||
},
|
||||
user_id: profileInfo.id_user
|
||||
}
|
||||
]);
|
||||
} else {
|
||||
setCorrectProjectUsers(projectUsers);
|
||||
@ -525,10 +525,10 @@ export const TrackerModal = ({
|
||||
"italic",
|
||||
"link",
|
||||
"bulletedList",
|
||||
"numberedList",
|
||||
"numberedList"
|
||||
],
|
||||
removePlugins: ["BlockQuote"],
|
||||
placeholder: "Описание задачи",
|
||||
placeholder: "Описание задачи"
|
||||
}}
|
||||
onChange={(event, editor) => {
|
||||
const data = editor.getData();
|
||||
|
@ -22,55 +22,55 @@ export const Navigation = () => {
|
||||
developer: [
|
||||
{
|
||||
path: "/summary",
|
||||
name: "Резюме",
|
||||
name: "Резюме"
|
||||
},
|
||||
{
|
||||
path: "/calendar",
|
||||
name: "Отчеты",
|
||||
name: "Отчеты"
|
||||
},
|
||||
{
|
||||
path: "/tracker",
|
||||
name: "Трекер",
|
||||
name: "Трекер"
|
||||
},
|
||||
{
|
||||
path: "/payouts",
|
||||
name: "Выплаты",
|
||||
name: "Выплаты"
|
||||
},
|
||||
{
|
||||
path: "/quiz",
|
||||
name: "Тесты",
|
||||
name: "Тесты"
|
||||
},
|
||||
{
|
||||
path: "/settings",
|
||||
name: "Настройки",
|
||||
},
|
||||
name: "Настройки"
|
||||
}
|
||||
],
|
||||
partner: [
|
||||
{
|
||||
path: "/catalog",
|
||||
name: "Каталог",
|
||||
name: "Каталог"
|
||||
},
|
||||
{
|
||||
path: "/requests",
|
||||
name: "Запросы",
|
||||
name: "Запросы"
|
||||
},
|
||||
{
|
||||
path: "/categories",
|
||||
name: "Персонал",
|
||||
name: "Персонал"
|
||||
},
|
||||
{
|
||||
path: "/tracker",
|
||||
name: "Трекер",
|
||||
name: "Трекер"
|
||||
},
|
||||
{
|
||||
path: "/treaties",
|
||||
name: "Договора",
|
||||
name: "Договора"
|
||||
},
|
||||
{
|
||||
path: "/settings",
|
||||
name: "Настройки",
|
||||
},
|
||||
],
|
||||
name: "Настройки"
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -15,7 +15,7 @@ const images = {
|
||||
archive: archive,
|
||||
error: error,
|
||||
copy: copy,
|
||||
success: success,
|
||||
success: success
|
||||
};
|
||||
|
||||
export const Notification = () => {
|
||||
|
@ -4,7 +4,7 @@ import { useDispatch, useSelector } from "react-redux";
|
||||
import {
|
||||
getPositionId,
|
||||
selectTags,
|
||||
setPositionId,
|
||||
setPositionId
|
||||
} from "@redux/outstaffingSlice";
|
||||
|
||||
import OutstaffingBlock from "@components/OutstaffingBlock/OutstaffingBlock";
|
||||
@ -34,7 +34,7 @@ const Outstaffing = () => {
|
||||
const onSelectPosition = createSelectPositionHandler({
|
||||
positionId,
|
||||
setPositionId,
|
||||
dispatch,
|
||||
dispatch
|
||||
});
|
||||
return (
|
||||
<>
|
||||
|
@ -13,13 +13,13 @@ const handlePositionClick = ({
|
||||
positionId,
|
||||
isSelected,
|
||||
onSelect,
|
||||
apiRequest,
|
||||
apiRequest
|
||||
}) => {
|
||||
if (isSelected) {
|
||||
apiRequest("/profile", {
|
||||
params: {
|
||||
limit: 1000,
|
||||
},
|
||||
limit: 1000
|
||||
}
|
||||
}).then((profileArr) => {
|
||||
dispatch(profiles(profileArr));
|
||||
dispatch(selectedItems([]));
|
||||
@ -29,8 +29,8 @@ const handlePositionClick = ({
|
||||
apiRequest("/profile", {
|
||||
params: {
|
||||
limit: "1000",
|
||||
position_id: positionId,
|
||||
},
|
||||
position_id: positionId
|
||||
}
|
||||
}).then((res) => {
|
||||
dispatch(profiles(res));
|
||||
dispatch(selectedItems([]));
|
||||
@ -46,7 +46,7 @@ const OutstaffingBlock = ({
|
||||
header,
|
||||
positionId,
|
||||
isSelected,
|
||||
onSelect,
|
||||
onSelect
|
||||
}) => {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
@ -87,7 +87,7 @@ const OutstaffingBlock = ({
|
||||
positionId,
|
||||
isSelected,
|
||||
onSelect,
|
||||
apiRequest,
|
||||
apiRequest
|
||||
})
|
||||
}
|
||||
>
|
||||
|
@ -8,7 +8,7 @@ import { getProfileInfo } from "@redux/outstaffingSlice";
|
||||
import {
|
||||
getRequestDates,
|
||||
setReportDate,
|
||||
setRequestDate,
|
||||
setRequestDate
|
||||
} from "@redux/reportSlice";
|
||||
|
||||
import { urlForLocal } from "@utils/helper";
|
||||
@ -89,7 +89,7 @@ export const ProfileCalendar = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Отчеты", link: "/profile/calendar" },
|
||||
{ name: "Отчеты", link: "/profile/calendar" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="summary__title">Ваши отчеты</h2>
|
||||
|
@ -7,7 +7,7 @@ import { Link } from "react-router-dom";
|
||||
import {
|
||||
setReportDate,
|
||||
setRequestDate,
|
||||
setSendRequest,
|
||||
setSendRequest
|
||||
} from "@redux/reportSlice";
|
||||
|
||||
import { getCorrectYYMMDD } from "@utils/helper";
|
||||
@ -20,7 +20,7 @@ import {
|
||||
currentMonthAndDay,
|
||||
getCorrectDate,
|
||||
getReports,
|
||||
hourOfNum,
|
||||
hourOfNum
|
||||
} from "@components/Calendar/calendarHelper";
|
||||
import BaseButton from "@components/Common/BaseButton/BaseButton";
|
||||
import ShortReport from "@components/ShortReport/ShortReport";
|
||||
@ -40,7 +40,7 @@ export const ProfileCalendarComponent = React.memo(
|
||||
startRangeDays,
|
||||
toggleRangeDays,
|
||||
startDate,
|
||||
setStartDateRange,
|
||||
setStartDateRange
|
||||
}) => {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
@ -58,7 +58,7 @@ export const ProfileCalendarComponent = React.memo(
|
||||
calendarHelper(value).map((array) => {
|
||||
setSelectedRangeDays((prevState) => ({
|
||||
...prevState,
|
||||
[array[0]]: false,
|
||||
[array[0]]: false
|
||||
}));
|
||||
});
|
||||
if (endDate) {
|
||||
@ -196,7 +196,7 @@ export const ProfileCalendarComponent = React.memo(
|
||||
calendarHelper(value).map((array) => {
|
||||
setSelectedRangeDays((prevState) => ({
|
||||
...prevState,
|
||||
[array[0]]: false,
|
||||
[array[0]]: false
|
||||
}));
|
||||
});
|
||||
}
|
||||
@ -316,15 +316,15 @@ export const ProfileCalendarComponent = React.memo(
|
||||
? `${getCorrectDate(startDate)} - ${getCorrectDate(endDate)}`
|
||||
: `${getCorrectDate(endDate)} - ${getCorrectDate(startDate)}`
|
||||
: activePeriod
|
||||
? "Выберите диапазон на календаре"
|
||||
: "Выбрать диапазон"}
|
||||
? "Выберите диапазон на календаре"
|
||||
: "Выбрать диапазон"}
|
||||
</span>
|
||||
<span>
|
||||
{totalRangeHours
|
||||
? `${totalRangeHours} ${hourOfNum(totalRangeHours)}`
|
||||
: endDate
|
||||
? "0 часов"
|
||||
: ""}
|
||||
? "0 часов"
|
||||
: ""}
|
||||
</span>
|
||||
{endDate && (
|
||||
<BaseButton
|
||||
|
@ -58,14 +58,14 @@ export const ProjectTiket = ({ project, index }) => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
project_id: project.id,
|
||||
status: 10,
|
||||
},
|
||||
status: 10
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(deleteProject(project));
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Проект успешно была перемещена в архив",
|
||||
type: "archive",
|
||||
type: "archive"
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ import remove from "assets/icons/remove.svg";
|
||||
import {
|
||||
getCorrectDate,
|
||||
getCreatedDate,
|
||||
hourOfNum,
|
||||
hourOfNum
|
||||
} from "../Calendar/calendarHelper";
|
||||
import "./reportForm.scss";
|
||||
|
||||
@ -48,7 +48,7 @@ const ReportForm = () => {
|
||||
const [datePickerOpen, setDatePickerOpen] = useState(false);
|
||||
|
||||
const [inputs, setInputs] = useState([
|
||||
{ task: "", hours_spent: "", minutes_spent: 0 },
|
||||
{ task: "", hours_spent: "", minutes_spent: 0 }
|
||||
]);
|
||||
const [troublesInputValue, setTroublesInputValue] = useState("");
|
||||
const [scheduledInputValue, setScheduledInputValue] = useState("");
|
||||
@ -56,7 +56,7 @@ const ReportForm = () => {
|
||||
const addInput = () => {
|
||||
setInputs((prev) => [
|
||||
...prev,
|
||||
{ task: "", hours_spent: "", minutes_spent: 0 },
|
||||
{ task: "", hours_spent: "", minutes_spent: 0 }
|
||||
]);
|
||||
};
|
||||
|
||||
@ -101,8 +101,8 @@ const ReportForm = () => {
|
||||
difficulties: troublesInputValue,
|
||||
tomorrow: scheduledInputValue,
|
||||
created_at: getCreatedDate(startDate),
|
||||
status: 1,
|
||||
},
|
||||
status: 1
|
||||
}
|
||||
}).then(() => {
|
||||
setReportSuccess("Отчет отправлен");
|
||||
setTimeout(() => {
|
||||
@ -126,7 +126,7 @@ const ReportForm = () => {
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Отчеты", link: "/profile/calendar" },
|
||||
{ name: "Добавить отчет", link: "/report" },
|
||||
{ name: "Добавить отчет", link: "/report" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="summary__title">
|
||||
@ -192,7 +192,7 @@ const ReportForm = () => {
|
||||
>
|
||||
<div className="report-form__task-number">{index + 1}.</div>
|
||||
<div className="report-form__task-input report-form__task-input--description">
|
||||
<input
|
||||
<textarea
|
||||
value={inputs[index].task}
|
||||
className={
|
||||
!input.task && reportSuccess === "Заполните задачи"
|
||||
@ -207,7 +207,7 @@ const ReportForm = () => {
|
||||
return index === inputIndex
|
||||
? {
|
||||
...input,
|
||||
task: e.target.value,
|
||||
task: e.target.value
|
||||
}
|
||||
: input;
|
||||
})
|
||||
@ -233,7 +233,7 @@ const ReportForm = () => {
|
||||
return index === inputIndex
|
||||
? {
|
||||
...input,
|
||||
hours_spent: Number(e.target.value),
|
||||
hours_spent: Number(e.target.value)
|
||||
}
|
||||
: input;
|
||||
})
|
||||
|
@ -69,8 +69,8 @@
|
||||
letter-spacing: normal;
|
||||
line-height: 30px;
|
||||
text-align: left;
|
||||
margin-top: 52px;
|
||||
margin-bottom: 35px;
|
||||
margin-top: 30px;
|
||||
margin-bottom: 10px;
|
||||
|
||||
@media (max-width: 555px) {
|
||||
margin-top: 25px;
|
||||
@ -80,7 +80,7 @@
|
||||
}
|
||||
|
||||
&__block-img {
|
||||
width: 280px;
|
||||
width: 230px;
|
||||
height: 42px;
|
||||
box-shadow: 0 0 59px rgba(44, 44, 44, 0.05);
|
||||
border-radius: 5px;
|
||||
@ -107,18 +107,15 @@
|
||||
|
||||
&__task {
|
||||
&-number {
|
||||
height: 14px;
|
||||
color: #282828;
|
||||
font-family: "GT Eesti Pro Display";
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
letter-spacing: normal;
|
||||
width: 12px;
|
||||
}
|
||||
|
||||
&-list {
|
||||
margin-top: 30px;
|
||||
margin-top: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
@ -194,8 +191,9 @@
|
||||
|
||||
&-form {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-left: 20px;
|
||||
margin-bottom: 28px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
&-input {
|
||||
@ -208,9 +206,9 @@
|
||||
border-color: #fc0000;
|
||||
}
|
||||
|
||||
input {
|
||||
textarea {
|
||||
width: 460px;
|
||||
height: 42px;
|
||||
height: 84px;
|
||||
box-shadow: 0 0 59px rgba(44, 44, 44, 0.05);
|
||||
border-radius: 5px;
|
||||
border: 1px solid #c4c4c4;
|
||||
@ -244,7 +242,7 @@
|
||||
}
|
||||
|
||||
input {
|
||||
width: 141px;
|
||||
width: 80px;
|
||||
height: 42px;
|
||||
box-shadow: 0 0 59px rgba(44, 44, 44, 0.05);
|
||||
border-radius: 5px;
|
||||
@ -410,7 +408,7 @@
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-left: 14px;
|
||||
margin-bottom: 28px;
|
||||
margin-bottom: 14px;
|
||||
|
||||
span {
|
||||
font-family: "GT Eesti Pro Display";
|
||||
|
@ -7,7 +7,7 @@ import {
|
||||
selectItems,
|
||||
selectTags,
|
||||
selectedItems,
|
||||
setPositionId,
|
||||
setPositionId
|
||||
} from "@redux/outstaffingSlice";
|
||||
|
||||
import { apiRequest } from "@api/request";
|
||||
@ -31,7 +31,7 @@ const TagSelect = () => {
|
||||
const params = filterItemsId ? { skill: filterItemsId } : "";
|
||||
|
||||
apiRequest("/profile", {
|
||||
params: { ...params, limit: 1000 },
|
||||
params: { ...params, limit: 1000 }
|
||||
}).then((res) => {
|
||||
dispatch(profiles(res));
|
||||
setSearchLoading(false);
|
||||
@ -58,7 +58,7 @@ const TagSelect = () => {
|
||||
return {
|
||||
id: item.id,
|
||||
value: item.value,
|
||||
label: item.value,
|
||||
label: item.value
|
||||
};
|
||||
})
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ import { Link } from "react-router-dom";
|
||||
import {
|
||||
getReportDate,
|
||||
getSendRequest,
|
||||
setSendRequest,
|
||||
setSendRequest
|
||||
} from "@redux/reportSlice";
|
||||
|
||||
import { apiRequest } from "@api/request";
|
||||
@ -13,7 +13,7 @@ import { apiRequest } from "@api/request";
|
||||
import {
|
||||
getCorrectDate,
|
||||
getCreatedDate,
|
||||
hourOfNum,
|
||||
hourOfNum
|
||||
} from "@components/Calendar/calendarHelper";
|
||||
import { Loader } from "@components/Common/Loader/Loader";
|
||||
|
||||
@ -56,7 +56,7 @@ export const ShortReport = () => {
|
||||
const taskInfo = {
|
||||
hours: task.hours_spent,
|
||||
task: task.task,
|
||||
id: task.id,
|
||||
id: task.id
|
||||
};
|
||||
if (task.hours_spent) {
|
||||
spendTime += Number(task.hours_spent);
|
||||
|
@ -18,24 +18,24 @@ export const SliderWorkers = ({ title, titleInfo, subTitle }) => {
|
||||
const [workers] = useState([
|
||||
{
|
||||
avatar: mockWorker,
|
||||
skils: "React / Vue Front end, Middle разработчик",
|
||||
skils: "React / Vue Front end, Middle разработчик"
|
||||
},
|
||||
{
|
||||
avatar: avatarMockFirst,
|
||||
skils: "Vue / React Front end, Senior разработчик",
|
||||
skils: "Vue / React Front end, Senior разработчик"
|
||||
},
|
||||
{
|
||||
avatar: avatarMockSecond,
|
||||
skils: "NodeJs Fullstack, Middle разработчик",
|
||||
skils: "NodeJs Fullstack, Middle разработчик"
|
||||
},
|
||||
{
|
||||
avatar: avatarMockThird,
|
||||
skils: "React / Vue Front end, Middle разработчик",
|
||||
skils: "React / Vue Front end, Middle разработчик"
|
||||
},
|
||||
{
|
||||
avatar: avatarMockFourth,
|
||||
skils: "React / PHP Fullstack, Middle разработчик",
|
||||
},
|
||||
skils: "React / PHP Fullstack, Middle разработчик"
|
||||
}
|
||||
]);
|
||||
|
||||
const settings = {
|
||||
@ -44,7 +44,7 @@ export const SliderWorkers = ({ title, titleInfo, subTitle }) => {
|
||||
slidesToShow: 3,
|
||||
slidesToScroll: 1,
|
||||
autoplay: true,
|
||||
autoplaySpeed: 4500,
|
||||
autoplaySpeed: 4500
|
||||
};
|
||||
|
||||
if (window.innerWidth < 575) {
|
||||
|
@ -6,7 +6,7 @@ const StarRating = ({
|
||||
countStars = 1,
|
||||
countActiveStars = 1,
|
||||
color = "#52B709",
|
||||
size = 61,
|
||||
size = 61
|
||||
}) => {
|
||||
const [shadedStars, setShadedStars] = useState([]);
|
||||
const [noShadedStars, setNoShadedStars] = useState([]);
|
||||
@ -22,16 +22,16 @@ const StarRating = ({
|
||||
}, []);
|
||||
|
||||
const ratingStyle = {
|
||||
"--size": size + "px",
|
||||
"--size": size + "px"
|
||||
};
|
||||
const activeStyle = {
|
||||
"--width": percent + "%",
|
||||
"--color": color,
|
||||
"--content": shadedStars.join(""),
|
||||
"--content": shadedStars.join("")
|
||||
};
|
||||
const bodyStyle = {
|
||||
"--content": noShadedStars.join(""),
|
||||
"--color": color,
|
||||
"--color": color
|
||||
};
|
||||
|
||||
return (
|
||||
|
@ -27,7 +27,7 @@ export const TrackerSelectColumn = ({ columns, task, currentColumn }) => {
|
||||
dispatch(
|
||||
moveProjectTask({
|
||||
startWrapperIndex: { index: currentColumn.id, task },
|
||||
columnId: column.id,
|
||||
columnId: column.id
|
||||
})
|
||||
);
|
||||
}}
|
||||
|
@ -19,7 +19,7 @@ export const TrackerTaskComment = ({
|
||||
comment,
|
||||
commentDelete,
|
||||
addSubComment,
|
||||
subCommentDelete,
|
||||
subCommentDelete
|
||||
}) => {
|
||||
const [commentsEditOpen, setCommentsEditOpen] = useState(false);
|
||||
const [commentsEditText, setCommentsEditText] = useState(comment.text);
|
||||
@ -32,8 +32,8 @@ export const TrackerTaskComment = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
comment_id: comment.id,
|
||||
text: commentsEditText,
|
||||
},
|
||||
text: commentsEditText
|
||||
}
|
||||
}).then(() => {});
|
||||
}
|
||||
|
||||
@ -42,8 +42,8 @@ export const TrackerTaskComment = ({
|
||||
method: "PUT",
|
||||
data: {
|
||||
comment_id: comment.id,
|
||||
status: 0,
|
||||
},
|
||||
status: 0
|
||||
}
|
||||
}).then(() => {
|
||||
if (comment.parent_id) {
|
||||
subCommentDelete(comment);
|
||||
@ -62,8 +62,8 @@ export const TrackerTaskComment = ({
|
||||
text: subCommentsCreateText,
|
||||
entity_type: 2,
|
||||
entity_id: taskId,
|
||||
parent_id: comment.id,
|
||||
},
|
||||
parent_id: comment.id
|
||||
}
|
||||
}).then((res) => {
|
||||
let newSubComment = res;
|
||||
newSubComment.created_at = new Date();
|
||||
@ -80,7 +80,7 @@ export const TrackerTaskComment = ({
|
||||
: "",
|
||||
"comments__list__item",
|
||||
commentsEditOpen ? "comment__edit--open" : "",
|
||||
comment.parent_id ? "comments__list__item__subComment" : "",
|
||||
comment.parent_id ? "comments__list__item__subComment" : ""
|
||||
].join(" ")}
|
||||
>
|
||||
<div className="comments__list__item__info">
|
||||
@ -131,8 +131,8 @@ export const TrackerTaskComment = ({
|
||||
"ImageToolbar",
|
||||
"ImageUpload",
|
||||
"MediaEmbed",
|
||||
"BlockQuote",
|
||||
],
|
||||
"BlockQuote"
|
||||
]
|
||||
}}
|
||||
onChange={(event, editor) => {
|
||||
const data = editor.getData();
|
||||
|
@ -16,7 +16,7 @@ export const Instruction = () => {
|
||||
|
||||
useEffect(() => {
|
||||
apiRequest("/user-questionnaire/get-question-number", {
|
||||
params: { user_questionnaire_uuid: test.uuid },
|
||||
params: { user_questionnaire_uuid: test.uuid }
|
||||
}).then((res) => setCountQuestions(res.question_number));
|
||||
}, []);
|
||||
|
||||
|
@ -28,7 +28,7 @@ export const QuizPassingInformation = ({ setStartTest, uuid, timer }) => {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: res?.message || "",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
return;
|
||||
}
|
||||
@ -54,7 +54,7 @@ export const QuizPassingInformation = ({ setStartTest, uuid, timer }) => {
|
||||
|
||||
const completeTest = () =>
|
||||
apiRequest("/user-questionnaire/questionnaire-completed", {
|
||||
method: "POST",
|
||||
method: "POST"
|
||||
});
|
||||
|
||||
const finishQuiz = async () => {
|
||||
|
@ -29,7 +29,7 @@ export const TaskQuiz = ({ timer }) => {
|
||||
|
||||
const { userResponses, handleChange } = useHandlerFieldTest({
|
||||
questions,
|
||||
indexQuestion: index,
|
||||
indexQuestion: index
|
||||
});
|
||||
|
||||
const nextQuestion = async (e) => {
|
||||
@ -50,13 +50,13 @@ export const TaskQuiz = ({ timer }) => {
|
||||
data: {
|
||||
user_id: userId,
|
||||
user_questionnaire_uuid: uuid,
|
||||
userResponses: JSON.stringify(userResponses),
|
||||
},
|
||||
userResponses: JSON.stringify(userResponses)
|
||||
}
|
||||
}).then(() => {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Тест успешно пройден",
|
||||
type: "success",
|
||||
type: "success"
|
||||
});
|
||||
navigate("/quiz");
|
||||
// if (String(res?.status)[0] !== "2") {
|
||||
|
@ -2,7 +2,7 @@ import React, { Component } from "react";
|
||||
|
||||
class ErrorBoundary extends Component {
|
||||
state = {
|
||||
error: null,
|
||||
error: null
|
||||
};
|
||||
|
||||
static getDerivedStateFromError(error) {
|
||||
|
@ -10,8 +10,8 @@ export const useHandlerFieldTest = ({ questions, indexQuestion }) => {
|
||||
{
|
||||
question_id: questions[indexQuestion].id,
|
||||
response_body: e.target.value,
|
||||
answer_id: e.target.id ? e.target.id : questions[indexQuestion].id,
|
||||
},
|
||||
answer_id: e.target.id ? e.target.id : questions[indexQuestion].id
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
||||
|
@ -22,18 +22,18 @@ export const Article = () => {
|
||||
{
|
||||
image: cardImg1,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
data: "1 марта, 2023"
|
||||
},
|
||||
{
|
||||
image: cardImg2,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
data: "1 марта, 2023"
|
||||
},
|
||||
{
|
||||
image: cardImg3,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
},
|
||||
data: "1 марта, 2023"
|
||||
}
|
||||
]);
|
||||
|
||||
return (
|
||||
@ -48,8 +48,8 @@ export const Article = () => {
|
||||
{ name: "Блог", link: "/blog" },
|
||||
{
|
||||
name: "Аутстаффинг джунов: почему это выгодно",
|
||||
link: "/blog",
|
||||
},
|
||||
link: "/blog"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
@ -44,7 +44,7 @@ export const AuthForCandidate = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: BackEndImg,
|
||||
img: BackEndImg
|
||||
},
|
||||
{
|
||||
title: "Frontend разработчики",
|
||||
@ -52,14 +52,14 @@ export const AuthForCandidate = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: FrontendImg,
|
||||
img: FrontendImg
|
||||
},
|
||||
{
|
||||
title: "Архитектура проектов",
|
||||
link: "/registration-candidate",
|
||||
description: "Потоки данных ER ERP CRM CQRS UML BPMN",
|
||||
available: true,
|
||||
img: ArchitectureImg,
|
||||
img: ArchitectureImg
|
||||
},
|
||||
{
|
||||
title: "Дизайн проектов",
|
||||
@ -67,35 +67,35 @@ export const AuthForCandidate = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: DesignImg,
|
||||
img: DesignImg
|
||||
},
|
||||
{
|
||||
title: "Тестирование проектов",
|
||||
link: "/registration-candidate",
|
||||
description: "SQL Postman TestRail Kibana Ручное тестирование",
|
||||
available: false,
|
||||
img: TestImg,
|
||||
img: TestImg
|
||||
},
|
||||
{
|
||||
title: "Администрирование проектов",
|
||||
link: "/registration-candidate",
|
||||
description: "DevOps ELK Kubernetes Docker Bash Apache Oracle Git",
|
||||
available: false,
|
||||
img: AdminImg,
|
||||
img: AdminImg
|
||||
},
|
||||
{
|
||||
title: "Управление проектом",
|
||||
link: "/registration-candidate",
|
||||
description: "Scrum Kanban Agile Miro CustDev",
|
||||
available: false,
|
||||
img: ManageImg,
|
||||
img: ManageImg
|
||||
},
|
||||
{
|
||||
title: "Копирайтинг проектов",
|
||||
link: "/registration-candidate",
|
||||
description: "Теги Заголовок H1 Дескриптор Абзац Сценарий",
|
||||
available: false,
|
||||
img: CopyImg,
|
||||
img: CopyImg
|
||||
},
|
||||
{
|
||||
title: "Реклама и SMM",
|
||||
@ -103,8 +103,8 @@ export const AuthForCandidate = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: false,
|
||||
img: SmmImg,
|
||||
},
|
||||
img: SmmImg
|
||||
}
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -21,33 +21,33 @@ export const Blog = () => {
|
||||
{
|
||||
image: cardImg1,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
data: "1 марта, 2023"
|
||||
},
|
||||
{
|
||||
image: cardImg2,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
data: "1 марта, 2023"
|
||||
},
|
||||
{
|
||||
image: cardImg3,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
data: "1 марта, 2023"
|
||||
},
|
||||
{
|
||||
image: cardImg4,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
data: "1 марта, 2023"
|
||||
},
|
||||
{
|
||||
image: cardImg5,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
data: "1 марта, 2023"
|
||||
},
|
||||
{
|
||||
image: cardImg6,
|
||||
title: "Аутстаффинг джунов: почему это выгодно",
|
||||
data: "1 марта, 2023",
|
||||
},
|
||||
data: "1 марта, 2023"
|
||||
}
|
||||
]);
|
||||
|
||||
return (
|
||||
@ -60,7 +60,7 @@ export const Blog = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/auth" },
|
||||
{ name: "Блог", link: "/blog" },
|
||||
{ name: "Блог", link: "/blog" }
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
@ -5,7 +5,7 @@ import { Navigate, useNavigate, useParams } from "react-router-dom";
|
||||
|
||||
import {
|
||||
currentCandidate,
|
||||
selectCurrentCandidate,
|
||||
selectCurrentCandidate
|
||||
} from "@redux/outstaffingSlice";
|
||||
|
||||
import { LEVELS, SKILLS } from "@utils/constants";
|
||||
@ -39,7 +39,7 @@ const FormPage = () => {
|
||||
useEffect(() => {
|
||||
if (!candidate.id) {
|
||||
apiRequest("/profile", {
|
||||
params: Number(params.id),
|
||||
params: Number(params.id)
|
||||
}).then((el) => dispatch(currentCandidate(el)));
|
||||
}
|
||||
}, []);
|
||||
|
@ -17,7 +17,7 @@ export const FrequentlyAskedQuestion = () => {
|
||||
id: params.id,
|
||||
title: "Это фриланс-платформа?",
|
||||
answer:
|
||||
"Нет, мы работаем только с юридическими лицами и индивидуальными предпринимателями и тщательно проверяем своих партнеров. Партнерами являются агентства, которые специализируются на оказании услуг в формате аутстафф-модели и обладают глубокой экспертизой в разработке и внедрении IT-проектов.",
|
||||
"Нет, мы работаем только с юридическими лицами и индивидуальными предпринимателями и тщательно проверяем своих партнеров. Партнерами являются агентства, которые специализируются на оказании услуг в формате аутстафф-модели и обладают глубокой экспертизой в разработке и внедрении IT-проектов."
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
@ -34,12 +34,12 @@ export const FrequentlyAskedQuestion = () => {
|
||||
{ name: "Главная", link: "/auth" },
|
||||
{
|
||||
name: "FAQ (часто задаваемые вопросы)",
|
||||
link: "/frequently-asked-questions",
|
||||
link: "/frequently-asked-questions"
|
||||
},
|
||||
{
|
||||
name: question.title,
|
||||
link: `/frequently-asked-question/${params.id}`,
|
||||
},
|
||||
link: `/frequently-asked-question/${params.id}`
|
||||
}
|
||||
]}
|
||||
/>
|
||||
<div className="frequently-asked-question__title">{question.title}</div>
|
||||
|
@ -17,55 +17,55 @@ export const FrequentlyAskedQuestions = () => {
|
||||
questions: [
|
||||
{
|
||||
id: 1,
|
||||
title: "Это фриланс-платформа?",
|
||||
title: "Это фриланс-платформа?"
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
title:
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?",
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?"
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
title: "Это фриланс-платформа?",
|
||||
title: "Это фриланс-платформа?"
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
title:
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?",
|
||||
},
|
||||
],
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Поиск специалиста",
|
||||
questions: [
|
||||
{
|
||||
id: 11,
|
||||
title: "Это фриланс-платформа?",
|
||||
title: "Это фриланс-платформа?"
|
||||
},
|
||||
{
|
||||
id: 22,
|
||||
title:
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?",
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?"
|
||||
},
|
||||
{
|
||||
id: 33,
|
||||
title: "Это фриланс-платформа?",
|
||||
title: "Это фриланс-платформа?"
|
||||
},
|
||||
{
|
||||
id: 44,
|
||||
title:
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?",
|
||||
},
|
||||
],
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Бронирование специалиста",
|
||||
questions: [
|
||||
{
|
||||
id: 11,
|
||||
title: "Это фриланс-платформа?",
|
||||
},
|
||||
],
|
||||
title: "Это фриланс-платформа?"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Работа с выбранным специалистом",
|
||||
@ -73,10 +73,10 @@ export const FrequentlyAskedQuestions = () => {
|
||||
{
|
||||
id: 11,
|
||||
title:
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?",
|
||||
},
|
||||
],
|
||||
},
|
||||
"Чем вы отличаетесь от традиционного процесса выбора исполнителя?"
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
return (
|
||||
@ -90,8 +90,8 @@ export const FrequentlyAskedQuestions = () => {
|
||||
{ name: "Главная", link: "/auth" },
|
||||
{
|
||||
name: "FAQ (часто задаваемые вопросы)",
|
||||
link: "/frequently-asked-questions",
|
||||
},
|
||||
link: "/frequently-asked-questions"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
<div className="frequently-asked-questions__about">
|
||||
|
@ -26,7 +26,7 @@ const Home = () => {
|
||||
useEffect(() => {
|
||||
setIsLoadingMore(true);
|
||||
apiRequest("/profile", {
|
||||
params: { limit: 1000 },
|
||||
params: { limit: 1000 }
|
||||
}).then((profileArr) => {
|
||||
dispatch(profiles(profileArr));
|
||||
setIsLoadingMore(false);
|
||||
@ -63,7 +63,7 @@ const Home = () => {
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Запросы и открытые позиции", link: "/profile/requests" },
|
||||
{ name: "Каталог", link: "/profile/catalog" },
|
||||
{ name: "Каталог", link: "/profile/catalog" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="catalog__title">Каталог специалистов</h2>
|
||||
|
@ -73,12 +73,12 @@ export const PartnerAddRequest = () => {
|
||||
) {
|
||||
setInputs({
|
||||
title: partnerRequestInfo.title,
|
||||
description: partnerRequestInfo.descr,
|
||||
description: partnerRequestInfo.descr
|
||||
});
|
||||
setSelectedSpecialization(partnerRequestInfo.position);
|
||||
setSelectedLevel({
|
||||
name: partnerRequestInfo.level,
|
||||
id: partnerRequestInfo.knowledge_level_id,
|
||||
id: partnerRequestInfo.knowledge_level_id
|
||||
});
|
||||
setSelectedCount(partnerRequestInfo.specialist_count);
|
||||
setSelectedSkills(partnerRequestInfo.skills);
|
||||
@ -115,8 +115,8 @@ export const PartnerAddRequest = () => {
|
||||
descr: inputs.description,
|
||||
skill_ids: selectedSkills.map((skill) => {
|
||||
return skill.id;
|
||||
}),
|
||||
},
|
||||
})
|
||||
}
|
||||
}).then(() => {
|
||||
navigate("/profile/requests");
|
||||
});
|
||||
@ -133,8 +133,8 @@ export const PartnerAddRequest = () => {
|
||||
descr: inputs.description,
|
||||
skill_ids: selectedSkills.map((skill) => {
|
||||
return skill.id;
|
||||
}),
|
||||
},
|
||||
})
|
||||
}
|
||||
}).then(() => {
|
||||
navigate("/profile/requests");
|
||||
});
|
||||
@ -154,8 +154,8 @@ export const PartnerAddRequest = () => {
|
||||
name: `${
|
||||
editRequest ? "Редактирование заявки" : "Создание новой заявки"
|
||||
}`,
|
||||
link: "/profile/add-request",
|
||||
},
|
||||
link: "/profile/add-request"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
<h2 className="partnerAddRequest__title">
|
||||
@ -175,7 +175,7 @@ export const PartnerAddRequest = () => {
|
||||
onChange={(e) =>
|
||||
setInputs((prevValue) => ({
|
||||
...prevValue,
|
||||
title: e.target.value,
|
||||
title: e.target.value
|
||||
}))
|
||||
}
|
||||
type="text"
|
||||
@ -242,7 +242,7 @@ export const PartnerAddRequest = () => {
|
||||
setSkills((prevArray) => [...prevArray, skill]);
|
||||
setFilteredSkills((prevArray) => [
|
||||
...prevArray,
|
||||
skill,
|
||||
skill
|
||||
]);
|
||||
setSelectedSkills(
|
||||
selectedSkills.filter((skill, indexSkill) => {
|
||||
@ -277,7 +277,7 @@ export const PartnerAddRequest = () => {
|
||||
onClick={() => {
|
||||
setSelectedSkills((prevArray) => [
|
||||
...prevArray,
|
||||
skill,
|
||||
skill
|
||||
]);
|
||||
setFilteredSkills(
|
||||
filteredSkills.filter((skill, skillIndex) => {
|
||||
@ -343,7 +343,7 @@ export const PartnerAddRequest = () => {
|
||||
onChange={(e) =>
|
||||
setInputs((prevValue) => ({
|
||||
...prevValue,
|
||||
description: e.target.value,
|
||||
description: e.target.value
|
||||
}))
|
||||
}
|
||||
/>
|
||||
|
@ -6,7 +6,7 @@ import {
|
||||
getPartnerRequestId,
|
||||
getPartnerRequests,
|
||||
setPartnerRequestId,
|
||||
setPartnerRequestInfo,
|
||||
setPartnerRequestInfo
|
||||
} from "@redux/outstaffingSlice";
|
||||
|
||||
import { urlForLocal } from "@utils/helper";
|
||||
@ -57,8 +57,8 @@ export const PartnerBid = () => {
|
||||
data: {
|
||||
user_id: localStorage.getItem("id"),
|
||||
request_id: requestId,
|
||||
status: 0,
|
||||
},
|
||||
status: 0
|
||||
}
|
||||
}).then(() => {
|
||||
navigate("/profile/requests");
|
||||
});
|
||||
@ -71,7 +71,7 @@ export const PartnerBid = () => {
|
||||
1: "Junior",
|
||||
2: "Middle",
|
||||
3: "Middle+",
|
||||
4: "Senior",
|
||||
4: "Senior"
|
||||
});
|
||||
return (
|
||||
<div className="partnerBid">
|
||||
@ -107,7 +107,7 @@ export const PartnerBid = () => {
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Запросы и открытые позиции", link: "/profile/requests" },
|
||||
{ name: "Просмотр заявки - PHP разработчик", link: "/profile/bid" },
|
||||
{ name: "Просмотр заявки - PHP разработчик", link: "/profile/bid" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="partnerBid__title">Страница заявки </h2>
|
||||
|
@ -33,8 +33,8 @@ export const PartnerEmployees = () => {
|
||||
{ name: "Данные моего персонала", link: "/profile/categories" },
|
||||
{
|
||||
name: "Backend разработчики",
|
||||
link: "/profile/categories/employees",
|
||||
},
|
||||
link: "/profile/categories/employees"
|
||||
}
|
||||
]}
|
||||
/>
|
||||
<h2 className="partnerEmployees__title">Backend разработчики</h2>
|
||||
|
@ -4,7 +4,7 @@ import { Link, Navigate } from "react-router-dom";
|
||||
|
||||
import {
|
||||
setPartnerRequestId,
|
||||
setPartnerRequests,
|
||||
setPartnerRequests
|
||||
} from "@redux/outstaffingSlice";
|
||||
|
||||
import { apiRequest } from "@api/request";
|
||||
@ -48,7 +48,7 @@ export const PartnerRequests = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Запросы и открытые позиции", link: "/profile/requests" },
|
||||
{ name: "Запросы и открытые позиции", link: "/profile/requests" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="partnerRequests__title">Запросы</h2>
|
||||
|
@ -21,12 +21,12 @@ export const PartnerSettings = () => {
|
||||
const [inputsValue, setInputsValue] = useState({
|
||||
name: "",
|
||||
oldPassword: "",
|
||||
password: "",
|
||||
password: ""
|
||||
});
|
||||
|
||||
const [inputsError, setInputsError] = useState({
|
||||
name: false,
|
||||
password: false,
|
||||
password: false
|
||||
});
|
||||
|
||||
const [loader, setLoader] = useState(false);
|
||||
@ -44,37 +44,37 @@ export const PartnerSettings = () => {
|
||||
apiRequest("/user/change-personal-data", {
|
||||
method: "PUT",
|
||||
data: {
|
||||
newUsername: inputsValue.name,
|
||||
},
|
||||
newUsername: inputsValue.name
|
||||
}
|
||||
}).then((data) => {
|
||||
apiRequest("/user/change-password", {
|
||||
method: "PUT",
|
||||
data: {
|
||||
password: inputsValue.oldPassword,
|
||||
newPassword: inputsValue.password,
|
||||
},
|
||||
newPassword: inputsValue.password
|
||||
}
|
||||
}).then((data) => {
|
||||
setLoader(false);
|
||||
if (data.status === "success") {
|
||||
setInputsError({
|
||||
name: false,
|
||||
password: false,
|
||||
password: false
|
||||
});
|
||||
setInputsValue({
|
||||
name: "",
|
||||
oldPassword: "",
|
||||
password: "",
|
||||
password: ""
|
||||
});
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Данные изменены",
|
||||
type: "success",
|
||||
type: "success"
|
||||
});
|
||||
} else {
|
||||
showNotification({
|
||||
show: true,
|
||||
text: "Неверные данные",
|
||||
type: "error",
|
||||
type: "error"
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -88,7 +88,7 @@ export const PartnerSettings = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Настройки", link: "/profile/settings" },
|
||||
{ name: "Настройки", link: "/profile/settings" }
|
||||
]}
|
||||
/>
|
||||
<div className="partner-settings">
|
||||
@ -105,11 +105,11 @@ export const PartnerSettings = () => {
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
name: e.target.value,
|
||||
name: e.target.value
|
||||
}));
|
||||
setInputsError((prevValue) => ({
|
||||
...prevValue,
|
||||
name: false,
|
||||
name: false
|
||||
}));
|
||||
}}
|
||||
value={inputsValue.name}
|
||||
@ -128,11 +128,11 @@ export const PartnerSettings = () => {
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
oldPassword: e.target.value,
|
||||
oldPassword: e.target.value
|
||||
}));
|
||||
setInputsError((prevValue) => ({
|
||||
...prevValue,
|
||||
password: false,
|
||||
password: false
|
||||
}));
|
||||
}}
|
||||
value={inputsValue.oldPassword}
|
||||
@ -149,11 +149,11 @@ export const PartnerSettings = () => {
|
||||
onChange={(e) => {
|
||||
setInputsValue((prevValue) => ({
|
||||
...prevValue,
|
||||
password: e.target.value,
|
||||
password: e.target.value
|
||||
}));
|
||||
setInputsError((prevValue) => ({
|
||||
...prevValue,
|
||||
password: false,
|
||||
password: false
|
||||
}));
|
||||
}}
|
||||
value={inputsValue.password}
|
||||
|
@ -31,7 +31,7 @@ export const PartnerTreaties = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Договора и отчетность", link: "/profile/treaties" },
|
||||
{ name: "Договора и отчетность", link: "/profile/treaties" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="treaties__title">Договора и отчетность</h2>
|
||||
|
@ -37,7 +37,7 @@ export const PartnerCategories = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: BackEndImg,
|
||||
img: BackEndImg
|
||||
},
|
||||
{
|
||||
title: "Frontend разработчики",
|
||||
@ -45,14 +45,14 @@ export const PartnerCategories = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: FrontendImg,
|
||||
img: FrontendImg
|
||||
},
|
||||
{
|
||||
title: "Архитектура проектов",
|
||||
link: "/profile/categories/employees",
|
||||
description: "Потоки данных ER ERP CRM CQRS UML BPMN",
|
||||
available: true,
|
||||
img: ArchitectureImg,
|
||||
img: ArchitectureImg
|
||||
},
|
||||
{
|
||||
title: "Дизайн проектов",
|
||||
@ -60,35 +60,35 @@ export const PartnerCategories = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: DesignImg,
|
||||
img: DesignImg
|
||||
},
|
||||
{
|
||||
title: "Тестирование проектов",
|
||||
link: "/profile/add-request",
|
||||
description: "SQL Postman TestRail Kibana Ручное тестирование",
|
||||
available: false,
|
||||
img: TestImg,
|
||||
img: TestImg
|
||||
},
|
||||
{
|
||||
title: "Администрирование проектов",
|
||||
link: "/profile/add-request",
|
||||
description: "DevOps ELK Kubernetes Docker Bash Apache Oracle Git",
|
||||
available: false,
|
||||
img: AdminImg,
|
||||
img: AdminImg
|
||||
},
|
||||
{
|
||||
title: "Управление проектом",
|
||||
link: "/profile/add-request",
|
||||
description: "Scrum Kanban Agile Miro CustDev",
|
||||
available: false,
|
||||
img: ManageImg,
|
||||
img: ManageImg
|
||||
},
|
||||
{
|
||||
title: "Копирайтинг проектов",
|
||||
link: "/profile/add-request",
|
||||
description: "Теги Заголовок H1 Дескриптор Абзац Сценарий",
|
||||
available: false,
|
||||
img: CopyImg,
|
||||
img: CopyImg
|
||||
},
|
||||
{
|
||||
title: "Реклама и SMM",
|
||||
@ -96,8 +96,8 @@ export const PartnerCategories = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: false,
|
||||
img: SmmImg,
|
||||
},
|
||||
img: SmmImg
|
||||
}
|
||||
]);
|
||||
|
||||
const [mokPersons] = useState([
|
||||
@ -109,7 +109,7 @@ export const PartnerCategories = () => {
|
||||
project: "Админка НВД Консалтинг",
|
||||
tasks_in_progress: 5,
|
||||
month_hours: 140,
|
||||
id: 1,
|
||||
id: 1
|
||||
},
|
||||
{
|
||||
personAvatar: avatarImg,
|
||||
@ -119,7 +119,7 @@ export const PartnerCategories = () => {
|
||||
project: "Админка НВД Консалтинг",
|
||||
tasks_in_progress: 5,
|
||||
month_hours: 140,
|
||||
id: 2,
|
||||
id: 2
|
||||
},
|
||||
{
|
||||
personAvatar: avatarImg,
|
||||
@ -129,8 +129,8 @@ export const PartnerCategories = () => {
|
||||
project: "Админка НВД Консалтинг",
|
||||
tasks_in_progress: 5,
|
||||
month_hours: 140,
|
||||
id: 3,
|
||||
},
|
||||
id: 3
|
||||
}
|
||||
]);
|
||||
return (
|
||||
<div className="partnerCategories">
|
||||
@ -140,7 +140,7 @@ export const PartnerCategories = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Данные моего персонала", link: "/profile/categories" },
|
||||
{ name: "Данные моего персонала", link: "/profile/categories" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="partnerCategories__title">Данные персонала</h2>
|
||||
|
@ -31,32 +31,32 @@ export const Profile = () => {
|
||||
path: "profile/calendar",
|
||||
img: reportsIcon,
|
||||
title: "Ваша отчетность",
|
||||
description: "<span></span>Отработанных в этом месяце часов",
|
||||
description: "<span></span>Отработанных в этом месяце часов"
|
||||
},
|
||||
{
|
||||
path: "profile/summary",
|
||||
img: summaryIcon,
|
||||
title: "Резюме",
|
||||
description: "Ваше резюме<br/><span>заполнено</span>",
|
||||
description: "Ваше резюме<br/><span>заполнено</span>"
|
||||
},
|
||||
{
|
||||
path: "profile/tracker",
|
||||
img: timerIcon,
|
||||
title: "Трекер времени",
|
||||
description: "Сколько времени занимает<br/> выполнение задач",
|
||||
description: "Сколько времени занимает<br/> выполнение задач"
|
||||
},
|
||||
{
|
||||
path: "profile/payouts",
|
||||
img: paymentIcon,
|
||||
title: "Выплаты",
|
||||
description: "У вас <span>подтвержден</span><br/> статус самозанятого",
|
||||
description: "У вас <span>подтвержден</span><br/> статус самозанятого"
|
||||
},
|
||||
{
|
||||
path: "profile/settings",
|
||||
img: settingIcon,
|
||||
title: "Настройки профиля",
|
||||
description: "Перейдите чтобы начать<br/> редактирование",
|
||||
},
|
||||
description: "Перейдите чтобы начать<br/> редактирование"
|
||||
}
|
||||
],
|
||||
partner: [
|
||||
{
|
||||
@ -64,33 +64,33 @@ export const Profile = () => {
|
||||
img: reportsIcon,
|
||||
title: "Запросы и открытые позиции",
|
||||
description:
|
||||
"<span>У вас 2 вакансии<br/></span>открытые от лица компании",
|
||||
"<span>У вас 2 вакансии<br/></span>открытые от лица компании"
|
||||
},
|
||||
{
|
||||
path: "profile/categories",
|
||||
img: summaryIcon,
|
||||
title: "Данные персонала",
|
||||
description: "Наши специалисты <br/><span>уже работающие у вас</span>",
|
||||
description: "Наши специалисты <br/><span>уже работающие у вас</span>"
|
||||
},
|
||||
{
|
||||
path: "profile/tracker",
|
||||
img: timerIcon,
|
||||
title: "Трекер времени",
|
||||
description: "Контроль времени и<br/> выполнение задач",
|
||||
description: "Контроль времени и<br/> выполнение задач"
|
||||
},
|
||||
{
|
||||
path: "profile/treaties",
|
||||
img: paymentIcon,
|
||||
title: "Договора и отчетность",
|
||||
description: "Ключевые условия<br/> договора",
|
||||
description: "Ключевые условия<br/> договора"
|
||||
},
|
||||
{
|
||||
path: "profile/settings",
|
||||
img: settingIcon,
|
||||
title: "Настройки профиля",
|
||||
description: "Перейдите чтобы начать<br/> редактирование",
|
||||
},
|
||||
],
|
||||
description: "Перейдите чтобы начать<br/> редактирование"
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
return (
|
||||
|
@ -20,14 +20,14 @@ export const ProfileCandidate = () => {
|
||||
path: "quiz",
|
||||
img: reportsIcon,
|
||||
title: "Мои тесты",
|
||||
description: "<span>У вас 122 часа<br/></span>отработанных в этом месяце",
|
||||
description: "<span>У вас 122 часа<br/></span>отработанных в этом месяце"
|
||||
},
|
||||
{
|
||||
path: "profile/settings",
|
||||
img: settingIcon,
|
||||
title: "Настройки профиля",
|
||||
description: "Перейдите чтобы начать редактирование",
|
||||
},
|
||||
description: "Перейдите чтобы начать редактирование"
|
||||
}
|
||||
]);
|
||||
return (
|
||||
<div className="profile-candidate">
|
||||
|
@ -20,7 +20,7 @@ import {
|
||||
setColumnName,
|
||||
setColumnPriority,
|
||||
setProjectBoardFetch,
|
||||
setToggleTab,
|
||||
setToggleTab
|
||||
} from "@redux/projectsTrackerSlice";
|
||||
|
||||
import { urlForLocal } from "@utils/helper";
|
||||
@ -73,7 +73,7 @@ export const ProjectTracker = () => {
|
||||
const [tags, setTags] = useState({
|
||||
open: false,
|
||||
add: false,
|
||||
edit: false,
|
||||
edit: false
|
||||
});
|
||||
const [acceptModalOpen, setAcceptModalOpen] = useState(false);
|
||||
const [currentColumnDelete, setCurrentColumnDelete] = useState(null);
|
||||
@ -93,13 +93,13 @@ export const ProjectTracker = () => {
|
||||
const priority = {
|
||||
2: "Высокий",
|
||||
1: "Средний",
|
||||
0: "Низкий",
|
||||
0: "Низкий"
|
||||
};
|
||||
|
||||
const priorityClass = {
|
||||
2: "high",
|
||||
1: "middle",
|
||||
0: "low",
|
||||
0: "low"
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
@ -117,7 +117,7 @@ export const ProjectTracker = () => {
|
||||
if (column.tasks.length) columnsTasksEmpty = false;
|
||||
setOpenColumnSelect((prevState) => ({
|
||||
...prevState,
|
||||
[column.id]: false,
|
||||
[column.id]: false
|
||||
}));
|
||||
columnHover[column.id] = false;
|
||||
column.tasks.forEach((task) => (tasksHover[task.id] = false));
|
||||
@ -154,7 +154,7 @@ export const ProjectTracker = () => {
|
||||
function dragEndTaskHandler() {
|
||||
setTaskHover((prevState) => ({ [prevState]: false }));
|
||||
setWrapperHover((prevState) => ({
|
||||
[prevState]: false,
|
||||
[prevState]: false
|
||||
}));
|
||||
}
|
||||
|
||||
@ -168,7 +168,7 @@ export const ProjectTracker = () => {
|
||||
movePositionProjectTask({
|
||||
startTask: startWrapperIndexTest.current.task,
|
||||
finishTask: task,
|
||||
finishIndex: finishTask,
|
||||
finishIndex: finishTask
|
||||
})
|
||||
);
|
||||
}
|
||||
@ -184,7 +184,7 @@ export const ProjectTracker = () => {
|
||||
|
||||
setWrapperHover((prevState) => ({
|
||||
[prevState]: false,
|
||||
[columnId]: true,
|
||||
[columnId]: true
|
||||
}));
|
||||
}
|
||||
|
||||
@ -192,7 +192,7 @@ export const ProjectTracker = () => {
|
||||
e.preventDefault();
|
||||
|
||||
setWrapperHover((prevState) => ({
|
||||
[prevState]: false,
|
||||
[prevState]: false
|
||||
}));
|
||||
|
||||
if (
|
||||
@ -206,7 +206,7 @@ export const ProjectTracker = () => {
|
||||
dispatch(
|
||||
moveProjectTask({
|
||||
startWrapperIndex: startWrapperIndexTest.current,
|
||||
columnId,
|
||||
columnId
|
||||
})
|
||||
);
|
||||
}
|
||||
@ -234,14 +234,14 @@ export const ProjectTracker = () => {
|
||||
data: {
|
||||
column_id: column.id,
|
||||
project_id: projectBoard.id,
|
||||
status: 0,
|
||||
},
|
||||
status: 0
|
||||
}
|
||||
}).then(() => {
|
||||
if (column.priority < projectBoard.columns.length) {
|
||||
for (let i = column.priority; i < projectBoard.columns.length; i++) {
|
||||
const currentColumn = {
|
||||
column_id: projectBoard.columns[i].id,
|
||||
priority: i,
|
||||
priority: i
|
||||
};
|
||||
priorityColumns.push(currentColumn);
|
||||
}
|
||||
@ -249,8 +249,8 @@ export const ProjectTracker = () => {
|
||||
method: "POST",
|
||||
data: {
|
||||
project_id: projectBoard.id,
|
||||
data: JSON.stringify(priorityColumns),
|
||||
},
|
||||
data: JSON.stringify(priorityColumns)
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(setProjectBoardFetch(projectBoard.id));
|
||||
});
|
||||
@ -266,8 +266,8 @@ export const ProjectTracker = () => {
|
||||
method: "DELETE",
|
||||
data: {
|
||||
project_id: projectBoard.id,
|
||||
user_id: userId,
|
||||
},
|
||||
user_id: userId
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(deletePersonOnProject(userId));
|
||||
});
|
||||
@ -316,21 +316,21 @@ export const ProjectTracker = () => {
|
||||
title: tagInfo.description,
|
||||
slug: tagInfo.name,
|
||||
color: color,
|
||||
status: 1,
|
||||
},
|
||||
status: 1
|
||||
}
|
||||
}).then((data) => {
|
||||
apiRequest("/mark/attach", {
|
||||
method: "POST",
|
||||
data: {
|
||||
mark_id: data.id,
|
||||
entity_type: 1,
|
||||
entity_id: projectId.id,
|
||||
},
|
||||
entity_id: projectId.id
|
||||
}
|
||||
}).then((data) => {
|
||||
dispatch(addNewTagToProject(data.mark));
|
||||
setTags((prevState) => ({
|
||||
...prevState,
|
||||
add: false,
|
||||
add: false
|
||||
}));
|
||||
});
|
||||
});
|
||||
@ -343,13 +343,13 @@ export const ProjectTracker = () => {
|
||||
mark_id: tagInfo.editMarkId,
|
||||
title: tagInfo.description,
|
||||
slug: tagInfo.name,
|
||||
color: color,
|
||||
},
|
||||
color: color
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(setProjectBoardFetch(projectId.id));
|
||||
setTags((prevState) => ({
|
||||
...prevState,
|
||||
edit: false,
|
||||
edit: false
|
||||
}));
|
||||
setTagInfo({ description: "", name: "" });
|
||||
setColor("#aabbcc");
|
||||
@ -362,8 +362,8 @@ export const ProjectTracker = () => {
|
||||
data: {
|
||||
mark_id: tagId,
|
||||
entity_type: 1,
|
||||
entity_id: projectId.id,
|
||||
},
|
||||
entity_id: projectId.id
|
||||
}
|
||||
}).then(() => {
|
||||
dispatch(deleteTagProject(tagId));
|
||||
});
|
||||
@ -412,11 +412,11 @@ export const ProjectTracker = () => {
|
||||
setTags({
|
||||
open: false,
|
||||
add: false,
|
||||
edit: false,
|
||||
edit: false
|
||||
});
|
||||
setTagInfo({
|
||||
description: "",
|
||||
name: "",
|
||||
name: ""
|
||||
});
|
||||
setColor("#aabbcc");
|
||||
}
|
||||
@ -453,7 +453,7 @@ export const ProjectTracker = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Трекер", link: "/profile/tracker" },
|
||||
{ name: "Трекер", link: "/profile/tracker" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="tracker__title">Управление проектами с трекером</h2>
|
||||
@ -705,7 +705,7 @@ export const ProjectTracker = () => {
|
||||
onClick={() => {
|
||||
setTags((prevState) => ({
|
||||
...prevState,
|
||||
open: !tags.open,
|
||||
open: !tags.open
|
||||
}));
|
||||
}}
|
||||
>
|
||||
@ -719,7 +719,7 @@ export const ProjectTracker = () => {
|
||||
onClick={() =>
|
||||
setTags((prevState) => ({
|
||||
...prevState,
|
||||
add: true,
|
||||
add: true
|
||||
}))
|
||||
}
|
||||
>
|
||||
@ -751,12 +751,12 @@ export const ProjectTracker = () => {
|
||||
onClick={() => {
|
||||
setTags((prevState) => ({
|
||||
...prevState,
|
||||
edit: true,
|
||||
edit: true
|
||||
}));
|
||||
setTagInfo({
|
||||
description: tag.title,
|
||||
name: tag.slug,
|
||||
editMarkId: tag.id,
|
||||
editMarkId: tag.id
|
||||
});
|
||||
setColor(tag.color);
|
||||
}}
|
||||
@ -784,11 +784,11 @@ export const ProjectTracker = () => {
|
||||
setTags((prevState) => ({
|
||||
...prevState,
|
||||
add: false,
|
||||
edit: false,
|
||||
edit: false
|
||||
}));
|
||||
setTagInfo({
|
||||
description: "",
|
||||
name: "",
|
||||
name: ""
|
||||
});
|
||||
setColor("#aabbcc");
|
||||
}}
|
||||
@ -801,7 +801,7 @@ export const ProjectTracker = () => {
|
||||
onChange={(e) =>
|
||||
setTagInfo((prevState) => ({
|
||||
...prevState,
|
||||
description: e.target.value,
|
||||
description: e.target.value
|
||||
}))
|
||||
}
|
||||
/>
|
||||
@ -813,7 +813,7 @@ export const ProjectTracker = () => {
|
||||
onChange={(e) =>
|
||||
setTagInfo((prevState) => ({
|
||||
...prevState,
|
||||
name: e.target.value,
|
||||
name: e.target.value
|
||||
}))
|
||||
}
|
||||
/>
|
||||
@ -890,7 +890,7 @@ export const ProjectTracker = () => {
|
||||
onClick={() => {
|
||||
setOpenColumnSelect((prevState) => ({
|
||||
...prevState,
|
||||
[column.id]: true,
|
||||
[column.id]: true
|
||||
}));
|
||||
}}
|
||||
className="more"
|
||||
@ -906,7 +906,7 @@ export const ProjectTracker = () => {
|
||||
onClick={() => {
|
||||
setOpenColumnSelect((prevState) => ({
|
||||
...prevState,
|
||||
[column.id]: false,
|
||||
[column.id]: false
|
||||
}));
|
||||
dispatch(modalToggle("editColumn"));
|
||||
dispatch(setColumnName(column.title));
|
||||
@ -970,7 +970,7 @@ export const ProjectTracker = () => {
|
||||
</div>
|
||||
<p
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: task.description,
|
||||
__html: task.description
|
||||
}}
|
||||
className="tasks__board__item__description"
|
||||
></p>
|
||||
|
@ -15,13 +15,13 @@ const tasks = [
|
||||
{
|
||||
index: 1,
|
||||
text: "Задача «67 – Навигационная система – Главное меню – Обновить иконки» заблокирована из-за отсутствия новых иконок",
|
||||
hours: 3,
|
||||
hours: 3
|
||||
},
|
||||
{
|
||||
index: 2,
|
||||
text: "Задача «83 – Навигационная система – Поиск по почтовому индексу – Добавить экран поиска по почтовому индексу» не может быть завершена, т.к. работа над задачей «82 – Навигационная система – Разработать модуль поиска по почтовому индексу» ещё не начата",
|
||||
hours: 3,
|
||||
},
|
||||
hours: 3
|
||||
}
|
||||
];
|
||||
|
||||
const SingleReportPage = () => {
|
||||
|
@ -29,29 +29,29 @@ const Statistics = () => {
|
||||
name: "Дмитрий Рогов",
|
||||
email: "dmitryi.zavadskyi@yandex.ru",
|
||||
role: "Программист",
|
||||
status: true,
|
||||
status: true
|
||||
},
|
||||
{
|
||||
avatar: mockAvatar,
|
||||
name: "Марина Орехова",
|
||||
email: "dmitryi.zavadskyi@yandex.ru",
|
||||
role: "Менеджер",
|
||||
status: true,
|
||||
status: true
|
||||
},
|
||||
{
|
||||
avatar: mockAvatar,
|
||||
name: "Тамара Доценко",
|
||||
email: "dmitryi.zavadskyi@yandex.ru51515188151",
|
||||
role: "Тестировщик",
|
||||
status: false,
|
||||
status: false
|
||||
},
|
||||
{
|
||||
avatar: mockAvatar,
|
||||
name: "Кек Лолов",
|
||||
email: "dm4124gmail.com",
|
||||
role: "PM",
|
||||
status: false,
|
||||
},
|
||||
status: false
|
||||
}
|
||||
];
|
||||
|
||||
const toggleTabs = (index) => {
|
||||
@ -66,7 +66,7 @@ const Statistics = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Трекер", link: "/profile/tracker" },
|
||||
{ name: "Трекер", link: "/profile/tracker" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="tracker__title">Управление проектами с трекером</h2>
|
||||
|
@ -60,9 +60,9 @@ export const Summary = () => {
|
||||
method: "PUT",
|
||||
data: {
|
||||
UserCard: {
|
||||
skill: selectedSkills.map((item) => item.skill_id),
|
||||
},
|
||||
},
|
||||
skill: selectedSkills.map((item) => item.skill_id)
|
||||
}
|
||||
}
|
||||
}).then(() => {});
|
||||
}
|
||||
|
||||
@ -70,8 +70,8 @@ export const Summary = () => {
|
||||
apiRequest("/resume/edit-text", {
|
||||
method: "PUT",
|
||||
data: {
|
||||
resume: summery,
|
||||
},
|
||||
resume: summery
|
||||
}
|
||||
}).then(() => {});
|
||||
}
|
||||
return (
|
||||
@ -83,7 +83,7 @@ export const Summary = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Резюме", link: "/profile/summary" },
|
||||
{ name: "Резюме", link: "/profile/summary" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="summary__title">
|
||||
@ -175,7 +175,7 @@ export const Summary = () => {
|
||||
onClick={() =>
|
||||
setSelectedSkills((prevValue) => [
|
||||
...prevValue,
|
||||
{ skill: skill, skill_id: skill.id },
|
||||
{ skill: skill, skill_id: skill.id }
|
||||
])
|
||||
}
|
||||
key={skill.id}
|
||||
@ -235,8 +235,8 @@ export const Summary = () => {
|
||||
"ImageToolbar",
|
||||
"ImageUpload",
|
||||
"MediaEmbed",
|
||||
"BlockQuote",
|
||||
],
|
||||
"BlockQuote"
|
||||
]
|
||||
}}
|
||||
onChange={(event, editor) => {
|
||||
const data = editor.getData();
|
||||
|
@ -6,7 +6,7 @@ import {
|
||||
getToggleTab,
|
||||
modalToggle,
|
||||
setAllProjects,
|
||||
setToggleTab,
|
||||
setToggleTab
|
||||
} from "@redux/projectsTrackerSlice";
|
||||
|
||||
import { caseOfNum } from "@utils/helper";
|
||||
@ -134,7 +134,7 @@ export const Tracker = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Трекер", link: "/profile/tracker" },
|
||||
{ name: "Трекер", link: "/profile/tracker" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="tracker__title">Управление проектами с трекером</h2>
|
||||
|
@ -6,7 +6,7 @@ import { apiRequest } from "@api/request";
|
||||
import {
|
||||
getCorrectDate,
|
||||
getCreatedDate,
|
||||
hourOfNum,
|
||||
hourOfNum
|
||||
} from "@components/Calendar/calendarHelper";
|
||||
import { Footer } from "@components/Common/Footer/Footer";
|
||||
import { Loader } from "@components/Common/Loader/Loader";
|
||||
@ -57,7 +57,7 @@ export const ViewReport = () => {
|
||||
const taskInfo = {
|
||||
hours: task.hours_spent,
|
||||
task: task.task,
|
||||
id: task.id,
|
||||
id: task.id
|
||||
};
|
||||
if (task.hours_spent) {
|
||||
spendTime += Number(task.hours_spent);
|
||||
@ -96,7 +96,7 @@ export const ViewReport = () => {
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile" },
|
||||
{ name: "Ваша отчетность", link: "/profile/calendar" },
|
||||
{ name: "Просмотр отчета за день", link: "/profile/view" },
|
||||
{ name: "Просмотр отчета за день", link: "/profile/view" }
|
||||
]}
|
||||
/>
|
||||
<h2 className="viewReport__title">
|
||||
|
@ -27,7 +27,7 @@ export const PassingTests = () => {
|
||||
autoStart: false,
|
||||
onExpire: () => {
|
||||
navigate("/quiz");
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
const onCloseWindow = (e) => {
|
||||
@ -43,18 +43,18 @@ export const PassingTests = () => {
|
||||
{
|
||||
title: "Зачем?",
|
||||
description:
|
||||
"Тесты itguild предназначены для того, чтобы подтверждать навыки, которые вы указали у себя.",
|
||||
"Тесты itguild предназначены для того, чтобы подтверждать навыки, которые вы указали у себя."
|
||||
},
|
||||
{
|
||||
title: "Почему именно тестирование?",
|
||||
description:
|
||||
"Тесты itguild заменяют первое техническое собеседование по любой вакансии.",
|
||||
"Тесты itguild заменяют первое техническое собеседование по любой вакансии."
|
||||
},
|
||||
{
|
||||
title: "Какие тесты нужно проходить?",
|
||||
description:
|
||||
"Здесь все довольно просто — следует проходить тесты по инструментам и навыкам, которыми вы владеете.",
|
||||
},
|
||||
"Здесь все довольно просто — следует проходить тесты по инструментам и навыкам, которыми вы владеете."
|
||||
}
|
||||
];
|
||||
|
||||
function onSwitchTab(e) {
|
||||
@ -86,7 +86,7 @@ export const PassingTests = () => {
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile-candidate" },
|
||||
{ name: "Тестирование", link: "/quiz" },
|
||||
{ name: "Прохождение тестов", link: "/quiz/test" },
|
||||
{ name: "Прохождение тестов", link: "/quiz/test" }
|
||||
]}
|
||||
/>
|
||||
<div className="passing-tests-page__title main-title">
|
||||
|
@ -36,7 +36,7 @@ export const QuizPage = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: BackEndImg,
|
||||
img: BackEndImg
|
||||
},
|
||||
{
|
||||
title: "Frontend разработчики",
|
||||
@ -44,14 +44,14 @@ export const QuizPage = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: FrontendImg,
|
||||
img: FrontendImg
|
||||
},
|
||||
{
|
||||
title: "Архитектура проектов",
|
||||
link: "/registration-candidate",
|
||||
description: "Потоки данных ER ERP CRM CQRS UML BPMN",
|
||||
available: true,
|
||||
img: ArchitectureImg,
|
||||
img: ArchitectureImg
|
||||
},
|
||||
{
|
||||
title: "Дизайн проектов",
|
||||
@ -59,35 +59,35 @@ export const QuizPage = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: true,
|
||||
img: DesignImg,
|
||||
img: DesignImg
|
||||
},
|
||||
{
|
||||
title: "Тестирование проектов",
|
||||
link: "/registration-candidate",
|
||||
description: "SQL Postman TestRail Kibana Ручное тестирование",
|
||||
available: false,
|
||||
img: TestImg,
|
||||
img: TestImg
|
||||
},
|
||||
{
|
||||
title: "Администрирование проектов",
|
||||
link: "/registration-candidate",
|
||||
description: "DevOps ELK Kubernetes Docker Bash Apache Oracle Git",
|
||||
available: false,
|
||||
img: AdminImg,
|
||||
img: AdminImg
|
||||
},
|
||||
{
|
||||
title: "Управление проектом",
|
||||
link: "/registration-candidate",
|
||||
description: "Scrum Kanban Agile Miro CustDev",
|
||||
available: false,
|
||||
img: ManageImg,
|
||||
img: ManageImg
|
||||
},
|
||||
{
|
||||
title: "Копирайтинг проектов",
|
||||
link: "/registration-candidate",
|
||||
description: "Теги Заголовок H1 Дескриптор Абзац Сценарий",
|
||||
available: false,
|
||||
img: CopyImg,
|
||||
img: CopyImg
|
||||
},
|
||||
{
|
||||
title: "Реклама и SMM",
|
||||
@ -95,8 +95,8 @@ export const QuizPage = () => {
|
||||
description:
|
||||
"Java PHP Python C# React Vue.js NodeJs Golang Ruby JavaScript",
|
||||
available: false,
|
||||
img: SmmImg,
|
||||
},
|
||||
img: SmmImg
|
||||
}
|
||||
]);
|
||||
const userId = localStorage.getItem("id");
|
||||
const [selectedCategory, setSetSelectedCategory] = useState(false);
|
||||
@ -116,7 +116,7 @@ export const QuizPage = () => {
|
||||
<ProfileBreadcrumbs
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile-candidate" },
|
||||
{ name: "Тестирование", link: "/quiz" },
|
||||
{ name: "Тестирование", link: "/quiz" }
|
||||
]}
|
||||
/>
|
||||
<div className="quiz-page__title main-title">
|
||||
|
@ -43,7 +43,7 @@ export const QuizReportPage = () => {
|
||||
links={[
|
||||
{ name: "Главная", link: "/profile-candidate" },
|
||||
{ name: "Тестирование", link: "/quiz" },
|
||||
{ name: "Отчет по тестированию", link: "/quiz/report" },
|
||||
{ name: "Отчет по тестированию", link: "/quiz/report" }
|
||||
]}
|
||||
/>
|
||||
<div className="quiz-report-page__title main-title">
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { createSlice } from "@reduxjs/toolkit";
|
||||
|
||||
const initialState = {
|
||||
isLoading: false,
|
||||
isLoading: false
|
||||
};
|
||||
|
||||
export const loaderSlice = createSlice({
|
||||
@ -10,8 +10,8 @@ export const loaderSlice = createSlice({
|
||||
reducers: {
|
||||
loading: (state, action) => {
|
||||
state.isLoading = action.payload;
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export const { loading } = loaderSlice.actions;
|
||||
|
@ -17,8 +17,8 @@ const initialState = {
|
||||
notification: {
|
||||
show: false,
|
||||
text: "",
|
||||
type: "",
|
||||
},
|
||||
type: ""
|
||||
}
|
||||
};
|
||||
|
||||
export const outstaffingSlice = createSlice({
|
||||
@ -72,8 +72,8 @@ export const outstaffingSlice = createSlice({
|
||||
},
|
||||
closeNotification: (state) => {
|
||||
state.notification.show = false;
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export const {
|
||||
@ -92,7 +92,7 @@ export const {
|
||||
setPartnerRequests,
|
||||
setPartnerRequestInfo,
|
||||
setNotification,
|
||||
closeNotification,
|
||||
closeNotification
|
||||
} = outstaffingSlice.actions;
|
||||
|
||||
export const selectProfiles = (state) => state.outstaffing.profiles;
|
||||
|
@ -10,7 +10,7 @@ const initialState = {
|
||||
boardLoader: false,
|
||||
columnName: "",
|
||||
columnId: 0,
|
||||
columnPriority: 0,
|
||||
columnPriority: 0
|
||||
};
|
||||
|
||||
export const setProjectBoardFetch = createAsyncThunk("userInfo", (id) =>
|
||||
@ -61,15 +61,15 @@ export const projectsTrackerSlice = createSlice({
|
||||
if (column.id === action.payload.columnId) {
|
||||
column.tasks.push({
|
||||
...action.payload.startWrapperIndex.task,
|
||||
column_id: column.id,
|
||||
column_id: column.id
|
||||
});
|
||||
apiRequest(`/task/update-task`, {
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: action.payload.startWrapperIndex.task.id,
|
||||
column_id: column.id,
|
||||
priority: column.tasks.length - 1,
|
||||
},
|
||||
priority: column.tasks.length - 1
|
||||
}
|
||||
}).then(() => {});
|
||||
}
|
||||
if (column.id === action.payload.startWrapperIndex.index) {
|
||||
@ -89,20 +89,20 @@ export const projectsTrackerSlice = createSlice({
|
||||
if (column.id === action.payload.finishTask.column_id) {
|
||||
column.tasks.splice(action.payload.finishIndex, 0, {
|
||||
...action.payload.startTask,
|
||||
column_id: column.id,
|
||||
column_id: column.id
|
||||
});
|
||||
apiRequest(`/task/update-task`, {
|
||||
method: "PUT",
|
||||
data: {
|
||||
task_id: action.payload.startTask.id,
|
||||
column_id: column.id,
|
||||
},
|
||||
column_id: column.id
|
||||
}
|
||||
}).then(() => {});
|
||||
const priorityTasks = [];
|
||||
column.tasks.forEach((task, index) => {
|
||||
const curTask = {
|
||||
task_id: task.id,
|
||||
priority: index,
|
||||
priority: index
|
||||
};
|
||||
priorityTasks.push(curTask);
|
||||
});
|
||||
@ -110,8 +110,8 @@ export const projectsTrackerSlice = createSlice({
|
||||
method: "POST",
|
||||
data: {
|
||||
data: JSON.stringify(priorityTasks),
|
||||
column_id: column.id,
|
||||
},
|
||||
column_id: column.id
|
||||
}
|
||||
}).then(() => {});
|
||||
}
|
||||
});
|
||||
@ -162,14 +162,14 @@ export const projectsTrackerSlice = createSlice({
|
||||
},
|
||||
modalToggle: (state, action) => {
|
||||
state.modalType = action.payload;
|
||||
},
|
||||
}
|
||||
},
|
||||
extraReducers: {
|
||||
[setProjectBoardFetch.fulfilled]: (state, action) => {
|
||||
state.projectBoard = action.payload;
|
||||
state.boardLoader = false;
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export const {
|
||||
@ -192,7 +192,7 @@ export const {
|
||||
filterCreatedByMe,
|
||||
filteredParticipateTasks,
|
||||
filteredExecutorTasks,
|
||||
movePositionProjectTask,
|
||||
movePositionProjectTask
|
||||
} = projectsTrackerSlice.actions;
|
||||
|
||||
export const getProjects = (state) => state.tracker.projects;
|
||||
|
@ -8,7 +8,7 @@ const initialState = {
|
||||
questionnaires: [],
|
||||
completedTest: false,
|
||||
selectedTest: {},
|
||||
result: null,
|
||||
result: null
|
||||
};
|
||||
|
||||
export const fetchResultTest = createAsyncThunk("result", (uuid) =>
|
||||
@ -26,13 +26,13 @@ export const quizSlice = createSlice({
|
||||
},
|
||||
setCompleteTest: (state) => {
|
||||
state.completedTest = true;
|
||||
},
|
||||
}
|
||||
},
|
||||
extraReducers: {
|
||||
[fetchResultTest.fulfilled]: (state, action) => {
|
||||
state.result = action.payload;
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export const { setQuestions } = quizSlice.actions;
|
||||
|
@ -4,7 +4,7 @@ const initialState = {
|
||||
dateSelected: "",
|
||||
reportDate: "",
|
||||
requestDates: "",
|
||||
sendRequest: "",
|
||||
sendRequest: ""
|
||||
};
|
||||
|
||||
export const reportSlice = createSlice({
|
||||
@ -22,8 +22,8 @@ export const reportSlice = createSlice({
|
||||
},
|
||||
setSendRequest: (state, action) => {
|
||||
state.sendRequest = action.payload;
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export const { dateSelected, setReportDate, setRequestDate, setSendRequest } =
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { createSlice } from "@reduxjs/toolkit";
|
||||
|
||||
const initialState = {
|
||||
role: null,
|
||||
role: null
|
||||
};
|
||||
|
||||
export const roleSlice = createSlice({
|
||||
@ -10,8 +10,8 @@ export const roleSlice = createSlice({
|
||||
reducers: {
|
||||
setRole: (state, action) => {
|
||||
state.role = action.payload;
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export const { setRole } = roleSlice.actions;
|
||||
|
@ -14,10 +14,10 @@ export const store = configureStore({
|
||||
role: roleReducer,
|
||||
report: reportReducer,
|
||||
tracker: projectsTrackerSlice,
|
||||
quiz: quizSlice,
|
||||
quiz: quizSlice
|
||||
},
|
||||
middleware: (getDefaultMiddleware) =>
|
||||
getDefaultMiddleware({
|
||||
serializableCheck: false,
|
||||
}),
|
||||
serializableCheck: false
|
||||
})
|
||||
});
|
||||
|
@ -2,7 +2,7 @@ export const LEVELS = {
|
||||
1: "Junior",
|
||||
2: "Middle",
|
||||
3: "Middle+",
|
||||
4: "Senior",
|
||||
4: "Senior"
|
||||
};
|
||||
|
||||
export const SKILLS = {
|
||||
@ -11,5 +11,5 @@ export const SKILLS = {
|
||||
3: "Маркетолог",
|
||||
4: "Smm - специалист",
|
||||
5: "Дизайнер",
|
||||
6: "Копирайтер",
|
||||
6: "Копирайтер"
|
||||
};
|
||||
|
@ -50,7 +50,7 @@ export const backendImg = (url) => `https://back.itguild.info${url}`;
|
||||
export function scrollToForm() {
|
||||
window.scrollTo({
|
||||
top: 850,
|
||||
behavior: "smooth",
|
||||
behavior: "smooth"
|
||||
});
|
||||
}
|
||||
|
||||
@ -77,7 +77,7 @@ export function caseOfNum(number, type) {
|
||||
files: ["файл", "файла", "файлов"],
|
||||
persons: ["участник", "участника", "участников"],
|
||||
tasks: ["задача", "задачи", "задач"],
|
||||
projects: ["проект", "проекта", "проектов"],
|
||||
projects: ["проект", "проекта", "проектов"]
|
||||
};
|
||||
const cases = [2, 0, 1, 1, 1, 2];
|
||||
return allTypes[type][
|
||||
|
Loading…
Reference in New Issue
Block a user