"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import { Card, CardHeader, CardContent } from "@/components/ui/Card"; import Button from "@/components/ui/Button"; import Badge from "@/components/ui/Badge"; import TaskStatusDropdownSimple from "@/components/TaskStatusDropdownSimple"; import { Input } from "@/components/ui/Input"; import { formatDistanceToNow, parseISO } from "date-fns"; import PageContainer from "@/components/ui/PageContainer"; import PageHeader from "@/components/ui/PageHeader"; import SearchBar from "@/components/ui/SearchBar"; import FilterBar from "@/components/ui/FilterBar"; import { LoadingState } from "@/components/ui/States"; export default function ProjectTasksPage() { const [allTasks, setAllTasks] = useState([]); const [filteredTasks, setFilteredTasks] = useState([]); const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const [priorityFilter, setPriorityFilter] = useState("all"); const [loading, setLoading] = useState(true); useEffect(() => { const fetchAllTasks = async () => { try { const res = await fetch("/api/all-project-tasks"); const tasks = await res.json(); setAllTasks(tasks); setFilteredTasks(tasks); } catch (error) { console.error("Failed to fetch all project tasks:", error); } finally { setLoading(false); } }; fetchAllTasks(); }, []); // Filter tasks based on search term and filters useEffect(() => { let filtered = allTasks; // Apply search filter if (searchTerm.trim()) { const searchLower = searchTerm.toLowerCase(); filtered = filtered.filter((task) => { return ( task.task_name?.toLowerCase().includes(searchLower) || task.project_name?.toLowerCase().includes(searchLower) || task.wp?.toLowerCase().includes(searchLower) || task.plot?.toLowerCase().includes(searchLower) ); }); } // Apply status filter if (statusFilter !== "all") { filtered = filtered.filter((task) => task.status === statusFilter); } // Apply priority filter if (priorityFilter !== "all") { filtered = filtered.filter((task) => task.priority === priorityFilter); } setFilteredTasks(filtered); }, [searchTerm, statusFilter, priorityFilter, allTasks]); const handleStatusChange = async (taskId, newStatus) => { try { const res = await fetch(`/api/project-tasks/${taskId}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ status: newStatus }), }); if (res.ok) { // Update the task in the local state setAllTasks((prevTasks) => prevTasks.map((task) => task.id === taskId ? { ...task, status: newStatus } : task ) ); } else { alert("Failed to update task status"); } } catch (error) { alert("Error updating task status"); } }; const handleDeleteTask = async (taskId) => { if (!confirm("Are you sure you want to delete this task?")) return; try { const res = await fetch(`/api/project-tasks/${taskId}`, { method: "DELETE", }); if (res.ok) { // Remove the task from local state setAllTasks((prevTasks) => prevTasks.filter((task) => task.id !== taskId) ); } else { alert("Failed to delete task"); } } catch (error) { alert("Error deleting task"); } }; const getPriorityVariant = (priority) => { switch (priority) { case "high": return "danger"; case "normal": return "secondary"; case "low": return "success"; default: return "secondary"; } }; const statusCounts = { all: allTasks.length, pending: allTasks.filter((task) => task.status === "pending").length, in_progress: allTasks.filter((task) => task.status === "in_progress") .length, completed: allTasks.filter((task) => task.status === "completed").length, }; if (loading) { return ( ); } const filterOptions = [ { label: "Status", value: statusFilter, onChange: (e) => setStatusFilter(e.target.value), options: [ { value: "all", label: "All" }, { value: "pending", label: "Pending" }, { value: "in_progress", label: "In Progress" }, { value: "completed", label: "Completed" }, ], }, { label: "Priority", value: priorityFilter, onChange: (e) => setPriorityFilter(e.target.value), options: [ { value: "all", label: "All" }, { value: "high", label: "High" }, { value: "normal", label: "Normal" }, { value: "low", label: "Low" }, ], }, ]; return ( setSearchTerm(e.target.value)} placeholder="Search tasks by name, project, WP, or plot..." resultsCount={filteredTasks.length} resultsText="tasks" />{" "} {/* Stats Cards */}

Total Tasks

{statusCounts.all}

Pending

{statusCounts.pending}

In Progress

{statusCounts.in_progress}

Completed

{statusCounts.completed}

{" "}
{/* Tasks List */} {filteredTasks.length === 0 ? (

No tasks found

{searchTerm || statusFilter !== "all" || priorityFilter !== "all" ? "Try adjusting your filters to see more tasks" : "No tasks have been created yet"}

) : (
{filteredTasks.map((task) => (
{" "}

{task.task_name}

{" "} {task.priority} {task.task_type === "template" && ( Template )}

Project

{task.project_name}

{task.wp && (

WP

{task.wp}

)} {task.plot && (

Plot

{task.plot}

)}
Added{" "} {formatDistanceToNow(parseISO(task.date_added), { addSuffix: true, })} {task.max_wait_days > 0 && ( Max wait: {task.max_wait_days} days )}
{" "}
))}{" "}
)}
); }