import React, {useEffect, useRef, useState} from "react"; import { ProfileHeader } from "../../components/ProfileHeader/ProfileHeader"; import { ProfileBreadcrumbs } from "../../components/ProfileBreadcrumbs/ProfileBreadcrumbs"; import { Footer } from "../../components/Footer/Footer"; import { useDispatch, useSelector } from "react-redux"; import { setAllProjects, getProjects, getProjectBoard, moveProjectTask, setProjectBoardFetch } from "../../redux/projectsTrackerSlice"; import ModalTicket from "../../components/UI/ModalTicket/ModalTicket"; import ModalCreate from "../../components/UI/ModalCreate/ModalCreate"; import ModalAdd from "../../components/UI/ModalAdd/ModalAdd"; import ProjectTiket from "../../components/ProjectTiket/ProjectTiket"; import project from "../../images/trackerProject.svg"; import tasks from "../../images/trackerTasks.svg"; import archive from "../../images/archiveTracker.svg"; import avatarTest from "../../images/AvatarTest .png"; import selectArrow from "../../images/select.svg"; import commentsBoard from "../../images/commentsBoard.svg"; import filesBoard from "../../images/filesBoard.svg"; import search from "../../images/serchIcon.png"; import noProjects from "../../images/noProjects.png"; import arrow from "../../images/arrowCalendar.png"; import {apiRequest} from "../../api/request"; import { Navigation } from "../../components/Navigation/Navigation"; import "./tracker.scss"; export const Tracker = () => { const dispatch = useDispatch(); const [toggleTab, setToggleTab] = useState(1); const [allTasks] = useState([ { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, ]); const [archiveProjects] = useState([ { name: "Будущее России", date: "7 марта 2023 г", }, { name: "Будущее России", date: "7 марта 2023 г", }, { name: "Будущее России", date: "7 марта 2023 г", }, { name: "Будущее России", date: "7 марта 2023 г", }, { name: "Будущее России", date: "7 марта 2023 г", }, { name: "Будущее России", date: "7 марта 2023 г", }, { name: "Будущее России", date: "7 марта 2023 г", }, { name: "Будущее России", date: "7 марта 2023 г", }, { name: "Будущее России", date: "7 марта 2023 г", }, ]); const [completeTasks] = useState([ { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, { name: "PR - 2245", description: "Сверстать часть таблицы. Сверстать часть таблицы", dateComplete: "7 марта 2023 г", avatarDo: avatarTest, project: "Будущее России", }, ]); const [filterCompleteTasks, setFilterCompleteTasks] = useState(completeTasks); // Modal State const [modalActiveTicket, setModalActiveTicket] = useState(false); const [indexTicket, setIndexTicket] = useState(0); const [modalAddWorker, setModalAddWorker] = useState(false); const [modalCreateProject, setModalCreateProject] = useState(false); const [modalCreateColl, setModalCreateColl] = useState(false); const [modalCreateTiket, setModalCreateTiket] = useState(false); const [valueTiket, setValueTiket] = useState(""); const [descriptionTicket, setDescriptionTicket] = useState("") const [valueColl, setValueColl] = useState(""); // const [projectTasksOpen, setProjectTasksOpen] = useState(false); const [selectedTab, setSelectedTab] = useState(0); const startWrapperIndexTest = useRef({}) const [wrapperHover, setWrapperHover] = useState([ false, false, false, false, ]); useEffect(() => { apiRequest(`/project/project-list?user_id=${localStorage.getItem('id')}&expand=columns`).then((el) => { dispatch(setAllProjects(el.projects)) }) }, []) const projects = useSelector(getProjects); const projectBoard = useSelector(getProjectBoard); const toggleTabs = (index) => { if (projectTasksOpen) { setProjectTasksOpen(false); } setToggleTab(index); }; function toggleMoreTasks(columnId) { setTabTaskMok((prevArray) => prevArray.map((elem, index) => { if (columnId === index) { return { ...elem, open: !elem.open }; } else { return elem; } }) ); } function dragStartHandler(e, task, columnId) { startWrapperIndexTest.current = { task: task, index: columnId }; setTimeout(() => { e.target.classList.add("tasks__board__item__hide"); }, 0); } function dragEndHandler(e) { setWrapperHover((prevArray) => prevArray.map((elem) => { return false; }) ); e.target.classList.remove("tasks__board__item__hide"); } function dragOverHandler(e) { e.preventDefault(); } function dragEnterHandler(columnId) { if (columnId === startWrapperIndexTest.current.index) { return; } setWrapperHover((prevArray) => prevArray.map((elem, index) => { if (index === columnId) { return true; } else { return false; } }) ); } function dragDropHandler(e, columnId) { e.preventDefault(); if (startWrapperIndexTest.current.index === columnId) { return; } setWrapperHover((prevArray) => prevArray.map((elem) => { return false; }) ); if (columnId !== startWrapperIndexTest.current.index) { dispatch(moveProjectTask({startWrapperIndex: startWrapperIndexTest.current, columnId})) } } function filterArchiveTasks(e) { setFilterCompleteTasks( completeTasks.filter((item) => { if (!e.target.value) { return item; } if ( item.name.toLowerCase().startsWith(e.target.value.toLowerCase()) || item.description .toLowerCase() .startsWith(e.target.value.toLowerCase()) ) { return item; } }) ); } function selectedTabTask(columnId) { setSelectedTab(columnId); setModalCreateTiket(true); } function openTicket(e, iTicket) { setIndexTicket(iTicket); setModalActiveTicket(true); } 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 } }).then((res) => { dispatch(setProjectBoardFetch(projectBoard.id)) }) setModalCreateTiket(false); setValueTiket(""); setDescriptionTicket("") } function createTab() { if (!valueColl) { return } apiRequest('/project-column/create-column', { method: 'POST', data: { project_id: projectBoard.id, title: valueColl } }).then((res) => { dispatch(setProjectBoardFetch(projectBoard.id)) }) setValueColl(""); setModalCreateColl(false); } return (

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

toggleTabs(1)} > img

Проекты

toggleTabs(2)} > img

Все мои задачи

toggleTabs(3)} > img

Архив

{Boolean(projects.length) && !projectTasksOpen && projects.map((project, index) => { return ( ); })} {!Boolean(projects.length) && !projectTasksOpen && (
noProjectImg

Создайте свой первый проект

Ставьте задачи, следите за прогрессом, ведите учёт рабочего времени

)} {Boolean(projects.length) && !projectTasksOpen && (

Ставьте задачи, следите за прогрессом, ведите учёт рабочего времени

)}

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

Введите название колонки

setValueColl(e.target.value)} >

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

Введите имя или e-mail{" "}

setValueTiket(e.target.value)} >
setModalCreateColl(true)}>+

добавить колонку

avatar avatar +9 +

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

Участвую arrow
Мои arrow
setProjectTasksOpen(false)} >

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

arrow

Введите название и описание задачи

setValueTiket(e.target.value)} placeholder='Название задачи' >
setDescriptionTicket(e.target.value)} placeholder='Описание задачи' >
{Boolean(projectBoard?.columns) && Boolean(projectBoard.columns.length) && projectBoard.columns.map((column) => { return (
dragOverHandler(e)} onDragEnter={(e) => dragEnterHandler(column.id)} onDrop={(e) => dragDropHandler(e, column.id)} className={`tasks__board ${ column.tasks.length >= 3 ? "tasks__board__more" : "" } ${ wrapperHover[column.id] ? "tasks__board__hover" : "" }`} >
{/**/} {column.title}
selectedTabTask(column.id)} > + ...
{column.tasks.map((task, index) => { if (index > 2) { if (!column.open) { return; } } return (
dragStartHandler(e, task, column.id) } onDragEnd={(e) => dragEndHandler(e)} onClick={(e) => openTicket(e, task.id)} >

{task.title}

{task.description}

commentsImg {task.comments} коментариев
filesImg {task.files} файлов
{/*
*/} {/* avatar*/} {/* avatar*/} {/*
*/}
); })} {column.tasks.length > 3 && ( toggleMoreTasks(column.id)} > {column.open ? "-" : "+"} )}
); })}

Список всех задач

search filterArchiveTasks(event)} />
{allTasks.map((task, index) => { return (
{task.name}

{task.description}

avatar

{task.project}

{task.dateComplete}
); })}

Архив задач:

{filterCompleteTasks.length} задач(а)

search filterArchiveTasks(event)} />
{Boolean(filterCompleteTasks.length) ? ( filterCompleteTasks.map((task, index) => { return (

{task.description}

{task.dateComplete}

avatar
Проект

{task.project}

); }) ) : (

В архиве задач нет

)}

Архив проектов:

{archiveProjects.length} проект(ов)

{Boolean(archiveProjects) ? ( archiveProjects.map((project, index) => { return (

{project.name}

{project.date}

); }) ) : (

В архиве проектов нет

)}
); };