108 lines
2.7 KiB
Swift
108 lines
2.7 KiB
Swift
import Elementary
|
|
import ManualDCore
|
|
|
|
extension PdfClient.Request {
|
|
|
|
func toHTML() -> (some HTML & Sendable) {
|
|
PdfDocument(request: self)
|
|
}
|
|
}
|
|
|
|
struct PdfDocument: HTMLDocument {
|
|
|
|
let title = "Duct Calc"
|
|
let lang = "en"
|
|
let request: PdfClient.Request
|
|
|
|
var head: some HTML {
|
|
link(.rel(.stylesheet), .href("/css/pdf.css"))
|
|
}
|
|
|
|
var body: some HTML {
|
|
div {
|
|
// h1(.class("headline")) { "Duct Calc" }
|
|
|
|
h2 { "Project" }
|
|
|
|
div(.class("flex")) {
|
|
ProjectTable(project: request.project)
|
|
// HACK:
|
|
table {}
|
|
}
|
|
|
|
div(.class("section")) {
|
|
div(.class("flex")) {
|
|
h2 { "Equipment" }
|
|
h2 { "Friction Rate" }
|
|
}
|
|
div(.class("flex")) {
|
|
div(.class("container")) {
|
|
div(.class("table-container")) {
|
|
EquipmentTable(title: "Equipment", equipmentInfo: request.equipmentInfo)
|
|
}
|
|
div(.class("table-container")) {
|
|
FrictionRateTable(
|
|
title: "Friction Rate",
|
|
componentLosses: request.componentLosses,
|
|
frictionRate: request.frictionRate,
|
|
totalEquivalentLength: request.totalEquivalentLength,
|
|
displayTotals: false
|
|
)
|
|
}
|
|
}
|
|
}
|
|
if let error = request.frictionRate.error {
|
|
div(.class("section")) {
|
|
p(.class("error")) {
|
|
error.reason
|
|
for resolution in error.resolutions {
|
|
br()
|
|
" * \(resolution)"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
div(.class("section")) {
|
|
h2 { "Duct Sizes" }
|
|
DuctSizesTable(rooms: request.ductSizes.rooms)
|
|
.attributes(.class("w-full"))
|
|
}
|
|
|
|
div(.class("section")) {
|
|
h2 { "Supply Trunk / Run Outs" }
|
|
TrunkTable(sizes: request.ductSizes, type: .supply)
|
|
.attributes(.class("w-full"))
|
|
}
|
|
|
|
div(.class("section")) {
|
|
h2 { "Return Trunk / Run Outs" }
|
|
TrunkTable(sizes: request.ductSizes, type: .return)
|
|
.attributes(.class("w-full"))
|
|
}
|
|
|
|
div(.class("section")) {
|
|
h2 { "Total Equivalent Lengths" }
|
|
EffectiveLengthsTable(effectiveLengths: [
|
|
request.maxSupplyTEL, request.maxReturnTEL,
|
|
])
|
|
.attributes(.class("w-full"))
|
|
}
|
|
|
|
div(.class("section")) {
|
|
h2 { "Register Detail" }
|
|
RegisterDetailTable(rooms: request.ductSizes.rooms)
|
|
.attributes(.class("w-full"))
|
|
}
|
|
|
|
div(.class("section")) {
|
|
h2 { "Room Detail" }
|
|
RoomsTable(rooms: request.rooms, projectSHR: request.projectSHR)
|
|
.attributes(.class("w-full"))
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|