diff --git a/server/handlers.go b/server/handlers.go
index 06d253e..2f650f6 100644
--- a/server/handlers.go
+++ b/server/handlers.go
@@ -332,7 +332,8 @@ func ItemListHandler(rw http.ResponseWriter, req *http.Request) {
if search := query.Get("search"); len(search) != 0 {
filter.Search = &search
}
- items := db(req).ListItems(filter, (curPage-1)*perPage, perPage)
+ newestFirst := query.Get("oldest_first") != "true"
+ items := db(req).ListItems(filter, (curPage-1)*perPage, perPage, newestFirst)
count := db(req).CountItems(filter)
writeJSON(rw, map[string]interface{}{
"page": map[string]int{
diff --git a/storage/item.go b/storage/item.go
index 16883c7..130a807 100644
--- a/storage/item.go
+++ b/storage/item.go
@@ -131,9 +131,13 @@ func listQueryPredicate(filter ItemFilter) (string, []interface{}) {
return predicate, args
}
-func (s *Storage) ListItems(filter ItemFilter, offset, limit int) []Item {
+func (s *Storage) ListItems(filter ItemFilter, offset, limit int, newestFirst bool) []Item {
predicate, args := listQueryPredicate(filter)
result := make([]Item, 0, 0)
+ order := "desc"
+ if !newestFirst {
+ order = "asc"
+ }
query := fmt.Sprintf(`
select
i.id, i.guid, i.feed_id, i.title, i.link, i.description,
@@ -141,9 +145,9 @@ func (s *Storage) ListItems(filter ItemFilter, offset, limit int) []Item {
from items i
join feeds f on f.id = i.feed_id
where %s
- order by i.date desc
+ order by i.date %s
limit %d offset %d
- `, predicate, limit, offset)
+ `, predicate, order, limit, offset)
rows, err := s.db.Query(query, args...)
if err != nil {
s.log.Print(err)
diff --git a/storage/settings.go b/storage/settings.go
index 7646690..71befdd 100644
--- a/storage/settings.go
+++ b/storage/settings.go
@@ -8,6 +8,7 @@ func settingsDefaults() map[string]interface{} {
"feed": "",
"feed_list_width": 300,
"item_list_width": 300,
+ "sort_newest_first": true,
}
}
diff --git a/template/index.html b/template/index.html
index a182d1a..b5932f8 100644
--- a/template/index.html
+++ b/template/index.html
@@ -23,11 +23,21 @@
{% inline "plus.svg" %}
New Feed
-
+
{% inline "list.svg" %}
Manage Feeds
+ Sort by
+
+ {% inline "check.svg" %}
+ Newest First
+
+
+ {% inline "check.svg" %}
+ Oldest First
+
+