From da230a287264d38156e950a3149e43f65599e65b Mon Sep 17 00:00:00 2001
From: Zsombor <gzsombor@users.noreply.github.com>
Date: Thu, 24 Aug 2017 14:30:27 +0200
Subject: [PATCH] Add possibility to record branch or tag information in an
 issue (#780)

---
 models/issue.go                               |  1 +
 modules/auth/repo_form.go                     |  1 +
 options/locale/locale_en-US.ini               |  1 +
 public/js/index.js                            | 17 ++++++++
 routers/repo/issue.go                         | 10 +++++
 .../repo/issue/branch_selector_field.tmpl     | 41 +++++++++++++++++++
 templates/repo/issue/list.tmpl                |  3 ++
 templates/repo/issue/new_form.tmpl            |  2 +
 .../repo/issue/view_content/sidebar.tmpl      |  2 +
 9 files changed, 78 insertions(+)
 create mode 100644 templates/repo/issue/branch_selector_field.tmpl

diff --git a/models/issue.go b/models/issue.go
index 2c385fd066..32e6a5b66b 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -49,6 +49,7 @@ type Issue struct {
 	IsPull          bool         `xorm:"INDEX"` // Indicates whether is a pull request or not.
 	PullRequest     *PullRequest `xorm:"-"`
 	NumComments     int
+	Ref             string
 
 	Deadline     time.Time `xorm:"-"`
 	DeadlineUnix int64     `xorm:"INDEX"`
diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go
index 58dcf468ef..681a478d3b 100644
--- a/modules/auth/repo_form.go
+++ b/modules/auth/repo_form.go
@@ -194,6 +194,7 @@ func (f *NewSlackHookForm) Validate(ctx *macaron.Context, errs binding.Errors) b
 type CreateIssueForm struct {
 	Title       string `binding:"Required;MaxSize(255)"`
 	LabelIDs    string `form:"label_ids"`
+	Ref         string `form:"ref"`
 	MilestoneID int64
 	AssigneeID  int64
 	Content     string
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 9931d9152b..4a8a39963f 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -612,6 +612,7 @@ issues.new.closed_milestone = Closed Milestones
 issues.new.assignee = Assignee
 issues.new.clear_assignee = Clear assignee
 issues.new.no_assignee = No assignee
+issues.no_ref = No Branch/Tag Specified
 issues.create = Create Issue
 issues.new_label = New Label
 issues.new_label_placeholder = Label name...
diff --git a/public/js/index.js b/public/js/index.js
index 90a61d7529..1b6f2f601e 100644
--- a/public/js/index.js
+++ b/public/js/index.js
@@ -86,6 +86,22 @@ function initEditForm() {
     initEditDiffTab($('.edit.form'));
 }
 
+function initBranchSelector() {
+    var $selectBranch = $('.ui.select-branch')
+    var $branchMenu = $selectBranch.find('.reference-list-menu');
+    $branchMenu.find('.item:not(.no-select)').click(function () {
+        var selectedValue = $(this).data('id');
+        $($(this).data('id-selector')).val(selectedValue);
+        $selectBranch.find('.ui .branch-name').text(selectedValue);
+    });
+    $selectBranch.find('.reference.column').click(function () {
+        $selectBranch.find('.scrolling.reference-list-menu').css('display', 'none');
+        $selectBranch.find('.reference .text').removeClass('black');
+        $($(this).data('target')).css('display', 'block');
+        $(this).find('.text').addClass('black');
+        return false;
+    });
+}
 
 function updateIssuesMeta(url, action, issueIds, elementId, afterSuccess) {
     $.ajax({
@@ -106,6 +122,7 @@ function initCommentForm() {
         return
     }
 
+    initBranchSelector();
     initCommentPreviewTab($('.comment.form'));
 
     // Labels
diff --git a/routers/repo/issue.go b/routers/repo/issue.go
index e4ed10d980..d1c5e1fe71 100644
--- a/routers/repo/issue.go
+++ b/routers/repo/issue.go
@@ -292,6 +292,13 @@ func RetrieveRepoMetas(ctx *context.Context, repo *models.Repository) []*models.
 		return nil
 	}
 
+	brs, err := ctx.Repo.GitRepo.GetBranches()
+	if err != nil {
+		ctx.Handle(500, "GetBranches", err)
+		return nil
+	}
+	ctx.Data["Branches"] = brs
+
 	return labels
 }
 
@@ -418,6 +425,7 @@ func NewIssuePost(ctx *context.Context, form auth.CreateIssueForm) {
 	ctx.Data["PageIsIssueList"] = true
 	ctx.Data["RequireHighlightJS"] = true
 	ctx.Data["RequireSimpleMDE"] = true
+	ctx.Data["ReadOnly"] = false
 	renderAttachmentSettings(ctx)
 
 	var (
@@ -447,6 +455,7 @@ func NewIssuePost(ctx *context.Context, form auth.CreateIssueForm) {
 		MilestoneID: milestoneID,
 		AssigneeID:  assigneeID,
 		Content:     form.Content,
+		Ref:         form.Ref,
 	}
 	if err := models.NewIssue(repo, issue, labelIDs, attachments); err != nil {
 		ctx.Handle(500, "NewIssue", err)
@@ -668,6 +677,7 @@ func ViewIssue(ctx *context.Context) {
 	ctx.Data["Participants"] = participants
 	ctx.Data["NumParticipants"] = len(participants)
 	ctx.Data["Issue"] = issue
+	ctx.Data["ReadOnly"] = true
 	ctx.Data["IsIssueOwner"] = ctx.Repo.IsWriter() || (ctx.IsSigned && issue.IsPoster(ctx.User.ID))
 	ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + ctx.Data["Link"].(string)
 	ctx.HTML(200, tplIssueView)
diff --git a/templates/repo/issue/branch_selector_field.tmpl b/templates/repo/issue/branch_selector_field.tmpl
new file mode 100644
index 0000000000..72b953b666
--- /dev/null
+++ b/templates/repo/issue/branch_selector_field.tmpl
@@ -0,0 +1,41 @@
+<input id="ref_selector" name="ref" type="hidden" value="{{.Issue.Ref}}">
+<div class="ui {{if .ReadOnly}}disabled{{end}} floating filter select-branch dropdown" data-no-results="{{.i18n.Tr "repo.pulls.no_results"}}">
+	<div class="ui basic small button">
+		<span class="text branch-name">{{if .Issue.Ref}}{{.Issue.Ref}}{{else}}{{.i18n.Tr "repo.issues.no_ref"}}{{end}}</span>
+		<i class="dropdown icon"></i>
+	</div>
+	<div class="menu">
+		<div class="ui icon search input">
+			<i class="filter icon"></i>
+			<input name="search" placeholder="{{.i18n.Tr "repo.filter_branch_and_tag"}}...">
+		</div>
+		<div class="header">
+			<div class="ui grid">
+				<div class="two column row">
+					<a class="reference column" href="#" data-target="#branch-list">
+						<span class="text black">
+							<i class="octicon octicon-git-branch"></i> {{.i18n.Tr "repo.branches"}}
+						</span>
+					</a>
+					<a class="reference column" href="#" data-target="#tag-list">
+						<span class="text">
+							<i class="reference tags icon"></i> {{.i18n.Tr "repo.tags"}}
+						</span>
+					</a>
+				</div>
+			</div>
+		</div>
+		<div id="branch-list" class="scrolling menu reference-list-menu">
+		{{range .Branches}}
+			<div class="item" data-id="{{.}}" data-id-selector="#ref_selector">{{.}}</div>
+		{{end}}
+		</div>
+		<div id="tag-list" class="scrolling menu reference-list-menu" style="display: none">
+		{{range .Tags}}
+			<div class="item" data-id="{{.}}" data-id-selector="#ref_selector">{{.}}</div>
+		{{end}}
+		</div>
+	</div>
+</div>
+
+<div class="ui divider"></div>
diff --git a/templates/repo/issue/list.tmpl b/templates/repo/issue/list.tmpl
index 8de52fb23f..5c5a574976 100644
--- a/templates/repo/issue/list.tmpl
+++ b/templates/repo/issue/list.tmpl
@@ -171,6 +171,9 @@
 					<div class="ui {{if .IsRead}}black{{else}}green{{end}} label">#{{.Index}}</div>
 					<a class="title has-emoji" href="{{$.Link}}/{{.Index}}">{{.Title}}</a>
 
+					{{if .Ref}}
+						<a class="ui label" href="{{$.RepoLink}}/src/{{.Ref}}">{{.Ref}}</a>
+					{{end}}
 					{{range .Labels}}
 						<a class="ui label" href="{{$.Link}}?q={{$.Keyword}}&type={{$.ViewType}}&state={{$.State}}&labels={{.ID}}&milestone={{$.MilestoneID}}&assignee={{$.AssigneeID}}" style="color: {{.ForegroundColor}}; background-color: {{.Color}}">{{.Name | Sanitize}}</a>
 					{{end}}
diff --git a/templates/repo/issue/new_form.tmpl b/templates/repo/issue/new_form.tmpl
index bfb97da2da..829f66943b 100644
--- a/templates/repo/issue/new_form.tmpl
+++ b/templates/repo/issue/new_form.tmpl
@@ -32,6 +32,8 @@
 
 	<div class="four wide column">
 		<div class="ui segment metas">
+			{{template "repo/issue/branch_selector_field" .}}
+
 			<input id="label_ids" name="label_ids" type="hidden" value="{{.label_ids}}">
 			<div class="ui {{if not .Labels}}disabled{{end}} floating jump select-label dropdown">
 				<span class="text">
diff --git a/templates/repo/issue/view_content/sidebar.tmpl b/templates/repo/issue/view_content/sidebar.tmpl
index cfb6f183b4..2c6149ed29 100644
--- a/templates/repo/issue/view_content/sidebar.tmpl
+++ b/templates/repo/issue/view_content/sidebar.tmpl
@@ -1,5 +1,7 @@
 <div class="four wide column">
 	<div class="ui segment metas">
+		{{template "repo/issue/branch_selector_field" .}}
+
 		<div class="ui {{if not .IsRepositoryWriter}}disabled{{end}} floating jump select-label dropdown">
 			<span class="text">
 				<strong>{{.i18n.Tr "repo.issues.new.labels"}}</strong>