mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	First version of page to see notifications
This commit is contained in:
		@@ -1208,3 +1208,10 @@ default_message = Drop files here or click to upload.
 | 
				
			|||||||
invalid_input_type = You can't upload files of this type.
 | 
					invalid_input_type = You can't upload files of this type.
 | 
				
			||||||
file_too_big = File size ({{filesize}} MB) exceeds maximum size ({{maxFilesize}} MB).
 | 
					file_too_big = File size ({{filesize}} MB) exceeds maximum size ({{maxFilesize}} MB).
 | 
				
			||||||
remove_file = Remove file
 | 
					remove_file = Remove file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[notification]
 | 
				
			||||||
 | 
					notifications = Notifications
 | 
				
			||||||
 | 
					unread = Unread
 | 
				
			||||||
 | 
					read = Read
 | 
				
			||||||
 | 
					no_unread = You have no unread notifications.
 | 
				
			||||||
 | 
					no_read = You have no read notifications.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1199,3 +1199,9 @@ invalid_input_type=Você não pode enviar arquivos deste tipo.
 | 
				
			|||||||
file_too_big=O tamanho do arquivo ({{filesize}} MB) excede o limite máximo ({{maxFilesize}} MB).
 | 
					file_too_big=O tamanho do arquivo ({{filesize}} MB) excede o limite máximo ({{maxFilesize}} MB).
 | 
				
			||||||
remove_file=Remover
 | 
					remove_file=Remover
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[notification]
 | 
				
			||||||
 | 
					notifications = Notificações
 | 
				
			||||||
 | 
					unread = Não lidas
 | 
				
			||||||
 | 
					read = Lidas
 | 
				
			||||||
 | 
					no_unread = Você não possui notificações não lidas.
 | 
				
			||||||
 | 
					no_read = Você não possui notificações lidas.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -151,3 +151,34 @@ func getIssueNotification(e Engine, userID, issueID int64) (*Notification, error
 | 
				
			|||||||
		Get(notification)
 | 
							Get(notification)
 | 
				
			||||||
	return notification, err
 | 
						return notification, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NotificationsForUser returns notifications for a given user and status
 | 
				
			||||||
 | 
					func NotificationsForUser(user *User, status NotificationStatus) ([]*Notification, error) {
 | 
				
			||||||
 | 
						return notificationsForUser(x, user, status)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func notificationsForUser(e Engine, user *User, status NotificationStatus) (notifications []*Notification, err error) {
 | 
				
			||||||
 | 
						err = e.
 | 
				
			||||||
 | 
							Where("user_id = ?", user.ID).
 | 
				
			||||||
 | 
							And("status = ?", status).
 | 
				
			||||||
 | 
							OrderBy("updated_unix DESC").
 | 
				
			||||||
 | 
							Find(¬ifications)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetRepo returns the repo of the notification
 | 
				
			||||||
 | 
					func (n *Notification) GetRepo() (repo *Repository, err error) {
 | 
				
			||||||
 | 
						repo = new(Repository)
 | 
				
			||||||
 | 
						_, err = x.
 | 
				
			||||||
 | 
							Where("id = ?", n.RepoID).
 | 
				
			||||||
 | 
							Get(repo)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetIssue returns the issue of the notification
 | 
				
			||||||
 | 
					func (n *Notification) GetIssue() (issue *Issue, err error) {
 | 
				
			||||||
 | 
						issue = new(Issue)
 | 
				
			||||||
 | 
						_, err = x.
 | 
				
			||||||
 | 
							Where("id = ?", n.IssueID).
 | 
				
			||||||
 | 
							Get(issue)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2691,6 +2691,24 @@ footer .ui.language .menu {
 | 
				
			|||||||
.user.followers .follow .ui.button {
 | 
					.user.followers .follow .ui.button {
 | 
				
			||||||
  padding: 8px 15px;
 | 
					  padding: 8px 15px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					.user.notification .octicon {
 | 
				
			||||||
 | 
					  float: left;
 | 
				
			||||||
 | 
					  font-size: 2em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.user.notification .content {
 | 
				
			||||||
 | 
					  float: left;
 | 
				
			||||||
 | 
					  margin-left: 7px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.user.notification .octicon-issue-opened,
 | 
				
			||||||
 | 
					.user.notification .octicon-git-pull-request {
 | 
				
			||||||
 | 
					  color: green;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.user.notification .octicon-issue-closed {
 | 
				
			||||||
 | 
					  color: red;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.user.notification .octicon-git-merge {
 | 
				
			||||||
 | 
					  color: purple;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
.dashboard {
 | 
					.dashboard {
 | 
				
			||||||
  padding-top: 15px;
 | 
					  padding-top: 15px;
 | 
				
			||||||
  padding-bottom: 80px;
 | 
					  padding-bottom: 80px;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,4 +74,25 @@
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &.notification {
 | 
				
			||||||
 | 
					        .octicon {
 | 
				
			||||||
 | 
					            float: left;
 | 
				
			||||||
 | 
					            font-size: 2em;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        .content {
 | 
				
			||||||
 | 
					            float: left;
 | 
				
			||||||
 | 
					            margin-left: 7px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .octicon-issue-opened, .octicon-git-pull-request {
 | 
				
			||||||
 | 
					            color: green;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        .octicon-issue-closed {
 | 
				
			||||||
 | 
					            color: red;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        .octicon-git-merge {
 | 
				
			||||||
 | 
					            color: purple;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,39 @@
 | 
				
			|||||||
package user
 | 
					package user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/models"
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/modules/base"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/context"
 | 
						"code.gitea.io/gitea/modules/context"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						tplNotification base.TplName = "user/notification/notification"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Notifications is the notifications page
 | 
					// Notifications is the notifications page
 | 
				
			||||||
func Notifications(c *context.Context) {
 | 
					func Notifications(c *context.Context) {
 | 
				
			||||||
	panic("Not implemented")
 | 
						var status models.NotificationStatus
 | 
				
			||||||
 | 
						switch c.Query("status") {
 | 
				
			||||||
 | 
						case "read":
 | 
				
			||||||
 | 
							status = models.NotificationStatusRead
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							status = models.NotificationStatusUnread
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						notifications, err := models.NotificationsForUser(c.User, status)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							c.Handle(500, "ErrNotificationsForUser", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						title := "Notifications"
 | 
				
			||||||
 | 
						if count := len(notifications); count > 0 {
 | 
				
			||||||
 | 
							title = fmt.Sprintf("(%d) %s", count, title)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						c.Data["Title"] = title
 | 
				
			||||||
 | 
						c.Data["Status"] = status
 | 
				
			||||||
 | 
						c.Data["Notifications"] = notifications
 | 
				
			||||||
 | 
						c.HTML(200, tplNotification)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,6 @@ const (
 | 
				
			|||||||
	tplSettingsSocial       base.TplName = "user/settings/social"
 | 
						tplSettingsSocial       base.TplName = "user/settings/social"
 | 
				
			||||||
	tplSettingsApplications base.TplName = "user/settings/applications"
 | 
						tplSettingsApplications base.TplName = "user/settings/applications"
 | 
				
			||||||
	tplSettingsDelete       base.TplName = "user/settings/delete"
 | 
						tplSettingsDelete       base.TplName = "user/settings/delete"
 | 
				
			||||||
	tplNotification         base.TplName = "user/notification"
 | 
					 | 
				
			||||||
	tplSecurity             base.TplName = "user/security"
 | 
						tplSecurity             base.TplName = "user/security"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										68
									
								
								templates/user/notification/notification.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								templates/user/notification/notification.tmpl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					{{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?status=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?status=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.Title}}</div>
 | 
				
			||||||
 | 
													</div>
 | 
				
			||||||
 | 
												</a>
 | 
				
			||||||
 | 
											</div>
 | 
				
			||||||
 | 
										{{end}}
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								{{end}}
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{template "base/footer" .}}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user