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.
53 lines
1.4 KiB
TypeScript
Executable File
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>
|
|
)
|
|
}
|