diff --git a/server/handlers.go b/server/handlers.go index e1bc47a..2104413 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -259,6 +259,15 @@ func FeedHandler(rw http.ResponseWriter, req *http.Request) { } } +func findItems(db *storage.Storage, filter storage.ItemFilter) []storage.Item { + statusFilter := db.GetSettingsValue("filter") + if statusFilter != nil && len(statusFilter.(string)) != 0 { + status := storage.StatusValues[statusFilter.(string)] + filter.Status = &status + } + return db.ListItems(filter) +} + func FeedItemsHandler(rw http.ResponseWriter, req *http.Request) { id, err := strconv.ParseInt(Vars(req)["id"], 10, 64) if err != nil { @@ -266,7 +275,7 @@ func FeedItemsHandler(rw http.ResponseWriter, req *http.Request) { return } rw.WriteHeader(http.StatusOK) - items := db(req).ListItems(storage.ItemFilter{FeedID: &id}) + items := findItems(db(req), storage.ItemFilter{FeedID: &id}) writeJSON(rw, items) } @@ -303,7 +312,7 @@ func FolderItemsHandler(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusBadRequest) return } - items := db(req).ListItems(storage.ItemFilter{FolderID: &id}) + items := findItems(db(req), storage.ItemFilter{FolderID: &id}) writeJSON(rw, items) } else { rw.WriteHeader(http.StatusMethodNotAllowed) @@ -312,7 +321,7 @@ func FolderItemsHandler(rw http.ResponseWriter, req *http.Request) { func ItemListHandler(rw http.ResponseWriter, req *http.Request) { if req.Method == "GET" { - items := db(req).ListItems(storage.ItemFilter{}) + items := findItems(db(req), storage.ItemFilter{}) writeJSON(rw, items) } else { rw.WriteHeader(http.StatusMethodNotAllowed) diff --git a/storage/settings.go b/storage/settings.go index a3209bd..700b605 100644 --- a/storage/settings.go +++ b/storage/settings.go @@ -10,6 +10,21 @@ func settingsDefaults() map[string]interface{} { } } +func (s *Storage) GetSettingsValue(key string) interface{} { + row := s.db.QueryRow(`select val from settings where key=?`, key) + if row == nil { + return settingsDefaults()[key] + } + var val []byte + row.Scan(&val) + var valDecoded interface{} + if err := json.Unmarshal([]byte(val), &valDecoded); err != nil { + s.log.Print(err) + return nil + } + return valDecoded +} + func (s *Storage) GetSettings() map[string]interface{} { result := settingsDefaults() rows, err := s.db.Query(`select key, val from settings;`) diff --git a/template/static/javascripts/app.js b/template/static/javascripts/app.js index 05b8b84..71e4072 100644 --- a/template/static/javascripts/app.js +++ b/template/static/javascripts/app.js @@ -3,17 +3,16 @@ var vm = new Vue({ el: '#app', created: function() { - this.refresh() var vm = this api.settings.get().then(function(data) { - console.log(1) vm.filterSelected = data.filter - console.log(1) + vm.refreshItems() }) + this.refreshFeeds() }, data: function() { return { - 'filterSelected': 'all', + 'filterSelected': null, 'folders': [], 'feeds': [], 'feedSelected': null, @@ -48,17 +47,40 @@ var vm = new Vue({ }, }, watch: { - 'filterSelected': function(newVal) { + 'filterSelected': function(newVal, oldVal) { + if (oldVal === null) return // do nothing, initial setup + var vm = this api.settings.update({filter: newVal}).then(function() { - this.$emit('refresh:items') - }.bind(this)) + vm.refreshItems() + }) }, 'feedSelected': function(newVal, oldVal) { + this.refreshItems() + }, + 'itemSelected': function(newVal, oldVal) { + this.itemSelectedDetails = this.itemsById[newVal] + if (this.itemSelectedDetails.status == 'unread') { + this.itemSelectedDetails.status = 'read' + api.items.update(this.itemSelectedDetails.id, {status: this.itemSelectedDetails.status}) + } + }, + }, + methods: { + refreshFeeds: function() { + var vm = this + Promise + .all([api.folders.list(), api.feeds.list()]) + .then(function(values) { + vm.folders = values[0] + vm.feeds = values[1] + }) + }, + refreshItems: function() { var promise = null - if (newVal === null) { + if (!this.feedSelected) { promise = api.items.list() } else { - var parts = newVal.split(':', 2) + var parts = this.feedSelected.split(':', 2) var type = parts[0] var guid = parts[1] if (type === 'feed') { @@ -71,24 +93,6 @@ var vm = new Vue({ vm.items = items }) }, - 'itemSelected': function(newVal, oldVal) { - this.itemSelectedDetails = this.itemsById[newVal] - if (this.itemSelectedDetails.status == 'unread') { - this.itemSelectedDetails.status = 'read' - api.items.update(this.itemSelectedDetails.id, {status: this.itemSelectedDetails.status}) - } - }, - }, - methods: { - refresh: function() { - var vm = this - Promise - .all([api.folders.list(), api.feeds.list()]) - .then(function(values) { - vm.folders = values[0] - vm.feeds = values[1] - }) - }, toggleFolderExpanded: function(folder) { folder.is_expanded = !folder.is_expanded },