import React, { useState, useEffect } from 'react'; import { X, Check, Calendar, Trash2, FileText, Plus, CheckSquare, Clock, Layers, Hash, AlertTriangle, Flame, ChevronRight, Folder, } from 'lucide-react'; import { Thought, SubTask, TaskList, KanbanColumn } from '../../lib/types'; import { triggerHaptic } from '../../lib/api'; interface TaskDetailModalProps { task: Thought | null; isOpen: boolean; onClose: () => void; activeColumns: KanbanColumn[]; taskLists: TaskList[]; onUpdateTitle: (task: Thought, newTitle: string) => Promise; onUpdateStatus: (task: Thought, newStatus: string) => Promise; onUpdatePriority: (task: Thought, newPriority: string) => Promise; onUpdateDueDate: (task: Thought, newDueDate: string) => Promise; onUpdateTaskList: (task: Thought, newListId: string) => Promise; onUpdateNotes: (task: Thought, newNotes: string) => Promise; onUpdateTags?: (task: Thought, newTags: string[]) => Promise; onToggleSubtask: (task: Thought, subtaskId: string) => Promise; onAddSubtask: (task: Thought, title: string) => Promise; onDeleteSubtask: (task: Thought, subtaskId: string) => Promise; onConvertToDoc: (task: Thought) => void; onDeleteTask: (taskId: string) => void; } export const TaskDetailModal: React.FC = ({ task, isOpen, onClose, activeColumns, taskLists, onUpdateTitle, onUpdateStatus, onUpdatePriority, onUpdateDueDate, onUpdateTaskList, onUpdateNotes, onUpdateTags, onToggleSubtask, onAddSubtask, onDeleteSubtask, onConvertToDoc, onDeleteTask, }) => { if (!isOpen || !task) return null; const [titleDraft, setTitleDraft] = useState(task.content); const [isEditingTitle, setIsEditingTitle] = useState(false); const [isEditingNotes, setIsEditingNotes] = useState(false); const [notesDraft, setNotesDraft] = useState(task.notes || ''); const [newSubtaskTitle, setNewSubtaskTitle] = useState(''); const [newTagDraft, setNewTagDraft] = useState(''); useEffect(() => { setTitleDraft(task.content); setNotesDraft(task.notes || ''); setIsEditingTitle(false); setIsEditingNotes(false); }, [task.id]); // Handle escape key to close useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { if (isEditingNotes) { setIsEditingNotes(false); } else if (isEditingTitle) { setIsEditingTitle(false); } else { onClose(); } } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [onClose, isEditingNotes, isEditingTitle]); const handleTitleSubmit = async () => { const trimmed = titleDraft.trim(); if (!trimmed) { setTitleDraft(task.content); setIsEditingTitle(false); return; } if (trimmed !== task.content) { await onUpdateTitle(task, trimmed); } setIsEditingTitle(false); }; const handleNotesSubmit = async () => { await onUpdateNotes(task, notesDraft); setIsEditingNotes(false); }; const handleAddSubtaskSubmit = async (e: React.FormEvent) => { e.preventDefault(); const trimmed = newSubtaskTitle.trim(); if (!trimmed) return; await onAddSubtask(task, trimmed); setNewSubtaskTitle(''); }; const handleAddTagSubmit = async (e: React.FormEvent) => { e.preventDefault(); let cleaned = newTagDraft.trim().replace(/^#+/, '').toLowerCase(); if (!cleaned) return; const currentTags = Array.isArray(task.tags) ? [...task.tags] : []; if (!currentTags.includes(cleaned)) { const updated = [...currentTags, cleaned]; if (onUpdateTags) { await onUpdateTags(task, updated); } else { await onUpdateTitle(task, `${task.content} #${cleaned}`); } } setNewTagDraft(''); }; const handleRemoveTag = async (tagToRemove: string) => { const currentTags = Array.isArray(task.tags) ? [...task.tags] : []; const updated = currentTags.filter((t) => t !== tagToRemove); if (onUpdateTags) { await onUpdateTags(task, updated); } }; const handleQuickDueDate = (daysOffset: number | null) => { if (daysOffset === null) { onUpdateDueDate(task, ''); return; } const d = new Date(); d.setDate(d.getDate() + daysOffset); const dateStr = d.toISOString().split('T')[0]; onUpdateDueDate(task, dateStr); }; const currentColumn = activeColumns.find((c) => c.id === task.kanbanStatus) || (task.isCompleted ? activeColumns.find((c) => c.isDone) || activeColumns[activeColumns.length - 1] : activeColumns.find((c) => !c.isDone) || activeColumns[0]); const subtasks = Array.isArray(task.subtasks) ? task.subtasks : []; const completedSubtasks = subtasks.filter((s) => s.isCompleted).length; const subtasksPercent = subtasks.length > 0 ? Math.round((completedSubtasks / subtasks.length) * 100) : 0; return (
e.stopPropagation()} > {/* Top Header */}
{task.isCompleted ? 'Erledigte Aufgabe' : 'Aufgabe bearbeiten'}
{/* Scrollable Body */}
{/* Task Title */}
{isEditingTitle ? (