From 9fce06ea695b70ed15c01481b057ad9e89495e25 Mon Sep 17 00:00:00 2001 From: Roland Bernard <rolbernard@unibz.it> Date: Tue, 22 Jun 2021 16:02:37 +0200 Subject: [PATCH] Added EditableTag to the project details --- .../components/navigation/Dropdown/index.tsx | 12 +++++++- client/src/components/ui/EditableTag/tag.scss | 4 --- .../pages/Projects/ProjectDetail/index.tsx | 28 +++++++++++++++---- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/client/src/components/navigation/Dropdown/index.tsx b/client/src/components/navigation/Dropdown/index.tsx index 50f7481..6fc87e1 100644 --- a/client/src/components/navigation/Dropdown/index.tsx +++ b/client/src/components/navigation/Dropdown/index.tsx @@ -1,5 +1,5 @@ -import { ReactNode, useState } from 'react'; +import { ReactNode, useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; import Popup from 'components/ui/Popup'; @@ -28,6 +28,16 @@ export default function Dropdown({ children, items, position }: Props) { } }); + useEffect(() => { + if (isOpen) { + const onClick = () => setOpen(false); + document.addEventListener('click', onClick); + return () => { + document.removeEventListener('click', onClick); + } + } + }, [isOpen]); + return ( <> <div className={'dropdown-container' + (isOpen ? ' open' : '') + (items.length === 0 ? ' inactive' : '')} onClick={() => setOpen(state => !state)}> diff --git a/client/src/components/ui/EditableTag/tag.scss b/client/src/components/ui/EditableTag/tag.scss index 7550256..94057f3 100644 --- a/client/src/components/ui/EditableTag/tag.scss +++ b/client/src/components/ui/EditableTag/tag.scss @@ -15,10 +15,6 @@ transform: translateY(80%); visibility: visible; } - - .icon { - transform: rotate(180deg); - } } .tag-dropdown { diff --git a/client/src/pages/Projects/ProjectDetail/index.tsx b/client/src/pages/Projects/ProjectDetail/index.tsx index 0060bf5..2d4e7e3 100644 --- a/client/src/pages/Projects/ProjectDetail/index.tsx +++ b/client/src/pages/Projects/ProjectDetail/index.tsx @@ -1,12 +1,12 @@ import { Link } from 'react-router-dom'; -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { useHistory, useParams } from 'react-router'; -import { StatusColors } from 'adapters/common'; -import { getProject, Project } from 'adapters/project'; +import { Status, StatusColors } from 'adapters/common'; +import { getProject, Project, updateProject } from 'adapters/project'; -import Tag from 'components/ui/Tag'; +import EditableTag from 'components/ui/EditableTag'; import LongText from 'components/ui/LongText'; import Tabs, { Tab } from 'components/navigation/Tabs'; import LoadingScreen from 'components/ui/LoadingScreen'; @@ -49,6 +49,19 @@ export default function ProjectDetail() { }); }, [history, projectId]) + const onStatusChange = useCallback((status: Status) => { + if (project) { + updateProject(project.id, { + status: status, + }).then(() => { + setProject({ + ...project, + status: status + }); + }); + } + }, [project]); + if (project) { return ( <div className={'project-detail-page theme-' + project.color}> @@ -56,7 +69,12 @@ export default function ProjectDetail() { arrow_back </Link> <div className="content-container"> - <Tag label={project.status} color={StatusColors.get(project.status)} /> + <EditableTag + label={project.status} + color={StatusColors.get(project.status)} + possible={Object.values(Status)} + onChange={onStatusChange} + /> <h1>{project.name}</h1> <div className="description-container"> <LongText text={project.text} /> -- GitLab