Skip to content

Commit cadefb0

Browse files
authored
Merge pull request #133 from codeit-sprint-part3-6team/#99_페이지_할-일-수정
#99 페이지 할 일 수정
2 parents bc6a277 + ac71d5d commit cadefb0

33 files changed

+939
-143
lines changed

public/ic/ic_grayCheck.svg

Lines changed: 3 additions & 0 deletions
Loading

src/components/common/input/info-input/DeadlineInput.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { TextField } from '@mui/material';
22
import { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers';
33
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
44
import ko from 'date-fns/locale/ko';
5-
import { useState } from 'react';
5+
import { useState, useEffect } from 'react';
66
import { styled } from '@mui/system';
77
import { createTheme, ThemeProvider } from '@mui/material/styles';
88
import format from 'date-fns/format';
@@ -70,18 +70,24 @@ const StyledTextField = styled(TextField)(({ theme }) => ({
7070

7171
interface DeadlineInputProps {
7272
onDateChange: (date: string) => void;
73+
initialDate: string | null;
7374
}
7475

7576
export default function DeadlineInput({
7677
onDateChange,
78+
initialDate,
7779
}: DeadlineInputProps): JSX.Element {
7880
const [selectedDate, setSelectedDate] = useState<Date | null>(null);
7981

82+
useEffect(() => {
83+
if (initialDate) {
84+
setSelectedDate(new Date(initialDate));
85+
}
86+
}, [initialDate]);
87+
8088
const handleChange = (newValue: Date | null): void => {
8189
setSelectedDate(newValue);
82-
const formattedDate = selectedDate
83-
? format(selectedDate, 'yyyy-MM-dd HH:mm')
84-
: '';
90+
const formattedDate = newValue ? format(newValue, 'yyyy-MM-dd HH:mm') : '';
8591
onDateChange(formattedDate);
8692
};
8793

src/components/common/modal/detail-cards/DetailCardModal.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import KebabIcon from 'public/ic/ic_kebab.svg';
66
import getCardDetail from '@/lib/dashboard/getCardDetail';
77
import { Card, GetCardsResponse } from '@/type/card';
88
import CardImage from '@/components/dashboard/card/CardImage';
9-
import { useSelector } from 'react-redux';
10-
import { RootState } from '@/redux/store';
9+
import { useSelector, useDispatch } from 'react-redux';
10+
import { RootState, AppDispatch } from '@/redux/store';
11+
import { setCardInfo } from '@/redux/cardSlice';
1112
import deleteCard from '@/lib/dashboard/deleteCard';
1213
import AuthorSection from './AuthorSection';
1314
import ChipSection from './ChipSection';
@@ -19,6 +20,7 @@ interface DetailCardModalProps {
1920
columnTitle: string;
2021
closeModal: () => void;
2122
setColumnData: React.Dispatch<React.SetStateAction<GetCardsResponse>>;
23+
openModifyModal: () => void;
2224
}
2325

2426
function DetailCardModal({
@@ -27,11 +29,13 @@ function DetailCardModal({
2729
columnTitle,
2830
closeModal,
2931
setColumnData,
32+
openModifyModal,
3033
}: DetailCardModalProps) {
3134
const {
3235
user: { id },
3336
} = useSelector((state: RootState) => state.userInfo);
3437
const [card, setCard] = useState<Card | null>(null);
38+
const dispatch = useDispatch<AppDispatch>();
3539

3640
// 카드 삭제 함수
3741
const handleCardDelete = async () => {
@@ -49,8 +53,9 @@ function DetailCardModal({
4953

5054
const handleMenuClick = async (value: string) => {
5155
closeModal();
52-
if (value === 'edit') alert('수정하기 모달 오픈');
53-
else if (value === 'delete') {
56+
if (value === 'edit') {
57+
openModifyModal();
58+
} else if (value === 'delete') {
5459
await handleCardDelete();
5560
}
5661
};
@@ -59,6 +64,7 @@ function DetailCardModal({
5964
try {
6065
const cardDetail = await getCardDetail({ cardId });
6166
setCard(cardDetail);
67+
dispatch(setCardInfo(cardDetail));
6268
} catch (error) {
6369
console.error('데이터 요청 실패:', error);
6470
}

src/components/dashboard/card/Card.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useState } from 'react';
12
import styles from '@/components/dashboard/card/Card.module.css';
23
import Chip from '@/components/common/chip/Chip';
34
import CardImage from '@/components/dashboard/card/CardImage';
@@ -7,6 +8,7 @@ import useModal from '@/hooks/useModal';
78
import OverlayContainer from '@/components/common/modal/overlay-container/OverlayContainer';
89
import DetailCardModal from '@/components/common/modal/detail-cards/DetailCardModal';
910
import UserProfile from '@/components/common/userprofile/UserProfile';
11+
import ModifyCard from '@/components/product/dashboard/modify-card/ModifyCard';
1012
import { GetCardsResponse } from '@/type/card';
1113

1214
interface CardProps {
@@ -18,7 +20,9 @@ interface CardProps {
1820
nickname: string;
1921
profileImage: string | null;
2022
columnTitle: string;
23+
columnId: number;
2124
setColumnData: React.Dispatch<React.SetStateAction<GetCardsResponse>>;
25+
onUpdate: () => void;
2226
}
2327

2428
function Card({
@@ -30,10 +34,17 @@ function Card({
3034
nickname,
3135
profileImage,
3236
columnTitle,
37+
columnId,
3338
setColumnData,
39+
onUpdate,
3440
}: CardProps) {
3541
const { isOpen, openModal, closeModal } = useModal();
3642
const fomattedDueDate = formatDate(dueDate);
43+
const [isModifyModalOpen, setIsModifyModalOpen] = useState(false); // 할 일 수정 모달 관련
44+
45+
const handleCloseModifyModal = () => {
46+
setIsModifyModalOpen(false);
47+
};
3748

3849
return (
3950
<>
@@ -79,6 +90,17 @@ function Card({
7990
columnTitle={columnTitle}
8091
closeModal={closeModal}
8192
setColumnData={setColumnData}
93+
openModifyModal={() => setIsModifyModalOpen(true)}
94+
/>
95+
</OverlayContainer>
96+
)}
97+
{isModifyModalOpen && (
98+
<OverlayContainer>
99+
<ModifyCard
100+
closeModal={handleCloseModifyModal}
101+
columnTitle={columnTitle}
102+
columnId={columnId}
103+
onUpdate={onUpdate}
82104
/>
83105
</OverlayContainer>
84106
)}

src/components/dashboard/column/Column.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import useModal from '@/hooks/useModal';
1111
import deleteColumns from '@/lib/dashboard/deleteColumns';
1212
import { Column as ColumnType } from '@/type/column';
1313
import DeleteCardsModal from '@/components/common/modal/delete-cards/DeleteCardsModal';
14-
import CreateCard from '@/components/product/dashboard/card/CreateCard';
14+
import CreateCard from '@/components/product/dashboard/create-card/CreateCard';
1515

1616
interface ColumnProp {
1717
columnId: number;
@@ -85,7 +85,7 @@ function Column({
8585
const handleObserver = useCallback(
8686
([entry]) => {
8787
if (entry.isIntersecting && columnData.cursorId)
88-
fetchCards(columnData.cursorId);
88+
fetchCards({ cursor: columnData.cursorId });
8989
},
9090
[fetchCards, columnData.cursorId],
9191
);
@@ -132,7 +132,11 @@ function Column({
132132
nickname={nickname}
133133
profileImage={profileImageUrl}
134134
columnTitle={columnTitle}
135+
columnId={columnId}
135136
setColumnData={setColumnData}
137+
onUpdate={() =>
138+
fetchCards({ size: columnData.totalCount + 1, reset: true })
139+
}
136140
/>
137141
),
138142
)}
@@ -173,7 +177,9 @@ function Column({
173177
onClose={() => {
174178
setModal(false);
175179
}}
176-
onUpdate={() => fetchCards(null, columnData.totalCount + 1, true)}
180+
onUpdate={() =>
181+
fetchCards({ size: columnData.totalCount + 1, reset: true })
182+
}
177183
/>
178184
)}
179185
</div>

src/components/product/dashboard/card/AssigneeSection.module.css renamed to src/components/product/dashboard/create-card/AssigneeSection.module.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,12 @@
7878
.option:hover {
7979
background-color: var(--gray-background);
8080
}
81+
82+
.calculate {
83+
display: flex;
84+
gap: 5px;
85+
}
86+
87+
.space {
88+
width: 22px;
89+
}

src/components/product/dashboard/card/AssigneeSection.tsx renamed to src/components/product/dashboard/create-card/AssigneeSection.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22
import UserProfile from '@/components/common/userprofile/UserProfile';
33
import ToggleButton from 'public/ic/ic_dropdown.svg';
4+
import Check from 'public/ic/ic_grayCheck.svg';
45
import styles from './AssigneeSection.module.css';
56

67
interface AssigneeSectionProps {
@@ -67,12 +68,19 @@ export default function AssigneeSection({
6768
}
6869
}}
6970
>
70-
<UserProfile
71-
type="todo-create"
72-
nickname={member.nickname}
73-
profileImageUrl={member.profileImageUrl}
74-
onlyImg={false}
75-
/>
71+
<div className={styles.calculate}>
72+
{member.nickname === selectedMemberNickname ? (
73+
<Check width={22} height={22} />
74+
) : (
75+
<div className={styles.space}></div>
76+
)}
77+
<UserProfile
78+
type="todo-create"
79+
nickname={member.nickname}
80+
profileImageUrl={member.profileImageUrl}
81+
onlyImg={false}
82+
/>
83+
</div>
7684
</div>
7785
))}
7886
</div>

src/components/product/dashboard/card/ButtonSection.module.css renamed to src/components/product/dashboard/create-card/ButtonSection.module.css

File renamed without changes.

src/components/product/dashboard/card/ButtonSection.tsx renamed to src/components/product/dashboard/create-card/ButtonSection.tsx

File renamed without changes.

src/components/product/dashboard/card/CardImageInput.module.css renamed to src/components/product/dashboard/create-card/CardImageInput.module.css

File renamed without changes.

0 commit comments

Comments
 (0)