From fe66b612b5234142304cd7c6c97a14017bca066c Mon Sep 17 00:00:00 2001
From: Jimmy Praet <jimmy.praet@telenet.be>
Date: Sun, 27 Jun 2021 21:57:01 +0200
Subject: [PATCH] Add previous/next buttons to review comments (#16273)

Co-authored-by: Norwin <noerw@users.noreply.github.com>
Signed-off-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: zeripath <art27@cantab.net>
---
 templates/repo/diff/conversation.tmpl |  8 ++++++++
 web_src/js/index.js                   | 22 ++++++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/templates/repo/diff/conversation.tmpl b/templates/repo/diff/conversation.tmpl
index ea268c5c17..5ae44e600e 100644
--- a/templates/repo/diff/conversation.tmpl
+++ b/templates/repo/diff/conversation.tmpl
@@ -27,6 +27,14 @@
 			</ui>
 		</div>
 		<div class="df je ac fw mt-3">
+			<div class="ui buttons mr-2">
+				<button class="ui icon tiny basic button previous-conversation">
+					{{svg "octicon-arrow-up"}} {{$.i18n.Tr "repo.issues.previous"}}
+				</button>
+				<button class="ui icon tiny basic button next-conversation">
+					{{svg "octicon-arrow-down"}} {{$.i18n.Tr "repo.issues.next"}}
+				</button>
+			</div>
 			{{if and $.CanMarkConversation $isNotPending}}
 				<button class="ui icon tiny basic button resolve-conversation" data-origin="diff" data-action="{{if not $resolved}}Resolve{{else}}UnResolve{{end}}" data-comment-id="{{(index .comments 0).ID}}" data-update-url="{{$.RepoLink}}/issues/resolve_conversation">
 					{{if $resolved}}
diff --git a/web_src/js/index.js b/web_src/js/index.js
index 67548f5d9d..f1f41ce747 100644
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -942,6 +942,28 @@ async function initRepository() {
       action: 'hide'
     });
 
+    // Previous/Next code review conversation
+    $(document).on('click', '.previous-conversation', (e) => {
+      const $conversation = $(e.currentTarget).closest('.comment-code-cloud');
+      const $conversations = $('.comment-code-cloud:not(.hide)');
+      const index = $conversations.index($conversation);
+      if (index !== 0) {
+        const $previousConversation = $conversations.eq(index - 1);
+        const anchor = $previousConversation.find('.comment').first().attr('id');
+        window.location.href = `#${anchor}`;
+      }
+    });
+    $(document).on('click', '.next-conversation', (e) => {
+      const $conversation = $(e.currentTarget).closest('.comment-code-cloud');
+      const $conversations = $('.comment-code-cloud:not(.hide)');
+      const index = $conversations.index($conversation);
+      if (index !== $conversations.length - 1) {
+        const $nextConversation = $conversations.eq(index + 1);
+        const anchor = $nextConversation.find('.comment').first().attr('id');
+        window.location.href = `#${anchor}`;
+      }
+    });
+
     // Quote reply
     $(document).on('click', '.quote-reply', function (event) {
       $(this).closest('.dropdown').find('.menu').toggle('visible');