Skip to content

Commit 5fd5561

Browse files
Merge pull request #52 from ka1ea6/fix/task-card
fix: applies fix for handling task card actions
2 parents 5de452a + 4364102 commit 5fd5561

12 files changed

Lines changed: 1065 additions & 857 deletions

File tree

src/components/DigitalColleagues/test-data.tsx

Lines changed: 414 additions & 336 deletions
Large diffs are not rendered by default.

src/components/DigitalColleagues/types.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,18 @@ export interface Sprint {
7373
isSelected?: boolean
7474
}
7575

76+
export interface Comment {
77+
id: string
78+
content: string
79+
timestamp: string
80+
user: User
81+
taskId: string
82+
taskTitle: string
83+
}
84+
7685
export interface Task {
7786
id: string
78-
title: string
87+
name: string
7988
description: string
8089
status: 'todo' | 'in-progress' | 'review' | 'done'
8190
priority: 'low' | 'medium' | 'high'
@@ -84,6 +93,7 @@ export interface Task {
8493
epicId: string
8594
sprintId?: string
8695
assignee: string
96+
comments?: Comment[]
8797
createdAt: Date
8898
}
8999

src/components/Projects/AddTaskModal.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export const AddTaskModal: React.FC<AddTaskModalProps> = ({
6060
defaultEpicId,
6161
}) => {
6262
const [formData, setFormData] = useState({
63-
title: '',
63+
name: '',
6464
description: '',
6565
status: 'todo' as Task['status'],
6666
priority: 'medium' as Task['priority'],
@@ -82,7 +82,7 @@ export const AddTaskModal: React.FC<AddTaskModalProps> = ({
8282
if (isOpen) {
8383
// Set default values or reset the form when the modal opens
8484
setFormData({
85-
title: '',
85+
name: '',
8686
description: '',
8787
status: 'todo',
8888
priority: 'medium',
@@ -97,9 +97,9 @@ export const AddTaskModal: React.FC<AddTaskModalProps> = ({
9797

9898
const handleSubmit = (e: React.FormEvent) => {
9999
e.preventDefault()
100-
if (formData.title.trim()) {
100+
if (formData.name.trim()) {
101101
onAddTask({
102-
title: formData.title.trim(),
102+
name: formData.name.trim(),
103103
description: formData.description.trim(),
104104
status: 'todo',
105105
priority: formData.priority as Task['priority'],
@@ -110,7 +110,7 @@ export const AddTaskModal: React.FC<AddTaskModalProps> = ({
110110
assignee: formData.assignee.trim() || 'Unassigned',
111111
})
112112
setFormData({
113-
title: '',
113+
name: '',
114114
description: '',
115115
status: 'todo',
116116
priority: 'medium',
@@ -137,11 +137,11 @@ export const AddTaskModal: React.FC<AddTaskModalProps> = ({
137137

138138
<form onSubmit={handleSubmit} className="space-y-4">
139139
<div className="space-y-2">
140-
<Label htmlFor="title">Task Title</Label>
140+
<Label htmlFor="name">Task Title</Label>
141141
<Input
142-
id="title"
143-
value={formData.title}
144-
onChange={(e) => handleChange('title', e.target.value)}
142+
id="name"
143+
value={formData.name}
144+
onChange={(e) => handleChange('name', e.target.value)}
145145
placeholder="Enter task title"
146146
required
147147
/>

src/components/Projects/KanbanBoardView.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ export interface KanbanBoardProps {
2020
initialColleagues?: DigitalColleague[]
2121
// Task handlers
2222
onAddTask?: (newTask: Omit<Task, 'id' | 'createdAt'>) => void
23-
onUpdateTask?: (taskId: string, updates: Partial<Task>) => void
23+
onUpdateTask?: (taskId: string, updates: Partial<Task>) => Promise<Task>
2424
onDeleteTask?: (taskId: string) => void
2525
onTaskClick?: (task: Task) => void
2626
// Epic handlers
2727
onAddEpic?: (newEpic: Omit<Epic, 'id'>) => void
28+
onAddComment?: ({ content, taskId }: { taskId: string; content: string }) => Promise<Task>
2829
}
2930

3031
export const KanbanBoardView: React.FC<KanbanBoardProps> = ({
@@ -41,6 +42,7 @@ export const KanbanBoardView: React.FC<KanbanBoardProps> = ({
4142
onTaskClick,
4243
// Epic handlers
4344
onAddEpic,
45+
onAddComment,
4446
}) => {
4547
const [tasks, setTasks] = useState<Task[]>(initialTasks)
4648
const [epics, setEpics] = useState<Epic[]>(initialEpics)
@@ -112,11 +114,13 @@ export const KanbanBoardView: React.FC<KanbanBoardProps> = ({
112114
onAddTask?.(newTask)
113115
}
114116

115-
const handleUpdateTask = async (taskId: string, updates: Partial<Task>): Promise<void> => {
117+
const handleUpdateTask = async (taskId: string, updates: Partial<Task>): Promise<Task> => {
116118
setTasks((prev) => prev.map((task) => (task.id === taskId ? { ...task, ...updates } : task)))
117119
if (onUpdateTask) {
118-
await onUpdateTask(taskId, updates)
120+
return await onUpdateTask(taskId, updates)
119121
}
122+
123+
return tasks.find((task) => task.id === taskId) as Task
120124
}
121125

122126
const handleDeleteTask = async (taskId: string): Promise<void> => {
@@ -236,11 +240,13 @@ export const KanbanBoardView: React.FC<KanbanBoardProps> = ({
236240
<TaskDetailsModal
237241
isOpen={!!selectedTask}
238242
onClose={() => setSelectedTask(null)}
239-
task={selectedTask}
243+
initialTask={selectedTask}
240244
epics={epics}
241245
sprints={sprints}
242246
onUpdateTask={handleUpdateTask}
243247
onDeleteTask={handleDeleteTask}
248+
colleagues={[...colleagues, ...users]}
249+
onAddComment={onAddComment}
244250
/>
245251
)}
246252
</>

src/components/Projects/PlanningView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ export const PlanningView: React.FC<PlanningViewProps> = ({
150150
<div className="space-y-2">
151151
<div className="flex items-start justify-between">
152152
<h4 className="font-medium text-sm text-foreground line-clamp-1 select-none pointer-events-none">
153-
{task.title}
153+
{task.name}
154154
</h4>
155155
<Badge
156156
className={`text-xs select-none pointer-events-none ${getPriorityColor(

src/components/Projects/ProjectPage.tsx

Lines changed: 84 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
"use client"
1+
'use client'
22

3-
import { useState } from "react"
4-
import { motion, AnimatePresence } from "motion/react"
5-
import { DigitalColleageusLayout } from "../DigitalColleagues/DigitalColleageusLayout"
6-
import { type BusinessUnit } from "../DigitalColleagues/types"
7-
import {
8-
mockSidebarItems,
9-
mockNotifications,
10-
} from "../DigitalColleagues/test-data"
3+
import { useState } from 'react'
4+
import { motion, AnimatePresence } from 'motion/react'
5+
import { DigitalColleageusLayout } from '../DigitalColleagues/DigitalColleageusLayout'
6+
import { type BusinessUnit } from '../DigitalColleagues/types'
7+
import { mockSidebarItems, mockNotifications } from '../DigitalColleagues/test-data'
118

12-
import type { App, RecentFile } from "../DigitalColleagues/types"
13-
import type { Epic, Sprint, Project, Task } from "@/components/Projects/ProjectView"
9+
import type { App, RecentFile } from '../DigitalColleagues/types'
10+
import type { Epic, Sprint, Project, Task } from '@/components/Projects/ProjectView'
1411

15-
import ProjectView from "./ProjectView"
12+
import ProjectView from './ProjectView'
1613
const AnimatedCircles = () => (
1714
<motion.div
1815
animate={{ rotate: 360 }}
19-
transition={{ duration: 50, repeat: Number.POSITIVE_INFINITY, ease: "linear" }}
16+
transition={{ duration: 50, repeat: Number.POSITIVE_INFINITY, ease: 'linear' }}
2017
className="relative h-40 w-40"
2118
>
2219
<div className="absolute inset-0 rounded-full bg-white/10 backdrop-blur-md" />
@@ -29,42 +26,43 @@ const AnimatedCircles = () => (
2926

3027
interface HomeProps {
3128
title?: string
32-
businessUnits: BusinessUnit[]
29+
businessUnits: BusinessUnit[]
3330

34-
projects: Project[];
35-
epics: Epic[];
36-
sprints: Sprint[];
37-
tasks: Task[];
38-
currentView: 'kanban' | 'planning' | 'documentation' | 'epics';
39-
// Task handlers
40-
onAddTask?: (newTask: Omit<Task, 'id' | 'createdAt'>) => void;
41-
onUpdateTask?: (taskId: string, updates: Partial<Task>) => void;
42-
onDeleteTask?: (taskId: string) => void;
43-
onTaskClick?: (task: Task) => void;
44-
// Epic handlers
45-
onAddEpic?: () => void;
46-
onUpdateEpic?: (epicId: string, updates: Partial<Epic>) => void;
47-
onDeleteEpic?: (epicId: string) => void;
48-
onAddTaskToEpic?: (epicId: string) => void;
49-
// Sprint handlers
50-
onAddSprint?: (sprint: Omit<Sprint, 'id'>) => void;
51-
onUpdateSprint?: (sprintId: string, updates: Partial<Sprint>) => void;
52-
onDeleteSprint?: (sprintId: string) => void;
53-
// Project handlers
54-
onAddProject?: (project: Omit<Project, 'id'>) => void;
55-
onUpdateProject?: (projectId: string, updates: Partial<Project>) => void;
56-
onDeleteProject?: (projectId: string) => void;
57-
// View handlers
58-
onViewChange?: (view: 'kanban' | 'planning' | 'tasks' | 'files' | 'epics') => void;
59-
mobileMenuOpen?: boolean;
60-
onToggleMobileMenu?: () => void;
61-
// Team handlers
62-
onTeamClick?: (teamId: string) => void;
63-
onTeamChange?: (team: any) => void;
64-
onCopilotClick?: () => void;
31+
projects: Project[]
32+
epics: Epic[]
33+
sprints: Sprint[]
34+
tasks: Task[]
35+
currentView: 'kanban' | 'planning' | 'documentation' | 'epics'
36+
// Task handlers
37+
onAddTask?: (newTask: Omit<Task, 'id' | 'createdAt'>) => void
38+
onUpdateTask?: (taskId: string, updates: Partial<Task>) => Promise<Task>
39+
onDeleteTask?: (taskId: string) => void
40+
onTaskClick?: (task: Task) => void
41+
// Epic handlers
42+
onAddEpic?: () => void
43+
onUpdateEpic?: (epicId: string, updates: Partial<Epic>) => void
44+
onDeleteEpic?: (epicId: string) => void
45+
onAddTaskToEpic?: (epicId: string) => void
46+
// Sprint handlers
47+
onAddSprint?: (sprint: Omit<Sprint, 'id'>) => void
48+
onUpdateSprint?: (sprintId: string, updates: Partial<Sprint>) => void
49+
onDeleteSprint?: (sprintId: string) => void
50+
// Project handlers
51+
onAddProject?: (project: Omit<Project, 'id'>) => void
52+
onUpdateProject?: (projectId: string, updates: Partial<Project>) => void
53+
onDeleteProject?: (projectId: string) => void
54+
// View handlers
55+
onViewChange?: (view: 'kanban' | 'planning' | 'tasks' | 'files' | 'epics') => void
56+
mobileMenuOpen?: boolean
57+
onToggleMobileMenu?: () => void
58+
// Team handlers
59+
onTeamClick?: (teamId: string) => void
60+
onTeamChange?: (team: any) => void
61+
onCopilotClick?: () => void
6562
}
6663

67-
export default function ProjectPage({ title = "",
64+
export default function ProjectPage({
65+
title = '',
6866
projects,
6967
businessUnits,
7068
epics,
@@ -97,75 +95,74 @@ export default function ProjectPage({ title = "",
9795
onTeamClick,
9896
onTeamChange,
9997
onCopilotClick,
100-
}: HomeProps) {
101-
const [activeTab, setActiveTab] = useState("projects")
98+
}: HomeProps) {
99+
const [activeTab, setActiveTab] = useState('projects')
102100
const [currentBusinessUnit, setCurrentBusinessUnit] = useState<BusinessUnit>(businessUnits[0]) // Default to Design
103101

104102
// Mock handlers
105103
const handleAppOpen = (app: App) => {
106-
console.log("Opening app:", app.name)
104+
console.log('Opening app:', app.name)
107105
}
108106

109107
const handleAppFavorite = (app: App) => {
110-
console.log("Favoriting app:", app.name)
108+
console.log('Favoriting app:', app.name)
111109
}
112110

113111
const handleFileClick = (file: RecentFile) => {
114-
console.log("Opening file:", file.name)
112+
console.log('Opening file:', file.name)
115113
}
116114

117115
const handleFileShare = (file: RecentFile) => {
118-
console.log("Sharing file:", file.name)
116+
console.log('Sharing file:', file.name)
119117
}
120118

121119
const handleProjectOpen = (project: Project) => {
122-
console.log("Opening project:", project.name)
120+
console.log('Opening project:', project.name)
123121
}
124122

125123
const handleProjectShare = (project: Project) => {
126-
console.log("Sharing project:", project.name)
124+
console.log('Sharing project:', project.name)
127125
}
128126

129127
const handleBusinessUnitChange = (unit: BusinessUnit) => {
130128
// setCurrentBusinessUnit(unit)
131-
console.log("Business unit changed to:", unit.name)
129+
console.log('Business unit changed to:', unit.name)
132130
}
133131

134132
const renderTabContent = () => {
135133
switch (activeTab) {
136-
137-
case "projects":
134+
case 'projects':
138135
return (
139-
<ProjectView
140-
initialProjects={projects}
141-
initialEpics={epics}
142-
initialSprints={sprints}
143-
initialTasks={tasks}
144-
// Task handlers
145-
onAddTask={onAddTask}
146-
onUpdateTask={onUpdateTask}
147-
onDeleteTask={onDeleteTask}
148-
onTaskClick={onTaskClick}
149-
// Epic handlers
150-
onAddEpic={onAddEpic}
151-
onUpdateEpic={onUpdateEpic}
152-
onDeleteEpic={onDeleteEpic}
153-
onAddTaskToEpic={onAddTaskToEpic}
154-
// Sprint handlers
155-
onAddSprint={onAddSprint}
156-
onUpdateSprint={onUpdateSprint}
157-
onDeleteSprint={onDeleteSprint}
158-
// Project handlers
159-
onAddProject={onAddProject}
160-
onUpdateProject={onUpdateProject}
161-
onDeleteProject={onDeleteProject}
162-
// View handlers
163-
onViewChange={onViewChange}
164-
onToggleMobileMenu={onToggleMobileMenu}
165-
// Team handlers
166-
onTeamClick={onTeamClick}
167-
onTeamChange={onTeamChange}
168-
onCopilotClick={onCopilotClick}
136+
<ProjectView
137+
initialProjects={projects}
138+
initialEpics={epics}
139+
initialSprints={sprints}
140+
initialTasks={tasks}
141+
// Task handlers
142+
onAddTask={onAddTask}
143+
onUpdateTask={onUpdateTask}
144+
onDeleteTask={onDeleteTask}
145+
onTaskClick={onTaskClick}
146+
// Epic handlers
147+
onAddEpic={onAddEpic}
148+
onUpdateEpic={onUpdateEpic}
149+
onDeleteEpic={onDeleteEpic}
150+
onAddTaskToEpic={onAddTaskToEpic}
151+
// Sprint handlers
152+
onAddSprint={onAddSprint}
153+
onUpdateSprint={onUpdateSprint}
154+
onDeleteSprint={onDeleteSprint}
155+
// Project handlers
156+
onAddProject={onAddProject}
157+
onUpdateProject={onUpdateProject}
158+
onDeleteProject={onDeleteProject}
159+
// View handlers
160+
onViewChange={onViewChange}
161+
onToggleMobileMenu={onToggleMobileMenu}
162+
// Team handlers
163+
onTeamClick={onTeamClick}
164+
onTeamChange={onTeamChange}
165+
onCopilotClick={onCopilotClick}
169166
/>
170167
)
171168
default:

0 commit comments

Comments
 (0)