From 37e789b7f5a3ff5ee24fb2a1abdd9ed740db836a Mon Sep 17 00:00:00 2001 From: daeseong9388 <103937206+daeseong9388@users.noreply.github.com> Date: Thu, 1 Dec 2022 10:28:32 +0900 Subject: [PATCH 001/218] =?UTF-8?q?FEAT:=20=EC=9D=B4=EC=8A=88=20=ED=8F=BC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=ED=8F=BC=20=EC=88=98=EC=A0=95=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: PR 템플릿 수정 * feat: 피처 요청 이슈 폼 작성 * fix: 피처 요청 이슈 폼 드롭다운 옵션 수정 * fix: 버그 리포트 템플릿에 심각성 항목 추가 * fix: 버그 리포트 템플릿 syntax 에러 수정 * fix: 버그 리포트 템플릿 드롭다운 양식 수정 * fix: 피처 템플릿 수정 - 난이도, 중요도 항목 추가 - 개요는 input field로 받음 * fix: 피처 요청은 담당자 지정을 필수로 설정 * fix: 피처 요청에 필수항목 설정 수정 * fix: 피처 템플릿 필수항목 수정 Co-authored-by: n-ryu --- .github/ISSUE_TEMPLATE/Bug-Report.yml | 11 ++++ .github/ISSUE_TEMPLATE/Feature-Request.yml | 63 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/Feature.yml | 28 ++++++++-- .github/pull-request-template.md | 16 +++--- 4 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/Feature-Request.yml diff --git a/.github/ISSUE_TEMPLATE/Bug-Report.yml b/.github/ISSUE_TEMPLATE/Bug-Report.yml index 779477d..382a38e 100644 --- a/.github/ISSUE_TEMPLATE/Bug-Report.yml +++ b/.github/ISSUE_TEMPLATE/Bug-Report.yml @@ -3,6 +3,17 @@ description: 기능 개선을 위해 버그를 제보해주세요. title: "fix: " labels: ["bug"] body: +- type: dropdown + attributes: + label: 심각성 + description: 해당 버그가 서비스에 미치는 영향의 심각성을 평가해 주세요. + multiple: false + options: + - A + - B + - C + validations: + required: true - type: textarea attributes: label: 버그 설명 diff --git a/.github/ISSUE_TEMPLATE/Feature-Request.yml b/.github/ISSUE_TEMPLATE/Feature-Request.yml new file mode 100644 index 0000000..c52b8ba --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Feature-Request.yml @@ -0,0 +1,63 @@ +name: 피처 요청 템플릿 +description: 서비스에 필요한 새로운 피처 명세를 작성하고 개발자에게 요청하세요. +title: "request: " +labels: ["request"] +body: +- type: input + attributes: + label: 피처 개요 + description: 필요한 피처에 대해서 한줄로 설명해주세요. + validations: + required: true +- type: textarea + attributes: + label: 요청 사유 + description: 해당 피처가 필요한 이유, 필요한 상황에 대해서 기술해주세요. + validations: + required: true +- type: dropdown + attributes: + label: 중요도 + description: 해당 피처의 중요도를 선택해주세요. + multiple: false + options: + - A + - B + - C + validations: + required: true +- type: dropdown + attributes: + label: 난이도 + description: 해당 피처의 구현 난이도(구현 시간도 고려하여)을 선택해주세요. + multiple: false + options: + - 상 + - 중 + - 하 + validations: + required: true +- type: textarea + attributes: + label: 피처 설명 + description: 필요한 피처에 대해서 자세히 설명해주세요. + validations: + required: false +- type: textarea + attributes: + label: 체크리스트 + description: 작업에 필요한 마이크로 피처들을 작성해 이슈를 링크해주세요. + validations: + required: false +- type: input + attributes: + label: 관련 정보 + description: 관련된 Project Wiki 페이지가 있다면 링크해주세요. + validations: + required: false +- type: checkboxes + attributes: + label: 담당자 지정 + options: + - label: assignee에 담당자를 제대로 지정하였나요? + required: true diff --git a/.github/ISSUE_TEMPLATE/Feature.yml b/.github/ISSUE_TEMPLATE/Feature.yml index f4be209..3c48703 100644 --- a/.github/ISSUE_TEMPLATE/Feature.yml +++ b/.github/ISSUE_TEMPLATE/Feature.yml @@ -3,10 +3,32 @@ description: 피처 구현을 위한 이슈를 작성하세요. title: "feat: " labels: ["feature"] body: -- type: textarea +- type: input attributes: label: 피처 개요 - description: 필요한 피처에 대해서 간단히 설명해주세요. + description: 필요한 피처에 대해서 한줄로 설명해주세요. + validations: + required: true +- type: dropdown + attributes: + label: 중요도 + description: 해당 피처의 중요도를 선택해주세요. + multiple: false + options: + - A + - B + - C + validations: + required: true +- type: dropdown + attributes: + label: 난이도 + description: 해당 피처의 구현 난이도(구현 시간도 고려하여)을 선택해주세요. + multiple: false + options: + - 상 + - 중 + - 하 validations: required: true - type: textarea @@ -26,4 +48,4 @@ body: label: 관련 정보 description: 관련된 Project Wiki 페이지가 있다면 링크해주세요. validations: - required: false \ No newline at end of file + required: false diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md index 9aeae00..e4e1bfb 100644 --- a/.github/pull-request-template.md +++ b/.github/pull-request-template.md @@ -1,17 +1,13 @@ - ## 개요 -무엇에 관한 내용인지 + ## 세부 내용 -- A - - description - - screenshot -- B - - 변경 전 - - 변경 후 -- C ## 공유 + - 고민과 질문 + - 해결 과정의 기록은 정리해서 위키에 수록 후 링크 달기 -## relevant issue number + +## 관련 이슈 + - 관련된 이슈 넘버가 있으면 이곳에 기입해주세요 From e325a1160c5f407b18d416234c8997d364756095 Mon Sep 17 00:00:00 2001 From: NaGyeong Park Date: Thu, 1 Dec 2022 11:31:06 +0900 Subject: [PATCH 002/218] =?UTF-8?q?feat:=20copyToClipboard=20util=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84=20resolve=20#149?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/util/Common.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/client/src/util/Common.ts b/client/src/util/Common.ts index 2762053..1906e70 100644 --- a/client/src/util/Common.ts +++ b/client/src/util/Common.ts @@ -1,3 +1,5 @@ +import { toast } from 'react-toastify'; + export const todoStatusText = (todoUntil: string): string => { return isTodoImminence(todoUntil) ? '오늘까지 해야하는 일!' : '오늘 안해도 되는 일'; }; @@ -45,3 +47,14 @@ export const getModalValues = (div: Element): any[] => { export const getTodayDate = (): string => { return new Date().toJSON().split('T')[0]; }; + +export const copyToClipboard = (text: string): void => { + navigator.clipboard.writeText(text).then( + () => { + toast.success('복사 성공'); + }, + () => { + toast.error('복사 실패'); + }, + ); +}; From ffc3c384809d8557aff4eb7195ca9de38c569d41 Mon Sep 17 00:00:00 2001 From: n-ryu Date: Thu, 1 Dec 2022 11:32:27 +0900 Subject: [PATCH 003/218] =?UTF-8?q?style:=20FilterBox=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EC=A7=80=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/table/FilterBox.tsx | 56 +++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 client/src/components/table/FilterBox.tsx diff --git a/client/src/components/table/FilterBox.tsx b/client/src/components/table/FilterBox.tsx new file mode 100644 index 0000000..e806cd7 --- /dev/null +++ b/client/src/components/table/FilterBox.tsx @@ -0,0 +1,56 @@ +import { memo, ReactElement } from 'react'; +import styled from 'styled-components'; + +import Text from '../Text'; +import Button from '../Button'; + +import { PRIMARY_COLORS } from '@util/Constants'; + +const { lightGray, black } = PRIMARY_COLORS; + +const StyledFilterBox = styled.div` + display: flex; + flex-direction: column; + background-color: ${lightGray}; + line-height: 25px; + letter-spacing: 0em; + align-items: flex-start; + justify-content: center; + box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 10px; + width: 161px; + padding: 20px; + gap: 20px; + position: absolute; + left: 40px; + top: 60px; +`; + +interface FilterProps { + setPostpone: Function; + postponeOptions: string[]; + time: number; + setTime: Function; + handleOnToggle: Function; +} + +const filterOptions = ['설정 안함', '내림차순', '오름차순']; + +const FilterBox = (props: FilterProps): ReactElement => { + return ( + + {filterOptions.map((text: string): ReactElement => { + return ( + + {filterDropdown && } + +
+ +
+
+ +
+
+ +
+
+ +
); diff --git a/client/src/container/todos/Table.tsx b/client/src/container/todos/Table.tsx index d3ff034..171ebc8 100644 --- a/client/src/container/todos/Table.tsx +++ b/client/src/container/todos/Table.tsx @@ -42,22 +42,24 @@ const Table = (): ReactElement => { const [todoListAtom] = useAtom(todoList); const [todos, setTodos] = useState([]); const [displayDetail, setDisplayDetail] = useAtom(displayDetailAtom); + const [filter, setFilter] = useState<'DONE' | 'READY' | 'WAIT'>('READY'); + const [sort, setSort] = useState>>([]); useEffect(() => { todoListAtom - .getSortedRTL() + .getSortedList(filter, []) .then((sortedTodoList: PlainTodo[]) => { setTodos(() => { return [...sortedTodoList]; }); }) .catch((err) => toast.error(err)); - }, [todoListAtom]); + }, [todoListAtom, filter, sort]); return todos.length > 0 ? ( - + {todos.map((todo: PlainTodo) => ( From 8b816162c570cb8d9a4d037608c8ef43056b92b1 Mon Sep 17 00:00:00 2001 From: n-ryu Date: Thu, 1 Dec 2022 15:13:17 +0900 Subject: [PATCH 010/218] =?UTF-8?q?feat:=20=ED=97=A4=EB=8D=94=20=EB=8B=A4?= =?UTF-8?q?=EC=8B=9C=20=EB=88=8C=EB=9F=AC=20=ED=95=84=ED=84=B0=20=EB=93=9C?= =?UTF-8?q?=EB=A1=AD=EB=8B=A4=EC=9A=B4=20=EB=81=8C=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/todos/TableHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/todos/TableHeader.tsx b/client/src/components/todos/TableHeader.tsx index 2ca9b0b..a03adee 100644 --- a/client/src/components/todos/TableHeader.tsx +++ b/client/src/components/todos/TableHeader.tsx @@ -21,7 +21,7 @@ const TableHeader = ({ setFilter, setSort, ...props }: Props): ReactElement => {
+ {sortDropdown === 'title' && }
- + + {sortDropdown === 'until' && }
- + + {sortDropdown === 'importance' && ( + + )}
diff --git a/client/src/container/todos/Table.tsx b/client/src/container/todos/Table.tsx index 171ebc8..3cda8be 100644 --- a/client/src/container/todos/Table.tsx +++ b/client/src/container/todos/Table.tsx @@ -43,11 +43,17 @@ const Table = (): ReactElement => { const [todos, setTodos] = useState([]); const [displayDetail, setDisplayDetail] = useAtom(displayDetailAtom); const [filter, setFilter] = useState<'DONE' | 'READY' | 'WAIT'>('READY'); - const [sort, setSort] = useState>>([]); + const [sort, setSort] = useState>(new Map()); useEffect(() => { todoListAtom - .getSortedList(filter, []) + .getSortedList( + filter, + [...sort] + .map((el) => ({ type: el[0], direction: el[1] })) + .filter((el) => el.direction !== 'NONE') + .reverse(), + ) .then((sortedTodoList: PlainTodo[]) => { setTodos(() => { return [...sortedTodoList]; From 662feb02f56eb04a564b0f1714911d909d8244e2 Mon Sep 17 00:00:00 2001 From: NaGyeong Park Date: Thu, 1 Dec 2022 16:04:17 +0900 Subject: [PATCH 014/218] =?UTF-8?q?feat:=20todo=20modal=EB=A1=9C=20create/?= =?UTF-8?q?edit=EC=8B=9C=20until=EC=9D=98=20=EC=8B=9C=EA=B0=84=20=EC=A7=80?= =?UTF-8?q?=EC=A0=95=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/todos/LabeledInput.tsx | 22 +++++++++++++++++--- client/src/container/todos/TableModal.tsx | 2 +- client/src/util/Constants.ts | 2 +- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/client/src/components/todos/LabeledInput.tsx b/client/src/components/todos/LabeledInput.tsx index f9016e5..4890926 100644 --- a/client/src/components/todos/LabeledInput.tsx +++ b/client/src/components/todos/LabeledInput.tsx @@ -1,7 +1,7 @@ import { ReactElement, useState, memo } from 'react'; import Text from '@components/Text'; import { PRIMARY_COLORS, TABLE_MODALS } from '@util/Constants'; -import { getTodayDate } from '@util/Common'; +import { getTodayDate, gethhmmFormat } from '@util/Common'; import styled from 'styled-components'; import Select from '@components/Select'; @@ -42,7 +42,7 @@ const Wrapper = styled.div` width: 100%; } } - > input[type='date'] { + > input[type='datetime-local'] { &:last-child { width: 30%; } @@ -74,13 +74,29 @@ const LabeledInput = ({ label, maxLength, type, id }: InputProps): ReactElement return setDateInput(value); }; + const blockUntilDateAtCreateMode = (): string => { + const todayDate = getTodayDate(); + const nowTime = gethhmmFormat(new Date()); + if (modalType === TABLE_MODALS.create) { + return todayDate + 'T' + nowTime; + } else return ''; + }; + return ( {type === 'text' && } {type === 'textarea' &&