556 lines
17 KiB
React
Raw Normal View History

2023-06-29 02:26:49 +03:00
import ClassicEditor from "@ckeditor/ckeditor5-build-classic";
import { CKEditor } from "@ckeditor/ckeditor5-react";
2023-06-29 02:27:08 +03:00
import React, { useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
2023-06-22 14:56:31 +03:00
2023-06-27 18:35:59 +03:00
import { getProfileInfo } from "@redux/outstaffingSlice";
2023-05-03 16:47:20 +03:00
import {
2023-06-22 14:56:31 +03:00
addPersonToProject,
editColumnName,
editProjectName,
getColumnId,
getColumnName,
getColumnPriority,
2023-05-03 16:47:20 +03:00
getProjectBoard,
getValueModalType,
2023-06-22 14:56:31 +03:00
setColumnName,
setColumnPriority,
setProject,
2023-05-03 16:47:20 +03:00
setProjectBoardFetch,
2023-06-22 19:18:41 +03:00
} from "@redux/projectsTrackerSlice";
import { urlForLocal } from "@utils/helper";
import { apiRequest } from "@api/request";
import BaseButton from "@components/Common/BaseButton/BaseButton";
import ModalLayout from "@components/Common/ModalLayout/ModalLayout";
2023-06-22 19:18:41 +03:00
import arrowDown from "assets/icons/arrows/selectArrow.png";
2023-06-29 02:27:08 +03:00
import avatarMok from "assets/images/avatarMok.png";
2023-06-22 19:18:41 +03:00
2023-05-05 16:10:25 +03:00
import "./trackerModal.scss";
2023-04-10 21:22:22 +03:00
2023-05-05 16:10:25 +03:00
export const TrackerModal = ({
active,
setActive,
selectedTab,
defautlInput,
titleProject,
2023-05-08 16:57:35 +03:00
projectId,
2023-05-24 19:23:24 +03:00
priorityTask,
2023-06-27 18:35:59 +03:00
projectUsers,
}) => {
2023-05-03 16:47:20 +03:00
const dispatch = useDispatch();
const projectBoard = useSelector(getProjectBoard);
2023-05-16 00:24:52 +03:00
const columnName = useSelector(getColumnName);
2023-06-22 14:56:31 +03:00
const columnId = useSelector(getColumnId);
const columnPriority = useSelector(getColumnPriority);
2023-06-27 18:35:44 +03:00
const profileInfo = useSelector(getProfileInfo);
2023-05-03 16:47:20 +03:00
const modalType = useSelector(getValueModalType);
2023-05-08 00:41:39 +03:00
const [projectName, setProjectName] = useState(defautlInput);
const [valueColumn, setValueColumn] = useState("");
const [nameProject, setNameProject] = useState("");
2023-05-03 16:47:20 +03:00
const [valueTiket, setValueTiket] = useState("");
2023-06-29 02:26:49 +03:00
const [descriptionTicket, setDescriptionTicket] = useState("Описание задачи");
2023-06-22 14:56:31 +03:00
const [workers, setWorkers] = useState([]);
const [selectWorkersOpen, setSelectWorkersOpen] = useState(false);
const [selectedWorker, setSelectedWorker] = useState(null);
const [selectColumnPriority, setSelectColumnPriority] = useState(
"Выберите приоритет колонки"
);
2023-06-27 18:35:59 +03:00
const [selectedExecutorTask, setSelectedExecutorTask] = useState(
"Выберите исполнителя задачи"
);
const [selectExecutorTaskOpen, setSelectExecutorTaskOpen] = useState(false);
2023-06-27 18:35:44 +03:00
const [correctProjectUsers, setCorrectProjectUsers] = useState([]);
const [selectColumnPriorityOpen, setSelectColumnPriorityOpen] =
useState(false);
2023-05-03 16:47:20 +03:00
function createTab() {
if (!valueColumn) {
2023-05-03 16:47:20 +03:00
return;
}
apiRequest("/project-column/create-column", {
method: "POST",
data: {
project_id: projectBoard.id,
2023-06-22 14:56:31 +03:00
priority: projectBoard.columns.length
? projectBoard.columns.at(-1).priority + 1
: 1,
title: valueColumn,
2023-05-03 16:47:20 +03:00
},
2023-05-31 11:24:46 +03:00
}).then(() => {
2023-05-03 16:47:20 +03:00
dispatch(setProjectBoardFetch(projectBoard.id));
});
setValueColumn("");
2023-05-03 16:47:20 +03:00
setActive(false);
}
function createTiket() {
if (!valueTiket || !descriptionTicket) {
return;
}
apiRequest("/task/create-task", {
method: "POST",
data: {
project_id: projectBoard.id,
title: valueTiket,
description: descriptionTicket,
status: 1,
user_id: localStorage.getItem("id"),
column_id: selectedTab,
2023-05-24 19:23:24 +03:00
priority: priorityTask,
2023-05-03 16:47:20 +03:00
},
2023-06-27 18:35:44 +03:00
}).then((res) => {
if (selectedExecutorTask.user_id) {
apiRequest("/task/update-task", {
method: "PUT",
data: {
task_id: res.id,
executor_id: selectedExecutorTask.user_id,
},
}).then(() => {
dispatch(setProjectBoardFetch(projectBoard.id));
setActive(false);
setValueTiket("");
2023-06-29 02:26:49 +03:00
setDescriptionTicket("Описание задачи");
2023-06-27 18:35:59 +03:00
setSelectedExecutorTask("Выберите исполнителя задачи");
});
2023-06-27 18:35:44 +03:00
} else {
setActive(false);
setValueTiket("");
2023-06-29 02:26:49 +03:00
setDescriptionTicket("Описание задачи");
2023-06-27 18:35:44 +03:00
dispatch(setProjectBoardFetch(projectBoard.id));
}
2023-05-03 16:47:20 +03:00
});
}
2023-05-08 00:41:39 +03:00
function editProject() {
apiRequest("/project/update", {
method: "PUT",
data: {
project_id: projectId,
2023-05-08 16:57:35 +03:00
name: projectName,
2023-05-08 00:41:39 +03:00
},
2023-05-31 11:24:46 +03:00
}).then(() => {
2023-05-08 16:57:35 +03:00
setActive(false);
dispatch(editProjectName({ id: projectId, name: projectName }));
2023-05-08 00:41:39 +03:00
});
2023-05-05 00:50:48 +03:00
}
2023-06-09 03:19:09 +03:00
function changeColumnParams() {
projectBoard.columns.forEach((column) => {
if (column.id === columnId && column.priority !== columnPriority) {
2023-06-22 14:56:31 +03:00
const priorityColumns = [
{
column_id: column.id,
priority: Number(columnPriority),
},
];
2023-06-09 03:19:09 +03:00
for (let i = column.priority; i < columnPriority; i++) {
const currentColumn = {
column_id: projectBoard.columns[i].id,
2023-06-22 14:56:31 +03:00
priority: i,
};
priorityColumns.push(currentColumn);
2023-06-09 03:19:09 +03:00
}
for (let i = column.priority; i > columnPriority; i--) {
const currentColumn = {
column_id: projectBoard.columns[i - 2].id,
2023-06-22 14:56:31 +03:00
priority: i,
};
priorityColumns.push(currentColumn);
2023-06-09 03:19:09 +03:00
}
apiRequest("/project-column/set-priority", {
method: "POST",
data: {
project_id: projectBoard.id,
2023-06-22 14:56:31 +03:00
data: JSON.stringify(priorityColumns),
},
2023-06-09 03:19:09 +03:00
}).then(() => {
dispatch(setProjectBoardFetch(projectBoard.id));
2023-06-22 14:56:31 +03:00
});
2023-06-09 03:19:09 +03:00
}
2023-06-22 14:56:31 +03:00
});
changeColumnTitle();
2023-06-09 03:19:09 +03:00
}
function changeColumnTitle() {
2023-05-16 00:24:52 +03:00
apiRequest("/project-column/update-column", {
method: "PUT",
data: {
column_id: columnId,
2023-05-24 19:23:24 +03:00
title: columnName,
},
2023-05-31 11:24:46 +03:00
}).then(() => {
2023-05-16 00:24:52 +03:00
setActive(false);
2023-05-24 19:23:24 +03:00
dispatch(editColumnName({ id: columnId, title: columnName }));
});
2023-05-16 00:24:52 +03:00
}
function createProject() {
if (nameProject === "") {
return;
} else {
apiRequest("/project/create", {
method: "POST",
data: {
user_id: localStorage.getItem("id"),
name: nameProject,
2023-05-08 00:41:39 +03:00
status: 19,
},
}).then((res) => {
const result = { ...res, columns: [] };
dispatch(setProject(result));
setActive(false);
setNameProject("");
});
}
}
2023-05-17 02:51:31 +03:00
function addUserToProject() {
apiRequest("/project/add-user", {
method: "POST",
data: {
2023-05-23 23:02:39 +03:00
user_id: selectedWorker.user_id,
2023-05-24 19:23:24 +03:00
project_id: projectBoard.id,
},
2023-05-17 02:51:31 +03:00
}).then((el) => {
2023-05-24 19:23:24 +03:00
dispatch(addPersonToProject(el));
2023-05-17 02:51:31 +03:00
setActive(false);
2023-05-24 19:23:24 +03:00
setSelectedWorker("");
setSelectWorkersOpen(false);
});
2023-05-17 02:51:31 +03:00
}
useEffect(() => {
2023-05-24 19:23:24 +03:00
modalType === "addWorker"
? apiRequest("/project/my-employee").then((el) => {
let persons = el.managerEmployees;
let ids = projectBoard.projectUsers.map((user) => user.user_id);
setWorkers(
persons.reduce((acc, cur) => {
if (!ids.includes(cur.user_id)) acc.push(cur);
return acc;
}, [])
);
})
: "";
2023-06-27 18:35:44 +03:00
if (
2023-06-27 18:35:59 +03:00
localStorage.getItem("role_status") !== "18" &&
projectUsers &&
Boolean(
!projectUsers.find((item) => item.user_id === profileInfo.id_user)
)
2023-06-27 18:35:44 +03:00
) {
2023-06-27 18:35:59 +03:00
setCorrectProjectUsers([
2023-06-27 18:35:44 +03:00
...projectUsers,
{
user: {
avatar: profileInfo.photo,
fio: profileInfo.fio,
},
user_id: profileInfo.id_user,
},
]);
} else {
2023-06-27 18:35:59 +03:00
setCorrectProjectUsers(projectUsers);
2023-06-27 18:35:44 +03:00
}
2023-05-24 19:23:24 +03:00
}, [active]);
2023-05-17 02:51:31 +03:00
return (
<ModalLayout
active={active}
setActive={setActive}
// onClick={() => {
// setSelectWorkersOpen(false);
// }}
>
{modalType === "addWorker" && (
<div>
<div className="title-project">
<h4>Добавьте участника</h4>
{/*<div className="input-container">*/}
{/* <input*/}
{/* className="name-project"*/}
{/* value={emailWorker}*/}
{/* onChange={(e) => setEmailWorker(e.target.value)}*/}
{/* />*/}
{/*</div>*/}
<div
className={
selectWorkersOpen ? "select__worker open" : "select__worker"
}
onClick={() => setSelectWorkersOpen(!selectWorkersOpen)}
>
<p>
{selectedWorker
? selectedWorker.employee.fio
: "Выберите пользователя"}
</p>
<img className="arrow" src={arrowDown} alt="arrow" />
{Boolean(selectWorkersOpen) && (
<div className="select__worker__dropDown">
{Boolean(workers.length) ? (
workers.map((worker) => {
if (worker === selectedWorker) {
return;
}
return (
<div
className="worker"
key={worker.id}
onClick={() => {
setSelectedWorker(worker);
}}
>
<p>{worker.employee.fio}</p>
<img
src={urlForLocal(worker.employee.avatar)}
alt="avatar"
/>
</div>
);
})
) : (
<div>Нет пользователей</div>
)}
</div>
)}
2023-05-03 16:47:20 +03:00
</div>
</div>
<BaseButton styles={"button-add"} onClick={addUserToProject}>
Добавить
</BaseButton>
</div>
)}
{modalType === "createTiketProject" && (
2023-06-27 18:35:44 +03:00
<>
<div className="title-project">
<h4>Введите название и описание задачи</h4>
<div className="input-container">
<input
className="name-project"
value={valueTiket}
onChange={(e) => setValueTiket(e.target.value)}
placeholder="Название задачи"
/>
</div>
2023-06-29 02:26:49 +03:00
<CKEditor
editor={ClassicEditor}
data={descriptionTicket}
config={{
2023-06-29 02:27:08 +03:00
toolbar: [
"heading",
"|",
"bold",
"italic",
"link",
"bulletedList",
"numberedList",
"blockQuote",
2023-06-29 02:26:49 +03:00
],
2023-06-29 02:27:08 +03:00
removePlugins: ["BlockQuote"],
2023-06-29 02:26:49 +03:00
}}
onChange={(event, editor) => {
const data = editor.getData();
setDescriptionTicket(data);
}}
/>
2023-06-27 18:35:44 +03:00
<div
2023-06-27 18:35:59 +03:00
onClick={() => setSelectExecutorTaskOpen(!selectExecutorTaskOpen)}
className={
selectExecutorTaskOpen
? "select__executor select__executor--open"
: "select__executor"
2023-06-27 18:35:44 +03:00
}
2023-06-27 18:35:59 +03:00
>
<div className="selected__executor">
{selectedExecutorTask.user_id ? (
<>
<span>{selectedExecutorTask.user.fio}</span>
<img
className="avatar"
src={urlForLocal(selectedExecutorTask.user.avatar)}
alt="avatar"
/>
</>
) : (
<span>{selectedExecutorTask}</span>
)}
</div>
<img className="arrow" src={arrowDown} alt="arrow" />
{selectExecutorTaskOpen && (
<div className="select__executor__dropDown">
{correctProjectUsers.length ? (
correctProjectUsers.map((person) => {
return (
<div
onClick={() => setSelectedExecutorTask(person)}
className="executor"
key={person.user_id}
>
<span>{person.user.fio}</span>
<img
className="avatar"
2023-06-29 02:26:49 +03:00
src={
person.user?.avatar
? urlForLocal(person.user.avatar)
: avatarMok
}
2023-06-27 18:35:59 +03:00
alt="avatar"
/>
</div>
);
})
) : (
<span>Нет пользователей</span>
)}
</div>
)}
2023-06-27 18:35:44 +03:00
</div>
2023-05-03 16:47:20 +03:00
</div>
<BaseButton styles={"button-add"} onClick={createTiket}>
Создать
</BaseButton>
2023-06-27 18:35:44 +03:00
</>
)}
{modalType === "editProject" && (
<div>
<div className="title-project">
<h4>Введите новое название</h4>
<div className="input-container">
<input
className="name-project"
value={projectName}
onChange={(e) => setProjectName(e.target.value)}
/>
2023-05-03 22:06:19 +03:00
</div>
</div>
2023-06-22 19:18:41 +03:00
<BaseButton styles={"button-add"} onClick={editProject}>
Сохранить
</BaseButton>
</div>
)}
{modalType === "createProject" && (
<div>
<div className="title-project">
<h4>{titleProject}</h4>
<div className="input-container">
<input
className="name-project"
value={nameProject}
onChange={(e) => setNameProject(e.target.value)}
/>
</div>
<BaseButton styles={"button-add"} onClick={createProject}>
Создать
2023-06-22 19:18:41 +03:00
</BaseButton>
2023-05-03 22:06:19 +03:00
</div>
</div>
)}
{modalType === "addSubtask" && (
<div>
<div className="title-project subtask">
<h4>
Вы добавляете подзадачу{" "}
<p>в колонку(id) задачи "{defautlInput}"</p>
</h4>
<p className="title-project__decs">Введите текст</p>
<div>
<textarea className="title-project__textarea"></textarea>
</div>
</div>
<BaseButton styles={"button-add"} onClick={(e) => e.preventDefault()}>
Добавить
</BaseButton>
</div>
)}
{modalType === "createColumn" && (
<div>
<div className="title-project">
<h4>Введите название колонки</h4>
<div className="input-container">
<input
className="name-project"
value={valueColumn}
onChange={(e) => setValueColumn(e.target.value)}
/>
</div>
</div>
<BaseButton styles={"button-add"} onClick={createTab}>
Создать
</BaseButton>
</div>
)}
{modalType === "editColumn" && (
<div>
<div className="title-project">
<h4>Введите новое название</h4>
<div className="input-container">
<input
className="name-project"
value={columnName}
onChange={(e) => dispatch(setColumnName(e.target.value))}
/>
</div>
<h4>Приоритет колонки</h4>
<div
2023-06-27 18:35:59 +03:00
className={
selectColumnPriorityOpen
? "select-priority select-priority--open"
: "select-priority"
}
onClick={() =>
setSelectColumnPriorityOpen(!selectColumnPriorityOpen)
}
>
<span>{selectColumnPriority}</span>
<img src={arrowDown} alt="arrow" />
{selectColumnPriorityOpen && (
<div className="select-priority__dropDown">
{projectBoard.columns.map((column, index) => {
return (
<span
key={column.id}
onClick={() => {
setSelectColumnPriority(index + 1);
dispatch(setColumnPriority(index + 1));
}}
>
{index + 1}
</span>
);
})}
</div>
)}
2023-05-04 18:38:56 +03:00
</div>
{/*<div className="input-container">*/}
{/* <input*/}
{/* className="name-project"*/}
{/* placeholder="Приоритет колонки"*/}
{/* type="number"*/}
{/* step="1"*/}
{/* value={columnPriority}*/}
{/* onChange={(e) => dispatch(setColumnPriority(e.target.value))}*/}
{/* />*/}
{/*</div>*/}
2023-05-04 18:38:56 +03:00
</div>
<BaseButton styles={"button-add"} onClick={changeColumnParams}>
Сохранить
</BaseButton>
</div>
)}
2023-05-03 16:47:20 +03:00
<span className="exit" onClick={() => setActive(false)}></span>
</ModalLayout>
2023-04-10 21:22:22 +03:00
);
};
2023-05-05 16:10:25 +03:00
export default TrackerModal;