compassmock/src/components/schedule/schedule-view.tsx
Nicholai 67fed00bbd feat(schedule): add gantt schedule with task management and dependencies
Implements the schedule module for COMPASS construction PM:

- D1/Drizzle schema: tasks, dependencies, phases tables
- frappe-gantt integration for interactive timeline view
- Critical path analysis (forward/backward pass, float calc)
- Dependency validation with cycle detection
- Business day calculations (skip weekends/holidays)
- Date propagation engine for cascading schedule changes
- Task CRUD with phase assignment and progress tracking
- Dependency management (FS/FF/SS/SF with lag support)
- Dual view: sortable list view + gantt chart view

Also includes full Next.js app scaffold with dashboard,
shadcn/ui components, and Cloudflare Workers deployment config.
2026-01-23 19:34:24 -07:00

53 lines
1.4 KiB
TypeScript
Executable File

"use client"
import { useState } from "react"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { ScheduleListView } from "./schedule-list-view"
import { ScheduleGanttView } from "./schedule-gantt-view"
import type { ScheduleData } from "@/lib/schedule/types"
interface ScheduleViewProps {
projectId: string
projectName: string
initialData: ScheduleData
}
export function ScheduleView({
projectId,
projectName,
initialData,
}: ScheduleViewProps) {
const [activeTab, setActiveTab] = useState("list")
return (
<div>
<div className="flex items-center justify-between mb-4">
<h1 className="text-2xl font-semibold">{projectName} - Schedule</h1>
</div>
<Tabs value={activeTab} onValueChange={setActiveTab}>
<TabsList>
<TabsTrigger value="list">List</TabsTrigger>
<TabsTrigger value="gantt">Gantt</TabsTrigger>
</TabsList>
<TabsContent value="list" className="mt-4">
<ScheduleListView
projectId={projectId}
tasks={initialData.tasks}
dependencies={initialData.dependencies}
/>
</TabsContent>
<TabsContent value="gantt" className="mt-4">
<ScheduleGanttView
projectId={projectId}
tasks={initialData.tasks}
dependencies={initialData.dependencies}
/>
</TabsContent>
</Tabs>
</div>
)
}