finish view issue without comments and ops
This commit is contained in:
		
							parent
							
								
									b410207dc1
								
							
						
					
					
						commit
						b4c0b7b98b
					
				
					 13 changed files with 662 additions and 425 deletions
				
			
		|  | @ -402,6 +402,10 @@ issues.filter_type.mentioning_you = Mentioning you | |||
| issues.opened_by = opened %[1]s by <a href="/%[2]s">%[2]s</a> | ||||
| issues.previous = Previous | ||||
| issues.next = Next | ||||
| issues.open_title = Open | ||||
| issues.closed_title = Closed | ||||
| issues.num_comments = %d comments | ||||
| issues.commented_at = commented at <a href="%s">%s</a> | ||||
| issues.label_title = Label name | ||||
| issues.label_color = Label color | ||||
| issues.label_count = %d labels | ||||
|  |  | |||
|  | @ -239,6 +239,28 @@ func (err ErrRepoAlreadyExist) Error() string { | |||
| 	return fmt.Sprintf("repository already exists [uname: %d, name: %s]", err.Uname, err.Name) | ||||
| } | ||||
| 
 | ||||
| // .___
 | ||||
| // |   | ______ ________ __   ____
 | ||||
| // |   |/  ___//  ___/  |  \_/ __ \
 | ||||
| // |   |\___ \ \___ \|  |  /\  ___/
 | ||||
| // |___/____  >____  >____/  \___  >
 | ||||
| //          \/     \/            \/
 | ||||
| 
 | ||||
| type ErrIssueNotExist struct { | ||||
| 	ID     int64 | ||||
| 	RepoID int64 | ||||
| 	Index  int64 | ||||
| } | ||||
| 
 | ||||
| func IsErrIssueNotExist(err error) bool { | ||||
| 	_, ok := err.(ErrIssueNotExist) | ||||
| 	return ok | ||||
| } | ||||
| 
 | ||||
| func (err ErrIssueNotExist) Error() string { | ||||
| 	return fmt.Sprintf("issue does not exist [id: %d, repo_id: %d, index: %4]", err.ID, err.RepoID, err.Index) | ||||
| } | ||||
| 
 | ||||
| // .____          ___.          .__
 | ||||
| // |    |   _____ \_ |__   ____ |  |
 | ||||
| // |    |   \__  \ | __ \_/ __ \|  |
 | ||||
|  |  | |||
|  | @ -27,7 +27,6 @@ import ( | |||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	ErrIssueNotExist       = errors.New("Issue does not exist") | ||||
| 	ErrWrongIssueCounter   = errors.New("Invalid number of issues for this milestone") | ||||
| 	ErrAttachmentNotLinked = errors.New("Attachment does not belong to this issue") | ||||
| 	ErrMissingIssueNumber  = errors.New("No issue number specified") | ||||
|  | @ -57,11 +56,24 @@ type Issue struct { | |||
| 	Deadline        time.Time | ||||
| 	Created         time.Time `xorm:"CREATED"` | ||||
| 	Updated         time.Time `xorm:"UPDATED"` | ||||
| 
 | ||||
| 	Attachments []*Attachment `xorm:"-"` | ||||
| } | ||||
| 
 | ||||
| // HashTag returns unique hash tag for issue.
 | ||||
| func (i *Issue) HashTag() string { | ||||
| 	return "#issue-" + com.ToStr(i.Index) | ||||
| } | ||||
| 
 | ||||
| func (i *Issue) AfterSet(colName string, _ xorm.Cell) { | ||||
| 	var err error | ||||
| 	switch colName { | ||||
| 	case "id": | ||||
| 		i.Attachments, err = GetAttachmentsByIssueID(i.ID) | ||||
| 		if err != nil { | ||||
| 			log.Error(3, "GetAttachmentsByIssueID[%d]: %v", i.ID, err) | ||||
| 		} | ||||
| 
 | ||||
| 	case "milestone_id": | ||||
| 		if i.MilestoneID == 0 { | ||||
| 			return | ||||
|  | @ -69,7 +81,7 @@ func (i *Issue) AfterSet(colName string, _ xorm.Cell) { | |||
| 
 | ||||
| 		i.Milestone, err = GetMilestoneByID(i.MilestoneID) | ||||
| 		if err != nil { | ||||
| 			log.Error(3, "GetMilestoneById: %v", err) | ||||
| 			log.Error(3, "GetMilestoneById[%d]: %v", i.ID, err) | ||||
| 		} | ||||
| 	case "assignee_id": | ||||
| 		if i.AssigneeID == 0 { | ||||
|  | @ -78,7 +90,7 @@ func (i *Issue) AfterSet(colName string, _ xorm.Cell) { | |||
| 
 | ||||
| 		i.Assignee, err = GetUserByID(i.AssigneeID) | ||||
| 		if err != nil { | ||||
| 			log.Error(3, "GetUserByID: %v", err) | ||||
| 			log.Error(3, "GetUserByID[%d]: %v", i.ID, err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -86,7 +98,7 @@ func (i *Issue) AfterSet(colName string, _ xorm.Cell) { | |||
| func (i *Issue) GetPoster() (err error) { | ||||
| 	i.Poster, err = GetUserByID(i.PosterID) | ||||
| 	if IsErrUserNotExist(err) { | ||||
| 		i.Poster = &User{Name: "FakeUser"} | ||||
| 		i.Poster = &User{Name: "Someone"} | ||||
| 		return nil | ||||
| 	} | ||||
| 	return err | ||||
|  | @ -148,11 +160,6 @@ func (i *Issue) GetAssignee() (err error) { | |||
| 	return err | ||||
| } | ||||
| 
 | ||||
| func (i *Issue) Attachments() []*Attachment { | ||||
| 	a, _ := GetAttachmentsForIssue(i.ID) | ||||
| 	return a | ||||
| } | ||||
| 
 | ||||
| func (i *Issue) AfterDelete() { | ||||
| 	_, err := DeleteAttachmentsByIssue(i.ID, true) | ||||
| 
 | ||||
|  | @ -255,25 +262,28 @@ func GetIssueByRef(ref string) (issue *Issue, err error) { | |||
| } | ||||
| 
 | ||||
| // GetIssueByIndex returns issue by given index in repository.
 | ||||
| func GetIssueByIndex(rid, index int64) (*Issue, error) { | ||||
| 	issue := &Issue{RepoID: rid, Index: index} | ||||
| func GetIssueByIndex(repoID, index int64) (*Issue, error) { | ||||
| 	issue := &Issue{ | ||||
| 		RepoID: repoID, | ||||
| 		Index:  index, | ||||
| 	} | ||||
| 	has, err := x.Get(issue) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} else if !has { | ||||
| 		return nil, ErrIssueNotExist | ||||
| 		return nil, ErrIssueNotExist{0, repoID, index} | ||||
| 	} | ||||
| 	return issue, nil | ||||
| } | ||||
| 
 | ||||
| // GetIssueById returns an issue by ID.
 | ||||
| func GetIssueById(id int64) (*Issue, error) { | ||||
| 	issue := &Issue{ID: id} | ||||
| 	has, err := x.Get(issue) | ||||
| // GetIssueByID returns an issue by given ID.
 | ||||
| func GetIssueByID(id int64) (*Issue, error) { | ||||
| 	issue := new(Issue) | ||||
| 	has, err := x.Id(id).Get(issue) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} else if !has { | ||||
| 		return nil, ErrIssueNotExist | ||||
| 		return nil, ErrIssueNotExist{id, 0, 0} | ||||
| 	} | ||||
| 	return issue, nil | ||||
| } | ||||
|  | @ -1303,17 +1313,10 @@ func GetAttachmentByUUID(uuid string) (*Attachment, error) { | |||
| 	return attach, nil | ||||
| } | ||||
| 
 | ||||
| func GetAttachmentsForIssue(issueId int64) ([]*Attachment, error) { | ||||
| // GetAttachmentsByIssueID returns all attachments for given issue by ID.
 | ||||
| func GetAttachmentsByIssueID(issueID int64) ([]*Attachment, error) { | ||||
| 	attachments := make([]*Attachment, 0, 10) | ||||
| 	err := x.Where("issue_id = ?", issueId).And("comment_id = 0").Find(&attachments) | ||||
| 	return attachments, err | ||||
| } | ||||
| 
 | ||||
| // GetAttachmentsByIssue returns a list of attachments for the given issue
 | ||||
| func GetAttachmentsByIssue(issueId int64) ([]*Attachment, error) { | ||||
| 	attachments := make([]*Attachment, 0, 10) | ||||
| 	err := x.Where("issue_id = ?", issueId).And("comment_id > 0").Find(&attachments) | ||||
| 	return attachments, err | ||||
| 	return attachments, x.Where("issue_id=? AND comment_id=0", issueID).Find(&attachments) | ||||
| } | ||||
| 
 | ||||
| // GetAttachmentsByComment returns a list of attachments for the given comment
 | ||||
|  | @ -1348,7 +1351,7 @@ func DeleteAttachments(attachments []*Attachment, remove bool) (int, error) { | |||
| 
 | ||||
| // DeleteAttachmentsByIssue deletes all attachments associated with the given issue.
 | ||||
| func DeleteAttachmentsByIssue(issueId int64, remove bool) (int, error) { | ||||
| 	attachments, err := GetAttachmentsByIssue(issueId) | ||||
| 	attachments, err := GetAttachmentsByIssueID(issueId) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
|  |  | |||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								public/css/gogs.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								public/css/gogs.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -118,8 +118,18 @@ | |||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	@comment-avatar-width: 3em; | ||||
| 	&.new.issue { | ||||
| 		.comment.form { | ||||
| 			.comment .avatar { | ||||
| 				width: @comment-avatar-width; | ||||
| 			} | ||||
| 			.content { | ||||
| 				margin-left: 4em; | ||||
| 				.markdown { | ||||
| 					font-size: 14px; | ||||
| 				} | ||||
| 			} | ||||
| 			.metas { | ||||
| 				min-width: 220px; | ||||
| 				.filter.menu { | ||||
|  | @ -129,6 +139,67 @@ | |||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	&.view.issue { | ||||
| 		.title { | ||||
| 			padding-bottom: 0!important; | ||||
| 			h1 { | ||||
| 				font-weight: 300; | ||||
| 				font-size: 3rem; | ||||
| 				margin-bottom: 5px; | ||||
| 			} | ||||
| 			.index { | ||||
| 				font-weight: 300; | ||||
| 				color: #aaa; | ||||
| 				letter-spacing: -1px; | ||||
| 			} | ||||
| 			.label { | ||||
| 				margin-right: 10px; | ||||
| 			} | ||||
| 		} | ||||
| 		.comment-list { | ||||
| 			.comment { | ||||
| 				.avatar { | ||||
| 					width: @comment-avatar-width; | ||||
| 				} | ||||
| 				.content { | ||||
| 					margin-left: 4em; | ||||
| 					.header { | ||||
| 						font-weight: normal; | ||||
| 						padding: auto 15px; | ||||
| 						color: #767676; | ||||
| 						background-color: #f7f7f7; | ||||
| 						border-bottom: 1px solid #eee; | ||||
| 						border-top-left-radius: 3px; | ||||
| 						border-top-right-radius: 3px; | ||||
| 						.text { | ||||
| 							max-width: 78%; | ||||
| 					    padding-top: 10px; | ||||
| 					    padding-bottom: 10px; | ||||
| 			        color: #767676; | ||||
| 					    a { | ||||
| 					    	color: #444; | ||||
| 					    	&:hover { | ||||
| 					    		color: #000; | ||||
| 					    	} | ||||
| 					    } | ||||
| 						} | ||||
| 					} | ||||
| 					.markdown { | ||||
| 						font-size: 14px; | ||||
| 					} | ||||
| 					.bottom.segment { | ||||
| 						background: #f3f4f5; | ||||
| 						.ui.image { | ||||
| 							max-height: 150px; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		.ui.segment.metas { | ||||
| 	    margin-top: -3px; | ||||
| 		} | ||||
| 	} | ||||
| 	.comment.form { | ||||
| 		.ui.comments { | ||||
| 			margin-top: -12px; | ||||
|  |  | |||
|  | @ -172,13 +172,17 @@ func Issues(ctx *middleware.Context) { | |||
| 	ctx.HTML(200, ISSUES) | ||||
| } | ||||
| 
 | ||||
| func renderAttachmentSettings(ctx *middleware.Context) { | ||||
| 	ctx.Data["IsAttachmentEnabled"] = setting.AttachmentEnabled | ||||
| 	ctx.Data["AttachmentAllowedTypes"] = setting.AttachmentAllowedTypes | ||||
| 	ctx.Data["AttachmentMaxFiles"] = setting.AttachmentMaxFiles | ||||
| } | ||||
| 
 | ||||
| func NewIssue(ctx *middleware.Context) { | ||||
| 	ctx.Data["Title"] = ctx.Tr("repo.issues.new") | ||||
| 	ctx.Data["PageIsIssueList"] = true | ||||
| 	ctx.Data["RequireDropzone"] = true | ||||
| 	ctx.Data["IsAttachmentEnabled"] = setting.AttachmentEnabled | ||||
| 	ctx.Data["AttachmentAllowedTypes"] = setting.AttachmentAllowedTypes | ||||
| 	ctx.Data["AttachmentMaxFiles"] = setting.AttachmentMaxFiles | ||||
| 	renderAttachmentSettings(ctx) | ||||
| 
 | ||||
| 	if ctx.User.IsAdmin { | ||||
| 		var ( | ||||
|  | @ -216,9 +220,7 @@ func NewIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) { | |||
| 	ctx.Data["Title"] = ctx.Tr("repo.issues.new") | ||||
| 	ctx.Data["PageIsIssueList"] = true | ||||
| 	ctx.Data["RequireDropzone"] = true | ||||
| 	ctx.Data["IsAttachmentEnabled"] = setting.AttachmentEnabled | ||||
| 	ctx.Data["AttachmentAllowedTypes"] = setting.AttachmentAllowedTypes | ||||
| 	ctx.Data["AttachmentMaxFiles"] = setting.AttachmentMaxFiles | ||||
| 	renderAttachmentSettings(ctx) | ||||
| 
 | ||||
| 	var ( | ||||
| 		repo        = ctx.Repo.Repository | ||||
|  | @ -409,116 +411,96 @@ func checkLabels(labels, allLabels []*models.Label) { | |||
| } | ||||
| 
 | ||||
| func ViewIssue(ctx *middleware.Context) { | ||||
| 	ctx.Data["AttachmentsEnabled"] = setting.AttachmentEnabled | ||||
| 	ctx.Data["PageIsIssueList"] = true | ||||
| 	ctx.Data["RequireDropzone"] = true | ||||
| 	renderAttachmentSettings(ctx) | ||||
| 
 | ||||
| 	idx := com.StrTo(ctx.Params(":index")).MustInt64() | ||||
| 	if idx == 0 { | ||||
| 		ctx.Handle(404, "issue.ViewIssue", nil) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, idx) | ||||
| 	issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) | ||||
| 	if err != nil { | ||||
| 		if err == models.ErrIssueNotExist { | ||||
| 		if models.IsErrIssueNotExist(err) { | ||||
| 			ctx.Handle(404, "GetIssueByIndex", err) | ||||
| 		} else { | ||||
| 			ctx.Handle(500, "GetIssueByIndex", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.Data["Title"] = issue.Name | ||||
| 
 | ||||
| 	// Get labels.
 | ||||
| 	if err = issue.GetLabels(); err != nil { | ||||
| 		ctx.Handle(500, "GetLabels", err) | ||||
| 		return | ||||
| 	} | ||||
| 	labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetLabels.2", err) | ||||
| 		return | ||||
| 	} | ||||
| 	checkLabels(issue.Labels, labels) | ||||
| 	ctx.Data["Labels"] = labels | ||||
| 
 | ||||
| 	// Get assigned milestone.
 | ||||
| 	if issue.MilestoneID > 0 { | ||||
| 		ctx.Data["Milestone"], err = models.GetMilestoneByID(issue.MilestoneID) | ||||
| 		if err != nil { | ||||
| 			if models.IsErrMilestoneNotExist(err) { | ||||
| 				log.Warn("GetMilestoneById: %v", err) | ||||
| 			} else { | ||||
| 				ctx.Handle(500, "GetMilestoneById", err) | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Get all milestones.
 | ||||
| 	ctx.Data["OpenMilestones"], err = models.GetMilestones(ctx.Repo.Repository.ID, -1, false) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetMilestones.1: %v", err) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.Data["ClosedMilestones"], err = models.GetMilestones(ctx.Repo.Repository.ID, -1, true) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetMilestones.2: %v", err) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Get all collaborators.
 | ||||
| 	ctx.Data["Collaborators"], err = ctx.Repo.Repository.GetCollaborators() | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetCollaborators", err) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if ctx.IsSigned { | ||||
| 		// Update issue-user.
 | ||||
| 		if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.ID); err != nil { | ||||
| 			ctx.Handle(500, "UpdateIssueUserPairByRead: %v", err) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Get poster and Assignee.
 | ||||
| 	if err = issue.GetPoster(); err != nil { | ||||
| 		ctx.Handle(500, "GetPoster: %v", err) | ||||
| 		return | ||||
| 	} else if err = issue.GetAssignee(); err != nil { | ||||
| 		ctx.Handle(500, "GetAssignee: %v", err) | ||||
| 		return | ||||
| 	} | ||||
| 	issue.RenderedContent = string(base.RenderMarkdown([]byte(issue.Content), ctx.Repo.RepoLink)) | ||||
| 
 | ||||
| 	// Get comments.
 | ||||
| 	comments, err := models.GetIssueComments(issue.ID) | ||||
| 	if err != nil { | ||||
| 		ctx.Handle(500, "GetIssueComments: %v", err) | ||||
| 	// Attchments.
 | ||||
| 
 | ||||
| 	// Metas.
 | ||||
| 	if err = issue.GetLabels(); err != nil { | ||||
| 		ctx.Handle(500, "GetLabels", err) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Get posters.
 | ||||
| 	for i := range comments { | ||||
| 		u, err := models.GetUserByID(comments[i].PosterId) | ||||
| 		if err != nil { | ||||
| 			ctx.Handle(500, "GetUserById.2: %v", err) | ||||
| 			return | ||||
| 		} | ||||
| 		comments[i].Poster = u | ||||
| 	if ctx.IsSigned { | ||||
| 		// 	// Update issue-user.
 | ||||
| 		// 	if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.ID); err != nil {
 | ||||
| 		// 		ctx.Handle(500, "UpdateIssueUserPairByRead: %v", err)
 | ||||
| 		// 		return
 | ||||
| 		// 	}
 | ||||
| 
 | ||||
| 		if comments[i].Type == models.COMMENT_TYPE_COMMENT { | ||||
| 			comments[i].Content = string(base.RenderMarkdown([]byte(comments[i].Content), ctx.Repo.RepoLink)) | ||||
| 		if ctx.User.IsAdmin { | ||||
| 			// labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID)
 | ||||
| 			// if err != nil {
 | ||||
| 			// 	ctx.Handle(500, "GetLabels.2", err)
 | ||||
| 			// 	return
 | ||||
| 			// }
 | ||||
| 			// checkLabels(issue.Labels, labels)
 | ||||
| 			// ctx.Data["Labels"] = labels
 | ||||
| 
 | ||||
| 			// // Get all milestones.
 | ||||
| 			// ctx.Data["OpenMilestones"], err = models.GetMilestones(ctx.Repo.Repository.ID, -1, false)
 | ||||
| 			// if err != nil {
 | ||||
| 			// 	ctx.Handle(500, "GetMilestones.1: %v", err)
 | ||||
| 			// 	return
 | ||||
| 			// }
 | ||||
| 			// ctx.Data["ClosedMilestones"], err = models.GetMilestones(ctx.Repo.Repository.ID, -1, true)
 | ||||
| 			// if err != nil {
 | ||||
| 			// 	ctx.Handle(500, "GetMilestones.2: %v", err)
 | ||||
| 			// 	return
 | ||||
| 			// }
 | ||||
| 
 | ||||
| 			// // Get all collaborators.
 | ||||
| 			// ctx.Data["Collaborators"], err = ctx.Repo.Repository.GetCollaborators()
 | ||||
| 			// if err != nil {
 | ||||
| 			// 	ctx.Handle(500, "GetCollaborators", err)
 | ||||
| 			// 	return
 | ||||
| 			// }
 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	ctx.Data["AllowedTypes"] = setting.AttachmentAllowedTypes | ||||
| 	// // Get comments.
 | ||||
| 	// comments, err := models.GetIssueComments(issue.ID)
 | ||||
| 	// if err != nil {
 | ||||
| 	// 	ctx.Handle(500, "GetIssueComments: %v", err)
 | ||||
| 	// 	return
 | ||||
| 	// }
 | ||||
| 
 | ||||
| 	// // Get posters.
 | ||||
| 	// for i := range comments {
 | ||||
| 	// 	u, err := models.GetUserByID(comments[i].PosterId)
 | ||||
| 	// 	if err != nil {
 | ||||
| 	// 		ctx.Handle(500, "GetUserById.2: %v", err)
 | ||||
| 	// 		return
 | ||||
| 	// 	}
 | ||||
| 	// 	comments[i].Poster = u
 | ||||
| 
 | ||||
| 	// 	if comments[i].Type == models.COMMENT_TYPE_COMMENT {
 | ||||
| 	// 		comments[i].Content = string(base.RenderMarkdown([]byte(comments[i].Content), ctx.Repo.RepoLink))
 | ||||
| 	// 	}
 | ||||
| 	// }
 | ||||
| 
 | ||||
| 	ctx.Data["Title"] = issue.Name | ||||
| 	ctx.Data["Issue"] = issue | ||||
| 	ctx.Data["Comments"] = comments | ||||
| 	ctx.Data["IsIssueOwner"] = ctx.Repo.IsOwner() || (ctx.IsSigned && issue.PosterID == ctx.User.Id) | ||||
| 	ctx.Data["IsRepoToolbarIssues"] = true | ||||
| 	ctx.Data["IsRepoToolbarIssuesList"] = false | ||||
| 	// ctx.Data["Comments"] = comments
 | ||||
| 	// ctx.Data["IsIssueOwner"] = ctx.Repo.IsOwner() || (ctx.IsSigned && issue.PosterID == ctx.User.Id)
 | ||||
| 	ctx.HTML(200, ISSUE_VIEW) | ||||
| } | ||||
| 
 | ||||
|  | @ -531,7 +513,7 @@ func UpdateIssue(ctx *middleware.Context, form auth.CreateIssueForm) { | |||
| 
 | ||||
| 	issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, idx) | ||||
| 	if err != nil { | ||||
| 		if err == models.ErrIssueNotExist { | ||||
| 		if models.IsErrIssueNotExist(err) { | ||||
| 			ctx.Handle(404, "issue.UpdateIssue", err) | ||||
| 		} else { | ||||
| 			ctx.Handle(500, "issue.UpdateIssue(GetIssueByIndex)", err) | ||||
|  | @ -579,7 +561,7 @@ func UpdateIssueLabel(ctx *middleware.Context) { | |||
| 
 | ||||
| 	issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, idx) | ||||
| 	if err != nil { | ||||
| 		if err == models.ErrIssueNotExist { | ||||
| 		if models.IsErrIssueNotExist(err) { | ||||
| 			ctx.Handle(404, "issue.UpdateIssueLabel(GetIssueByIndex)", err) | ||||
| 		} else { | ||||
| 			ctx.Handle(500, "issue.UpdateIssueLabel(GetIssueByIndex)", err) | ||||
|  | @ -659,12 +641,12 @@ func UpdateIssueMilestone(ctx *middleware.Context) { | |||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	issue, err := models.GetIssueById(issueId) | ||||
| 	issue, err := models.GetIssueByID(issueId) | ||||
| 	if err != nil { | ||||
| 		if err == models.ErrIssueNotExist { | ||||
| 			ctx.Handle(404, "issue.UpdateIssueMilestone(GetIssueById)", err) | ||||
| 		if models.IsErrIssueNotExist(err) { | ||||
| 			ctx.Handle(404, "issue.UpdateIssueMilestone(GetIssueByID)", err) | ||||
| 		} else { | ||||
| 			ctx.Handle(500, "issue.UpdateIssueMilestone(GetIssueById)", err) | ||||
| 			ctx.Handle(500, "issue.UpdateIssueMilestone(GetIssueByID)", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
|  | @ -705,12 +687,12 @@ func UpdateAssignee(ctx *middleware.Context) { | |||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	issue, err := models.GetIssueById(issueId) | ||||
| 	issue, err := models.GetIssueByID(issueId) | ||||
| 	if err != nil { | ||||
| 		if err == models.ErrIssueNotExist { | ||||
| 			ctx.Handle(404, "GetIssueById", err) | ||||
| 		if models.IsErrIssueNotExist(err) { | ||||
| 			ctx.Handle(404, "GetIssueByID", err) | ||||
| 		} else { | ||||
| 			ctx.Handle(500, "GetIssueById", err) | ||||
| 			ctx.Handle(500, "GetIssueByID", err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
|  | @ -758,7 +740,7 @@ func Comment(ctx *middleware.Context) { | |||
| 
 | ||||
| 	issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, index) | ||||
| 	if err != nil { | ||||
| 		if err == models.ErrIssueNotExist { | ||||
| 		if models.IsErrIssueNotExist(err) { | ||||
| 			send(404, nil, err) | ||||
| 		} else { | ||||
| 			send(200, nil, err) | ||||
|  |  | |||
|  | @ -339,9 +339,9 @@ func Issues(ctx *middleware.Context) { | |||
| 
 | ||||
| 	issues := make([]*models.Issue, len(ius)) | ||||
| 	for i := range ius { | ||||
| 		issues[i], err = models.GetIssueById(ius[i].IssueID) | ||||
| 		issues[i], err = models.GetIssueByID(ius[i].IssueID) | ||||
| 		if err != nil { | ||||
| 			if err == models.ErrIssueNotExist { | ||||
| 			if models.IsErrIssueNotExist(err) { | ||||
| 				log.Warn("user.Issues(GetIssueById #%d): issue not exist", ius[i].IssueID) | ||||
| 				continue | ||||
| 			} else { | ||||
|  |  | |||
|  | @ -85,7 +85,7 @@ | |||
|       	{{end}} | ||||
| 
 | ||||
|         <p class="desc"> | ||||
|         	{{$.i18n.Tr "repo.issues.opened_by" $timeStr .Poster.Name|Str2html}} | ||||
|         	{{$.i18n.Tr "repo.issues.opened_by" $timeStr .Poster.Name | Safe}} | ||||
| 	        {{if .Milestone}} | ||||
| 					<a class="milestone" href="{{$.RepoLink}}/issues?type={{$.ViewType}}&state={{$.State}}&labels={{$.SelectLabels}}&milestone={{.Milestone.ID}}"> | ||||
| 						<span class="octicon octicon-milestone"></span> {{.Milestone.Name}} | ||||
|  |  | |||
|  | @ -41,7 +41,6 @@ | |||
| 		</div> | ||||
| 	</div> | ||||
| 
 | ||||
| 	{{if .IsRepositoryAdmin}} | ||||
| 	<div class="four wide column"> | ||||
| 		<div class="ui segment metas"> | ||||
| 			<input id="label_ids" name="label_ids" type="hidden" value="{{.label_ids}}"> | ||||
|  | @ -130,5 +129,4 @@ | |||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	{{end}} | ||||
| </form> | ||||
|  | @ -1,284 +1,15 @@ | |||
| {{template "base/head_old" .}} | ||||
| {{template "base/navbar" .}} | ||||
| {{template "repo/nav" .}} | ||||
| {{template "repo/toolbar" .}} | ||||
| <div id="body" class="container"> | ||||
|     <div id="issue" data-id="{{.Issue.ID}}"> | ||||
|         <div id="issue-{{.Issue.ID}}" class="issue-whole issue-is-opening"> | ||||
|             <div class="issue-wrap col-md-10"> | ||||
|                 <div class="issue-head clearfix"> | ||||
|                     <div class="number pull-right">#{{.Issue.Index}}</div> | ||||
|                     <a class="author pull-left" href="{{AppSubUrl}}/{{.Issue.Poster.Name}}"><img class="avatar" src="{{.Issue.Poster.AvatarLink}}" alt="" width="30"/></a> | ||||
|                     <h1 class="title pull-left">{{.Issue.Name}}</h1> | ||||
|                     <input id="issue-edit-title" class="form-control input-lg pull-left hidden" type="text" value="{{.Issue.Name}}" data-ajax-rel="issue-edit-save" data-ajax-val="val" data-ajax-field="title"/> | ||||
|                     <input type="hidden" value="{{.Issue.ID}}" data-ajax-rel="issue-edit-save" data-ajax-val="val" data-ajax-field="issue_id"/> | ||||
|                     <p class="info pull-left"> | ||||
|                         {{if .IsIssueOwner}}<a class="btn btn-default pull-right issue-edit" href="#" id="issue-edit-btn">Edit</a> | ||||
|                         <a class="btn btn-danger pull-right issue-edit-cancel hidden" href="#">Cancel</a> | ||||
|                         <a class="btn btn-primary pull-right issue-edit-save hidden" href="#" data-ajax="{{.RepoLink}}/issues/{{.Issue.Index}}" data-ajax-name="issue-edit-save" data-ajax-method="post">Save</a>{{end}} | ||||
|                         <span class="status label label-{{if .Issue.IsClosed}}danger{{else}}success{{end}}">{{if .Issue.IsClosed}}Closed{{else}}Open{{end}}</span> | ||||
|                         <a href="{{AppSubUrl}}/{{.Issue.Poster.Name}}" class="author"><strong>{{.Issue.Poster.Name}}</strong></a> opened this issue | ||||
|                         <span class="time">{{TimeSince .Issue.Created $.Lang}}</span> · {{.Issue.NumComments}} comments | ||||
|                     </p> | ||||
|                 </div> | ||||
|                 <div class="issue-main"> | ||||
|                     <div class="panel panel-default issue-content"> | ||||
|                         <div class="panel-body"> | ||||
|                             <div class="content markdown"> | ||||
|                                 {{Str2html .Issue.RenderedContent}} | ||||
|                             </div> | ||||
|                             <div class="issue-edit-content hidden"> | ||||
|                                 <div class="form-group"> | ||||
|                                     <div class="md-help pull-right">Content with <a href="https://help.github.com/articles/markdown-basics">Markdown</a> | ||||
|                                     </div> | ||||
|                                     <ul class="nav nav-tabs" data-init="tabs"> | ||||
|                                         <li class="issue-write active"><a href="#issue-edit-textarea" data-toggle="tab">Write</a></li> | ||||
|                                         <li class="issue-preview"><a href="#issue-edit-preview" data-toggle="tab" data-ajax="/api/v1/markdown" data-ajax-name="issue-edit-preview" data-ajax-context="{{.RepoLink}}" data-ajax-method="post" data-preview="#issue-edit-preview">Preview</a></li> | ||||
|                                     </ul> | ||||
|                                     <div class="tab-content"> | ||||
|                                         <div class="tab-pane active" id="issue-edit-textarea"> | ||||
|                                             <div class="form-group"> | ||||
|                                                 <input type="hidden" value="1" name="issueIndex"> | ||||
|                                                 <textarea class="form-control" name="content" id="issue-edit-content" rows="10" placeholder="Write some content" data-ajax-rel="issue-edit-preview" data-ajax-val="val" data-ajax-field="text">{{.Issue.Content}}</textarea> | ||||
|                                             </div> | ||||
|                                         </div> | ||||
|                                         <div class="tab-pane issue-preview-content" id="issue-edit-preview">Loading...</div> | ||||
|                                     </div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                         {{with $attachments := .Issue.Attachments}} | ||||
|                         {{if $attachments}} | ||||
|                         <div class="attachments"> | ||||
|                             <span class="attachment-label label label-info">Attachments:</span> | ||||
| 
 | ||||
|                             {{range $attachments}} | ||||
|                             <a class="attachment label label-default" href="/attachments/{{.UUID}}">{{.Name}}</a> | ||||
|                             {{end}} | ||||
|                         </div> | ||||
|                         {{end}} | ||||
|                         {{end}} | ||||
|                     </div> | ||||
|                     {{range .Comments}} | ||||
|                     {{/* 0 = COMMENT, 1 = REOPEN, 2 = CLOSE, 3 = ISSUE, 4 = COMMIT, 5 = PULL */}} | ||||
|                     {{if eq .Type 0}} | ||||
|                     <div class="issue-child" id="issue-comment-{{.Id}}"> | ||||
|                         <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt=""/></a> | ||||
|                         <div class="issue-content panel panel-default"> | ||||
|                             <div class="panel-heading"> | ||||
|                                 <a href="{{AppSubUrl}}/{{.Poster.Name}}" class="user">{{.Poster.Name}}</a> commented <span class="time">{{TimeSince .Created $.Lang}}</span> | ||||
|                                 <!-- <a class="issue-comment-del pull-right issue-action" href="#" title="Edit Comment"><i class="fa fa-times-circle"></i></a> | ||||
|                                 <a class="issue-comment-edit pull-right issue-action" href="#" title="Remove Comment" data-url="{remove-link}"><i class="fa fa-edit"></i></a> --> | ||||
|                                 {{if eq .Poster.Id $.Owner.Id}} | ||||
|                                 <span class="role label label-default pull-right">Owner</span> | ||||
|                                 {{end}} | ||||
|                             </div> | ||||
|                             <div class="panel-body markdown"> | ||||
|                                 {{if len .Content}} | ||||
|                                 {{Str2html .Content}} | ||||
|                                 {{else}} | ||||
|                                 <i>No comment entered</i> | ||||
|                                 {{end}} | ||||
|                             </div> | ||||
|                             {{with $attachments := .Attachments}} | ||||
|                             {{if $attachments}} | ||||
|                             <div class="attachments"> | ||||
|                                 <span class="attachment-label label label-info">Attachments:</span> | ||||
| 
 | ||||
|                                 {{range $attachments}} | ||||
|                                 <a class="attachment label label-default" href="{{.IssueId}}/attachment/{{.Id}}">{{.Name}}</a> | ||||
|                                 {{end}} | ||||
|                             </div> | ||||
|                             {{end}} | ||||
|                             {{end}} | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{else if eq .Type 1}} | ||||
|                     <div class="issue-child issue-opened"> | ||||
|                         <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt="" /></a> | ||||
|                         <div class="issue-content"> | ||||
|                             <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}">{{.Poster.Name}}</a> <span class="label label-success">Reopened</span> this issue <span class="time">{{TimeSince .Created $.Lang}}</span> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{else if eq .Type 2}} | ||||
|                     <div class="issue-child issue-closed"> | ||||
|                         <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt=""/></a> | ||||
|                         <div class="issue-content"> | ||||
|                             <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}">{{.Poster.Name}}</a> <span class="label label-danger">Closed</span> this issue <span class="time">{{TimeSince .Created $.Lang}}</span> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{else if eq .Type 4}} | ||||
|                     <div class="issue-child issue-reference issue-reference-commit"> | ||||
|                         <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt=""/></a> | ||||
|                         <div class="issue-content"> | ||||
|                             <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}">{{.Poster.Name}}</a> <span class="label label-primary">Referenced</span> this issue <span class="time">{{TimeSince .Created $.Lang}}</span> | ||||
|                             <p> | ||||
|                                 <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt=""/></a> | ||||
|                                 {{.ContentHtml}} | ||||
|                             </p> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{end}} | ||||
|                     {{end}} | ||||
|                     <hr class="issue-line"/> | ||||
|                     {{if .SignedUser}}<div class="issue-child issue-reply"> | ||||
|                     <a class="user pull-left" href="{{AppSubUrl}}/{{.SignedUser.Name}}"><img class="avatar" src="{{.SignedUser.AvatarLink}}" alt=""/></a> | ||||
|                     <form class="panel panel-default issue-content" action="{{.RepoLink}}/comment/new" method="post" enctype="multipart/form-data"> | ||||
|                         {{.CsrfTokenHtml}} | ||||
|                         <div class="panel-body"> | ||||
|                             <div class="form-group"> | ||||
|                                 <div class="md-help pull-right">Content with <a href="https://help.github.com/articles/markdown-basics">Markdown</a> | ||||
|                                 </div> | ||||
|                                 <ul class="nav nav-tabs" data-init="tabs"> | ||||
|                                     <li class="active issue-write"><a href="#issue-textarea" data-toggle="tab">Write</a></li> | ||||
|                                     <li class="issue-preview"><a href="#issue-preview" data-toggle="tab" data-ajax="/api/v1/markdown" data-ajax-name="issue-preview"  data-ajax-context="{{.RepoLink}}" data-ajax-method="post" data-preview="#issue-preview">Preview</a></li> | ||||
|                                 </ul> | ||||
|                                 <div class="tab-content"> | ||||
|                                     <div class="tab-pane" id="issue-textarea"> | ||||
|                                         <div class="form-group"> | ||||
|                                             <div id="submit-error" class="text-danger"></div> | ||||
|                                             <input type="hidden" value="{{.Issue.Index}}" name="issueIndex"/> | ||||
|                                             <textarea class="form-control" name="content" id="issue-reply-content" rows="10" placeholder="Write some content" data-ajax-rel="issue-preview" data-ajax-val="val" data-ajax-field="text">{{.content}}</textarea> | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                     <div class="tab-pane issue-preview-content" id="issue-preview">Loading...</div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                             {{if .AttachmentsEnabled}} | ||||
|                             <!-- <div id="attached"> | ||||
|                                 <div id="attached-list"> | ||||
|                                     <b>Attachments:</b> | ||||
|                                 </div> | ||||
|                             </div> --> | ||||
|                             {{end}} | ||||
|                             <div class="text-right"> | ||||
|                                 <div class="form-group"> | ||||
|                                     {{if .AttachmentsEnabled}} | ||||
|                                     <!-- <input type="file" accept="{{.AllowedTypes}}" style="display: none;" id="attachments-input" name="attachments" multiple /> | ||||
|                                     <button class="btn-default btn attachment-add" id="attachments-button">Select Attachments...</button> --> | ||||
|                                     {{end}} | ||||
|                                     {{if .IsIssueOwner}}{{if .Issue.IsClosed}} | ||||
|                                     <input type="submit" class="btn-default btn issue-open" id="issue-open-btn" data-origin="Reopen" data-text="Reopen & Comment" name="change_status" value="Reopen"/>{{else}} | ||||
|                                     <input type="submit" class="btn-default btn issue-close" id="issue-close-btn" data-origin="Close" data-text="Close & Comment" name="change_status" value="Close"/>{{end}}{{end}}   | ||||
|                                     <button class="btn-success btn" id="issue-reply-btn">Comment</button> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </form> | ||||
|                 </div>{{else}}<div class="alert alert-warning"><a class="btn btn-success btn-lg" href="{{AppSubUrl}}/user/sign_up">Sign up for free</a> to join this conversation. Already have an account? <a href="{{AppSubUrl}}/user/login">Sign in to comment</a></div>{{end}} | ||||
|                 </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <div class="issue-bar col-md-2"> | ||||
|                 <div class="labels" data-ajax="{{.Issue.Index}}/label"> | ||||
|                     {{if .IsRepositoryOwner}} | ||||
|                     <div class="pull-right action"> | ||||
|                         <button class="btn btn-default btn-sm" data-toggle="dropdown"> | ||||
|                             <i class="fa fa-tags"></i> | ||||
|                             <span class="caret"></span> | ||||
|                         </button> | ||||
|                         <div class="dropdown-menu dropdown-menu-right no"> | ||||
|                             <ul class="list-unstyled"> | ||||
|                                 {{range .Labels}} | ||||
|                                 <li class="{{if not .IsChecked}}no-{{end}}checked" data-id="{{.ID}}"> | ||||
|                                     {{if .IsChecked}}<span class="check pull-left"><i class="fa fa-check"></i></span>{{end}} | ||||
|                                     <span class="color" style="background-color: {{.Color}}"></span> | ||||
|                                     <span class="name">{{.Name}}</span> | ||||
|                                 </li> | ||||
|                                 {{end}} | ||||
|                             </ul> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{end}} | ||||
|                     <h4>Labels</h4> | ||||
|                     {{if .Issue.Labels}} | ||||
|                     {{range .Issue.Labels}} | ||||
|                     <p id="label-{{.ID}}" class="label-item label-white" style="background-color: {{.Color}}"><strong>{{.Name}}</strong></p> | ||||
|                     {{end}} | ||||
|                     {{else}} | ||||
|                     <p>None yet</p> | ||||
|                     {{end}} | ||||
|                 </div> | ||||
|                 <div class="milestone" data-milestone="{{.Milestone.ID}}" data-ajax="{{.Issue.Index}}/milestone"> | ||||
|                     <div class="pull-right action"> | ||||
|                         {{if .IsRepositoryOwner}} | ||||
|                         <button class="btn btn-default btn-sm" data-toggle="dropdown"> | ||||
|                             <i class="fa fa-check-square-o"></i> | ||||
|                             <span class="caret"></span> | ||||
|                         </button> | ||||
|                         <div class="dropdown-menu dropdown-menu-right"> | ||||
|                             <ul class="list-unstyled"> | ||||
|                                 <li data-id="0" class="clear-milestone milestone-item  hidden"><i class="fa fa-times-circle-o"></i> Clear milestone </li> | ||||
|                                 <li class="milestone-list"> | ||||
|                                     <ul class="nav nav-tabs" data-init="tabs"> | ||||
|                                         <li class="active"><a href="#milestone-open" data-toggle="tab">Open</a></li> | ||||
|                                         <li><a href="#milestone-close" data-toggle="tab">Closed</a></li> | ||||
|                                     </ul> | ||||
|                                     <div class="tab-content"> | ||||
|                                         <div class="tab-pane active" id="milestone-open"> | ||||
|                                             {{if not .OpenMilestones}} | ||||
|                                             <p class="milestone-item">Nothing to show</p> | ||||
|                                             {{else}} | ||||
|                                             <ul class="list-unstyled"> | ||||
|                                                 {{range .OpenMilestones}} | ||||
|                                                 <li class="milestone-item" data-id="{{.ID}}"> | ||||
|                                                     <p><strong>{{.Name}}</strong></p> | ||||
|                                                     <!-- <p>due to 3 days later</p> --> | ||||
|                                                 </li> | ||||
|                                                 {{end}} | ||||
|                                             </ul> | ||||
|                                             {{end}} | ||||
|                                         </div> | ||||
| 
 | ||||
|                                         <div class="tab-pane" id="milestone-close"> | ||||
|                                             {{if not .ClosedMilestones}} | ||||
|                                             <p class="milestone-item">Nothing to show</p> | ||||
|                                             {{else}} | ||||
|                                             <ul class="list-unstyled"> | ||||
|                                                 {{range .ClosedMilestones}} | ||||
|                                                 <li class="milestone-item" data-id="{{.ID}}"> | ||||
|                                                     <p><strong>{{.Name}}</strong></p> | ||||
|                                                     <p>Closed {{TimeSince .ClosedDate $.Lang}}</p> | ||||
|                                                 </li> | ||||
|                                                 {{end}} | ||||
|                                             </ul> | ||||
|                                             {{end}} | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                 </li> | ||||
|                             </ul> | ||||
|                         </div> | ||||
|                         {{end}} | ||||
|                     </div> | ||||
|                     <h4>Milestone</h4> | ||||
|                     {{if .Milestone}} | ||||
|                     <p class="completion{{if eq .Milestone.Completeness 0}} hidden{{end}}"><span style="width:{{.Milestone.Completeness}}%"> </span></p> | ||||
|                     <p class="name"><strong><a href="{{$.RepoLink}}/issues?milestone={{.Milestone.ID}}{{if $.Issue.IsClosed}}&state=closed{{end}}">{{.Milestone.Name}}</a></strong></p> | ||||
|                     {{else}} | ||||
|                     <p class="name">No milestone</p> | ||||
|                     {{end}} | ||||
|                 </div> | ||||
| 
 | ||||
|                 <div class="assignee" data-assigned="{{if .Issue.Assignee}}{{.Issue.Assignee.Id}}{{else}}0{{end}}" data-ajax="{{.Issue.Index}}/assignee">{{if .IsRepositoryOwner}} | ||||
|                     <div class="pull-right action"> | ||||
|                         <button type="button" class="dropdown-toggle btn btn-default btn-sm" data-toggle="dropdown"> | ||||
|                             <i class="fa fa-group"></i> | ||||
|                             <span class="caret"></span> | ||||
|                         </button> | ||||
|                         <div class="dropdown-menu dropdown-menu-right"> | ||||
|                             <ul class="list-unstyled"> | ||||
|                                 <li data-uid="0" class="clear-assignee hidden"><i class="fa fa-times-circle-o"></i> Clear assignee</li> | ||||
|                                 {{range .Collaborators}} | ||||
|                                 <li data-uid="{{.Id}}"><img src="{{.AvatarLink}}"><strong>{{.Name}}</strong></li> | ||||
|                                 {{end}} | ||||
|                             </ul> | ||||
|                         </div> | ||||
|                     </div>{{end}} | ||||
|                     <h4>Assignee</h4> | ||||
|                     <p>{{if .Issue.Assignee}}<img src="{{.Issue.Assignee.AvatarLink}}"><strong>{{.Issue.Assignee.Name}}</strong>{{else}}No one assigned{{end}}</p> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| {{template "base/head" .}} | ||||
| <div class="repository view issue"> | ||||
| 	{{template "repo/header" .}} | ||||
| 	<div class="ui container"> | ||||
| 		<div class="navbar"> | ||||
| 			{{template "repo/issue/navbar" .}} | ||||
| 			<div class="ui right"> | ||||
| 				<a class="ui green button" href="{{$.RepoLink}}/issues/new">{{.i18n.Tr "repo.issues.new"}}</a> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		<div class="ui divider"></div> | ||||
| 		{{template "repo/issue/view_content" .}} | ||||
| 	</div> | ||||
| </div> | ||||
| {{template "base/footer_old" .}} | ||||
| {{template "base/footer" .}} | ||||
							
								
								
									
										142
									
								
								templates/repo/issue/view_content.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								templates/repo/issue/view_content.tmpl
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,142 @@ | |||
| <div class="ui grid"> | ||||
| 	{{if .Flash}} | ||||
| 	<div class="sixteen wide column"> | ||||
|   	{{template "base/alert" .}} | ||||
|   </div> | ||||
|   {{end}} | ||||
|   <div class="sixteen wide column title"> | ||||
| 		<h1><span class="index">#{{.Issue.Index}}</span> {{.Issue.Name}}</h1> | ||||
| 		{{if .Issue.IsClosed}} | ||||
| 		<div class="ui red large label"><i class="octicon octicon-issue-closed"></i> {{.i18n.Tr "repo.issues.closed_title"}}</div> | ||||
| 		{{else}} | ||||
| 		<div class="ui green large label"><i class="octicon octicon-issue-opened"></i> {{.i18n.Tr "repo.issues.open_title"}}</div> | ||||
| 		{{end}} | ||||
| 		{{ $createdStr:= TimeSince .Issue.Created $.Lang }} | ||||
| 		<span class="time-desc"> | ||||
| 			{{$.i18n.Tr "repo.issues.opened_by" $createdStr .Issue.Poster.Name|Str2html}} | ||||
| 			· | ||||
| 			{{$.i18n.Tr "repo.issues.num_comments" .Issue.NumComments}} | ||||
| 		</span> | ||||
|   	<div class="ui divider"></div> | ||||
|   </div> | ||||
| 	<div class="twelve wide column comment-list"> | ||||
|   	<ui class="ui comments"> | ||||
|   		<div class="comment"> | ||||
| 		    <a class="avatar" href="{{.SignedUser.HomeLink}}"> | ||||
| 		      <img src="{{.SignedUser.AvatarLink}}"> | ||||
| 		    </a> | ||||
| 		    <div class="content"> | ||||
| 					<div class="ui top attached header"> | ||||
| 						<span class="text"><a href="{{.Issue.Poster.HomeLink}}">{{.Issue.Poster.Name}}</a> {{.i18n.Tr "repo.issues.commented_at" .Issue.HashTag $createdStr | Safe}}</span> | ||||
| 					  <div class="ui right actions"> | ||||
| 					  </div> | ||||
| 					</div> | ||||
| 			    <div class="ui attached segment markdown"> | ||||
| 						{{.Issue.RenderedContent|Str2html}} | ||||
| 	  			</div> | ||||
| 	  			{{if .Issue.Attachments}} | ||||
| 					<div class="ui bottom attached segment"> | ||||
| 						<div class="ui small images"> | ||||
| 							{{range .Issue.Attachments}} | ||||
| 						  <a href="/attachments/{{.UUID}}"><img class="ui image" src="/attachments/{{.UUID}}"></a> | ||||
| 						  {{end}} | ||||
| 						</div> | ||||
| 					</div> | ||||
| 	  			{{end}} | ||||
| 		    </div> | ||||
|   		</div> | ||||
|   	</ui> | ||||
| 	</div> | ||||
| 
 | ||||
| 	<div class="four wide column"> | ||||
| 		<div class="ui segment metas"> | ||||
| 			<input id="label_ids" name="label_ids" type="hidden" value="{{.label_ids}}"> | ||||
| 			<div class="ui {{if not .Labels}}disabled{{end}} jump select-label dropdown"> | ||||
| 				<span class="text"> | ||||
| 					<strong>{{.i18n.Tr "repo.issues.new.labels"}}</strong> | ||||
| 					<span class="octicon octicon-gear"></span> | ||||
| 				</span> | ||||
|         <div class="filter menu" data-id="#label_ids"> | ||||
|         	<div class="no-select item">{{.i18n.Tr "repo.issues.new.clear_labels"}}</div> | ||||
|         	{{range .Labels}} | ||||
|         	<a class="{{if .IsChecked}}checked{{end}} item" href="#" data-id="{{.ID}}" data-id-selector="#label_{{.ID}}"><span class="octicon {{if .IsChecked}}octicon-check{{end}}"></span><span class="label color" style="background-color: {{.Color}}"></span> {{.Name}}</a> | ||||
|           {{end}} | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<div class="ui labels list"> | ||||
| 				{{if not .Issue.Labels}} | ||||
| 				<span class="no-select item {{if .HasSelectedLabel}}hide{{end}}">{{.i18n.Tr "repo.issues.new.no_label"}}</span> | ||||
| 				{{else}} | ||||
|       	{{range .Issue.Labels}} | ||||
|       	<a class="item" id="label_{{.ID}}" href="{{$.RepoLink}}/issues?labels={{.ID}}"><span class="label color" style="background-color: {{.Color}}"></span> <span class="text">{{.Name}}</span></a> | ||||
|         {{end}} | ||||
|         {{end}} | ||||
| 			</div> | ||||
| 
 | ||||
| 			<div class="ui divider"></div> | ||||
| 
 | ||||
| 			<input id="milestone_id" name="milestone_id" type="hidden" value="{{.milestone_id}}"> | ||||
| 			<div class="ui {{if not (or .OpenMilestones .ClosedMilestones)}}disabled{{end}} jump select-milestone dropdown"> | ||||
| 				<span class="text"> | ||||
| 					<strong>{{.i18n.Tr "repo.issues.new.milestone"}}</strong> | ||||
| 					<span class="octicon octicon-gear"></span> | ||||
| 				</span> | ||||
|         <div class="menu"> | ||||
|         	<div class="no-select item">{{.i18n.Tr "repo.issues.new.clear_milestone"}}</div> | ||||
|         	{{if .OpenMilestones}} | ||||
|         	<div class="divider"></div> | ||||
|         	<div class="header"> | ||||
|     	      <i class="octicon octicon-milestone"></i> | ||||
|     	      {{.i18n.Tr "repo.issues.new.open_milestone"}} | ||||
|     	    </div> | ||||
|         	{{range .OpenMilestones}} | ||||
|         	<div class="item" data-id="{{.ID}}" data-href="{{$.RepoLink}}/issues?milestone={{.ID}}"> {{.Name}}</div> | ||||
|           {{end}} | ||||
|     	    {{end}} | ||||
|     	    {{if .ClosedMilestones}} | ||||
|         	<div class="divider"></div> | ||||
|         	<div class="header"> | ||||
|     	      <i class="octicon octicon-milestone"></i> | ||||
|     	      {{.i18n.Tr "repo.issues.new.closed_milestone"}} | ||||
|     	    </div> | ||||
|         	{{range .ClosedMilestones}} | ||||
|         	<a class="item" data-id="{{.ID}}" data-href="{{$.RepoLink}}/issues?milestone={{.ID}}"> {{.Name}}</a> | ||||
|           {{end}} | ||||
|         	{{end}} | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<div class="ui select-milestone list"> | ||||
| 				<span class="no-select item {{if .Issue.Milestone}}hide{{end}}">{{.i18n.Tr "repo.issues.new.no_milestone"}}</span> | ||||
| 				<div class="selected"> | ||||
| 					{{if .Issue.Milestone}} | ||||
| 					<a class="item" href="{{.RepoLink}}/issues?milestone={{.Issue.Milestone.ID}}"> {{.Issue.Milestone.Name}}</a> | ||||
| 					{{end}} | ||||
| 				</div> | ||||
| 			</div> | ||||
| 
 | ||||
| 			<div class="ui divider"></div> | ||||
| 
 | ||||
| 			<input id="assignee_id" name="assignee_id" type="hidden" value="{{.assignee_id}}"> | ||||
| 			<div class="ui {{if not .Assignees}}disabled{{end}} jump select-assignee dropdown"> | ||||
| 				<span class="text"> | ||||
| 					<strong>{{.i18n.Tr "repo.issues.new.assignee"}}</strong> | ||||
| 					<span class="octicon octicon-gear"></span> | ||||
| 				</span> | ||||
|         <div class="menu"> | ||||
|         	<div class="no-select item">{{.i18n.Tr "repo.issues.new.clear_assignee"}}</div> | ||||
|         	{{range .Assignees}} | ||||
|         	<div class="item" data-id="{{.Id}}" data-href="{{.HomeLink}}" data-avatar="{{.AvatarLink}}"><img src="{{.AvatarLink}}"> {{.Name}}</div> | ||||
|           {{end}} | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<div class="ui select-assignee list"> | ||||
| 				<span class="no-select item {{if .Issue.Assignee}}hide{{end}}">{{.i18n.Tr "repo.issues.new.no_assignee"}}</span> | ||||
| 				<div class="selected"> | ||||
| 					{{if .Issue.Assignee}} | ||||
| 					<a class="item" href="{{.Issue.Assignee.HomeLink}}"><img class="ui avatar image" src="{{.Issue.Assignee.AvatarLink}}"> {{.Issue.Assignee.Name}}</a> | ||||
| 					{{end}} | ||||
| 				</div> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
| </div> | ||||
							
								
								
									
										284
									
								
								templates/repo/issue/view_old.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										284
									
								
								templates/repo/issue/view_old.tmpl
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,284 @@ | |||
| {{template "base/head_old" .}} | ||||
| {{template "base/navbar" .}} | ||||
| {{template "repo/nav" .}} | ||||
| {{template "repo/toolbar" .}} | ||||
| <div id="body" class="container"> | ||||
|     <div id="issue" data-id="{{.Issue.ID}}"> | ||||
|         <div id="issue-{{.Issue.ID}}" class="issue-whole issue-is-opening"> | ||||
|             <div class="issue-wrap col-md-10"> | ||||
|                 <div class="issue-head clearfix"> | ||||
|                     <div class="number pull-right">#{{.Issue.Index}}</div> | ||||
|                     <a class="author pull-left" href="{{AppSubUrl}}/{{.Issue.Poster.Name}}"><img class="avatar" src="{{.Issue.Poster.AvatarLink}}" alt="" width="30"/></a> | ||||
|                     <h1 class="title pull-left">{{.Issue.Name}}</h1> | ||||
|                     <input id="issue-edit-title" class="form-control input-lg pull-left hidden" type="text" value="{{.Issue.Name}}" data-ajax-rel="issue-edit-save" data-ajax-val="val" data-ajax-field="title"/> | ||||
|                     <input type="hidden" value="{{.Issue.ID}}" data-ajax-rel="issue-edit-save" data-ajax-val="val" data-ajax-field="issue_id"/> | ||||
|                     <p class="info pull-left"> | ||||
|                         {{if .IsIssueOwner}}<a class="btn btn-default pull-right issue-edit" href="#" id="issue-edit-btn">Edit</a> | ||||
|                         <a class="btn btn-danger pull-right issue-edit-cancel hidden" href="#">Cancel</a> | ||||
|                         <a class="btn btn-primary pull-right issue-edit-save hidden" href="#" data-ajax="{{.RepoLink}}/issues/{{.Issue.Index}}" data-ajax-name="issue-edit-save" data-ajax-method="post">Save</a>{{end}} | ||||
|                         <span class="status label label-{{if .Issue.IsClosed}}danger{{else}}success{{end}}">{{if .Issue.IsClosed}}Closed{{else}}Open{{end}}</span> | ||||
|                         <a href="{{AppSubUrl}}/{{.Issue.Poster.Name}}" class="author"><strong>{{.Issue.Poster.Name}}</strong></a> opened this issue | ||||
|                         <span class="time">{{TimeSince .Issue.Created $.Lang}}</span> · {{.Issue.NumComments}} comments | ||||
|                     </p> | ||||
|                 </div> | ||||
|                 <div class="issue-main"> | ||||
|                     <div class="panel panel-default issue-content"> | ||||
|                         <div class="panel-body"> | ||||
|                             <div class="content markdown"> | ||||
|                                 {{Str2html .Issue.RenderedContent}} | ||||
|                             </div> | ||||
|                             <div class="issue-edit-content hidden"> | ||||
|                                 <div class="form-group"> | ||||
|                                     <div class="md-help pull-right">Content with <a href="https://help.github.com/articles/markdown-basics">Markdown</a> | ||||
|                                     </div> | ||||
|                                     <ul class="nav nav-tabs" data-init="tabs"> | ||||
|                                         <li class="issue-write active"><a href="#issue-edit-textarea" data-toggle="tab">Write</a></li> | ||||
|                                         <li class="issue-preview"><a href="#issue-edit-preview" data-toggle="tab" data-ajax="/api/v1/markdown" data-ajax-name="issue-edit-preview" data-ajax-context="{{.RepoLink}}" data-ajax-method="post" data-preview="#issue-edit-preview">Preview</a></li> | ||||
|                                     </ul> | ||||
|                                     <div class="tab-content"> | ||||
|                                         <div class="tab-pane active" id="issue-edit-textarea"> | ||||
|                                             <div class="form-group"> | ||||
|                                                 <input type="hidden" value="1" name="issueIndex"> | ||||
|                                                 <textarea class="form-control" name="content" id="issue-edit-content" rows="10" placeholder="Write some content" data-ajax-rel="issue-edit-preview" data-ajax-val="val" data-ajax-field="text">{{.Issue.Content}}</textarea> | ||||
|                                             </div> | ||||
|                                         </div> | ||||
|                                         <div class="tab-pane issue-preview-content" id="issue-edit-preview">Loading...</div> | ||||
|                                     </div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                         {{with $attachments := .Issue.Attachments}} | ||||
|                         {{if $attachments}} | ||||
|                         <div class="attachments"> | ||||
|                             <span class="attachment-label label label-info">Attachments:</span> | ||||
| 
 | ||||
|                             {{range $attachments}} | ||||
|                             <a class="attachment label label-default" href="/attachments/{{.UUID}}">{{.Name}}</a> | ||||
|                             {{end}} | ||||
|                         </div> | ||||
|                         {{end}} | ||||
|                         {{end}} | ||||
|                     </div> | ||||
|                     {{range .Comments}} | ||||
|                     {{/* 0 = COMMENT, 1 = REOPEN, 2 = CLOSE, 3 = ISSUE, 4 = COMMIT, 5 = PULL */}} | ||||
|                     {{if eq .Type 0}} | ||||
|                     <div class="issue-child" id="issue-comment-{{.Id}}"> | ||||
|                         <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt=""/></a> | ||||
|                         <div class="issue-content panel panel-default"> | ||||
|                             <div class="panel-heading"> | ||||
|                                 <a href="{{AppSubUrl}}/{{.Poster.Name}}" class="user">{{.Poster.Name}}</a> commented <span class="time">{{TimeSince .Created $.Lang}}</span> | ||||
|                                 <!-- <a class="issue-comment-del pull-right issue-action" href="#" title="Edit Comment"><i class="fa fa-times-circle"></i></a> | ||||
|                                 <a class="issue-comment-edit pull-right issue-action" href="#" title="Remove Comment" data-url="{remove-link}"><i class="fa fa-edit"></i></a> --> | ||||
|                                 {{if eq .Poster.Id $.Owner.Id}} | ||||
|                                 <span class="role label label-default pull-right">Owner</span> | ||||
|                                 {{end}} | ||||
|                             </div> | ||||
|                             <div class="panel-body markdown"> | ||||
|                                 {{if len .Content}} | ||||
|                                 {{Str2html .Content}} | ||||
|                                 {{else}} | ||||
|                                 <i>No comment entered</i> | ||||
|                                 {{end}} | ||||
|                             </div> | ||||
|                             {{with $attachments := .Attachments}} | ||||
|                             {{if $attachments}} | ||||
|                             <div class="attachments"> | ||||
|                                 <span class="attachment-label label label-info">Attachments:</span> | ||||
| 
 | ||||
|                                 {{range $attachments}} | ||||
|                                 <a class="attachment label label-default" href="{{.IssueId}}/attachment/{{.Id}}">{{.Name}}</a> | ||||
|                                 {{end}} | ||||
|                             </div> | ||||
|                             {{end}} | ||||
|                             {{end}} | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{else if eq .Type 1}} | ||||
|                     <div class="issue-child issue-opened"> | ||||
|                         <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt="" /></a> | ||||
|                         <div class="issue-content"> | ||||
|                             <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}">{{.Poster.Name}}</a> <span class="label label-success">Reopened</span> this issue <span class="time">{{TimeSince .Created $.Lang}}</span> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{else if eq .Type 2}} | ||||
|                     <div class="issue-child issue-closed"> | ||||
|                         <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt=""/></a> | ||||
|                         <div class="issue-content"> | ||||
|                             <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}">{{.Poster.Name}}</a> <span class="label label-danger">Closed</span> this issue <span class="time">{{TimeSince .Created $.Lang}}</span> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{else if eq .Type 4}} | ||||
|                     <div class="issue-child issue-reference issue-reference-commit"> | ||||
|                         <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt=""/></a> | ||||
|                         <div class="issue-content"> | ||||
|                             <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}">{{.Poster.Name}}</a> <span class="label label-primary">Referenced</span> this issue <span class="time">{{TimeSince .Created $.Lang}}</span> | ||||
|                             <p> | ||||
|                                 <a class="user pull-left" href="{{AppSubUrl}}/{{.Poster.Name}}"><img class="avatar" src="{{.Poster.AvatarLink}}" alt=""/></a> | ||||
|                                 {{.ContentHtml}} | ||||
|                             </p> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{end}} | ||||
|                     {{end}} | ||||
|                     <hr class="issue-line"/> | ||||
|                     {{if .SignedUser}}<div class="issue-child issue-reply"> | ||||
|                     <a class="user pull-left" href="{{AppSubUrl}}/{{.SignedUser.Name}}"><img class="avatar" src="{{.SignedUser.AvatarLink}}" alt=""/></a> | ||||
|                     <form class="panel panel-default issue-content" action="{{.RepoLink}}/comment/new" method="post" enctype="multipart/form-data"> | ||||
|                         {{.CsrfTokenHtml}} | ||||
|                         <div class="panel-body"> | ||||
|                             <div class="form-group"> | ||||
|                                 <div class="md-help pull-right">Content with <a href="https://help.github.com/articles/markdown-basics">Markdown</a> | ||||
|                                 </div> | ||||
|                                 <ul class="nav nav-tabs" data-init="tabs"> | ||||
|                                     <li class="active issue-write"><a href="#issue-textarea" data-toggle="tab">Write</a></li> | ||||
|                                     <li class="issue-preview"><a href="#issue-preview" data-toggle="tab" data-ajax="/api/v1/markdown" data-ajax-name="issue-preview"  data-ajax-context="{{.RepoLink}}" data-ajax-method="post" data-preview="#issue-preview">Preview</a></li> | ||||
|                                 </ul> | ||||
|                                 <div class="tab-content"> | ||||
|                                     <div class="tab-pane" id="issue-textarea"> | ||||
|                                         <div class="form-group"> | ||||
|                                             <div id="submit-error" class="text-danger"></div> | ||||
|                                             <input type="hidden" value="{{.Issue.Index}}" name="issueIndex"/> | ||||
|                                             <textarea class="form-control" name="content" id="issue-reply-content" rows="10" placeholder="Write some content" data-ajax-rel="issue-preview" data-ajax-val="val" data-ajax-field="text">{{.content}}</textarea> | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                     <div class="tab-pane issue-preview-content" id="issue-preview">Loading...</div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                             {{if .AttachmentsEnabled}} | ||||
|                             <!-- <div id="attached"> | ||||
|                                 <div id="attached-list"> | ||||
|                                     <b>Attachments:</b> | ||||
|                                 </div> | ||||
|                             </div> --> | ||||
|                             {{end}} | ||||
|                             <div class="text-right"> | ||||
|                                 <div class="form-group"> | ||||
|                                     {{if .AttachmentsEnabled}} | ||||
|                                     <!-- <input type="file" accept="{{.AllowedTypes}}" style="display: none;" id="attachments-input" name="attachments" multiple /> | ||||
|                                     <button class="btn-default btn attachment-add" id="attachments-button">Select Attachments...</button> --> | ||||
|                                     {{end}} | ||||
|                                     {{if .IsIssueOwner}}{{if .Issue.IsClosed}} | ||||
|                                     <input type="submit" class="btn-default btn issue-open" id="issue-open-btn" data-origin="Reopen" data-text="Reopen & Comment" name="change_status" value="Reopen"/>{{else}} | ||||
|                                     <input type="submit" class="btn-default btn issue-close" id="issue-close-btn" data-origin="Close" data-text="Close & Comment" name="change_status" value="Close"/>{{end}}{{end}}   | ||||
|                                     <button class="btn-success btn" id="issue-reply-btn">Comment</button> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </form> | ||||
|                 </div>{{else}}<div class="alert alert-warning"><a class="btn btn-success btn-lg" href="{{AppSubUrl}}/user/sign_up">Sign up for free</a> to join this conversation. Already have an account? <a href="{{AppSubUrl}}/user/login">Sign in to comment</a></div>{{end}} | ||||
|                 </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <div class="issue-bar col-md-2"> | ||||
|                 <div class="labels" data-ajax="{{.Issue.Index}}/label"> | ||||
|                     {{if .IsRepositoryOwner}} | ||||
|                     <div class="pull-right action"> | ||||
|                         <button class="btn btn-default btn-sm" data-toggle="dropdown"> | ||||
|                             <i class="fa fa-tags"></i> | ||||
|                             <span class="caret"></span> | ||||
|                         </button> | ||||
|                         <div class="dropdown-menu dropdown-menu-right no"> | ||||
|                             <ul class="list-unstyled"> | ||||
|                                 {{range .Labels}} | ||||
|                                 <li class="{{if not .IsChecked}}no-{{end}}checked" data-id="{{.ID}}"> | ||||
|                                     {{if .IsChecked}}<span class="check pull-left"><i class="fa fa-check"></i></span>{{end}} | ||||
|                                     <span class="color" style="background-color: {{.Color}}"></span> | ||||
|                                     <span class="name">{{.Name}}</span> | ||||
|                                 </li> | ||||
|                                 {{end}} | ||||
|                             </ul> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {{end}} | ||||
|                     <h4>Labels</h4> | ||||
|                     {{if .Issue.Labels}} | ||||
|                     {{range .Issue.Labels}} | ||||
|                     <p id="label-{{.ID}}" class="label-item label-white" style="background-color: {{.Color}}"><strong>{{.Name}}</strong></p> | ||||
|                     {{end}} | ||||
|                     {{else}} | ||||
|                     <p>None yet</p> | ||||
|                     {{end}} | ||||
|                 </div> | ||||
|                 <div class="milestone" data-milestone="{{.Milestone.ID}}" data-ajax="{{.Issue.Index}}/milestone"> | ||||
|                     <div class="pull-right action"> | ||||
|                         {{if .IsRepositoryOwner}} | ||||
|                         <button class="btn btn-default btn-sm" data-toggle="dropdown"> | ||||
|                             <i class="fa fa-check-square-o"></i> | ||||
|                             <span class="caret"></span> | ||||
|                         </button> | ||||
|                         <div class="dropdown-menu dropdown-menu-right"> | ||||
|                             <ul class="list-unstyled"> | ||||
|                                 <li data-id="0" class="clear-milestone milestone-item  hidden"><i class="fa fa-times-circle-o"></i> Clear milestone </li> | ||||
|                                 <li class="milestone-list"> | ||||
|                                     <ul class="nav nav-tabs" data-init="tabs"> | ||||
|                                         <li class="active"><a href="#milestone-open" data-toggle="tab">Open</a></li> | ||||
|                                         <li><a href="#milestone-close" data-toggle="tab">Closed</a></li> | ||||
|                                     </ul> | ||||
|                                     <div class="tab-content"> | ||||
|                                         <div class="tab-pane active" id="milestone-open"> | ||||
|                                             {{if not .OpenMilestones}} | ||||
|                                             <p class="milestone-item">Nothing to show</p> | ||||
|                                             {{else}} | ||||
|                                             <ul class="list-unstyled"> | ||||
|                                                 {{range .OpenMilestones}} | ||||
|                                                 <li class="milestone-item" data-id="{{.ID}}"> | ||||
|                                                     <p><strong>{{.Name}}</strong></p> | ||||
|                                                     <!-- <p>due to 3 days later</p> --> | ||||
|                                                 </li> | ||||
|                                                 {{end}} | ||||
|                                             </ul> | ||||
|                                             {{end}} | ||||
|                                         </div> | ||||
| 
 | ||||
|                                         <div class="tab-pane" id="milestone-close"> | ||||
|                                             {{if not .ClosedMilestones}} | ||||
|                                             <p class="milestone-item">Nothing to show</p> | ||||
|                                             {{else}} | ||||
|                                             <ul class="list-unstyled"> | ||||
|                                                 {{range .ClosedMilestones}} | ||||
|                                                 <li class="milestone-item" data-id="{{.ID}}"> | ||||
|                                                     <p><strong>{{.Name}}</strong></p> | ||||
|                                                     <p>Closed {{TimeSince .ClosedDate $.Lang}}</p> | ||||
|                                                 </li> | ||||
|                                                 {{end}} | ||||
|                                             </ul> | ||||
|                                             {{end}} | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                 </li> | ||||
|                             </ul> | ||||
|                         </div> | ||||
|                         {{end}} | ||||
|                     </div> | ||||
|                     <h4>Milestone</h4> | ||||
|                     {{if .Milestone}} | ||||
|                     <p class="completion{{if eq .Milestone.Completeness 0}} hidden{{end}}"><span style="width:{{.Milestone.Completeness}}%"> </span></p> | ||||
|                     <p class="name"><strong><a href="{{$.RepoLink}}/issues?milestone={{.Milestone.ID}}{{if $.Issue.IsClosed}}&state=closed{{end}}">{{.Milestone.Name}}</a></strong></p> | ||||
|                     {{else}} | ||||
|                     <p class="name">No milestone</p> | ||||
|                     {{end}} | ||||
|                 </div> | ||||
| 
 | ||||
|                 <div class="assignee" data-assigned="{{if .Issue.Assignee}}{{.Issue.Assignee.Id}}{{else}}0{{end}}" data-ajax="{{.Issue.Index}}/assignee">{{if .IsRepositoryOwner}} | ||||
|                     <div class="pull-right action"> | ||||
|                         <button type="button" class="dropdown-toggle btn btn-default btn-sm" data-toggle="dropdown"> | ||||
|                             <i class="fa fa-group"></i> | ||||
|                             <span class="caret"></span> | ||||
|                         </button> | ||||
|                         <div class="dropdown-menu dropdown-menu-right"> | ||||
|                             <ul class="list-unstyled"> | ||||
|                                 <li data-uid="0" class="clear-assignee hidden"><i class="fa fa-times-circle-o"></i> Clear assignee</li> | ||||
|                                 {{range .Collaborators}} | ||||
|                                 <li data-uid="{{.Id}}"><img src="{{.AvatarLink}}"><strong>{{.Name}}</strong></li> | ||||
|                                 {{end}} | ||||
|                             </ul> | ||||
|                         </div> | ||||
|                     </div>{{end}} | ||||
|                     <h4>Assignee</h4> | ||||
|                     <p>{{if .Issue.Assignee}}<img src="{{.Issue.Assignee.AvatarLink}}"><strong>{{.Issue.Assignee.Name}}</strong>{{else}}No one assigned{{end}}</p> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
| {{template "base/footer_old" .}} | ||||
		Loading…
	
		Reference in a new issue