filter feed items

This commit is contained in:
Nazar Kanaev 2020-07-06 21:09:24 +01:00
parent 3cc7f09436
commit 7f8225b351
3 changed files with 58 additions and 30 deletions

View File

@ -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) { func FeedItemsHandler(rw http.ResponseWriter, req *http.Request) {
id, err := strconv.ParseInt(Vars(req)["id"], 10, 64) id, err := strconv.ParseInt(Vars(req)["id"], 10, 64)
if err != nil { if err != nil {
@ -266,7 +275,7 @@ func FeedItemsHandler(rw http.ResponseWriter, req *http.Request) {
return return
} }
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
items := db(req).ListItems(storage.ItemFilter{FeedID: &id}) items := findItems(db(req), storage.ItemFilter{FeedID: &id})
writeJSON(rw, items) writeJSON(rw, items)
} }
@ -303,7 +312,7 @@ func FolderItemsHandler(rw http.ResponseWriter, req *http.Request) {
rw.WriteHeader(http.StatusBadRequest) rw.WriteHeader(http.StatusBadRequest)
return return
} }
items := db(req).ListItems(storage.ItemFilter{FolderID: &id}) items := findItems(db(req), storage.ItemFilter{FolderID: &id})
writeJSON(rw, items) writeJSON(rw, items)
} else { } else {
rw.WriteHeader(http.StatusMethodNotAllowed) rw.WriteHeader(http.StatusMethodNotAllowed)
@ -312,7 +321,7 @@ func FolderItemsHandler(rw http.ResponseWriter, req *http.Request) {
func ItemListHandler(rw http.ResponseWriter, req *http.Request) { func ItemListHandler(rw http.ResponseWriter, req *http.Request) {
if req.Method == "GET" { if req.Method == "GET" {
items := db(req).ListItems(storage.ItemFilter{}) items := findItems(db(req), storage.ItemFilter{})
writeJSON(rw, items) writeJSON(rw, items)
} else { } else {
rw.WriteHeader(http.StatusMethodNotAllowed) rw.WriteHeader(http.StatusMethodNotAllowed)

View File

@ -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{} { func (s *Storage) GetSettings() map[string]interface{} {
result := settingsDefaults() result := settingsDefaults()
rows, err := s.db.Query(`select key, val from settings;`) rows, err := s.db.Query(`select key, val from settings;`)

View File

@ -3,17 +3,16 @@
var vm = new Vue({ var vm = new Vue({
el: '#app', el: '#app',
created: function() { created: function() {
this.refresh()
var vm = this var vm = this
api.settings.get().then(function(data) { api.settings.get().then(function(data) {
console.log(1)
vm.filterSelected = data.filter vm.filterSelected = data.filter
console.log(1) vm.refreshItems()
}) })
this.refreshFeeds()
}, },
data: function() { data: function() {
return { return {
'filterSelected': 'all', 'filterSelected': null,
'folders': [], 'folders': [],
'feeds': [], 'feeds': [],
'feedSelected': null, 'feedSelected': null,
@ -48,28 +47,15 @@ var vm = new Vue({
}, },
}, },
watch: { 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() { api.settings.update({filter: newVal}).then(function() {
this.$emit('refresh:items') vm.refreshItems()
}.bind(this)) })
}, },
'feedSelected': function(newVal, oldVal) { 'feedSelected': function(newVal, oldVal) {
var promise = null this.refreshItems()
if (newVal === null) {
promise = api.items.list()
} else {
var parts = newVal.split(':', 2)
var type = parts[0]
var guid = parts[1]
if (type === 'feed') {
promise = api.feeds.list_items(guid)
} else if (type == 'folder') {
promise = api.folders.list_items(guid)
}
}
promise.then(function(items) {
vm.items = items
})
}, },
'itemSelected': function(newVal, oldVal) { 'itemSelected': function(newVal, oldVal) {
this.itemSelectedDetails = this.itemsById[newVal] this.itemSelectedDetails = this.itemsById[newVal]
@ -80,7 +66,7 @@ var vm = new Vue({
}, },
}, },
methods: { methods: {
refresh: function() { refreshFeeds: function() {
var vm = this var vm = this
Promise Promise
.all([api.folders.list(), api.feeds.list()]) .all([api.folders.list(), api.feeds.list()])
@ -89,6 +75,24 @@ var vm = new Vue({
vm.feeds = values[1] vm.feeds = values[1]
}) })
}, },
refreshItems: function() {
var promise = null
if (!this.feedSelected) {
promise = api.items.list()
} else {
var parts = this.feedSelected.split(':', 2)
var type = parts[0]
var guid = parts[1]
if (type === 'feed') {
promise = api.feeds.list_items(guid)
} else if (type == 'folder') {
promise = api.folders.list_items(guid)
}
}
promise.then(function(items) {
vm.items = items
})
},
toggleFolderExpanded: function(folder) { toggleFolderExpanded: function(folder) {
folder.is_expanded = !folder.is_expanded folder.is_expanded = !folder.is_expanded
}, },