"use client"; import { useState } from "react"; import { GanttChart, toGanttTasks } from "@/components/gantt"; import type { GanttTask } from "@/components/gantt"; import { TaskStatus, TaskPriority, type Task } from "@mosaic/shared"; /** * Demo page for Gantt Chart component * * This page demonstrates the GanttChart component with sample data * showing various task states, durations, and interactions. */ export default function GanttDemoPage(): React.ReactElement { // Sample tasks for demonstration const baseTasks: Task[] = [ { id: "task-1", workspaceId: "demo-workspace", title: "Project Planning", description: "Initial project planning and requirements gathering", status: TaskStatus.COMPLETED, priority: TaskPriority.HIGH, dueDate: new Date("2026-02-10"), assigneeId: null, creatorId: "demo-user", projectId: null, parentId: null, sortOrder: 0, metadata: { startDate: "2026-02-01", }, completedAt: new Date("2026-02-09"), createdAt: new Date("2026-02-01"), updatedAt: new Date("2026-02-09"), }, { id: "task-2", workspaceId: "demo-workspace", title: "Design Phase", description: "Create mockups and design system", status: TaskStatus.IN_PROGRESS, priority: TaskPriority.HIGH, dueDate: new Date("2026-02-25"), assigneeId: null, creatorId: "demo-user", projectId: null, parentId: null, sortOrder: 1, metadata: { startDate: "2026-02-11", dependencies: ["task-1"], }, completedAt: null, createdAt: new Date("2026-02-11"), updatedAt: new Date("2026-02-15"), }, { id: "task-3", workspaceId: "demo-workspace", title: "Backend Development", description: "Build API and database", status: TaskStatus.NOT_STARTED, priority: TaskPriority.MEDIUM, dueDate: new Date("2026-03-20"), assigneeId: null, creatorId: "demo-user", projectId: null, parentId: null, sortOrder: 2, metadata: { startDate: "2026-02-20", dependencies: ["task-1"], }, completedAt: null, createdAt: new Date("2026-02-01"), updatedAt: new Date("2026-02-01"), }, { id: "task-4", workspaceId: "demo-workspace", title: "Frontend Development", description: "Build user interface components", status: TaskStatus.NOT_STARTED, priority: TaskPriority.MEDIUM, dueDate: new Date("2026-03-25"), assigneeId: null, creatorId: "demo-user", projectId: null, parentId: null, sortOrder: 3, metadata: { startDate: "2026-02-26", dependencies: ["task-2"], }, completedAt: null, createdAt: new Date("2026-02-01"), updatedAt: new Date("2026-02-01"), }, { id: "task-5", workspaceId: "demo-workspace", title: "Integration Testing", description: "Test all components together", status: TaskStatus.PAUSED, priority: TaskPriority.HIGH, dueDate: new Date("2026-04-05"), assigneeId: null, creatorId: "demo-user", projectId: null, parentId: null, sortOrder: 4, metadata: { startDate: "2026-03-26", dependencies: ["task-3", "task-4"], }, completedAt: null, createdAt: new Date("2026-02-01"), updatedAt: new Date("2026-03-15"), }, { id: "task-6", workspaceId: "demo-workspace", title: "Deployment", description: "Deploy to production", status: TaskStatus.NOT_STARTED, priority: TaskPriority.HIGH, dueDate: new Date("2026-04-10"), assigneeId: null, creatorId: "demo-user", projectId: null, parentId: null, sortOrder: 5, metadata: { startDate: "2026-04-06", dependencies: ["task-5"], }, completedAt: null, createdAt: new Date("2026-02-01"), updatedAt: new Date("2026-02-01"), }, { id: "task-7", workspaceId: "demo-workspace", title: "Documentation", description: "Write user and developer documentation", status: TaskStatus.IN_PROGRESS, priority: TaskPriority.LOW, dueDate: new Date("2026-04-08"), assigneeId: null, creatorId: "demo-user", projectId: null, parentId: null, sortOrder: 6, metadata: { startDate: "2026-03-01", }, completedAt: null, createdAt: new Date("2026-03-01"), updatedAt: new Date("2026-03-10"), }, ]; const ganttTasks = toGanttTasks(baseTasks); const [selectedTask, setSelectedTask] = useState(null); const [showDependencies, setShowDependencies] = useState(false); const handleTaskClick = (task: GanttTask): void => { setSelectedTask(task); }; const statusCounts = { total: ganttTasks.length, completed: ganttTasks.filter((t) => t.status === TaskStatus.COMPLETED).length, inProgress: ganttTasks.filter((t) => t.status === TaskStatus.IN_PROGRESS).length, notStarted: ganttTasks.filter((t) => t.status === TaskStatus.NOT_STARTED).length, paused: ganttTasks.filter((t) => t.status === TaskStatus.PAUSED).length, }; return (
{/* Header */}

Gantt Chart Component Demo

Interactive project timeline visualization with task dependencies

{/* Stats */}
{statusCounts.total}
Total Tasks
{statusCounts.completed}
Completed
{statusCounts.inProgress}
In Progress
{statusCounts.notStarted}
Not Started
{statusCounts.paused}
Paused
{/* Controls */}
{/* Gantt Chart */}

Project Timeline

{/* Selected Task Details */} {selectedTask && (

Selected Task Details

Title
{selectedTask.title}
Status
{selectedTask.status}
Priority
{selectedTask.priority}
Duration
{Math.ceil( (selectedTask.endDate.getTime() - selectedTask.startDate.getTime()) / (1000 * 60 * 60 * 24) )}{" "} days
Start Date
{selectedTask.startDate.toLocaleDateString()}
End Date
{selectedTask.endDate.toLocaleDateString()}
{selectedTask.description && (
Description
{selectedTask.description}
)}
)} {/* PDA-Friendly Language Notice */}

🌟 PDA-Friendly Design

This component uses respectful, non-judgmental language. Tasks past their target date show "Target passed" instead of "OVERDUE", and approaching deadlines show "Approaching target" to maintain a positive, supportive tone.

); }