import Elementary import ElementaryHTMX import SharedModels struct VendorForm: HTML { let context: Context var vendor: Vendor? { context.vendor } init( _ context: Context ) { self.context = context } init() { self.init(.float(nil)) } enum Context { case float(Vendor? = nil, shouldShow: Bool = false) case formOnly(Vendor) var vendor: Vendor? { switch self { case let .float(vendor, _): return vendor case let .formOnly(vendor): return vendor } } } var content: some HTML { switch context { case let .float(vendor, shouldDisplay): Float(shouldDisplay: shouldDisplay) { makeForm(vendor: vendor) } case let .formOnly(vendor): makeForm(vendor: vendor) } } func makeForm(vendor: Vendor?) -> some HTML { form( .id("vendor-form"), vendor != nil ? .hx.put(targetURL) : .hx.post(targetURL), .hx.target("#content"), .hx.swap(.outerHTML) ) { div(.class("row")) { input( .type(.text), .class("col-9"), .id("vendor-name"), .name("name"), .value(vendor?.name ?? ""), .placeholder("Vendor Name"), vendor != nil ? .hx.put(targetURL) : .hx.post(targetURL), .hx.trigger(.event(.keyup).changed().delay("500ms")), .required ) if let vendor { button( .class("danger"), .style("font-size: 1.25em; padding: 10px 20px; border-radius: 10px;"), .hx.delete("/api/v1/vendors/\(vendor.id)"), .hx.confirm("Are you sure you want to delete this vendor?"), .hx.target("#vendor_\(vendor.id)"), .hx.swap(.outerHTML.transition(true).swap("1s")), .custom( name: "hx-on::after-request", value: "if(event.detail.successful) toggleContent('float'); window.location.href='/vendors';" ) ) { "Delete" } } button( .type(.submit), .class("btn-primary"), .style("float: right") ) { buttonLabel } } } } private var buttonLabel: String { guard vendor != nil else { return "Create" } return "Update" } var targetURL: String { guard let vendor else { return "/vendors" } return "/vendors/\(vendor.id)" } }