From a910aac946b8d2ef5b2812ffe6c0684f4e72b07f Mon Sep 17 00:00:00 2001 From: Justin Hawkins Date: Tue, 7 Jun 2022 19:51:56 +0930 Subject: [PATCH] Add reversible column sorting, with sort direction indicators --- db/bookmarks.go | 22 +++++--- web/templates/manage_results.html | 6 +-- .../manage_results_column_header.html | 3 ++ web/web.go | 51 +++++++++++++++++++ 4 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 web/templates/manage_results_column_header.html diff --git a/db/bookmarks.go b/db/bookmarks.go index ff16374..5192456 100644 --- a/db/bookmarks.go +++ b/db/bookmarks.go @@ -139,17 +139,27 @@ func (m *BookmarkManager) Search(opts SearchOptions) ([]entity.Bookmark, error) bhQuery = bolthold.Query(*bhQuery.And("Tags").ContainsAll(bolthold.Slice(opts.Tags)...)) } - if opts.Sort == "title" { - bhQuery.SortBy("Info.Title") - } else if opts.Sort == "created" { - bhQuery.SortBy("TimestampCreated") - } else if opts.Sort == "scraped" { - bhQuery.SortBy("TimestampLastScraped") + reverse := false + sortOrder := opts.Sort + if sortOrder != "" && sortOrder[0] == '-' { + reverse = true + sortOrder = sortOrder[1:] + } + if sortOrder == "title" { + bhQuery.SortBy("Info.Title") + } else if sortOrder == "created" { + bhQuery.SortBy("TimestampCreated") + } else if sortOrder == "scraped" { + bhQuery.SortBy("TimestampLastScraped") } else { bhQuery.SortBy("ID") } + if reverse { + bhQuery = *bhQuery.Reverse() + } + out := []entity.Bookmark{} err := m.db.store.ForEach(&bhQuery, func(bm *entity.Bookmark) error { diff --git a/web/templates/manage_results.html b/web/templates/manage_results.html index da33b96..78af685 100644 --- a/web/templates/manage_results.html +++ b/web/templates/manage_results.html @@ -2,10 +2,10 @@ - + {{ template "manage_results_column_header.html" .column.title }} - - + {{ template "manage_results_column_header.html" .column.created }} + {{ template "manage_results_column_header.html" .column.scraped }} {{ range .bookmarks }} diff --git a/web/templates/manage_results_column_header.html b/web/templates/manage_results_column_header.html new file mode 100644 index 0000000..a6b18f3 --- /dev/null +++ b/web/templates/manage_results_column_header.html @@ -0,0 +1,3 @@ + + diff --git a/web/web.go b/web/web.go index a0b0d13..90cbf4f 100644 --- a/web/web.go +++ b/web/web.go @@ -42,6 +42,28 @@ type Server struct { bmm *db.BookmarkManager } +type ColumnInfo struct { + Name string + Param string + Sorted string +} + +func (c ColumnInfo) URLString() string { + if c.Sorted == "asc" { + return "-" + c.Param + } + return c.Param +} + +func (c ColumnInfo) TitleArrow() string { + if c.Sorted == "asc" { + return "↑" + } else if c.Sorted == "desc" { + return "↓" + } + return "" +} + // Create creates a new web server instance and sets up routing. func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server { @@ -100,6 +122,35 @@ func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server { allBookmarks, _ := bmm.Search(db.SearchOptions{Query: query, Tags: tags, Sort: sort}) meta := gin.H{"config": config, "bookmarks": allBookmarks} + colTitle := &ColumnInfo{Name: "Title/URL", Param: "title"} + colCreated := &ColumnInfo{Name: "Created", Param: "created"} + colScraped := &ColumnInfo{Name: "Scraped", Param: "scraped"} + if sort == "title" { + colTitle.Sorted = "asc" + } + if sort == "-title" { + colTitle.Sorted = "desc" + } + if sort == "scraped" { + colScraped.Sorted = "asc" + } + if sort == "-scraped" { + colScraped.Sorted = "desc" + } + if sort == "created" { + colCreated.Sorted = "asc" + } + if sort == "-created" { + colCreated.Sorted = "desc" + } + + cols := gin.H{ + "title": colTitle, + "created": colCreated, + "scraped": colScraped, + } + meta["column"] = cols + c.HTML(http.StatusOK, "manage_results.html", meta, )
 title/urltagscreatedscraped
{{ .Name }} {{ .TitleArrow }} +