feat: Initial csv parsing for uploading rooms for a project. Need to style the upload form.
All checks were successful
CI / Linux Tests (push) Successful in 5m41s

This commit is contained in:
2026-02-05 16:39:40 -05:00
parent b2b5e32535
commit 57766c990e
16 changed files with 226 additions and 117 deletions

View File

@@ -1,3 +1,4 @@
import CSVParser
import DatabaseClient
import Dependencies
import Elementary
@@ -284,10 +285,18 @@ extension SiteRoute.View.ProjectRoute.RoomRoute {
on request: ViewController.Request,
projectID: Project.ID
) async -> AnySendableHTML {
@Dependency(\.csvParser) var csvParser
@Dependency(\.database) var database
switch self {
case .csv(let csv):
return await roomsView(on: request, projectID: projectID) {
let rooms = try await csvParser.parseRooms(csv)
_ = try await database.rooms.createMany(projectID, rooms)
}
// return EmptyHTML()
case .delete(let id):
return await ResultView {
try await database.rooms.delete(id)
@@ -298,7 +307,7 @@ extension SiteRoute.View.ProjectRoute.RoomRoute {
case .submit(let form):
return await roomsView(on: request, projectID: projectID) {
_ = try await database.rooms.create(form)
_ = try await database.rooms.create(projectID, form)
}
case .update(let id, let form):

View File

@@ -47,8 +47,6 @@ struct RoomForm: HTML, Sendable {
.hx.swap(.outerHTML)
) {
input(.class("hidden"), .name("projectID"), .value("\(projectID)"))
if let id = room?.id {
input(.class("hidden"), .name("id"), .value("\(id)"))
}

View File

@@ -11,6 +11,11 @@ struct RoomsView: HTML, Sendable {
let rooms: [Room]
let sensibleHeatRatio: Double?
private var csvRoute: String {
SiteRoute.router.path(for: .view(.project(.detail(projectID, .rooms(.index)))))
.appendingPath("csv")
}
var body: some HTML {
div(.class("flex w-full flex-col")) {
PageTitleRow {
@@ -44,6 +49,18 @@ struct RoomsView: HTML, Sendable {
.attributes(.class("border border-error"), when: sensibleHeatRatio == nil)
}
.attributes(.class("tooltip-open"), when: sensibleHeatRatio == nil)
Tooltip("Upload csv file", position: .left) {
form(
.hx.post(csvRoute),
.hx.target("body"),
.hx.swap(.outerHTML),
.custom(name: "enctype", value: "multipart/form-data")
) {
input(.type(.file), .name("file"), .accept(".csv"))
SubmitButton()
}
}
}
div(.class("flex items-end space-x-4 font-bold")) {