import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Card } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Calendar } from '@/components/ui/calendar'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Plus, Calendar as CalendarIcon, Clock, Copy, Play, Tag, Edit, Trash2, Palette, FileText, ArrowLeft } from 'lucide-react'; import { Label, Task } from '@shared/schema'; import TaskDetailsModal from '@/components/TaskDetailsModal'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { apiRequest } from '@/lib/queryClient'; // Helper function to get today's date at start of day for proper date comparison const getStartOfToday = () => { const today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate()); }; // Helper function to convert ProjectTask to global Task format const convertProjectTaskToTask = (projectTask: ProjectTask, projectId: string): Task => { return { id: `project-${projectId}-task-${projectTask.id}`, // Generate unique ID title: projectTask.title, description: projectTask.description || null, status: projectTask.status, priority: projectTask.priority, dueDate: null, // Projects tasks don't have due dates by default timeTracked: projectTask.timeTracked || 0, isTracking: false, projectId: projectId, notes: projectTask.notes || null, labelId: projectTask.labelId || null }; }; interface TimeEntry { id: string; date: Date; timeSpent: number; // in minutes description?: string; } interface ProjectTask { id: string; title: string; description?: string; priority: 'low' | 'medium' | 'high'; status: 'todo' | 'inProgress' | 'done'; estimatedHours?: number; labelId?: string; notes?: string; timeTracked?: number; // in minutes timeEntries?: TimeEntry[]; } interface Project { id: string; name: string; description?: string; status: 'planning' | 'active' | 'finished'; tasks: ProjectTask[]; startDate?: Date; endDate?: Date; plannedEndDate?: Date; createdAt: Date; } interface ProjectTemplateProps { onCreateFromTemplate?: (templateId: string, startDate: Date, projectName: string) => void; onCreateTemplate?: (template: any) => void; onCreateTasks?: (tasks: Task[]) => void; onNavigateToSettings?: () => void; } const defaultProjects: Project[] = [ { id: '1', name: 'Website Redesign', description: 'Complete redesign of company website', status: 'active', startDate: new Date(), createdAt: new Date(), tasks: [ { id: '1', title: 'Research competitors', priority: 'high', status: 'done', estimatedHours: 4 }, { id: '2', title: 'Create wireframes', priority: 'high', status: 'inProgress', estimatedHours: 8 }, { id: '3', title: 'Design mockups', priority: 'medium', status: 'todo', estimatedHours: 12 }, { id: '4', title: 'Frontend development', priority: 'high', status: 'todo', estimatedHours: 40 } ] }, { id: '2', name: 'Mobile App Launch', description: 'Launch new mobile application', status: 'planning', createdAt: new Date(), tasks: [ { id: '1', title: 'Define requirements', priority: 'high', status: 'todo', estimatedHours: 6 }, { id: '2', title: 'Create user stories', priority: 'medium', status: 'todo', estimatedHours: 8 }, { id: '3', title: 'Design UI/UX', priority: 'high', status: 'todo', estimatedHours: 20 } ] }, { id: '3', name: 'Blog Platform', description: 'Personal blog with CMS', status: 'finished', startDate: new Date('2024-01-01'), endDate: new Date('2024-03-01'), createdAt: new Date('2024-01-01'), tasks: [ { id: '1', title: 'Setup infrastructure', priority: 'high', status: 'done', estimatedHours: 8 }, { id: '2', title: 'Develop backend API', priority: 'high', status: 'done', estimatedHours: 32 }, { id: '3', title: 'Create admin panel', priority: 'medium', status: 'done', estimatedHours: 16 }, { id: '4', title: 'Deploy and test', priority: 'high', status: 'done', estimatedHours: 4 } ] } ]; export default function ProjectTemplate({ onCreateFromTemplate, onCreateTemplate, onCreateTasks, onNavigateToSettings }: ProjectTemplateProps) { const { t } = useTranslation(); const [projects, setProjects] = useState(defaultProjects); const [selectedProject, setSelectedProject] = useState(null); const [draggedProject, setDraggedProject] = useState(null); const [isCreateProjectOpen, setIsCreateProjectOpen] = useState(false); const [isEditProjectOpen, setIsEditProjectOpen] = useState(false); const [newProjectName, setNewProjectName] = useState(''); const [newProjectDescription, setNewProjectDescription] = useState(''); const [newPlannedEndDate, setNewPlannedEndDate] = useState(); const [isPlannedEndDateCalendarOpen, setIsPlannedEndDateCalendarOpen] = useState(false); const [isRestartProjectOpen, setIsRestartProjectOpen] = useState(false); const [restartingProject, setRestartingProject] = useState(null); const [newEndDate, setNewEndDate] = useState(); const [clearHistory, setClearHistory] = useState(false); const [isEndDateCalendarOpen, setIsEndDateCalendarOpen] = useState(false); const [closedProjectsFilter, setClosedProjectsFilter] = useState(''); // Task management state const [projectTasks, setProjectTasks] = useState([]); const [isEditingTask, setIsEditingTask] = useState(false); const [editingTaskIndex, setEditingTaskIndex] = useState(null); const [taskForm, setTaskForm] = useState>({}); // Label management state const [isLabelDialogOpen, setIsLabelDialogOpen] = useState(false); const [editingLabel, setEditingLabel] = useState