Merge pull request #539 from andreynering/notifications-step-2
Notifications - Step 2tokarchuk/v1.17
commit
79d527195d
@ -0,0 +1,81 @@ |
|||||||
|
package user |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"strings" |
||||||
|
|
||||||
|
"github.com/Unknwon/paginater" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/models" |
||||||
|
"code.gitea.io/gitea/modules/base" |
||||||
|
"code.gitea.io/gitea/modules/context" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
tplNotification base.TplName = "user/notification/notification" |
||||||
|
) |
||||||
|
|
||||||
|
// GetNotificationCount is the middleware that sets the notification count in the context
|
||||||
|
func GetNotificationCount(c *context.Context) { |
||||||
|
if strings.HasPrefix(c.Req.URL.Path, "/api") { |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
if !c.IsSigned { |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
count, err := models.GetNotificationUnreadCount(c.User) |
||||||
|
if err != nil { |
||||||
|
c.Handle(500, "GetNotificationCount", err) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
c.Data["NotificationUnreadCount"] = count |
||||||
|
} |
||||||
|
|
||||||
|
// Notifications is the notifications page
|
||||||
|
func Notifications(c *context.Context) { |
||||||
|
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": |
||||||
|
status = models.NotificationStatusRead |
||||||
|
default: |
||||||
|
status = models.NotificationStatusUnread |
||||||
|
} |
||||||
|
|
||||||
|
notifications, err := models.NotificationsForUser(c.User, status, page, perPage) |
||||||
|
if err != nil { |
||||||
|
c.Handle(500, "ErrNotificationsForUser", err) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
total, err := models.GetNotificationCount(c.User, status) |
||||||
|
if err != nil { |
||||||
|
c.Handle(500, "ErrGetNotificationCount", err) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
title := "Notifications" |
||||||
|
if count := len(notifications); count > 0 { |
||||||
|
title = fmt.Sprintf("(%d) %s", count, title) |
||||||
|
} |
||||||
|
c.Data["Title"] = title |
||||||
|
c.Data["Keyword"] = keyword |
||||||
|
c.Data["Status"] = status |
||||||
|
c.Data["Notifications"] = notifications |
||||||
|
c.Data["Page"] = paginater.New(int(total), perPage, page, 5) |
||||||
|
c.HTML(200, tplNotification) |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
{{template "base/head" .}} |
||||||
|
|
||||||
|
<div class="user notification"> |
||||||
|
<div class="ui container"> |
||||||
|
<h1 class="ui header">{{.i18n.Tr "notification.notifications"}}</h1> |
||||||
|
|
||||||
|
<div class="ui top attached tabular menu"> |
||||||
|
<a href="/notifications?q=unread"> |
||||||
|
<div class="{{if eq .Status 1}}active{{end}} item"> |
||||||
|
{{.i18n.Tr "notification.unread"}} |
||||||
|
{{if eq .Status 1}} |
||||||
|
<div class="ui label">{{len .Notifications}}</div> |
||||||
|
{{end}} |
||||||
|
</div> |
||||||
|
</a> |
||||||
|
<a href="/notifications?q=read"> |
||||||
|
<div class="{{if eq .Status 2}}active{{end}} item"> |
||||||
|
{{.i18n.Tr "notification.read"}} |
||||||
|
{{if eq .Status 2}} |
||||||
|
<div class="ui label">{{len .Notifications}}</div> |
||||||
|
{{end}} |
||||||
|
</div> |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
<div class="ui bottom attached active tab segment"> |
||||||
|
{{if eq (len .Notifications) 0}} |
||||||
|
{{if eq .Status 1}} |
||||||
|
{{.i18n.Tr "notification.no_unread"}} |
||||||
|
{{else}} |
||||||
|
{{.i18n.Tr "notification.no_read"}} |
||||||
|
{{end}} |
||||||
|
{{else}} |
||||||
|
<div class="ui relaxed divided list"> |
||||||
|
{{range $notification := .Notifications}} |
||||||
|
{{$issue := $notification.GetIssue}} |
||||||
|
{{$repo := $notification.GetRepo}} |
||||||
|
{{$repoOwner := $repo.MustOwner}} |
||||||
|
|
||||||
|
<div class="item"> |
||||||
|
<a href="{{$.AppSubUrl}}/{{$repoOwner.Name}}/{{$repo.Name}}/issues/{{$issue.Index}}"> |
||||||
|
{{if and $issue.IsPull}} |
||||||
|
{{if $issue.IsClosed}} |
||||||
|
<i class="octicon octicon-git-merge"></i> |
||||||
|
{{else}} |
||||||
|
<i class="octicon octicon-git-pull-request"></i> |
||||||
|
{{end}} |
||||||
|
{{else}} |
||||||
|
{{if $issue.IsClosed}} |
||||||
|
<i class="octicon octicon-issue-closed"></i> |
||||||
|
{{else}} |
||||||
|
<i class="octicon octicon-issue-opened"></i> |
||||||
|
{{end}} |
||||||
|
{{end}} |
||||||
|
|
||||||
|
<div class="content"> |
||||||
|
<div class="header">{{$repoOwner.Name}}/{{$repo.Name}}</div> |
||||||
|
<div class="description">#{{$issue.Index}} - {{$issue.Title}}</div> |
||||||
|
</div> |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
{{end}} |
||||||
|
</div> |
||||||
|
{{end}} |
||||||
|
</div> |
||||||
|
|
||||||
|
{{template "base/paginate" .}} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{{template "base/footer" .}} |
Loading…
Reference in new issue