From d437c684032327f4c171dc4b4a64025d653c846b Mon Sep 17 00:00:00 2001 From: Eli Ribble Date: Sat, 7 Feb 2026 20:02:39 +0000 Subject: [PATCH] Add pages for showing the CSV upload UI And sample CSV file download --- html/static/file/sample-pool.csv | 4 +++ .../{data-entry.html => pool-csv-upload.html} | 36 ++++++------------- html/template/sync/pool-list.html | 9 +++++ scss/sync/pool-csv-upload.scss | 20 +++++++++++ sync/pool.go | 17 +++++++++ sync/routes.go | 1 + sync/url.go | 2 ++ 7 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 html/static/file/sample-pool.csv rename html/template/sync/{data-entry.html => pool-csv-upload.html} (86%) create mode 100644 html/template/sync/pool-list.html create mode 100644 scss/sync/pool-csv-upload.scss diff --git a/html/static/file/sample-pool.csv b/html/static/file/sample-pool.csv new file mode 100644 index 00000000..283a98f0 --- /dev/null +++ b/html/static/file/sample-pool.csv @@ -0,0 +1,4 @@ +Street Address,City,Zip,Property Owner Name,Resident Owned,Resident Phone Number,Pool Condition,Notes,Recurrant,New,Hostile,Unresponsive +123 Main Street,Visalia,93615,John Smith,Yes,1235556789,Empty,"Pool collects runoff, dry by summer",Yes,No,No,Yes +456 Valley View Dr,Los Angeles,93618,Jane and Jim Blackner,No,2345550055,Green,Pool murky at beginning of season,No,Yes,No,No +11235 Fibonacci Rd,San Francisco,93618,Warren Buffet,No,3455551212,,,,,, diff --git a/html/template/sync/data-entry.html b/html/template/sync/pool-csv-upload.html similarity index 86% rename from html/template/sync/data-entry.html rename to html/template/sync/pool-csv-upload.html index 285c1e6c..ee98f8ec 100644 --- a/html/template/sync/data-entry.html +++ b/html/template/sync/pool-csv-upload.html @@ -1,31 +1,10 @@ -{{ template "sync/layout/base.html" . }} - -{{ define "title" }}Data Entry{{ end }} +{{ template "sync/layout/authenticated.html" . }} +{{ define "title" }}Layout Test{{ end }} {{ define "extraheader" }} - + {{ end }} {{ define "content" }} +

Upload Pool Data

@@ -78,7 +57,12 @@
diff --git a/html/template/sync/pool-list.html b/html/template/sync/pool-list.html new file mode 100644 index 00000000..85dc9342 --- /dev/null +++ b/html/template/sync/pool-list.html @@ -0,0 +1,9 @@ +{{ template "sync/layout/authenticated.html" . }} + +{{ define "title" }}Pool List{{ end }} +{{ define "extraheader" }} +{{ end }} +{{ define "content" }} +

Pool list

+ Do an upload +{{ end }} diff --git a/scss/sync/pool-csv-upload.scss b/scss/sync/pool-csv-upload.scss new file mode 100644 index 00000000..496f0c59 --- /dev/null +++ b/scss/sync/pool-csv-upload.scss @@ -0,0 +1,20 @@ +.upload-container { + max-width: 800px; + margin: 0 auto; +} +.schema-table { + font-size: 0.9rem; +} +.upload-area { + border: 2px dashed #dee2e6; + padding: 2rem; + text-align: center; + margin: 1.5rem 0; + border-radius: 5px; + background-color: #f8f9fa; +} +.required-field::after { + content: "*"; + color: red; + margin-left: 3px; +} diff --git a/sync/pool.go b/sync/pool.go index 2f6adba8..642584f5 100644 --- a/sync/pool.go +++ b/sync/pool.go @@ -10,6 +10,10 @@ type ContentPoolList struct { URL ContentURL User User } +type ContentPoolUpload struct { + URL ContentURL + User User +} func getPoolList(w http.ResponseWriter, r *http.Request, u *models.User) { userContent, err := contentForUser(r.Context(), u) @@ -23,3 +27,16 @@ func getPoolList(w http.ResponseWriter, r *http.Request, u *models.User) { } html.RenderOrError(w, "sync/pool-list.html", data) } + +func getPoolUpload(w http.ResponseWriter, r *http.Request, u *models.User) { + userContent, err := contentForUser(r.Context(), u) + if err != nil { + respondError(w, "Failed to get user", err, http.StatusInternalServerError) + return + } + data := ContentPoolUpload{ + URL: newContentURL(), + User: userContent, + } + html.RenderOrError(w, "sync/pool-csv-upload.html", data) +} diff --git a/sync/routes.go b/sync/routes.go index 551de83e..340c0149 100644 --- a/sync/routes.go +++ b/sync/routes.go @@ -63,6 +63,7 @@ func Router() chi.Router { r.Method("GET", "/cell/{cell}", auth.NewEnsureAuth(getCellDetails)) r.Method("GET", "/layout-test", auth.NewEnsureAuth(getLayoutTest)) r.Method("GET", "/pool", auth.NewEnsureAuth(getPoolList)) + r.Method("GET", "/pool/upload", auth.NewEnsureAuth(getPoolUpload)) r.Method("GET", "/settings", auth.NewEnsureAuth(getSettings)) r.Method("GET", "/signout", auth.NewEnsureAuth(getSignout)) r.Method("GET", "/source/{globalid}", auth.NewEnsureAuth(getSource)) diff --git a/sync/url.go b/sync/url.go index 39d39699..3fcf1a92 100644 --- a/sync/url.go +++ b/sync/url.go @@ -6,10 +6,12 @@ import ( type ContentURL struct { PoolCSVUpload string + SamplePoolCSV string } func newContentURL() ContentURL { return ContentURL{ PoolCSVUpload: config.MakeURLNidus("/pool/upload"), + SamplePoolCSV: config.MakeURLNidus("/static/file/sample-pool.csv"), } }