feat: Begins migrating views from leaf to elementary

This commit is contained in:
2025-01-14 17:11:57 -05:00
parent 31c6b51371
commit 8842957cf3
23 changed files with 294 additions and 1136 deletions

View File

@@ -0,0 +1,78 @@
import Elementary
import ElementaryHTMX
struct UserForm: HTML, Sendable {
let context: Context
var content: some HTML {
form(
.id("user-form"),
.class("user-form"),
.hx.post(context.targetURL),
.hx.pushURL(context.pushURL),
.custom(name: "hx-on::after-request", value: "if(event.detail.successful) this.reset(); toggleContent('form');")
) {
input(.type(.text), .id("username"), .name("username"), .placeholder("Username"), .autofocus, .required)
br()
if context.showEmailInput {
input(.type(.email), .id("email"), .name("email"), .placeholder("Email"), .required)
br()
}
input(.type(.password), .id("password"), .name("password"), .placeholder("Password"), .required)
br()
if context.showConfirmPassword {
input(.type(.password), .id("confirmPassword"), .name("confirmPassword"), .required)
br()
}
input(.type(.submit), .value(context.buttonLabel))
}
}
enum Context {
case create
case login(next: String?)
var showConfirmPassword: Bool {
switch self {
case .create: return true
case .login: return false
}
}
var showEmailInput: Bool {
switch self {
case .create: return true
case .login: return false
}
}
var pushURL: Bool {
switch self {
case .create: return false
case .login: return true
}
}
var buttonLabel: String {
switch self {
case .create:
return "Create"
case .login:
return "Login"
}
}
var targetURL: String {
switch self {
case .create:
return "/users"
case let .login(next: next):
let path = "/login"
if let next {
return "\(path)?next=\(next)"
}
return path
}
}
}
}

View File

@@ -0,0 +1,40 @@
import DatabaseClient
import Dependencies
import Elementary
import ElementaryHTMX
import SharedModels
struct UserTable: HTML {
@Dependency(\.database.users.fetchAll) var fetchAll
var content: some HTML {
table(.id("user-table")) {
thead {
tr {
th { "Username" }
th { "Email" }
th { ToggleFormButton() }
}
}
tbody {
let users = try await fetchAll()
for user in users {
Row(user: user)
}
}
}
}
struct Row: HTML {
let user: User
var content: some HTML<HTMLTag.tr> {
tr {
td { user.username }
td { user.email }
td { "Fix me." }
}
}
}
}