feat: Initial view controller dependency and snapshot tests.

This commit is contained in:
2025-01-23 10:57:20 -05:00
parent c74433c2eb
commit 5695d0e13c
49 changed files with 2802 additions and 1 deletions

View File

@@ -0,0 +1,81 @@
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))
}
}

View File

@@ -0,0 +1,51 @@
import Elementary
import ElementaryHTMX
import SharedModels
struct EmployeeTable: HTML {
let employees: [Employee]
var content: some HTML {
table {
thead {
tr {
th { "Name" }
th(.style("width: 100px;")) {
Button.add()
.attributes(
.style("padding: 0px 10px;"),
.hx.get(route: .employee(.form)),
.hx.target(.id(.float)),
.hx.swap(.outerHTML.transition(true).swap("0.5s"))
)
}
}
}
tbody(.id(.employee(.table))) {
for employee in employees {
Row(employee: employee)
}
}
}
}
struct Row: HTML {
let employee: Employee
var content: some HTML {
tr(.id(.employee(.row(id: employee.id)))) {
td { employee.fullName }
td {
Button.detail()
.attributes(
.style("padding-left: 15px;"),
.hx.get(route: .employee(.get(id: employee.id))),
.hx.target(.id(.float)),
.hx.pushURL(true),
.hx.swap(.outerHTML.transition(true).swap("0.5s"))
)
}
}
}
}
}