diff --git a/src/components/Modal/Tracker/ModalTicket/ModalTicket.jsx b/src/components/Modal/Tracker/ModalTicket/ModalTicket.jsx
index f2d14230..640f6d46 100644
--- a/src/components/Modal/Tracker/ModalTicket/ModalTicket.jsx
+++ b/src/components/Modal/Tracker/ModalTicket/ModalTicket.jsx
@@ -7,7 +7,7 @@ import { Link } from "react-router-dom";
import { getProfileInfo } from "@redux/outstaffingSlice";
import { setProjectBoardFetch } from "@redux/projectsTrackerSlice";
-import { getCorrectRequestDate, urlForLocal } from "@utils/helper";
+import { caseOfNum, getCorrectRequestDate, urlForLocal } from "@utils/helper";
import { apiRequest } from "@api/request";
@@ -429,7 +429,7 @@ export const ModalTiсket = ({
Загрузить файл
{0}
- Файлов
+ {caseOfNum(0, "files")}
diff --git a/src/components/Modal/Tracker/ModalTicket/modalTicket.scss b/src/components/Modal/Tracker/ModalTicket/modalTicket.scss
index 9a1e24ca..a5f8c70b 100644
--- a/src/components/Modal/Tracker/ModalTicket/modalTicket.scss
+++ b/src/components/Modal/Tracker/ModalTicket/modalTicket.scss
@@ -78,8 +78,22 @@
font-style: normal;
font-size: 16px;
line-height: 24px;
- max-width: 340px;
+ padding: 5px;
outline: none;
+ border-radius: 8px;
+ border: 1px solid rgb(204, 206, 209);
+ }
+
+ .ck-toolbar {
+ border-radius: 8px 8px 0 0 !important;
+ }
+
+ .ck-content {
+ font-size: 14px;
+ min-height: 100px;
+ border: 1px solid rgb(204, 206, 209) !important;
+ border-radius: 0 0 8px 8px !important;
+ box-shadow: none !important;
}
button {
@@ -228,7 +242,7 @@
margin-left: 34px;
text-decoration-line: underline;
font-weight: 400;
- font-size: 10px;
+ font-size: 11px;
line-height: 32px;
cursor: pointer;
@@ -381,9 +395,9 @@
margin-right: 18px;
}
- &:focus-within {
- border: 1px solid #0000004d;
- }
+ //&:focus-within {
+ // border: 1px solid #0000004d;
+ //}
}
}
@@ -467,6 +481,11 @@
border: none;
color: white;
font-size: 17px;
+ transition: all 0.3s ease;
+
+ &:hover {
+ background: #6cc933;
+ }
}
}
@@ -479,6 +498,11 @@
color: white;
background: #1458dd;
border-radius: 44px;
+ transition: all 0.15s ease;
+
+ &:hover {
+ background: #0255ff;
+ }
img {
margin-left: 10px;
@@ -499,6 +523,11 @@
color: white;
background: red;
border-radius: 44px;
+ transition: all 0.3s ease;
+
+ &:hover {
+ background: #f5693d;
+ }
}
.time {
diff --git a/src/components/Modal/Tracker/TicketFullScreen/TicketFullScreen.jsx b/src/components/Modal/Tracker/TicketFullScreen/TicketFullScreen.jsx
index a5e264f4..5337973d 100644
--- a/src/components/Modal/Tracker/TicketFullScreen/TicketFullScreen.jsx
+++ b/src/components/Modal/Tracker/TicketFullScreen/TicketFullScreen.jsx
@@ -8,11 +8,10 @@ import {
deletePersonOnProject,
getBoarderLoader,
modalToggle,
- setProjectBoardFetch,
setToggleTab,
} from "@redux/projectsTrackerSlice";
-import { getCorrectRequestDate, urlForLocal } from "@utils/helper";
+import { caseOfNum, getCorrectRequestDate, urlForLocal } from "@utils/helper";
import { apiRequest } from "@api/request";
@@ -586,7 +585,7 @@ export const TicketFullScreen = () => {
Загрузить файл
{0}
- Файлов
+ {caseOfNum(0, "files")}
diff --git a/src/components/Modal/Tracker/TrackerModal/trackerModal.scss b/src/components/Modal/Tracker/TrackerModal/trackerModal.scss
index 5c28876f..e5928691 100644
--- a/src/components/Modal/Tracker/TrackerModal/trackerModal.scss
+++ b/src/components/Modal/Tracker/TrackerModal/trackerModal.scss
@@ -94,6 +94,22 @@
max-width: 320px;
}
+ .ck-editor__editable.ck-rounded-corners {
+ min-height: 100px;
+ font-size: 14px;
+ }
+
+ .ck-toolbar {
+ border: none !important;
+ border-radius: 8px 8px 0 0 !important;
+ }
+
+ .ck-content {
+ border: none !important;
+ border-radius: 0 0 8px 8px !important;
+ box-shadow: none !important;
+ }
+
.select__executor {
width: 320px;
background: white;
@@ -229,6 +245,12 @@
.worker {
display: flex;
justify-content: space-between;
+
+ &:hover {
+ p {
+ font-weight: 500;
+ }
+ }
}
}
}
diff --git a/src/components/ReportForm/reportForm.scss b/src/components/ReportForm/reportForm.scss
index e9e88658..f27547d0 100644
--- a/src/components/ReportForm/reportForm.scss
+++ b/src/components/ReportForm/reportForm.scss
@@ -99,6 +99,8 @@
cursor: pointer;
img {
+ width: 20px;
+ height: 20px;
margin-left: 20px;
margin-right: 20px;
}
diff --git a/src/components/TrackerTaskComment/TrackerTaskComment.jsx b/src/components/TrackerTaskComment/TrackerTaskComment.jsx
index b7227a88..e729914e 100644
--- a/src/components/TrackerTaskComment/TrackerTaskComment.jsx
+++ b/src/components/TrackerTaskComment/TrackerTaskComment.jsx
@@ -12,6 +12,7 @@ import TrackerTaskSubComment from "@components/TrackerTaskComment/TrackerTaskCom
import del from "assets/icons/delete.svg";
import edit from "assets/icons/edit.svg";
import accept from "assets/images/accept.png";
+import avatarMok from "assets/images/avatarMok.png";
export const TrackerTaskComment = ({
taskId,
@@ -84,7 +85,14 @@ export const TrackerTaskComment = ({
>
-
+
{comment.user.fio}
diff --git a/src/pages/ProjectTracker/ProjectTracker.js b/src/pages/ProjectTracker/ProjectTracker.js
index 134ff358..768a4f30 100644
--- a/src/pages/ProjectTracker/ProjectTracker.js
+++ b/src/pages/ProjectTracker/ProjectTracker.js
@@ -6,6 +6,7 @@ import {
activeLoader,
deletePersonOnProject,
filterCreatedByMe,
+ filteredExecutorTasks,
filteredParticipateTasks,
getBoarderLoader,
getProjectBoard,
@@ -20,6 +21,7 @@ import {
} from "@redux/projectsTrackerSlice";
import { urlForLocal } from "@utils/helper";
+import { caseOfNum } from "@utils/helper";
import { apiRequest } from "@api/request";
@@ -28,13 +30,13 @@ import { Footer } from "@components/Common/Footer/Footer";
import { Loader } from "@components/Common/Loader/Loader";
import ModalTicket from "@components/Modal/Tracker/ModalTicket/ModalTicket";
import TrackerModal from "@components/Modal/Tracker/TrackerModal/TrackerModal";
-// import TrackerModal from "@components/Modal/TrackerModal/TrackerModal";
import { Navigation } from "@components/Navigation/Navigation";
import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs";
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
import archive from "assets/icons/archiveTracker.svg";
import arrow from "assets/icons/arrows/arrowCalendar.png";
+import arrowDown from "assets/icons/arrows/selectArrow.png";
import close from "assets/icons/close.png";
import commentsBoard from "assets/icons/commentsBoard.svg";
import del from "assets/icons/delete.svg";
@@ -61,6 +63,8 @@ export const ProjectTracker = () => {
const [checkBoxParticipateTasks, setCheckBoxParticipateTasks] =
useState(false);
const [checkBoxMyTasks, setCheckBoxMyTasks] = useState(false);
+ const [selectedExecutor, setSelectedExecutor] = useState(null);
+ const [selectExecutorOpen, setSelectedExecutorOpen] = useState(false);
const startWrapperIndexTest = useRef({});
const projectBoard = useSelector(getProjectBoard);
const loader = useSelector(getBoarderLoader);
@@ -228,6 +232,7 @@ export const ProjectTracker = () => {
dispatch(setProjectBoardFetch(projectId.id));
setCheckBoxParticipateTasks(false);
setCheckBoxMyTasks(false);
+ setSelectedExecutor(null);
}
setCheckBoxParticipateTasks(!checkBoxParticipateTasks);
}
@@ -239,10 +244,23 @@ export const ProjectTracker = () => {
dispatch(setProjectBoardFetch(projectId.id));
setCheckBoxParticipateTasks(false);
setCheckBoxMyTasks(false);
+ setSelectedExecutor(null);
}
setCheckBoxMyTasks(!checkBoxMyTasks);
}
+ function executorFilter(user) {
+ dispatch(filteredExecutorTasks(user.user_id));
+ setSelectedExecutor(user);
+ }
+
+ function deleteSelectedExecutorFilter() {
+ setSelectedExecutor(null);
+ setCheckBoxParticipateTasks(false);
+ setCheckBoxMyTasks(false);
+ dispatch(setProjectBoardFetch(projectId.id));
+ }
+
return (
@@ -423,6 +441,63 @@ export const ProjectTracker = () => {
{checkBoxMyTasks &&
}
+ {selectedExecutor ? (
+
+
{selectedExecutor.user.fio}
+
+
+
+ ) : (
+
+ setSelectedExecutorOpen(!selectExecutorOpen)
+ }
+ >
+
Выберите исполнитель
+
+ {selectExecutorOpen && (
+
+ {projectBoard.projectUsers.map((user) => {
+ return (
+
executorFilter(user)}
+ >
+
{user.user?.fio}
+
+
+ );
+ })}
+
+ )}
+
+ )}
Вернуться на проекты
@@ -563,11 +638,17 @@ export const ProjectTracker = () => {
-
{task.comment_count} коментариев
+
+ {task.comment_count}{" "}
+ {caseOfNum(task.comment_count, "comments")}
+
-
{task.files} файлов
+
+ {task.files ? task.files : 0}{" "}
+ {caseOfNum(0, "files")}
+
diff --git a/src/pages/Tracker/Tracker.js b/src/pages/Tracker/Tracker.js
index d99f1f5c..e62e06ca 100644
--- a/src/pages/Tracker/Tracker.js
+++ b/src/pages/Tracker/Tracker.js
@@ -27,6 +27,7 @@ import archive from "assets/icons/archiveTracker.svg";
import search from "assets/icons/serchIcon.png";
import project from "assets/icons/trackerProject.svg";
import tasks from "assets/icons/trackerTasks.svg";
+import avatarMok from "assets/images/avatarMok.png";
import noProjects from "assets/images/noProjects.png";
import "./tracker.scss";
@@ -253,11 +254,19 @@ export const Tracker = () => {
{task.title}
-
{task.description}
+
@@ -301,11 +310,20 @@ export const Tracker = () => {
{task.title}
-
{task.description}
+
diff --git a/src/pages/Tracker/tracker.scss b/src/pages/Tracker/tracker.scss
index 1a38bead..9ed708bb 100644
--- a/src/pages/Tracker/tracker.scss
+++ b/src/pages/Tracker/tracker.scss
@@ -208,7 +208,8 @@
&__wrapper {
display: flex;
- max-width: 1160px;
+ max-width: 1260px;
+ width: 100%;
margin: 0 auto;
justify-content: space-between;
padding: 0 10px;
@@ -252,7 +253,6 @@
&__persons {
position: relative;
display: flex;
- cursor: pointer;
align-items: center;
.projectPersons {
@@ -302,8 +302,14 @@
background: #00c5a8;
color: white;
font-size: 14px;
+ transition: all 0.15s ease;
left: -28px;
z-index: 2;
+ cursor: pointer;
+
+ &:hover {
+ background: #10d5bb;
+ }
}
p {
@@ -461,11 +467,114 @@
}
}
+ &__executor {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ cursor: pointer;
+ margin-right: 10px;
+ border-radius: 8px;
+ border: 1px solid #e3e2e2;
+ padding: 2px 6px;
+ position: relative;
+ max-width: 220px;
+ width: 100%;
+
+ &Selected {
+ display: flex;
+ align-items: center;
+ border-radius: 8px;
+ max-width: 220px;
+ width: 100%;
+ margin-right: 10px;
+ justify-content: center;
+
+ p {
+ color: #252c32;
+ font-weight: 400;
+ font-size: 14px;
+ line-height: 24px;
+ max-width: 155px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ .avatar {
+ margin: 0 5px;
+ }
+
+ .delete {
+ cursor: pointer;
+ }
+
+ img {
+ display: flex;
+ width: 20px;
+ height: 20px;
+ }
+ }
+ p {
+ color: #252c32;
+ font-weight: 400;
+ font-size: 14px;
+ line-height: 24px;
+ }
+
+ img {
+ transition: all 0.15s ease;
+ margin-left: 5px;
+ }
+
+ .open {
+ transform: rotate(180deg);
+ }
+
+ &Dropdown {
+ position: absolute;
+ top: 33px;
+ background: white;
+ border-radius: 8px;
+ z-index: 5;
+ padding: 10px 10px;
+ display: flex;
+ flex-direction: column;
+ row-gap: 7px;
+ width: 100%;
+
+
+ .executorDropdown__person {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ p {
+ max-width: 155px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ img {
+ width: 15px;
+ height: 15px;
+ }
+
+ &:hover {
+ p {
+ font-weight: 600;
+ }
+ }
+ }
+ }
+ }
+
&__back {
cursor: pointer;
display: flex;
align-items: center;
color: black;
+ max-width: 180px;
+ width: 100%;
p {
font-weight: 400;
@@ -477,6 +586,12 @@
margin-left: 10px;
width: 20px;
}
+
+ &:hover {
+ p {
+ font-weight: 500;
+ }
+ }
}
}
@@ -738,12 +853,20 @@
font-weight: 500;
font-size: 16px;
line-height: 24px;
- cursor: pointer;
+ max-width: 250px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
}
.add {
color: #6f6f6f;
font-size: 19px;
+ cursor: pointer;
+
+ &:hover {
+ font-weight: 600;
+ }
}
.more {
@@ -751,6 +874,11 @@
position: relative;
bottom: 4px;
font-size: 20px;
+ cursor: pointer;
+
+ &:hover {
+ font-weight: 600;
+ }
}
.done {
diff --git a/src/redux/projectsTrackerSlice.js b/src/redux/projectsTrackerSlice.js
index d8a10860..7a4b7023 100644
--- a/src/redux/projectsTrackerSlice.js
+++ b/src/redux/projectsTrackerSlice.js
@@ -122,6 +122,13 @@ export const projectsTrackerSlice = createSlice({
);
});
},
+ filteredExecutorTasks: (state, action) => {
+ state.projectBoard.columns.forEach((column) => {
+ column.tasks = column.tasks.filter(
+ (task) => task.executor_id === action.payload
+ );
+ });
+ },
setColumnName: (state, action) => {
state.columnName = action.payload;
},
@@ -174,6 +181,7 @@ export const {
addPersonToProject,
filterCreatedByMe,
filteredParticipateTasks,
+ filteredExecutorTasks,
movePositionProjectTask,
} = projectsTrackerSlice.actions;
diff --git a/src/utils/helper.js b/src/utils/helper.js
index f32e202b..bae68067 100644
--- a/src/utils/helper.js
+++ b/src/utils/helper.js
@@ -61,3 +61,23 @@ export function getCorrectRequestDate(date) {
const sec = String(date.getUTCSeconds());
return `${yyyy}-${mm}-${dd} ${hh}:${min}:${sec}`;
}
+
+export function caseOfNum(number, type) {
+ const comments = ["коментарий", "комментария", " коментариев"];
+ const files = ["файлов", "файла", "файлов"];
+ const cases = [2, 0, 1, 1, 1, 2];
+ if (type === "comments") {
+ return comments[
+ number % 100 > 4 && number % 100 < 20
+ ? 2
+ : cases[number % 10 < 5 ? number % 10 : 5]
+ ];
+ }
+ if (type === "files") {
+ return files[
+ number % 100 > 4 && number % 100 < 20
+ ? 2
+ : cases[number % 10 < 5 ? number % 10 : 5]
+ ];
+ }
+}