82 lines
2.3 KiB
Swift
82 lines
2.3 KiB
Swift
import Elementary
|
|
import ElementaryHTMX
|
|
import SharedModels
|
|
|
|
struct EmployeeForm: HTML {
|
|
let employee: Employee?
|
|
let shouldShow: Bool
|
|
|
|
init(employee: Employee? = nil, shouldShow: Bool = false) {
|
|
self.employee = employee
|
|
self.shouldShow = shouldShow
|
|
}
|
|
|
|
init(employee: Employee) {
|
|
self.employee = employee
|
|
self.shouldShow = true
|
|
}
|
|
|
|
var content: some HTML {
|
|
Float(shouldDisplay: shouldShow, resetURL: .employee(.index)) {
|
|
form(
|
|
employee == nil ? .hx.post(route: targetURL) : .hx.put(route: targetURL),
|
|
.hx.target(target),
|
|
employee == nil
|
|
? .hx.swap(.beforeEnd.transition(true).swap("0.5s"))
|
|
: .hx.swap(.outerHTML.transition(true).swap("0.5s")),
|
|
.hx.on(
|
|
.afterRequest,
|
|
.ifSuccessful(.toggleContent(.float), .setWindowLocation(to: .employee(.index)))
|
|
)
|
|
) {
|
|
div(.class("row")) {
|
|
input(
|
|
.type(.text), .class("col-5"),
|
|
.name("firstName"), .value(employee?.firstName ?? ""),
|
|
.placeholder("First Name"), .required
|
|
)
|
|
div(.class("col-2")) {}
|
|
input(
|
|
.type(.text), .class("col-5"),
|
|
.name("lastName"), .value(employee?.lastName ?? ""),
|
|
.placeholder("Last Name"), .required
|
|
)
|
|
}
|
|
div(.class("btn-row")) {
|
|
button(.type(.submit), .class("btn-primary")) {
|
|
buttonLabel
|
|
}
|
|
if let employee {
|
|
Button.danger {
|
|
"Delete"
|
|
}
|
|
.attributes(
|
|
.hx.confirm("Are you sure you want to delete this employee?"),
|
|
.hx.delete(route: .employee(.delete(id: employee.id))),
|
|
.hx.target(.id(.employee(.row(id: employee.id)))),
|
|
.hx.swap(.outerHTML.transition(true).swap("1s"))
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private var target: HXTarget {
|
|
guard let employee else {
|
|
return .id(.employee(.table))
|
|
}
|
|
return .id(.employee(.row(id: employee.id)))
|
|
}
|
|
|
|
private var buttonLabel: String {
|
|
guard employee != nil else { return "Create" }
|
|
return "Update"
|
|
}
|
|
|
|
private var targetURL: SharedModels.ViewRoute {
|
|
guard let employee else { return .employee(.index) }
|
|
return .employee(.get(id: employee.id))
|
|
}
|
|
}
|