feat: MySQL integration, Docker setup, drag-and-drop kanban

This commit is contained in:
tusuii
2026-02-16 10:20:27 +05:30
parent 5d8af1f173
commit 892a2ceba1
24 changed files with 919 additions and 196 deletions

View File

@@ -7,12 +7,13 @@ interface ListProps {
tasks: Task[]; currentUser: User; onTaskClick: (t: Task) => void;
filterUser: string | null; searchQuery: string;
onToggleDone: (taskId: string) => void;
users: User[];
}
type SortKey = 'dueDate' | 'priority' | 'status' | 'assignee';
const PRIO_ORDER = { critical: 0, high: 1, medium: 2, low: 3 };
export function ListView({ tasks, currentUser, onTaskClick, filterUser, searchQuery, onToggleDone }: ListProps) {
export function ListView({ tasks, currentUser, onTaskClick, filterUser, searchQuery, onToggleDone, users }: ListProps) {
const [sortBy, setSortBy] = useState<SortKey>('dueDate');
const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc');
const [menuOpen, setMenuOpen] = useState<string | null>(null);
@@ -53,14 +54,14 @@ export function ListView({ tasks, currentUser, onTaskClick, filterUser, searchQu
</thead>
<tbody>
{sorted.map(t => {
const u = getUserById(t.assignee);
const u = getUserById(users, t.assignee);
const due = new Date(t.dueDate + 'T00:00:00');
const overdue = due < new Date() && t.status !== 'done';
return (
<tr key={t.id}>
<td><input type="checkbox" checked={t.status === 'done'} onChange={() => onToggleDone(t.id)} /></td>
<td onClick={() => onTaskClick(t)} style={{ cursor: 'pointer' }}>{t.title}</td>
<td><div style={{ display: 'flex', alignItems: 'center', gap: 6 }}><Avatar userId={t.assignee} size={20} />{u?.name}</div></td>
<td><div style={{ display: 'flex', alignItems: 'center', gap: 6 }}><Avatar userId={t.assignee} size={20} users={users} />{u?.name}</div></td>
<td><PriorityBadge level={t.priority} /></td>
<td><StatusBadge status={t.status} /></td>
<td style={{ color: overdue ? '#ef4444' : undefined }}>{due.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}</td>