From 95865257a373fe61ec5d1fd1a3716b2f4c249861 Mon Sep 17 00:00:00 2001 From: Maximilian Friedersdorff Date: Wed, 5 Nov 2025 08:46:22 +0000 Subject: [PATCH 1/5] Support listing notes by tag --- internal/notes/notes.go | 9 +++++++++ internal/notes/views/views.go | 12 ++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/internal/notes/notes.go b/internal/notes/notes.go index c542aad..a11c74f 100644 --- a/internal/notes/notes.go +++ b/internal/notes/notes.go @@ -398,3 +398,12 @@ func (n *Note) ToggleBox(nthBox int) { n.Body = buf.Bytes() n.Save() } + +func (n *Note) HasTag(tag string) bool { + for _, tag_ := range n.Tags { + if tag_ == tag { + return true + } + } + return false +} diff --git a/internal/notes/views/views.go b/internal/notes/views/views.go index 8452840..5884d18 100644 --- a/internal/notes/views/views.go +++ b/internal/notes/views/views.go @@ -199,6 +199,8 @@ type titleAndURL struct { func list(w http.ResponseWriter, r *http.Request) { user := r.Context().Value(middleware.ContextKey("user")).(string) + tag := r.FormValue("tag") + titlesAndUrls := make([]titleAndURL, 0) ns := notes.Notes.Get(user) @@ -206,10 +208,12 @@ func list(w http.ResponseWriter, r *http.Request) { log.Printf("Notes for %s: %+v", user, ns) for note := range ns { - titlesAndUrls = append( - titlesAndUrls, - titleAndURL{Title: note.Title, URL: myurls.Reverse("view", urls.Repl{"note": note.Uid})}, - ) + if tag == "" || note.HasTag(tag) { + titlesAndUrls = append( + titlesAndUrls, + titleAndURL{Title: note.Title, URL: myurls.Reverse("view", urls.Repl{"note": note.Uid})}, + ) + } } urlNew := myurls.Reverse("new", urls.Repl{}) From e52f0cbe988ae9487bdd68d78158ff10c1d9d330 Mon Sep 17 00:00:00 2001 From: Maximilian Friedersdorff Date: Wed, 5 Nov 2025 08:49:01 +0000 Subject: [PATCH 2/5] Pretty up filtering by tag --- internal/conf/templates/base.tmpl.html | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/internal/conf/templates/base.tmpl.html b/internal/conf/templates/base.tmpl.html index f663226..30523c4 100644 --- a/internal/conf/templates/base.tmpl.html +++ b/internal/conf/templates/base.tmpl.html @@ -39,11 +39,21 @@ - {{range .userTags}} - - {{end}} + {{template "navLinks" .}}
  • Logout {{.user}} From 7a44876e7792994473720480f512f722a767096e Mon Sep 17 00:00:00 2001 From: Maximilian Friedersdorff Date: Wed, 5 Nov 2025 08:55:10 +0000 Subject: [PATCH 3/5] Allow navbar to collapse on small screens --- internal/conf/templates/base.tmpl.html | 66 +++++++++++++++----------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/internal/conf/templates/base.tmpl.html b/internal/conf/templates/base.tmpl.html index 30523c4..0819389 100644 --- a/internal/conf/templates/base.tmpl.html +++ b/internal/conf/templates/base.tmpl.html @@ -31,35 +31,43 @@
    From 1df4f3f807f850d092fe3d092b201bdc46de4115 Mon Sep 17 00:00:00 2001 From: Maximilian Friedersdorff Date: Wed, 5 Nov 2025 09:27:08 +0000 Subject: [PATCH 4/5] Add mechanism to set tags on note --- internal/conf/templates/view.tmpl.html | 4 ++-- internal/notes/views/views.go | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/internal/conf/templates/view.tmpl.html b/internal/conf/templates/view.tmpl.html index eefa8dc..57b79b2 100644 --- a/internal/conf/templates/view.tmpl.html +++ b/internal/conf/templates/view.tmpl.html @@ -46,7 +46,7 @@
    Share with other user
    - + @@ -65,7 +65,7 @@
    - +
    Tags
    diff --git a/internal/notes/views/views.go b/internal/notes/views/views.go index 5884d18..dc2af4e 100644 --- a/internal/notes/views/views.go +++ b/internal/notes/views/views.go @@ -4,6 +4,7 @@ import ( "log" "net/http" "strconv" + "strings" urls "forgejo.gwairfelin.com/max/gispatcho" "forgejo.gwairfelin.com/max/gonotes/internal/middleware" @@ -25,6 +26,7 @@ func GetRoutes(prefix string) *http.ServeMux { "new": {Path: "/new", Protocol: "GET", Handler: new}, "view_": {Path: "/{note}", Protocol: "GET", Handler: view}, "view": {Path: "/{note}/", Protocol: "GET", Handler: view}, + "setTags": {Path: "/{note}/tags/", Protocol: "POST", Handler: setTags}, "delete": {Path: "/{note}/delete/", Protocol: "GET", Handler: delete}, "edit": {Path: "/{note}/edit/", Protocol: "GET", Handler: edit}, "share": {Path: "/{note}/share/", Protocol: "POST", Handler: share}, @@ -55,9 +57,12 @@ func view(w http.ResponseWriter, r *http.Request) { "urlNew": myurls.Reverse("new", urls.Repl{}), "urlShare": myurls.Reverse("share", urls.Repl{"note": uid}), "urlUnshare": myurls.Reverse("unshare", urls.Repl{"note": uid}), + "urlSetTags": myurls.Reverse("setTags", urls.Repl{"note": uid}), "viewers": viewers, + "tags": strings.Join(note.Tags, " "), "isOwner": user == note.Owner, } + log.Printf("%s", context) note.Render() err := templ.RenderTemplate(w, r, "view.tmpl.html", context) @@ -225,3 +230,23 @@ func list(w http.ResponseWriter, r *http.Request) { return } } + +func setTags(w http.ResponseWriter, r *http.Request) { + user := r.Context().Value(middleware.ContextKey("user")).(string) + uid := r.PathValue("note") + tags := r.FormValue("tags") + + note, ok := notes.Notes.GetOne(user, uid) + log.Printf("Found note %s", note.Title) + if !ok || note.Owner != user { + http.Redirect(w, r, myurls.Reverse("view", urls.Repl{"note": uid}), http.StatusFound) + return + } + + log.Printf("Note has existing tags %s", note.Tags) + log.Printf("Form has raw value %s", tags) + + note.Tags = strings.Split(tags, " ") + note.Save() + http.Redirect(w, r, myurls.Reverse("view", urls.Repl{"note": note.Uid}), http.StatusFound) +} From 38bbc35922a6dfddfb66625dfe58073d97297c59 Mon Sep 17 00:00:00 2001 From: Maximilian Friedersdorff Date: Wed, 5 Nov 2025 09:27:35 +0000 Subject: [PATCH 5/5] Remove noisy log statements --- internal/notes/views/views.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/internal/notes/views/views.go b/internal/notes/views/views.go index dc2af4e..39b5659 100644 --- a/internal/notes/views/views.go +++ b/internal/notes/views/views.go @@ -62,7 +62,6 @@ func view(w http.ResponseWriter, r *http.Request) { "tags": strings.Join(note.Tags, " "), "isOwner": user == note.Owner, } - log.Printf("%s", context) note.Render() err := templ.RenderTemplate(w, r, "view.tmpl.html", context) @@ -237,15 +236,11 @@ func setTags(w http.ResponseWriter, r *http.Request) { tags := r.FormValue("tags") note, ok := notes.Notes.GetOne(user, uid) - log.Printf("Found note %s", note.Title) if !ok || note.Owner != user { http.Redirect(w, r, myurls.Reverse("view", urls.Repl{"note": uid}), http.StatusFound) return } - log.Printf("Note has existing tags %s", note.Tags) - log.Printf("Form has raw value %s", tags) - note.Tags = strings.Split(tags, " ") note.Save() http.Redirect(w, r, myurls.Reverse("view", urls.Repl{"note": note.Uid}), http.StatusFound)