feat: Begins a generic htmx form context and template, integrates user form, begins views for vendor and purchase orders.

This commit is contained in:
2025-01-08 14:02:50 -05:00
parent 3557227430
commit 2b6e92a5c6
18 changed files with 493 additions and 93 deletions

View File

@@ -0,0 +1,67 @@
import Vapor
/// Represents a generic form context that is used to generate form templates
/// that are handled by htmx.
struct HtmxFormCTX<C: Content>: Content {
let formClass: String?
let formId: String
let htmxPostTargetUrl: String?
let htmxPutTargetUrl: String?
let htmxTarget: String
let htmxPushUrl: Bool
let htmxResetAfterRequest: Bool
let htmxSwapOob: String?
let htmxSwap: String?
let context: C
init(
formClass: String? = nil,
formId: String,
htmxTargetUrl: TargetUrl,
htmxTarget: String,
htmxPushUrl: Bool,
htmxResetAfterRequest: Bool = true,
htmxSwapOob: HtmxSwap? = nil,
htmxSwap: HtmxSwap? = nil,
context: C
) {
self.formClass = formClass
self.formId = formId
self.htmxPostTargetUrl = htmxTargetUrl.postUrl
self.htmxPutTargetUrl = htmxTargetUrl.putUrl
self.htmxTarget = htmxTarget
self.htmxPushUrl = htmxPushUrl
self.htmxResetAfterRequest = htmxResetAfterRequest
self.htmxSwapOob = htmxSwapOob?.rawValue
self.htmxSwap = htmxSwap?.rawValue
self.context = context
}
enum HtmxSwap: String {
case innerHTML
case outerHTML
case afterbegin
case beforebegin
case afterend
case beforeend
case delete
case none
}
enum TargetUrl {
case put(String)
case post(String)
var putUrl: String? {
guard case let .put(url) = self else { return nil }
return url
}
var postUrl: String? {
guard case let .post(url) = self else { return nil }
return url
}
}
}
struct EmptyContent: Content {}