import ProjectLayout from '../../../../../ProjectManagement/resources/js/Layouts/ProjectLayout'; import { Card, CardContent, CardHeader, CardTitle } from '@/Components/ui/card'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/Components/ui/table'; import { Button } from '@/Components/ui/button'; import { Badge } from '@/Components/ui/badge'; import { ChevronDown, ChevronUp, Play, CheckCircle2, Trash2, Download, Upload, Loader2, Plus, Package } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/Components/ui/dialog'; import { Input } from '@/Components/ui/input'; import { Form, FormField } from '@/Components/ui/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/Components/ui/select'; import { useForm, router } from '@inertiajs/react'; import { Fragment, useState, useRef, FormEvent, useMemo } from 'react'; import MaterialPickerModal from '@/Components/MaterialPickerModal'; import KanbanBoard from '../../Components/KanbanBoard'; import { LayoutList, Kanban, Activity as ActivityIcon } from 'lucide-react'; import { Textarea } from '@/Components/ui/textarea'; export default function Tasks({ project, employees, availableMaterials, delayReasons, weatherConditions }: any) { const [addTaskOpen, setAddTaskOpen] = useState(false); const [expandedTask, setExpandedTask] = useState(null); const [addMaterialTaskId, setAddMaterialTaskId] = useState(null); const [addDelayTaskId, setAddDelayTaskId] = useState(null); const [importOpen, setImportOpen] = useState(false); const [importUploading, setImportUploading] = useState(false); const [viewMode, setViewMode] = useState<'board' | 'table'>('board'); const [detailsTaskUlid, setDetailsTaskUlid] = useState(null); const importRef = useRef(null); const taskForm = useForm({ name: '', description: '', assigned_users: [] as string[], labor_cost: '', estimated_hours: '', start_date: '', end_date: '', }); const employeeSelectItems = useMemo(() => employees?.map((e: any) => ({ value: e.ulid, label: e.name })) || [], [employees]); const formatCurrency = (v: string) => new Intl.NumberFormat('en-PH', { style: 'currency', currency: 'PHP' }).format(Number(v)); const statusLabel = (s: string) => s.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()); const handleAddTask = (e: FormEvent) => { e.preventDefault(); taskForm.post(route('projects.tasks.store', project.ulid), { onSuccess: () => { taskForm.reset(); setAddTaskOpen(false); }, }); }; const handleTaskTransition = (taskUlid: string, status: string) => { router.patch(route('projects.tasks.transition', [project.ulid, taskUlid]), { status }); }; const handleDeleteTask = (taskUlid: string) => { if (confirm('Delete this task?')) { router.delete(route('projects.tasks.destroy', [project.ulid, taskUlid])); } }; const handleUpdateMaterial = (taskUlid: string, tmUlid: string, field: string, value: string) => { router.put(route('projects.tasks.materials.update', [project.ulid, taskUlid, tmUlid]), { [field]: value, }, { preserveScroll: true }); }; const handleDeleteMaterial = (taskUlid: string, tmUlid: string) => { if (confirm('Remove this material from the task?')) { router.delete(route('projects.tasks.materials.destroy', [project.ulid, taskUlid, tmUlid]), { preserveScroll: true }); } }; const handleReorder = (reorderedTasks: any[]) => { router.post(route('projects.tasks.reorder', project.ulid), { tasks: reorderedTasks }, { preserveScroll: true, preserveState: true }); }; const detailsTask = detailsTaskUlid ? project?.tasks?.find((t: any) => t.ulid === detailsTaskUlid) : null; if (!project) { return ; } return (
Tasks
{ setImportOpen(open); if (!open && importRef.current) importRef.current.value = ''; }}> Import Tasks from Excel
{ e.preventDefault(); const file = importRef.current?.files?.[0]; if (!file) return; setImportUploading(true); const formData = new FormData(); formData.append('file', file); router.post(route('projects.tasks.import', project.ulid), { file }, { forceFormData: true, onSuccess: () => { setImportOpen(false); if (importRef.current) importRef.current.value = ''; }, onFinish: () => setImportUploading(false), }); }} className="space-y-4">
Add Task
taskForm.setData('name', e.target.value)} />