diff options
-rw-r--r-- | routers/repo/issue.go | 1 | ||||
-rw-r--r-- | templates/repo/issue/comment_tab.tmpl | 5 | ||||
-rw-r--r-- | templates/repo/view_file.tmpl | 9 | ||||
-rw-r--r-- | web_src/js/index.js | 69 | ||||
-rw-r--r-- | web_src/less/_repository.less | 7 |
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; +} |