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.
97 lines
2.1 KiB
TypeScript
Executable File
97 lines
2.1 KiB
TypeScript
Executable File
"use client"
|
|
|
|
import * as React from "react"
|
|
import {
|
|
IconCalendarStats,
|
|
IconDashboard,
|
|
IconFolder,
|
|
IconHelp,
|
|
IconInnerShadowTop,
|
|
IconSearch,
|
|
IconSettings,
|
|
} from "@tabler/icons-react"
|
|
|
|
import { NavMain } from "@/components/nav-main"
|
|
import { NavSecondary } from "@/components/nav-secondary"
|
|
import { NavUser } from "@/components/nav-user"
|
|
import {
|
|
Sidebar,
|
|
SidebarContent,
|
|
SidebarFooter,
|
|
SidebarHeader,
|
|
SidebarMenu,
|
|
SidebarMenuButton,
|
|
SidebarMenuItem,
|
|
} from "@/components/ui/sidebar"
|
|
|
|
const data = {
|
|
user: {
|
|
name: "shadcn",
|
|
email: "m@example.com",
|
|
avatar: "/avatars/shadcn.jpg",
|
|
},
|
|
navMain: [
|
|
{
|
|
title: "Dashboard",
|
|
url: "/dashboard",
|
|
icon: IconDashboard,
|
|
},
|
|
{
|
|
title: "Projects",
|
|
url: "/dashboard/projects",
|
|
icon: IconFolder,
|
|
},
|
|
{
|
|
title: "Schedule",
|
|
url: "/dashboard/projects/demo-project-1/schedule",
|
|
icon: IconCalendarStats,
|
|
},
|
|
],
|
|
navSecondary: [
|
|
{
|
|
title: "Settings",
|
|
url: "#",
|
|
icon: IconSettings,
|
|
},
|
|
{
|
|
title: "Get Help",
|
|
url: "#",
|
|
icon: IconHelp,
|
|
},
|
|
{
|
|
title: "Search",
|
|
url: "#",
|
|
icon: IconSearch,
|
|
},
|
|
],
|
|
}
|
|
|
|
export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
|
|
return (
|
|
<Sidebar collapsible="offcanvas" {...props}>
|
|
<SidebarHeader>
|
|
<SidebarMenu>
|
|
<SidebarMenuItem>
|
|
<SidebarMenuButton
|
|
asChild
|
|
className="data-[slot=sidebar-menu-button]:!p-1.5"
|
|
>
|
|
<a href="/dashboard">
|
|
<IconInnerShadowTop className="!size-5" />
|
|
<span className="text-base font-semibold">COMPASS</span>
|
|
</a>
|
|
</SidebarMenuButton>
|
|
</SidebarMenuItem>
|
|
</SidebarMenu>
|
|
</SidebarHeader>
|
|
<SidebarContent>
|
|
<NavMain items={data.navMain} />
|
|
<NavSecondary items={data.navSecondary} className="mt-auto" />
|
|
</SidebarContent>
|
|
<SidebarFooter>
|
|
<NavUser user={data.user} />
|
|
</SidebarFooter>
|
|
</Sidebar>
|
|
)
|
|
}
|