]> source.dussan.org Git - gitea.git/commitdiff
Comment - Reference in new issue (#14366)
authorKN4CK3R <KN4CK3R@users.noreply.github.com>
Thu, 21 Jan 2021 13:51:17 +0000 (14:51 +0100)
committerGitHub <noreply@github.com>
Thu, 21 Jan 2021 13:51:17 +0000 (14:51 +0100)
* Implemented "Reference in new issue"

* Fixed menu style on "pulls/x/files" because "button" has a style.

* Added context menu for PR file comments.

* Use only a single modal for every comment.

* Use current repository as default. Added search filter.

* Added suggested changes.

* Fixed assignment.

Co-authored-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: 6543 <6543@obermui.de>
options/locale/locale_en-US.ini
templates/repo/diff/box.tmpl
templates/repo/issue/view_content.tmpl
templates/repo/issue/view_content/context_menu.tmpl
templates/repo/issue/view_content/reference_issue_dialog.tmpl [new file with mode: 0644]
web_src/js/index.js

index 142f3049f34ca51f89a5c95825a02c900e57e110..c950591d76c9679b714d72eb91d3ebad38121941 100644 (file)
@@ -1068,6 +1068,7 @@ issues.commented_at = `commented <a href="#%s">%s</a>`
 issues.delete_comment_confirm = Are you sure you want to delete this comment?
 issues.context.copy_link = Copy Link
 issues.context.quote_reply = Quote Reply
+issues.context.reference_issue = Reference in new issue
 issues.context.edit = Edit
 issues.context.delete = Delete
 issues.no_content = There is no content yet.
@@ -1225,6 +1226,7 @@ issues.review.resolve_conversation = Resolve conversation
 issues.review.un_resolve_conversation = Unresolve conversation
 issues.review.resolved_by = marked this conversation as resolved
 issues.assignee.error = Not all assignees was added due to an unexpected error.
+issues.reference_issue.body = Body
 
 pulls.desc = Enable pull requests and code reviews.
 pulls.new = New Pull Request
index 8533f9b910c3788e962c681fd0a9fab2f153d7a1..f01795ad15b605b1e27a64264a0b094dc6fcd380 100644 (file)
                        </div>
                {{end}}
 
+               {{template "repo/issue/view_content/reference_issue_dialog" .}}
+
                {{if .IsSplitStyle}}
                        <script>
                                document.addEventListener('DOMContentLoaded', () => {
index 37628a74e88df62f5335358d6fc12398976343ff..0119c12cd8c9f6f64c96715ec5b04a803981d8ef 100644 (file)
@@ -52,7 +52,7 @@
                                                                        </div>
                                                                {{end}}
                                                                {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/issues/%d/reactions" $.RepoLink .Issue.Index)}}
-                                                               {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" .Issue "delete" false "diff" false "IsCommentPoster" $.IsIssuePoster}}
+                                                               {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" .Issue "delete" false "issue" true "diff" false "IsCommentPoster" $.IsIssuePoster}}
                                                        {{end}}
                                                </div>
                                        </div>
        </div>
 </div>
 
+{{template "repo/issue/view_content/reference_issue_dialog" .}}
+
 <div class="hide" id="no-content">
        <span class="no-content">{{.i18n.Tr "repo.issues.no_content"}}</span>
 </div>
index 41786242ba5ebb669db3893590cad8c746760004..f5a965b8a9383f8d39a5211dc5838991c12fca3e 100644 (file)
@@ -4,12 +4,15 @@
                {{svg "octicon-kebab-horizontal"}}
        </a>
        <div class="menu">
-               {{if .issue}}
-                       <div class="item context clipboard" data-clipboard-text="{{Printf "%s%s/issues/%d#%s" AppUrl .ctx.Repository.FullName .ctx.Issue.Index .item.HashTag}}">{{.ctx.i18n.Tr "repo.issues.context.copy_link"}}</div>
-               {{else}}
-                       <div class="item context clipboard" data-clipboard-text="{{Printf "%s%s/pulls/%d/files#%s" AppUrl .ctx.Repository.FullName .ctx.Issue.Index .item.HashTag}}">{{.ctx.i18n.Tr "repo.issues.context.copy_link"}}</div>
-               {{end}}
+               {{ $referenceUrl := "" }}
+               {{ if .issue }}
+                       {{ $referenceUrl = Printf "%s%s/issues/%d#%s" AppUrl .ctx.Repository.FullName .ctx.Issue.Index .item.HashTag }}
+               {{ else }}
+                       {{ $referenceUrl = Printf "%s%s/pulls/%d/files#%s" AppUrl .ctx.Repository.FullName .ctx.Issue.Index .item.HashTag }}
+               {{ end }}
+               <div class="item context clipboard" data-clipboard-text="{{$referenceUrl}}">{{.ctx.i18n.Tr "repo.issues.context.copy_link"}}</div>
                <div class="item context quote-reply {{if .diff}}quote-reply-diff{{end}}" data-target="{{.item.ID}}">{{.ctx.i18n.Tr "repo.issues.context.quote_reply"}}</div>
+               <div class="item context reference-issue" data-target="{{.item.ID}}" data-modal="#reference-issue-modal" data-poster="{{.item.Poster.GetDisplayName}}" data-reference="{{$referenceUrl}}">{{.ctx.i18n.Tr "repo.issues.context.reference_issue"}}</div>
                {{if or .ctx.Permission.IsAdmin .IsCommentPoster .ctx.HasIssuesOrPullsWritePermission}}
                        <div class="divider"></div>
                        <div class="item context edit-content">{{.ctx.i18n.Tr "repo.issues.context.edit"}}</div>
diff --git a/templates/repo/issue/view_content/reference_issue_dialog.tmpl b/templates/repo/issue/view_content/reference_issue_dialog.tmpl
new file mode 100644 (file)
index 0000000..2133df5
--- /dev/null
@@ -0,0 +1,30 @@
+<div class="ui small modal" id="reference-issue-modal">
+       <div class="header">
+               {{.i18n.Tr "repo.issues.context.reference_issue"}}
+       </div>
+       <div class="content" style="text-align:left">
+               <form class="ui form" action="{{ Printf "%s/issues/new" .Repository.Link }}" method="post">
+                       {{.CsrfTokenHtml}}
+                       <div class="ui segment content">
+                               <div class="field">
+                                       <span class="text"><strong>{{.i18n.Tr "repository"}}</strong></span>
+                                       <div class="ui search normal selection dropdown issue_reference_repository_search">
+                                               <div class="default text">{{.Repository.FullName}}</div>
+                                               <div class="menu"></div>
+                                       </div>
+                               </div>
+                               <div class="field">
+                                       <span class="text"><strong>{{.i18n.Tr "repo.milestones.title"}}</strong></span>
+                                       <input name="title" value="" autofocus required maxlength="255" autocomplete="off">
+                               </div>
+                               <div class="field">
+                                       <span class="text"><strong>{{.i18n.Tr "repo.issues.reference_issue.body"}}</strong></span>
+                                       <textarea name="content" class="form-control"></textarea>
+                               </div>
+                               <div class="text right">
+                                       <button class="ui green button">{{.i18n.Tr "repo.issues.create"}}</button>
+                               </div>
+                       </div>
+               </form>
+       </div>
+</div>
index f64f9e6ef1118a546e421341f15fec84e61df012..541f32507dc28870263c4abd71f7c888e07cbd8f 100644 (file)
@@ -932,6 +932,27 @@ async function initRepository() {
       event.preventDefault();
     });
 
+    // Reference issue
+    $(document).on('click', '.reference-issue', function (event) {
+      const $this = $(this);
+
+      $this.closest('.dropdown').find('.menu').toggle('visible');
+
+      const content = $(`#comment-${$this.data('target')}`).text();
+      const subject = content.split('\n', 1)[0].slice(0, 255);
+
+      const poster = $this.data('poster');
+      const reference = $this.data('reference');
+
+      const $modal = $($this.data('modal'));
+      $modal.find('input[name="title"').val(subject);
+      $modal.find('textarea[name="content"]').val(`${content}\n\n_Originally posted by @${poster} in ${reference}_`);
+
+      $modal.modal('show');
+
+      event.preventDefault();
+    });
+
     // Edit issue or comment content
     $(document).on('click', '.edit-content', async function (event) {
       $(this).closest('.dropdown').find('.menu').toggle('visible');
@@ -2337,6 +2358,31 @@ function initTemplateSearch() {
   changeOwner();
 }
 
+function initIssueReferenceRepositorySearch() {
+  $('.issue_reference_repository_search')
+    .dropdown({
+      apiSettings: {
+        url: `${AppSubUrl}/api/v1/repos/search?q={query}&limit=20`,
+        onResponse(response) {
+          const filteredResponse = {success: true, results: []};
+          $.each(response.data, (_r, repo) => {
+            filteredResponse.results.push({
+              name: htmlEscape(repo.full_name),
+              value: repo.full_name
+            });
+          });
+          return filteredResponse;
+        },
+        cache: false,
+      },
+      onChange(_value, _text, $choice) {
+        const $form = $choice.closest('form');
+        $form.attr('action', `${AppSubUrl}/${_text}/issues/new`);
+      },
+      fullTextSearch: true
+    });
+}
+
 $(document).ready(async () => {
   // Show exact time
   $('.time-since').each(function () {
@@ -2553,6 +2599,7 @@ $(document).ready(async () => {
   initPullRequestReview();
   initRepoStatusChecker();
   initTemplateSearch();
+  initIssueReferenceRepositorySearch();
   initContextPopups();
   initTableSort();
   initNotificationsTable();