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
All checks were successful
CI / Linux Tests (push) Successful in 5m41s
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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)"))
|
||||
}
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
Reference in New Issue
Block a user