feat: add drag-and-drop to Kanban board

- Implement native HTML5 Drag and Drop API on task cards
- Cards show grab cursor and reduce opacity while dragging
- Drop zones highlight with indigo glow and pulse animation
- Moving a task updates its status and logs an activity entry
- Added handleMoveTask to App.tsx with STATUS_LABELS import
- CSS: drag-over styles, pulse keyframes, grab/grabbing cursors
This commit is contained in:
tusuii
2026-02-15 11:43:17 +05:30
parent e46d8773ee
commit 769a64f612
3 changed files with 1932 additions and 256 deletions

View File

@@ -1,5 +1,5 @@
import { useState } from 'react';
import { SEED_TASKS } from './data';
import { SEED_TASKS, STATUS_LABELS } from './data';
import type { Task, User, Status } from './data';
import { LoginPage } from './Login';
import { Sidebar } from './Sidebar';
@@ -80,6 +80,13 @@ export default function App() {
setTasks(prev => prev.map(t => t.id === taskId ? { ...t, status: t.status === 'done' ? 'todo' : 'done' as Status } : t));
};
const handleMoveTask = (taskId: string, newStatus: Status) => {
setTasks(prev => prev.map(t => t.id === taskId ? {
...t, status: newStatus,
activity: [...t.activity, { id: `a${Date.now()}`, text: `🔄 ${currentUser.name} moved task to ${STATUS_LABELS[newStatus]}`, timestamp: new Date().toISOString() }]
} : t));
};
const displayPage = VIEW_PAGES.includes(activePage) ? activeView : activePage;
const filteredMyTasks = tasks.filter(t => t.assignee === currentUser.id);
@@ -100,7 +107,8 @@ export default function App() {
)}
{displayPage === 'kanban' && (
<KanbanBoard tasks={tasks} currentUser={currentUser} onTaskClick={handleTaskClick}
onAddTask={handleKanbanAdd} filterUser={filterUser} searchQuery={searchQuery} />
onAddTask={handleKanbanAdd} filterUser={filterUser} searchQuery={searchQuery}
onMoveTask={handleMoveTask} />
)}
{displayPage === 'list' && (
<ListView tasks={tasks} currentUser={currentUser} onTaskClick={handleTaskClick}