import React, { useState, useCallback, useRef, useEffect } from 'react'; import { useDrag, useDrop } from 'react-dnd'; import { Check, Trash2, Edit, Tag, User, Bot, Clipboard, Save, Plus } from 'lucide-react'; import { useToast } from '../../contexts/ToastContext'; import { DeleteConfirmModal } from '../common/DeleteConfirmModal'; import { projectService } from '../../services/projectService'; import { ItemTypes, getAssigneeIcon, getAssigneeGlow, getOrderColor, getOrderGlow } from '../../lib/task-utils'; import { DraggableTaskCard } from './DraggableTaskCard'; export interface Task { id: string; title: string; description: string; status: 'todo' | 'doing' | 'review' | 'done'; assignee: { name: 'User' | 'Archon' | 'AI IDE Agent'; avatar: string; }; feature: string; featureColor: string; task_order: number; } interface TaskTableViewProps { tasks: Task[]; onTaskView: (task: Task) => void; onTaskComplete: (taskId: string) => void; onTaskDelete: (task: Task) => void; onTaskReorder: (taskId: string, newOrder: number, status: Task['status']) => void; onTaskCreate?: (task: Omit) => Promise; onTaskUpdate?: (taskId: string, updates: Partial) => Promise; } const getAssigneeGlassStyle = (assigneeName: 'User' | 'Archon' | 'AI IDE Agent') => { switch (assigneeName) { case 'User': return 'backdrop-blur-md bg-gradient-to-b from-white/80 to-white/60 dark:from-white/10 dark:to-black/30 border-blue-400 dark:border-blue-500'; // blue glass case 'AI IDE Agent': return 'backdrop-blur-md bg-gradient-to-b from-white/80 to-white/60 dark:from-white/10 dark:to-black/30 border-emerald-400 dark:border-emerald-500'; // emerald green glass (like toggle) case 'Archon': return 'backdrop-blur-md bg-gradient-to-b from-white/80 to-white/60 dark:from-white/10 dark:to-black/30 border-pink-400 dark:border-pink-500'; // pink glass default: return 'backdrop-blur-md bg-gradient-to-b from-white/80 to-white/60 dark:from-white/10 dark:to-black/30 border-blue-400 dark:border-blue-500'; } }; // Get glass morphism style based on task order (lower = higher priority = warmer color) const getOrderGlassStyle = (order: number) => { if (order <= 3) return 'backdrop-blur-md bg-gradient-to-b from-white/80 to-white/60 dark:from-white/10 dark:to-black/30 border-rose-400 dark:border-rose-500'; // red glass if (order <= 6) return 'backdrop-blur-md bg-gradient-to-b from-white/80 to-white/60 dark:from-white/10 dark:to-black/30 border-orange-400 dark:border-orange-500'; // orange glass if (order <= 10) return 'backdrop-blur-md bg-gradient-to-b from-white/80 to-white/60 dark:from-white/10 dark:to-black/30 border-blue-400 dark:border-blue-500'; // blue glass return 'backdrop-blur-md bg-gradient-to-b from-white/80 to-white/60 dark:from-white/10 dark:to-black/30 border-emerald-400 dark:border-emerald-500'; // green glass }; const getOrderTextColor = (order: number) => { if (order <= 3) return 'text-rose-500 dark:text-rose-400'; // red text if (order <= 6) return 'text-orange-500 dark:text-orange-400'; // orange text if (order <= 10) return 'text-blue-500 dark:text-blue-400'; // blue text return 'text-emerald-500 dark:text-emerald-400'; // green text }; // Helper function to reorder tasks properly const reorderTasks = (tasks: Task[], fromIndex: number, toIndex: number): Task[] => { const result = [...tasks]; const [movedTask] = result.splice(fromIndex, 1); result.splice(toIndex, 0, movedTask); // Update task_order to be sequential (1, 2, 3, ...) return result.map((task, index) => ({ ...task, task_order: index + 1 })); }; // Inline editable cell component interface EditableCellProps { value: string; onSave: (value: string) => void; type?: 'text' | 'textarea' | 'select'; options?: string[]; placeholder?: string; isEditing: boolean; onEdit: () => void; onCancel: () => void; } const EditableCell = ({ value, onSave, type = 'text', options = [], placeholder = '', isEditing, onEdit, onCancel }: EditableCellProps) => { const [editValue, setEditValue] = useState(value); const handleSave = () => { onSave(editValue); }; const handleCancel = () => { setEditValue(value); onCancel(); }; // Handle keyboard events for Tab/Enter to save, Escape to cancel const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === 'Tab') { e.preventDefault(); handleSave(); } else if (e.key === 'Escape') { e.preventDefault(); handleCancel(); } }; // Handle blur to save (when clicking outside) const handleBlur = () => { handleSave(); }; if (!isEditing) { return (
{value || Click to edit}
); } return (
{type === 'select' ? ( ) : type === 'textarea' ? (