aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--routers/repo/issue.go1
-rw-r--r--templates/repo/issue/comment_tab.tmpl5
-rw-r--r--templates/repo/view_file.tmpl9
-rw-r--r--web_src/js/index.js69
-rw-r--r--web_src/less/_repository.less7
5 files changed, 89 insertions, 2 deletions
diff --git a/routers/repo/issue.go b/routers/repo/issue.go
index 9f04c54816..15459cd0e6 100644
--- a/routers/repo/issue.go
+++ b/routers/repo/issue.go
@@ -781,6 +781,7 @@ func NewIssue(ctx *context.Context) {
ctx.Data["TitleQuery"] = title
body := ctx.Query("body")
ctx.Data["BodyQuery"] = body
+
ctx.Data["IsProjectsEnabled"] = ctx.Repo.CanRead(models.UnitTypeProjects)
ctx.Data["IsAttachmentEnabled"] = setting.Attachment.Enabled
upload.AddUploadContext(ctx, "comment")
diff --git a/templates/repo/issue/comment_tab.tmpl b/templates/repo/issue/comment_tab.tmpl
index d24f7a22ad..28a9b24edc 100644
--- a/templates/repo/issue/comment_tab.tmpl
+++ b/templates/repo/issue/comment_tab.tmpl
@@ -4,8 +4,9 @@
</div>
<div class="field">
<div class="ui bottom active tab" data-tab="write">
- <textarea id="content" class="edit_area js-quick-submit" name="content" tabindex="4" data-id="issue-{{.RepoName}}" data-url="{{.Repository.APIURL}}/markdown" data-context="{{.Repo.RepoLink}}">
-{{if .BodyQuery}}{{.BodyQuery}}{{else if .IssueTemplate}}{{.IssueTemplate}}{{else if .PullRequestTemplate}}{{.PullRequestTemplate}}{{else}}{{.content}}{{end}}</textarea>
+ <textarea id="content" class="edit_area js-quick-submit" name="content" tabindex="4" data-id="issue-{{.RepoName}}" data-url="{{.Repository.APIURL}}/markdown" data-context="{{.Repo.RepoLink}}">
+ {{- if .BodyQuery}}{{.BodyQuery}}{{else if .IssueTemplate}}{{.IssueTemplate}}{{else if .PullRequestTemplate}}{{.PullRequestTemplate}}{{else}}{{.content}}{{end -}}
+ </textarea>
</div>
<div class="ui bottom tab markdown" data-tab="preview">
{{.i18n.Tr "loading"}}
diff --git a/templates/repo/view_file.tmpl b/templates/repo/view_file.tmpl
index 15a8a589f1..9beddfb912 100644
--- a/templates/repo/view_file.tmpl
+++ b/templates/repo/view_file.tmpl
@@ -111,6 +111,15 @@
{{end}}
</tbody>
</table>
+ <div class="code-view-menu-list ui fluid popup transition hidden">
+ <div class="ui column relaxed equal height">
+ <div class="column">
+ <div class="ui link list">
+ <a class="item ref-in-new-issue" href="{{.RepoLink}}/issues/new?body={{URLJoin AppUrl .RepoLink}}/src/commit/{{.CommitID}}/{{EscapePound .TreePath}}">{{.i18n.Tr "repo.issues.context.reference_issue"}}</a>
+ </div>
+ </div>
+ </div>
+ </div>
{{end}}
{{end}}
</div>
diff --git a/web_src/js/index.js b/web_src/js/index.js
index ccd9276059..6c30d14fbb 100644
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -2167,6 +2167,45 @@ function searchRepositories() {
});
}
+function showCodeViewMenu() {
+ // Get clicked tr
+ const $code_tr = $('.code-view td.lines-code.active').parent();
+
+ // Reset code line marker
+ $('.code-view-menu-list').appendTo($('.code-view'));
+ $('.code-line-marker').remove();
+
+ // Generate new one
+ const icon_wrap = $('<div>', {
+ class: 'code-line-marker'
+ }).prependTo($code_tr.find('td:eq(0)').get(0)).hide();
+
+ const a_wrap = $('<a>', {
+ class: 'code-line-link'
+ }).appendTo(icon_wrap);
+
+ $('<i>', {
+ class: 'dropdown icon',
+ style: 'margin: 0px;'
+ }).appendTo(a_wrap);
+
+ icon_wrap.css({
+ left: '-7px',
+ display: 'block',
+ });
+
+ $('.code-view-menu-list').css({
+ 'min-width': '220px',
+ });
+
+ // Popup the menu
+ $('.code-line-link').popup({
+ popup: $('.code-view-menu-list'),
+ on: 'click',
+ lastResort: 'bottom left',
+ });
+}
+
function initCodeView() {
if ($('.code-view .lines-num').length > 0) {
$(document).on('click', '.lines-num span', function (e) {
@@ -2179,6 +2218,9 @@ function initCodeView() {
}
selectRange($list, $list.filter(`[rel=${$select.attr('id')}]`), (e.shiftKey ? $list.filter('.active').eq(0) : null));
deSelect();
+
+ // show code view menu marker
+ showCodeViewMenu();
});
$(window).on('hashchange', () => {
@@ -2193,6 +2235,10 @@ function initCodeView() {
if (m) {
$first = $list.filter(`[rel=${m[1]}]`);
selectRange($list, $first, $list.filter(`[rel=${m[2]}]`));
+
+ // show code view menu marker
+ showCodeViewMenu();
+
$('html, body').scrollTop($first.offset().top - 200);
return;
}
@@ -2200,6 +2246,10 @@ function initCodeView() {
if (m) {
$first = $list.filter(`[rel=L${m[2]}]`);
selectRange($list, $first);
+
+ // show code view menu marker
+ showCodeViewMenu();
+
$('html, body').scrollTop($first.offset().top - 200);
}
}).trigger('hashchange');
@@ -2752,11 +2802,30 @@ function selectRange($list, $select, $from) {
}
$list.filter(classes.join(',')).addClass('active');
changeHash(`#L${a}-L${b}`);
+
+ // add hashchange to permalink
+ const $issue = $('a.ref-in-new-issue');
+ const matched = $issue.attr('href').match(/%23L\d+$|%23L\d+-L\d+$/);
+ if (matched) {
+ $issue.attr('href', $issue.attr('href').replace($issue.attr('href').substr(matched.index), `%23L${a}-L${b}`));
+ } else {
+ $issue.attr('href', `${$issue.attr('href')}%23L${a}-L${b}`);
+ }
+
return;
}
}
$select.addClass('active');
changeHash(`#${$select.attr('rel')}`);
+
+ // add hashchange to permalink
+ const $issue = $('a.ref-in-new-issue');
+ const matched = $issue.attr('href').match(/%23L\d+$|%23L\d+-L\d+$/);
+ if (matched) {
+ $issue.attr('href', $issue.attr('href').replace($issue.attr('href').substr(matched.index), `%23${$select.attr('rel')}`));
+ } else {
+ $issue.attr('href', `${$issue.attr('href')}%23${$select.attr('rel')}`);
+ }
}
$(() => {
diff --git a/web_src/less/_repository.less b/web_src/less/_repository.less
index b750cf8c07..7cb71d8ba0 100644
--- a/web_src/less/_repository.less
+++ b/web_src/less/_repository.less
@@ -3145,3 +3145,10 @@ td.blob-excerpt {
transform: scale(105%);
box-shadow: 0 .5rem 1rem var(--color-shadow) !important;
}
+
+.code-line-marker {
+ width: 13px;
+ height: 20px;
+ background-color: rgb(34 36 38 / 15%);
+ position: absolute;
+}