diff --git a/Sources/ManualDCore/Routes/ViewRoute.swift b/Sources/ManualDCore/Routes/ViewRoute.swift index 6e98bb8..315c47a 100644 --- a/Sources/ManualDCore/Routes/ViewRoute.swift +++ b/Sources/ManualDCore/Routes/ViewRoute.swift @@ -9,6 +9,7 @@ extension SiteRoute { public enum View: Equatable, Sendable { case project(ProjectRoute) case room(RoomRoute) + case frictionRate(FrictionRateRoute) public static let router = OneOf { Route(.case(Self.project)) { @@ -17,6 +18,9 @@ extension SiteRoute { Route(.case(Self.room)) { SiteRoute.View.RoomRoute.router } + Route(.case(Self.frictionRate)) { + SiteRoute.View.FrictionRateRoute.router + } } } } @@ -81,3 +85,26 @@ extension SiteRoute.View { } } } + +extension SiteRoute.View { + public enum FrictionRateRoute: Equatable, Sendable { + case index + case form + + static let rootPath = "friction-rate" + + public static let router = OneOf { + Route(.case(Self.index)) { + Path { rootPath } + Method.get + } + Route(.case(Self.form)) { + Path { + rootPath + "create" + } + Method.get + } + } + } +} diff --git a/Sources/ViewController/Live.swift b/Sources/ViewController/Live.swift index 7e77f08..1ba9ad8 100644 --- a/Sources/ViewController/Live.swift +++ b/Sources/ViewController/Live.swift @@ -9,6 +9,8 @@ extension ViewController.Request { return try await route.renderView(isHtmxRequest: isHtmxRequest) case .room(let route): return try await route.renderView(isHtmxRequest: isHtmxRequest) + case .frictionRate(let route): + return try await route.renderView(isHtmxRequest: isHtmxRequest) default: // FIX: FIX return mainPage @@ -49,6 +51,22 @@ extension SiteRoute.View.RoomRoute { } } +extension SiteRoute.View.FrictionRateRoute { + func renderView(isHtmxRequest: Bool) async throws -> AnySendableHTML { + switch self { + case .index: + return MainPage { + FrictionRateView() + } + // FIX: + default: + return MainPage { + FrictionRateView() + } + } + } +} + private let mainPage: AnySendableHTML = { MainPage { div { diff --git a/Sources/ViewController/Views/FrictionRate/EquipmentForm.swift b/Sources/ViewController/Views/FrictionRate/EquipmentForm.swift new file mode 100644 index 0000000..94129fb --- /dev/null +++ b/Sources/ViewController/Views/FrictionRate/EquipmentForm.swift @@ -0,0 +1,35 @@ +import Elementary +import ManualDCore +import Styleguide + +struct EquipmentForm: HTML, Sendable { + + var body: some HTML { + div(.id("equipmentForm")) { + h1(.class("text-3xl font-bold pb-6")) { "Equipment Info" } + form { + div { + label(.for("staticPressure")) { "Static Pressure" } + Input(id: "staticPressure", placeholder: "Static pressure") + .attributes(.type(.number), .value("0.5"), .min("0"), .max("1.0"), .step("0.1")) + } + div { + label(.for("heatingCFM")) { "Heating CFM" } + Input(id: "heatingCFM", placeholder: "CFM") + .attributes(.type(.number), .min("0")) + } + div { + label(.for("coolingCFM")) { "Cooling CFM" } + Input(id: "coolingCFM", placeholder: "CFM") + .attributes(.type(.number), .min("0")) + } + Row { + div {} + div(.class("space-x-4")) { + SubmitButton(title: "Save") + } + } + } + } + } +} diff --git a/Sources/ViewController/Views/FrictionRate/FrictionRateView.swift b/Sources/ViewController/Views/FrictionRate/FrictionRateView.swift new file mode 100644 index 0000000..3eb2d85 --- /dev/null +++ b/Sources/ViewController/Views/FrictionRate/FrictionRateView.swift @@ -0,0 +1,12 @@ +import Elementary +import ManualDCore +import Styleguide + +struct FrictionRateView: HTML, Sendable { + + var body: some HTML { + div { + EquipmentForm() + } + } +} diff --git a/Sources/ViewController/Views/Sidebar.swift b/Sources/ViewController/Views/Sidebar.swift index 6c042ad..2fba872 100644 --- a/Sources/ViewController/Views/Sidebar.swift +++ b/Sources/ViewController/Views/Sidebar.swift @@ -15,7 +15,7 @@ struct Sidebar: HTML { row(title: "Project", icon: .mapPin, href: "/projects") row(title: "Rooms", icon: .doorClosed, href: "/rooms") row(title: "Equivalent Lengths", icon: .rulerDimensionLine, href: "#") - row(title: "Friction Rate", icon: .squareFunction, href: "#") + row(title: "Friction Rate", icon: .squareFunction, href: "/friction-rate") row(title: "Duct Sizes", icon: .wind, href: "#") } }