setDraggingCard({ cardData: card })}
onContextMenu={(e: React.MouseEvent) => e.preventDefault()}
className="BG-white Border-section relative rounded-6 border-solid px-20 py-16"
+ onClick={() => setOpenCard(true)}
>
{imageUrl && (
{/* 태그 */}
-
+ {tags.length !== 0 && }
{/* 마감일 & 담당자 */}
{/* :마감일 */}
- {dueDate && (
-
-
+
+
+ {dueDate && (
- {dueDate}
+ {dueDate.split(' ')[0]}
-
- )}
-
+ )}
+
{/* :담당자 */}
{assignee && (
)}
+
+ {/* 카드 모달 */}
+ {openCard && (
+
+ setOpenCard(false)}
+ card={card}
+ column={column}
+ />
+
+ )}
)
}
diff --git a/src/app/features/dashboard_Id/Card/ColumnTitle.tsx b/src/app/features/dashboard_Id/Card/ColumnTitle.tsx
new file mode 100644
index 0000000..9311ac5
--- /dev/null
+++ b/src/app/features/dashboard_Id/Card/ColumnTitle.tsx
@@ -0,0 +1,10 @@
+export default function ColumnTitle({ title }: { title: string }) {
+ return (
+
+ )
+}
diff --git a/src/app/features/dashboard_Id/Card/MyAssignee.tsx b/src/app/features/dashboard_Id/Card/MyAssignee.tsx
new file mode 100644
index 0000000..8a69e36
--- /dev/null
+++ b/src/app/features/dashboard_Id/Card/MyAssignee.tsx
@@ -0,0 +1,18 @@
+import { Avatar } from '@/app/shared/components/common/Avatar'
+
+import { Assignee } from '../type/Card.type'
+
+export default function MyAssignee({ assignee }: { assignee: Assignee }) {
+ return (
+
+
+
+ {assignee.nickname}
+
+
+ )
+}
diff --git a/src/app/features/dashboard_Id/Card/Tags.tsx b/src/app/features/dashboard_Id/Card/Tags.tsx
index 6832b12..0e6b613 100644
--- a/src/app/features/dashboard_Id/Card/Tags.tsx
+++ b/src/app/features/dashboard_Id/Card/Tags.tsx
@@ -1,23 +1,39 @@
+import { useTheme } from 'next-themes'
+
import { getColor } from '@/app/shared/lib/getColor'
export default function Tags({ tags }: { tags: string[] }) {
//태그 컬러 - 랜덤 배정
//카드 생성 시 - 동일 태그 입력 불가하도록
const bgColors = ['#F9EEE3', '#E7F7DB', '#F7DBF0', '#DBE6F7']
+ const bgColorsDark = ['#774212', '#366712', '#711E5C', '#0F3167']
const textColors = ['#D58D49', '#86D549', '#D549B6', '#4981D5']
+ const { resolvedTheme } = useTheme()
+ const isDark = resolvedTheme === 'dark'
+
return (
{tags.map((tag) => {
- const colorIndex = getColor(tag, bgColors.length)
+ // const colorIndex = getColor(tag, bgColors.length)
+ // getColors함수 사용하면 NaN값이 떠서 작동을 안함.. 원래 문제 없었는데 이유를 모르겠음.
+ const hash = tag
+ .split('')
+ .reduce((acc, char) => acc + char.charCodeAt(0), 0)
+ const colorIndex = hash % 4
+
+ const backgroundColor = isDark
+ ? bgColorsDark[colorIndex]
+ : bgColors[colorIndex]
+ const textColor = isDark ? bgColors[colorIndex] : textColors[colorIndex]
return (
{tag}
diff --git a/src/app/features/dashboard_Id/Card/TagsCanDelete.tsx b/src/app/features/dashboard_Id/Card/TagsCanDelete.tsx
new file mode 100644
index 0000000..e22dd8b
--- /dev/null
+++ b/src/app/features/dashboard_Id/Card/TagsCanDelete.tsx
@@ -0,0 +1,49 @@
+import { useTheme } from 'next-themes'
+
+import { getColor } from '@/app/shared/lib/getColor'
+
+export default function TagsCanDelete({
+ tags,
+ setTags,
+}: {
+ tags: string[]
+ setTags: React.Dispatch>
+}) {
+ //태그 컬러 - 랜덤 배정
+ //카드 생성 시 - 동일 태그 입력 불가하도록
+ const bgColors = ['#F9EEE3', '#E7F7DB', '#F7DBF0', '#DBE6F7']
+ const textColors = ['#D58D49', '#86D549', '#D549B6', '#4981D5']
+
+ const { resolvedTheme } = useTheme()
+ const isDark = resolvedTheme === 'dark'
+
+ return (
+
+ {tags.map((tag) => {
+ const hash = tag
+ .split('')
+ .reduce((acc, char) => acc + char.charCodeAt(0), 0)
+ const colorIndex = hash % 4
+
+ const backgroundColor = isDark
+ ? textColors[colorIndex]
+ : bgColors[colorIndex]
+ const textColor = isDark ? bgColors[colorIndex] : textColors[colorIndex]
+
+ return (
+ setTags(tags.filter((t) => t !== tag))}
+ >
+ {tag}
+
+ )
+ })}
+
+ )
+}
diff --git a/src/app/features/dashboard_Id/Card/cardFormModals/AssigneeList.tsx b/src/app/features/dashboard_Id/Card/cardFormModals/AssigneeList.tsx
index 1e5a4a5..d0f3f5a 100644
--- a/src/app/features/dashboard_Id/Card/cardFormModals/AssigneeList.tsx
+++ b/src/app/features/dashboard_Id/Card/cardFormModals/AssigneeList.tsx
@@ -1,15 +1,14 @@
import { ControllerRenderProps } from 'react-hook-form'
+import { Avatar } from '@/app/shared/components/common/Avatar'
import { cn } from '@/app/shared/lib/cn'
import getDashboardMembers from '../../lib/getDashboardMembers'
+import { Assignee } from '../../type/Card.type'
import { CardFormData } from '../../type/CardFormData.type'
import { Member } from '../../type/Member.type'
+import MyAssignee from '../MyAssignee'
-export interface Assignee {
- userId: number
- nickname: string
-}
interface AssigneeListProps {
members: Member[] | undefined
setAssignee: (assignee: Assignee) => void
@@ -36,13 +35,13 @@ export default function AssigneeList({
'BG-Input-hovered w-full cursor-pointer px-16 py-11 pt-14 placeholder-gray-400 caret-transparent',
index !== 0 && 'border-t',
)}
- key={assignee.userId}
+ key={assignee.id}
onClick={() => {
setAssignee(assignee) // 담당자 업데이트
- controlField.onChange(assignee.userId) // 리액트 훅에는 .userId 값 연결
+ controlField.onChange(assignee.id) // 리액트 훅에는 .userId 값 연결
}}
>
- {assignee.nickname}
+
))}
diff --git a/src/app/features/dashboard_Id/Card/cardFormModals/ColumnList.tsx b/src/app/features/dashboard_Id/Card/cardFormModals/ColumnList.tsx
new file mode 100644
index 0000000..4f9c1ce
--- /dev/null
+++ b/src/app/features/dashboard_Id/Card/cardFormModals/ColumnList.tsx
@@ -0,0 +1,44 @@
+import { ControllerRenderProps } from 'react-hook-form'
+
+import { cn } from '@/app/shared/lib/cn'
+
+import { SimpleColumn, useColumnsStore } from '../../store/useColumnsStore'
+import { CardFormData } from '../../type/CardFormData.type'
+import ColumnTitle from '../ColumnTitle'
+
+interface ColumnListProps {
+ setColumn: (selectedColumn: SimpleColumn) => void
+ controlField: ControllerRenderProps