| @@ -182,14 +182,20 @@ func getIssueNotification(e Engine, userID, issueID int64) (*Notification, error | |||||
| } | } | ||||
| // NotificationsForUser returns notifications for a given user and status | // NotificationsForUser returns notifications for a given user and status | ||||
| func NotificationsForUser(user *User, status NotificationStatus) ([]*Notification, error) { | |||||
| return notificationsForUser(x, user, status) | |||||
| func NotificationsForUser(user *User, status NotificationStatus, page, perPage int) ([]*Notification, error) { | |||||
| return notificationsForUser(x, user, status, page, perPage) | |||||
| } | } | ||||
| func notificationsForUser(e Engine, user *User, status NotificationStatus) (notifications []*Notification, err error) { | |||||
| err = e. | |||||
| func notificationsForUser(e Engine, user *User, status NotificationStatus, page, perPage int) (notifications []*Notification, err error) { | |||||
| sess := e. | |||||
| Where("user_id = ?", user.ID). | Where("user_id = ?", user.ID). | ||||
| And("status = ?", status). | And("status = ?", status). | ||||
| OrderBy("updated_unix DESC"). | |||||
| OrderBy("updated_unix DESC") | |||||
| if page > 0 && perPage > 0 { | |||||
| sess.Limit(perPage, (page-1)*perPage) | |||||
| } | |||||
| err = sess. | |||||
| Find(¬ifications) | Find(¬ifications) | ||||
| return | return | ||||
| } | } | ||||
| @@ -4,6 +4,8 @@ import ( | |||||
| "fmt" | "fmt" | ||||
| "strings" | "strings" | ||||
| "github.com/Unknwon/paginater" | |||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| "code.gitea.io/gitea/modules/base" | "code.gitea.io/gitea/modules/base" | ||||
| "code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
| @@ -34,26 +36,46 @@ func GetNotificationCount(c *context.Context) { | |||||
| // Notifications is the notifications page | // Notifications is the notifications page | ||||
| func Notifications(c *context.Context) { | func Notifications(c *context.Context) { | ||||
| var status models.NotificationStatus | |||||
| switch c.Query("status") { | |||||
| var ( | |||||
| keyword = c.Query("q") | |||||
| status models.NotificationStatus | |||||
| page = c.QueryInt("page") | |||||
| perPage = c.QueryInt("perPage") | |||||
| ) | |||||
| if page < 1 { | |||||
| page = 1 | |||||
| } | |||||
| if perPage < 1 { | |||||
| perPage = 20 | |||||
| } | |||||
| switch keyword { | |||||
| case "read": | case "read": | ||||
| status = models.NotificationStatusRead | status = models.NotificationStatusRead | ||||
| default: | default: | ||||
| status = models.NotificationStatusUnread | status = models.NotificationStatusUnread | ||||
| } | } | ||||
| notifications, err := models.NotificationsForUser(c.User, status) | |||||
| notifications, err := models.NotificationsForUser(c.User, status, page, perPage) | |||||
| if err != nil { | if err != nil { | ||||
| c.Handle(500, "ErrNotificationsForUser", err) | c.Handle(500, "ErrNotificationsForUser", err) | ||||
| return | return | ||||
| } | } | ||||
| total, err := models.GetNotificationCount(c.User, status) | |||||
| if err != nil { | |||||
| c.Handle(500, "ErrGetNotificationCount", err) | |||||
| return | |||||
| } | |||||
| title := "Notifications" | title := "Notifications" | ||||
| if count := len(notifications); count > 0 { | if count := len(notifications); count > 0 { | ||||
| title = fmt.Sprintf("(%d) %s", count, title) | title = fmt.Sprintf("(%d) %s", count, title) | ||||
| } | } | ||||
| c.Data["Title"] = title | c.Data["Title"] = title | ||||
| c.Data["Keyword"] = keyword | |||||
| c.Data["Status"] = status | c.Data["Status"] = status | ||||
| c.Data["Notifications"] = notifications | c.Data["Notifications"] = notifications | ||||
| c.Data["Page"] = paginater.New(int(total), perPage, page, 5) | |||||
| c.HTML(200, tplNotification) | c.HTML(200, tplNotification) | ||||
| } | } | ||||
| @@ -5,7 +5,7 @@ | |||||
| <h1 class="ui header">{{.i18n.Tr "notification.notifications"}}</h1> | <h1 class="ui header">{{.i18n.Tr "notification.notifications"}}</h1> | ||||
| <div class="ui top attached tabular menu"> | <div class="ui top attached tabular menu"> | ||||
| <a href="/notifications?status=unread"> | |||||
| <a href="/notifications?q=unread"> | |||||
| <div class="{{if eq .Status 1}}active{{end}} item"> | <div class="{{if eq .Status 1}}active{{end}} item"> | ||||
| {{.i18n.Tr "notification.unread"}} | {{.i18n.Tr "notification.unread"}} | ||||
| {{if eq .Status 1}} | {{if eq .Status 1}} | ||||
| @@ -13,7 +13,7 @@ | |||||
| {{end}} | {{end}} | ||||
| </div> | </div> | ||||
| </a> | </a> | ||||
| <a href="/notifications?status=read"> | |||||
| <a href="/notifications?q=read"> | |||||
| <div class="{{if eq .Status 2}}active{{end}} item"> | <div class="{{if eq .Status 2}}active{{end}} item"> | ||||
| {{.i18n.Tr "notification.read"}} | {{.i18n.Tr "notification.read"}} | ||||
| {{if eq .Status 2}} | {{if eq .Status 2}} | ||||
| @@ -62,6 +62,8 @@ | |||||
| </div> | </div> | ||||
| {{end}} | {{end}} | ||||
| </div> | </div> | ||||
| {{template "base/paginate" .}} | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||