feat: Begins user profile, adds database model, need to add views / forms.
This commit is contained in:
@@ -54,37 +54,27 @@ extension ViewController.Request {
|
||||
}
|
||||
case .project(let route):
|
||||
return await route.renderView(on: self)
|
||||
default:
|
||||
// FIX: FIX
|
||||
return _render(isHtmxRequest: false) {
|
||||
div { "Fix me!" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func view<C: HTML>(
|
||||
@HTMLBuilder inner: () -> C
|
||||
) -> AnySendableHTML where C: Sendable {
|
||||
_render(isHtmxRequest: isHtmxRequest, showSidebar: showSidebar) {
|
||||
inner()
|
||||
}
|
||||
MainPage(theme: theme) { inner() }
|
||||
}
|
||||
|
||||
func view<C: HTML>(
|
||||
@HTMLBuilder inner: () async -> C
|
||||
) async -> AnySendableHTML where C: Sendable {
|
||||
await _render(isHtmxRequest: isHtmxRequest, showSidebar: showSidebar) {
|
||||
await inner()
|
||||
let inner = await inner()
|
||||
|
||||
return MainPage(theme: theme) {
|
||||
inner
|
||||
}
|
||||
}
|
||||
|
||||
var showSidebar: Bool {
|
||||
switch route {
|
||||
case .login, .signup, .project(.page):
|
||||
return false
|
||||
default:
|
||||
return true
|
||||
}
|
||||
var theme: Theme? {
|
||||
.dracula
|
||||
}
|
||||
}
|
||||
|
||||
@@ -261,7 +251,6 @@ extension SiteRoute.View.ProjectRoute.RoomRoute {
|
||||
return await roomsView(on: request, projectID: projectID)
|
||||
|
||||
case .submit(let form):
|
||||
// FIX: Just return a room row.
|
||||
return await roomsView(on: request, projectID: projectID) {
|
||||
_ = try await database.rooms.create(form)
|
||||
}
|
||||
@@ -587,41 +576,53 @@ extension SiteRoute.View.ProjectRoute.DuctSizingRoute {
|
||||
}
|
||||
}
|
||||
|
||||
private func _render<C: HTML>(
|
||||
isHtmxRequest: Bool,
|
||||
active activeTab: SiteRoute.View.ProjectRoute.DetailRoute.Tab = .rooms,
|
||||
showSidebar: Bool = true,
|
||||
@HTMLBuilder inner: () async throws -> C
|
||||
) async throws -> AnySendableHTML where C: Sendable {
|
||||
let inner = try await inner()
|
||||
if isHtmxRequest {
|
||||
return inner
|
||||
}
|
||||
return MainPage { inner }
|
||||
}
|
||||
|
||||
private func _render<C: HTML>(
|
||||
isHtmxRequest: Bool,
|
||||
active activeTab: SiteRoute.View.ProjectRoute.DetailRoute.Tab = .rooms,
|
||||
showSidebar: Bool = true,
|
||||
@HTMLBuilder inner: () async -> C
|
||||
) async -> AnySendableHTML where C: Sendable {
|
||||
let inner = await inner()
|
||||
if isHtmxRequest {
|
||||
return inner
|
||||
}
|
||||
return MainPage { inner }
|
||||
}
|
||||
|
||||
private func _render<C: HTML>(
|
||||
isHtmxRequest: Bool,
|
||||
active activeTab: SiteRoute.View.ProjectRoute.DetailRoute.Tab = .rooms,
|
||||
showSidebar: Bool = true,
|
||||
@HTMLBuilder inner: () -> C
|
||||
) -> AnySendableHTML where C: Sendable {
|
||||
let inner = inner()
|
||||
if isHtmxRequest {
|
||||
return inner
|
||||
}
|
||||
return MainPage { inner }
|
||||
}
|
||||
// private func _render<C: HTML>(
|
||||
// isHtmxRequest: Bool,
|
||||
// active activeTab: SiteRoute.View.ProjectRoute.DetailRoute.Tab = .rooms,
|
||||
// showSidebar: Bool = true,
|
||||
// theme: Theme? = nil,
|
||||
// @HTMLBuilder inner: () async throws -> C
|
||||
// ) async throws -> AnySendableHTML where C: Sendable {
|
||||
// let inner = try await inner()
|
||||
// if isHtmxRequest {
|
||||
// return div(.class("h-screen w-full")) {
|
||||
// inner
|
||||
// }
|
||||
// .attributes(.data("theme", value: theme!.rawValue), when: theme != nil)
|
||||
// }
|
||||
// return MainPage(theme: theme) { inner }
|
||||
// }
|
||||
//
|
||||
// private func _render<C: HTML>(
|
||||
// isHtmxRequest: Bool,
|
||||
// active activeTab: SiteRoute.View.ProjectRoute.DetailRoute.Tab = .rooms,
|
||||
// showSidebar: Bool = true,
|
||||
// theme: Theme? = nil,
|
||||
// @HTMLBuilder inner: () async -> C
|
||||
// ) async -> AnySendableHTML where C: Sendable {
|
||||
// let inner = await inner()
|
||||
// if isHtmxRequest {
|
||||
// return div(.class("h-screen w-full")) {
|
||||
// inner
|
||||
// }
|
||||
// .attributes(.data("theme", value: theme!.rawValue), when: theme != nil)
|
||||
// }
|
||||
// return MainPage(theme: theme) { inner }
|
||||
// }
|
||||
//
|
||||
// private func _render<C: HTML>(
|
||||
// isHtmxRequest: Bool,
|
||||
// active activeTab: SiteRoute.View.ProjectRoute.DetailRoute.Tab = .rooms,
|
||||
// showSidebar: Bool = true,
|
||||
// theme: Theme? = nil,
|
||||
// @HTMLBuilder inner: () -> C
|
||||
// ) -> AnySendableHTML where C: Sendable {
|
||||
// let inner = inner()
|
||||
// if isHtmxRequest {
|
||||
// return div(.class("h-screen w-full")) {
|
||||
// inner
|
||||
// }
|
||||
// .attributes(.data("theme", value: theme!.rawValue), when: theme != nil)
|
||||
// }
|
||||
// return MainPage(theme: theme) { inner }
|
||||
// }
|
||||
|
||||
@@ -9,10 +9,13 @@ public struct MainPage<Inner: HTML>: SendableHTMLDocument where Inner: Sendable
|
||||
public var lang: String { "en" }
|
||||
|
||||
let inner: Inner
|
||||
let theme: Theme?
|
||||
|
||||
init(
|
||||
theme: Theme? = nil,
|
||||
_ inner: () -> Inner
|
||||
) {
|
||||
self.theme = theme
|
||||
self.inner = inner()
|
||||
}
|
||||
|
||||
@@ -54,10 +57,7 @@ public struct MainPage<Inner: HTML>: SendableHTMLDocument where Inner: Sendable
|
||||
div(.class("h-screen w-full")) {
|
||||
inner
|
||||
}
|
||||
script(.src("https://unpkg.com/lucide@latest")) {}
|
||||
script {
|
||||
"lucide.createIcons();"
|
||||
}
|
||||
.attributes(.data("theme", value: theme!.rawValue), when: theme != nil)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,10 +42,34 @@ struct Navbar: HTML, Sendable {
|
||||
}
|
||||
}
|
||||
div(.class("flex-none")) {
|
||||
button(.class("w-fit px-4 py-2")) {
|
||||
"User Menu"
|
||||
details(.class("dropdown dropdown-left dropdown-bottom")) {
|
||||
summary(.class("btn w-fit px-4 py-2")) {
|
||||
SVG(.circleUser)
|
||||
}
|
||||
.navButton()
|
||||
|
||||
ul(
|
||||
.class(
|
||||
"""
|
||||
menu dropdown-content bg-base-100
|
||||
rounded-box z-1 w-fit p-2 shadow-sm
|
||||
"""
|
||||
)
|
||||
) {
|
||||
li(.class("w-full")) {
|
||||
// TODO: Save theme to user profile ??
|
||||
div(.class("flex justify-between p-4 space-x-6")) {
|
||||
Label("Theme")
|
||||
input(.type(.checkbox), .class("toggle theme-controller"), .value("light"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// button(.class("w-fit px-4 py-2")) {
|
||||
// SVG(.circleUser)
|
||||
// }
|
||||
// .navButton()
|
||||
}
|
||||
.navButton()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,13 +82,6 @@ extension ProjectView {
|
||||
|
||||
ul(.class("w-full")) {
|
||||
|
||||
// FIX: Move to user profile / settings page.
|
||||
li(.class("w-full is-drawer-close:hidden")) {
|
||||
div(.class("flex justify-between p-4")) {
|
||||
Label("Theme")
|
||||
input(.type(.checkbox), .class("toggle theme-controller"), .value("light"))
|
||||
}
|
||||
}
|
||||
|
||||
li(.class("flex w-full")) {
|
||||
row(
|
||||
|
||||
@@ -121,6 +121,7 @@ struct RoomsView: HTML, Sendable {
|
||||
}
|
||||
|
||||
public struct RoomRow: HTML, Sendable {
|
||||
|
||||
let room: Room
|
||||
let shr: Double
|
||||
|
||||
@@ -137,7 +138,7 @@ struct RoomsView: HTML, Sendable {
|
||||
}
|
||||
|
||||
public var body: some HTML {
|
||||
tr(.id("roomRow_\(room.name)")) {
|
||||
tr(.id("roomRow_\(room.id.idString)")) {
|
||||
td { room.name }
|
||||
td {
|
||||
div(.class("flex justify-center")) {
|
||||
|
||||
Reference in New Issue
Block a user