Преглед на файлове

finish view issue without comments and ops

Unknwon преди 9 години
родител
ревизия
b4c0b7b98b

+ 4 - 0
conf/locale/locale_en-US.ini

@@ -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

+ 22 - 0
models/error.go

@@ -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)
+}
+
 // .____          ___.          .__
 // |    |   _____ \_ |__   ____ |  |
 // |    |   \__  \ | __ \_/ __ \|  |

+ 31 - 28
models/issue.go

@@ -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) {
-	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) {
+// 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
+	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

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
modules/bindata/bindata.go


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
public/css/gogs.min.css


+ 71 - 0
public/less/_repository.less

@@ -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;

+ 85 - 103
routers/repo/issue.go

@@ -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
-
-	idx := com.StrTo(ctx.Params(":index")).MustInt64()
-	if idx == 0 {
-		ctx.Handle(404, "issue.ViewIssue", nil)
-		return
-	}
+	ctx.Data["PageIsIssueList"] = true
+	ctx.Data["RequireDropzone"] = true
+	renderAttachmentSettings(ctx)
 
-	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)
+	if err = issue.GetPoster(); err != nil {
+		ctx.Handle(500, "GetPoster: %v", 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
-			}
-		}
-	}
+	issue.RenderedContent = string(base.RenderMarkdown([]byte(issue.Content), ctx.Repo.RepoLink))
 
-	// 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
-	}
+	// Attchments.
 
-	// Get all collaborators.
-	ctx.Data["Collaborators"], err = ctx.Repo.Repository.GetCollaborators()
-	if err != nil {
-		ctx.Handle(500, "GetCollaborators", err)
+	// Metas.
+	if err = issue.GetLabels(); err != nil {
+		ctx.Handle(500, "GetLabels", 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
+		// 	// Update issue-user.
+		// 	if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.ID); err != nil {
+		// 		ctx.Handle(500, "UpdateIssueUserPairByRead: %v", err)
+		// 		return
+		// 	}
+
+		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
+			// }
 		}
 	}
 
-	// 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)
+	// 	return
+	// }
 
-	// 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
 
-	// 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))
+	// 	}
+	// }
 
-		if comments[i].Type == models.COMMENT_TYPE_COMMENT {
-			comments[i].Content = string(base.RenderMarkdown([]byte(comments[i].Content), ctx.Repo.RepoLink))
-		}
-	}
-
-	ctx.Data["AllowedTypes"] = setting.AttachmentAllowedTypes
-
-	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)

+ 2 - 2
routers/user/home.go

@@ -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 {

+ 1 - 1
templates/repo/issue/list.tmpl

@@ -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}}

+ 0 - 2
templates/repo/issue/new_form.tmpl

@@ -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>

+ 14 - 283
templates/repo/issue/view.tmpl

@@ -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}}&nbsp;&nbsp;
-                                    <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}}%">&nbsp;</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 - 0
templates/repo/issue/view_content.tmpl

@@ -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 - 0
templates/repo/issue/view_old.tmpl

@@ -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}}&nbsp;&nbsp;
+                                    <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}}%">&nbsp;</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" .}}

Някои файлове не бяха показани, защото твърде много файлове са промени