import Elementary import ElementaryHTMX import Fluent import SharedModels import Vapor struct PurchaseOrderTable: HTML { let page: Page var content: some HTML { table { thead { tr { th { "PO" } th { "Work Order" } th { "Customer" } th { "Vendor" } th { "Materials" } th { "Created For" } th { Button.add() .attributes( .hx.get("/purchase-orders/create"), .hx.target("#float"), .hx.swap(.outerHTML), .hx.pushURL(true) ) } } } tbody(.id("purchase-order-table")) { Rows(page: page) } } } // Produces only the rows for the given page struct Rows: HTML { let page: Page var content: some HTML { for purchaseOrder in page.items { Row(purchaseOrder: purchaseOrder) } if page.metadata.pageCount > page.metadata.page { tr( .hx.get("/purchase-orders/next?page=\(page.metadata.page + 1)&limit=\(page.metadata.per)"), .hx.trigger(.event(.revealed)), .hx.swap(.outerHTML.transition(true).swap("1s")), .hx.target("this"), .hx.indicator("next .htmx-indicator") ) { img(.src("/images/spinner.svg"), .class("htmx-indicator"), .width(60), .height(60)) } } } } // A single row. struct Row: HTML { let purchaseOrder: PurchaseOrder var content: some HTML { tr( .id("purchase_order_\(purchaseOrder.id)") ) { td { "\(purchaseOrder.id)" } td { purchaseOrder.workOrder != nil ? String(purchaseOrder.workOrder!) : "" } td { purchaseOrder.customer } td { purchaseOrder.vendorBranch.displayName } td { purchaseOrder.materials } td { purchaseOrder.createdFor.fullName } td { Button.detail() .attributes( .hx.get("/purchase-orders/\(purchaseOrder.id)"), .hx.target("#float"), .hx.swap(.outerHTML.transition(true).swap("0.5s")), .hx.pushURL(true) ) } } } } } private extension VendorBranch.Detail { var displayName: String { "\(vendor.name.capitalized) - \(name.capitalized)" } }