139 lines
3.7 KiB
Swift
139 lines
3.7 KiB
Swift
import Elementary
|
|
import ElementaryHTMX
|
|
import ManualDCore
|
|
import Styleguide
|
|
|
|
struct EffectiveLengthsView: HTML, Sendable {
|
|
|
|
@Environment(ProjectViewValue.$projectID) var projectID
|
|
|
|
let effectiveLengths: [EffectiveLength]
|
|
|
|
var supplies: [EffectiveLength] {
|
|
effectiveLengths.filter({ $0.type == .supply })
|
|
.sorted { $0.totalEquivalentLength > $1.totalEquivalentLength }
|
|
}
|
|
|
|
var returns: [EffectiveLength] {
|
|
effectiveLengths.filter({ $0.type == .return })
|
|
.sorted { $0.totalEquivalentLength > $1.totalEquivalentLength }
|
|
}
|
|
|
|
var body: some HTML {
|
|
div(.class("space-y-4")) {
|
|
Row {
|
|
PageTitle { "Equivalent Lengths" }
|
|
PlusButton()
|
|
.attributes(
|
|
.class("btn-ghost me-4"),
|
|
.showModal(id: EffectiveLengthForm.id(nil))
|
|
)
|
|
}
|
|
.attributes(.class("pb-6"))
|
|
|
|
EffectiveLengthForm(projectID: projectID, dismiss: true)
|
|
|
|
EffectiveLengthsTable(effectiveLengths: effectiveLengths)
|
|
|
|
}
|
|
}
|
|
|
|
// TODO: Remove if using table view.
|
|
private struct EffectiveLengthView: HTML, Sendable {
|
|
|
|
let effectiveLength: EffectiveLength
|
|
|
|
var straightLengthsTotal: Int {
|
|
effectiveLength.straightLengths
|
|
.reduce(into: 0) { $0 += $1 }
|
|
}
|
|
|
|
var groupsTotal: Double {
|
|
effectiveLength.groups.totalEquivalentLength
|
|
}
|
|
|
|
var id: String {
|
|
return "effectiveLenghtCard_\(effectiveLength.id.uuidString.replacing("-", with: ""))"
|
|
}
|
|
|
|
var body: some HTML<HTMLTag.div> {
|
|
div(
|
|
.class("card h-full bg-base-100 shadow-sm border rounded-lg"),
|
|
.id(id)
|
|
) {
|
|
div(.class("card-body text-lg")) {
|
|
Row {
|
|
h2 { effectiveLength.name }
|
|
div(
|
|
.class("space-x-4")
|
|
) {
|
|
span(.class("text-primary text-sm italic")) {
|
|
"Total"
|
|
}
|
|
|
|
Number(self.effectiveLength.totalEquivalentLength, digits: 0)
|
|
.attributes(.class("badge badge-outline badge-primary text-lg"))
|
|
}
|
|
}
|
|
.attributes(.class("card-title pb-6"))
|
|
|
|
Row {
|
|
Label { "Straight Lengths" }
|
|
|
|
ul {
|
|
for length in effectiveLength.straightLengths {
|
|
li {
|
|
Number(length)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.attributes(.class("pb-6"))
|
|
|
|
Row {
|
|
span { "Groups" }
|
|
span { "Equivalent Length" }
|
|
span { "Quantity" }
|
|
}
|
|
.attributes(.class("label font-bold border-b border-label"))
|
|
|
|
for group in effectiveLength.groups {
|
|
Row {
|
|
span { "\(group.group)-\(group.letter)" }
|
|
Number(group.value)
|
|
Number(group.quantity)
|
|
}
|
|
}
|
|
|
|
div(.class("card-actions justify-end pt-6 space-y-4 mt-auto")) {
|
|
div(.class("join")) {
|
|
TrashButton()
|
|
.attributes(
|
|
.class("join-item btn-ghost"),
|
|
.hx.delete(
|
|
route: .project(
|
|
.detail(
|
|
effectiveLength.projectID,
|
|
.equivalentLength(.delete(id: effectiveLength.id))
|
|
)
|
|
)
|
|
),
|
|
.hx.confirm("Are you sure?"),
|
|
.hx.target("#\(id)"),
|
|
.hx.swap(.outerHTML)
|
|
)
|
|
EditButton()
|
|
.attributes(
|
|
.class("join-item btn-ghost"),
|
|
.showModal(id: EffectiveLengthForm.id(effectiveLength))
|
|
)
|
|
}
|
|
}
|
|
|
|
EffectiveLengthForm(effectiveLength: effectiveLength)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|