import Elementary import ElementaryHTMX import SharedModels struct VendorForm: HTML, Sendable { let context: Context var vendor: Vendor? { context.vendor } init( _ context: Context ) { self.context = context } init() { self.init(.float(nil)) } enum Context: Sendable { 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(route: targetURL) : .hx.post(route: 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(route: targetURL) : .hx.post(route: 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(route: .vendor(.delete(id: vendor.id))), .hx.confirm("Are you sure you want to delete this vendor?"), .hx.target(.id(.vendor(.row(id: 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: SiteRoute.View { guard let vendor else { return .vendor(.index) } return .vendor(.get(id: vendor.id)) } }