diff options
author | 2017-12-02 17:04:01 -0800 | |
---|---|---|
committer | 2017-12-02 17:04:01 -0800 | |
commit | 2f1367a8d4c33e7c6ba459cfc6756e079c7a1af4 (patch) | |
tree | 04a2c15d41f79c05b74b67c9bbab4bfb483be6e1 /server/ui | |
parent | 453ff64f29c5ca330b20fb9c3dd41bbf7e7b7396 (diff) |
Make entries sorting configurable
Diffstat (limited to 'server/ui')
-rw-r--r-- | server/ui/controller/category.go | 2 | ||||
-rw-r--r-- | server/ui/controller/entry.go | 160 | ||||
-rw-r--r-- | server/ui/controller/feed.go | 2 | ||||
-rw-r--r-- | server/ui/controller/history.go | 2 | ||||
-rw-r--r-- | server/ui/controller/settings.go | 9 | ||||
-rw-r--r-- | server/ui/controller/unread.go | 2 | ||||
-rw-r--r-- | server/ui/form/settings.go | 29 |
7 files changed, 83 insertions, 123 deletions
diff --git a/server/ui/controller/category.go b/server/ui/controller/category.go index b718d0d..75b7f90 100644 --- a/server/ui/controller/category.go +++ b/server/ui/controller/category.go @@ -54,7 +54,7 @@ func (c *Controller) ShowCategoryEntries(ctx *core.Context, request *core.Reques builder := c.store.GetEntryQueryBuilder(user.ID, user.Timezone) builder.WithCategoryID(category.ID) builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.DefaultSortingDirection) + builder.WithDirection(user.EntryDirection) builder.WithoutStatus(model.EntryStatusRemoved) builder.WithOffset(offset) builder.WithLimit(nbItemsPerPage) diff --git a/server/ui/controller/entry.go b/server/ui/controller/entry.go index 7915af5..933f0c6 100644 --- a/server/ui/controller/entry.go +++ b/server/ui/controller/entry.go @@ -11,12 +11,12 @@ import ( "github.com/miniflux/miniflux2/model" "github.com/miniflux/miniflux2/server/core" "github.com/miniflux/miniflux2/server/ui/payload" + "github.com/miniflux/miniflux2/storage" ) // ShowFeedEntry shows a single feed entry in "feed" mode. func (c *Controller) ShowFeedEntry(ctx *core.Context, request *core.Request, response *core.Response) { user := ctx.LoggedUser() - sortingDirection := model.DefaultSortingDirection entryID, err := request.IntegerParam("entryID") if err != nil { @@ -46,33 +46,25 @@ func (c *Controller) ShowFeedEntry(ctx *core.Context, request *core.Request, res return } - args, err := c.getCommonTemplateArgs(ctx) - if err != nil { - response.HTML().ServerError(err) - return + if entry.Status == model.EntryStatusUnread { + err = c.store.SetEntriesStatus(user.ID, []int64{entry.ID}, model.EntryStatusRead) + if err != nil { + log.Println(err) + response.HTML().ServerError(nil) + return + } } - builder = c.store.GetEntryQueryBuilder(user.ID, user.Timezone) - builder.WithoutStatus(model.EntryStatusRemoved) - builder.WithFeedID(feedID) - builder.WithCondition("e.id", "!=", entryID) - builder.WithCondition("e.published_at", "<=", entry.Date) - builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.DefaultSortingDirection) - nextEntry, err := builder.GetEntry() + args, err := c.getCommonTemplateArgs(ctx) if err != nil { response.HTML().ServerError(err) return } builder = c.store.GetEntryQueryBuilder(user.ID, user.Timezone) - builder.WithoutStatus(model.EntryStatusRemoved) builder.WithFeedID(feedID) - builder.WithCondition("e.id", "!=", entryID) - builder.WithCondition("e.published_at", ">=", entry.Date) - builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.GetOppositeDirection(sortingDirection)) - prevEntry, err := builder.GetEntry() + + prevEntry, nextEntry, err := c.getEntryPrevNext(user, builder, entry.ID) if err != nil { response.HTML().ServerError(err) return @@ -88,14 +80,6 @@ func (c *Controller) ShowFeedEntry(ctx *core.Context, request *core.Request, res prevEntryRoute = ctx.Route("feedEntry", "feedID", feedID, "entryID", prevEntry.ID) } - if entry.Status == model.EntryStatusUnread { - err = c.store.SetEntriesStatus(user.ID, []int64{entry.ID}, model.EntryStatusRead) - if err != nil { - response.HTML().ServerError(err) - return - } - } - response.HTML().Render("entry", args.Merge(tplParams{ "entry": entry, "prevEntry": prevEntry, @@ -109,7 +93,6 @@ func (c *Controller) ShowFeedEntry(ctx *core.Context, request *core.Request, res // ShowCategoryEntry shows a single feed entry in "category" mode. func (c *Controller) ShowCategoryEntry(ctx *core.Context, request *core.Request, response *core.Response) { user := ctx.LoggedUser() - sortingDirection := model.DefaultSortingDirection categoryID, err := request.IntegerParam("categoryID") if err != nil { @@ -139,33 +122,25 @@ func (c *Controller) ShowCategoryEntry(ctx *core.Context, request *core.Request, return } - args, err := c.getCommonTemplateArgs(ctx) - if err != nil { - response.HTML().ServerError(err) - return + if entry.Status == model.EntryStatusUnread { + err = c.store.SetEntriesStatus(user.ID, []int64{entry.ID}, model.EntryStatusRead) + if err != nil { + log.Println(err) + response.HTML().ServerError(nil) + return + } } - builder = c.store.GetEntryQueryBuilder(user.ID, user.Timezone) - builder.WithoutStatus(model.EntryStatusRemoved) - builder.WithCategoryID(categoryID) - builder.WithCondition("e.id", "!=", entryID) - builder.WithCondition("e.published_at", "<=", entry.Date) - builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(sortingDirection) - nextEntry, err := builder.GetEntry() + args, err := c.getCommonTemplateArgs(ctx) if err != nil { response.HTML().ServerError(err) return } builder = c.store.GetEntryQueryBuilder(user.ID, user.Timezone) - builder.WithoutStatus(model.EntryStatusRemoved) builder.WithCategoryID(categoryID) - builder.WithCondition("e.id", "!=", entryID) - builder.WithCondition("e.published_at", ">=", entry.Date) - builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.GetOppositeDirection(sortingDirection)) - prevEntry, err := builder.GetEntry() + + prevEntry, nextEntry, err := c.getEntryPrevNext(user, builder, entry.ID) if err != nil { response.HTML().ServerError(err) return @@ -181,15 +156,6 @@ func (c *Controller) ShowCategoryEntry(ctx *core.Context, request *core.Request, prevEntryRoute = ctx.Route("categoryEntry", "categoryID", categoryID, "entryID", prevEntry.ID) } - if entry.Status == model.EntryStatusUnread { - err = c.store.SetEntriesStatus(user.ID, []int64{entry.ID}, model.EntryStatusRead) - if err != nil { - log.Println(err) - response.HTML().ServerError(nil) - return - } - } - response.HTML().Render("entry", args.Merge(tplParams{ "entry": entry, "prevEntry": prevEntry, @@ -203,7 +169,6 @@ func (c *Controller) ShowCategoryEntry(ctx *core.Context, request *core.Request, // ShowUnreadEntry shows a single feed entry in "unread" mode. func (c *Controller) ShowUnreadEntry(ctx *core.Context, request *core.Request, response *core.Response) { user := ctx.LoggedUser() - sortingDirection := model.DefaultSortingDirection entryID, err := request.IntegerParam("entryID") if err != nil { @@ -226,33 +191,25 @@ func (c *Controller) ShowUnreadEntry(ctx *core.Context, request *core.Request, r return } - args, err := c.getCommonTemplateArgs(ctx) - if err != nil { - response.HTML().ServerError(err) - return + if entry.Status == model.EntryStatusUnread { + err = c.store.SetEntriesStatus(user.ID, []int64{entry.ID}, model.EntryStatusRead) + if err != nil { + log.Println(err) + response.HTML().ServerError(nil) + return + } } - builder = c.store.GetEntryQueryBuilder(user.ID, user.Timezone) - builder.WithoutStatus(model.EntryStatusRemoved) - builder.WithStatus(model.EntryStatusUnread) - builder.WithCondition("e.id", "!=", entryID) - builder.WithCondition("e.published_at", "<=", entry.Date) - builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(sortingDirection) - nextEntry, err := builder.GetEntry() + args, err := c.getCommonTemplateArgs(ctx) if err != nil { response.HTML().ServerError(err) return } builder = c.store.GetEntryQueryBuilder(user.ID, user.Timezone) - builder.WithoutStatus(model.EntryStatusRemoved) builder.WithStatus(model.EntryStatusUnread) - builder.WithCondition("e.id", "!=", entryID) - builder.WithCondition("e.published_at", ">=", entry.Date) - builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.GetOppositeDirection(sortingDirection)) - prevEntry, err := builder.GetEntry() + + prevEntry, nextEntry, err := c.getEntryPrevNext(user, builder, entry.ID) if err != nil { response.HTML().ServerError(err) return @@ -268,15 +225,6 @@ func (c *Controller) ShowUnreadEntry(ctx *core.Context, request *core.Request, r prevEntryRoute = ctx.Route("unreadEntry", "entryID", prevEntry.ID) } - if entry.Status == model.EntryStatusUnread { - err = c.store.SetEntriesStatus(user.ID, []int64{entry.ID}, model.EntryStatusRead) - if err != nil { - log.Println(err) - response.HTML().ServerError(nil) - return - } - } - response.HTML().Render("entry", args.Merge(tplParams{ "entry": entry, "prevEntry": prevEntry, @@ -290,7 +238,6 @@ func (c *Controller) ShowUnreadEntry(ctx *core.Context, request *core.Request, r // ShowReadEntry shows a single feed entry in "history" mode. func (c *Controller) ShowReadEntry(ctx *core.Context, request *core.Request, response *core.Response) { user := ctx.LoggedUser() - sortingDirection := model.DefaultSortingDirection entryID, err := request.IntegerParam("entryID") if err != nil { @@ -320,26 +267,9 @@ func (c *Controller) ShowReadEntry(ctx *core.Context, request *core.Request, res } builder = c.store.GetEntryQueryBuilder(user.ID, user.Timezone) - builder.WithoutStatus(model.EntryStatusRemoved) builder.WithStatus(model.EntryStatusRead) - builder.WithCondition("e.id", "!=", entryID) - builder.WithCondition("e.published_at", "<=", entry.Date) - builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(sortingDirection) - nextEntry, err := builder.GetEntry() - if err != nil { - response.HTML().ServerError(err) - return - } - builder = c.store.GetEntryQueryBuilder(user.ID, user.Timezone) - builder.WithoutStatus(model.EntryStatusRemoved) - builder.WithStatus(model.EntryStatusRead) - builder.WithCondition("e.id", "!=", entryID) - builder.WithCondition("e.published_at", ">=", entry.Date) - builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.GetOppositeDirection(sortingDirection)) - prevEntry, err := builder.GetEntry() + prevEntry, nextEntry, err := c.getEntryPrevNext(user, builder, entry.ID) if err != nil { response.HTML().ServerError(err) return @@ -390,3 +320,29 @@ func (c *Controller) UpdateEntriesStatus(ctx *core.Context, request *core.Reques response.JSON().Standard("OK") } + +func (c *Controller) getEntryPrevNext(user *model.User, builder *storage.EntryQueryBuilder, entryID int64) (prev *model.Entry, next *model.Entry, err error) { + builder.WithoutStatus(model.EntryStatusRemoved) + builder.WithOrder(model.DefaultSortingOrder) + builder.WithDirection(user.EntryDirection) + + entries, err := builder.GetEntries() + if err != nil { + return nil, nil, err + } + + n := len(entries) + for i := 0; i < n; i++ { + if entries[i].ID == entryID { + if i-1 > 0 { + prev = entries[i-1] + } + + if i+1 < n { + next = entries[i+1] + } + } + } + + return prev, next, nil +} diff --git a/server/ui/controller/feed.go b/server/ui/controller/feed.go index 85a94cf..eeb66c4 100644 --- a/server/ui/controller/feed.go +++ b/server/ui/controller/feed.go @@ -72,7 +72,7 @@ func (c *Controller) ShowFeedEntries(ctx *core.Context, request *core.Request, r builder.WithFeedID(feed.ID) builder.WithoutStatus(model.EntryStatusRemoved) builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.DefaultSortingDirection) + builder.WithDirection(user.EntryDirection) builder.WithOffset(offset) builder.WithLimit(nbItemsPerPage) diff --git a/server/ui/controller/history.go b/server/ui/controller/history.go index 9b4e316..1052517 100644 --- a/server/ui/controller/history.go +++ b/server/ui/controller/history.go @@ -23,7 +23,7 @@ func (c *Controller) ShowHistoryPage(ctx *core.Context, request *core.Request, r builder := c.store.GetEntryQueryBuilder(user.ID, user.Timezone) builder.WithStatus(model.EntryStatusRead) builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.DefaultSortingDirection) + builder.WithDirection(user.EntryDirection) builder.WithOffset(offset) builder.WithLimit(nbItemsPerPage) diff --git a/server/ui/controller/settings.go b/server/ui/controller/settings.go index e8ab20b..a951e5d 100644 --- a/server/ui/controller/settings.go +++ b/server/ui/controller/settings.go @@ -74,10 +74,11 @@ func (c *Controller) getSettingsFormTemplateArgs(ctx *core.Context, user *model. if settingsForm == nil { args["form"] = form.SettingsForm{ - Username: user.Username, - Theme: user.Theme, - Language: user.Language, - Timezone: user.Timezone, + Username: user.Username, + Theme: user.Theme, + Language: user.Language, + Timezone: user.Timezone, + EntryDirection: user.EntryDirection, } } else { args["form"] = settingsForm diff --git a/server/ui/controller/unread.go b/server/ui/controller/unread.go index a114250..e0f120a 100644 --- a/server/ui/controller/unread.go +++ b/server/ui/controller/unread.go @@ -17,7 +17,7 @@ func (c *Controller) ShowUnreadPage(ctx *core.Context, request *core.Request, re builder := c.store.GetEntryQueryBuilder(user.ID, user.Timezone) builder.WithStatus(model.EntryStatusUnread) builder.WithOrder(model.DefaultSortingOrder) - builder.WithDirection(model.DefaultSortingDirection) + builder.WithDirection(user.EntryDirection) builder.WithOffset(offset) builder.WithLimit(nbItemsPerPage) diff --git a/server/ui/form/settings.go b/server/ui/form/settings.go index 3d37a0f..2ebaa6d 100644 --- a/server/ui/form/settings.go +++ b/server/ui/form/settings.go @@ -13,12 +13,13 @@ import ( // SettingsForm represents the settings form. type SettingsForm struct { - Username string - Password string - Confirmation string - Theme string - Language string - Timezone string + Username string + Password string + Confirmation string + Theme string + Language string + Timezone string + EntryDirection string } // Merge updates the fields of the given user. @@ -27,6 +28,7 @@ func (s *SettingsForm) Merge(user *model.User) *model.User { user.Theme = s.Theme user.Language = s.Language user.Timezone = s.Timezone + user.EntryDirection = s.EntryDirection if s.Password != "" { user.Password = s.Password @@ -37,7 +39,7 @@ func (s *SettingsForm) Merge(user *model.User) *model.User { // Validate makes sure the form values are valid. func (s *SettingsForm) Validate() error { - if s.Username == "" || s.Theme == "" || s.Language == "" || s.Timezone == "" { + if s.Username == "" || s.Theme == "" || s.Language == "" || s.Timezone == "" || s.EntryDirection == "" { return errors.NewLocalizedError("The username, theme, language and timezone fields are mandatory.") } @@ -57,11 +59,12 @@ func (s *SettingsForm) Validate() error { // NewSettingsForm returns a new SettingsForm. func NewSettingsForm(r *http.Request) *SettingsForm { return &SettingsForm{ - Username: r.FormValue("username"), - Password: r.FormValue("password"), - Confirmation: r.FormValue("confirmation"), - Theme: r.FormValue("theme"), - Language: r.FormValue("language"), - Timezone: r.FormValue("timezone"), + Username: r.FormValue("username"), + Password: r.FormValue("password"), + Confirmation: r.FormValue("confirmation"), + Theme: r.FormValue("theme"), + Language: r.FormValue("language"), + Timezone: r.FormValue("timezone"), + EntryDirection: r.FormValue("entry_direction"), } } |