diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index d8693ee9dfa29..eb1ffebc37714 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -1572,6 +1572,8 @@ pulls.compare_changes_desc = Select the branch to merge into and the branch to p
pulls.has_viewed_file = Viewed
pulls.has_changed_since_last_review = Changed since your last review
pulls.viewed_files_label = %[1]d / %[2]d files viewed
+pulls.expand_files = Expand all files
+pulls.collapse_files = Collapse all files
pulls.compare_base = merge into
pulls.compare_compare = pull from
pulls.switch_comparison_type = Switch comparison type
diff --git a/templates/repo/diff/options_dropdown.tmpl b/templates/repo/diff/options_dropdown.tmpl
index 93e1183d1b18f..ced0e060467e1 100644
--- a/templates/repo/diff/options_dropdown.tmpl
+++ b/templates/repo/diff/options_dropdown.tmpl
@@ -12,5 +12,7 @@
{{.locale.Tr "repo.diff.download_patch"}}
{{.locale.Tr "repo.diff.download_diff"}}
{{end}}
+ {{.locale.Tr "repo.pulls.expand_files"}}
+ {{.locale.Tr "repo.pulls.collapse_files"}}
diff --git a/web_src/css/review.css b/web_src/css/review.css
index 0111311d3c346..14668eb24599a 100644
--- a/web_src/css/review.css
+++ b/web_src/css/review.css
@@ -256,7 +256,7 @@ a.blob-excerpt:hover {
.changed-since-last-review {
border: 1px var(--color-accent) solid;
background-color: var(--color-small-accent);
- border-radius: 15px;
+ border-radius: var(--border-radius);
padding: 4px 8px;
margin: -8px 0; /* just like other buttons in the diff box header */
font-size: 0.857rem; /* just like .ui.tiny.button */
diff --git a/web_src/js/features/pull-view-file.js b/web_src/js/features/pull-view-file.js
index 06d78d78c200c..c6985efadb528 100644
--- a/web_src/js/features/pull-view-file.js
+++ b/web_src/js/features/pull-view-file.js
@@ -4,6 +4,8 @@ const {csrfToken, pageData} = window.config;
const prReview = pageData.prReview || {};
const viewedStyleClass = 'viewed-file-checked-form';
const viewedCheckboxSelector = '.viewed-file-form'; // Selector under which all "Viewed" checkbox forms can be found
+const expandFilesBtnSelector = '#expand-files-btn';
+const collapseFilesBtnSelector = '#collapse-files-btn';
// Refreshes the summary of viewed files if present
@@ -69,3 +71,21 @@ export function initViewedCheckboxListenerFor() {
});
}
}
+
+export function initExpandAndCollapseFilesButton() {
+ // expand btn
+ document.querySelector(expandFilesBtnSelector)?.addEventListener('click', () => {
+ for (const box of document.querySelectorAll('.file-content[data-folded="true"]')) {
+ setFileFolding(box, box.querySelector('.fold-file'), false);
+ }
+ });
+ // collapse btn, need to exclude the div of “show more”
+ document.querySelector(collapseFilesBtnSelector)?.addEventListener('click', () => {
+ for (const box of document.querySelectorAll('.file-content:not([data-folded="true"])')) {
+ if (box.getAttribute('id') === 'diff-incomplete') continue;
+ setFileFolding(box, box.querySelector('.fold-file'), true);
+ }
+ });
+}
+
+
diff --git a/web_src/js/features/repo-diff.js b/web_src/js/features/repo-diff.js
index df66db7f6ceb7..9be4bc8d0f69b 100644
--- a/web_src/js/features/repo-diff.js
+++ b/web_src/js/features/repo-diff.js
@@ -1,12 +1,13 @@
import $ from 'jquery';
import {initCompReactionSelector} from './comp/ReactionSelector.js';
import {initRepoIssueContentHistory} from './repo-issue-content.js';
-import {initViewedCheckboxListenerFor, countAndUpdateViewedFiles} from './pull-view-file.js';
+import {initDiffFileTree} from './repo-diff-filetree.js';
import {validateTextareaNonEmpty} from './comp/ComboMarkdownEditor.js';
+import {initViewedCheckboxListenerFor, countAndUpdateViewedFiles, initExpandAndCollapseFilesButton} from './pull-view-file.js';
const {csrfToken} = window.config;
-export function initRepoDiffReviewButton() {
+function initRepoDiffReviewButton() {
const $reviewBox = $('#review-box');
const $counter = $reviewBox.find('.review-comments-counter');
@@ -25,7 +26,7 @@ export function initRepoDiffReviewButton() {
});
}
-export function initRepoDiffFileViewToggle() {
+function initRepoDiffFileViewToggle() {
$('.file-view-toggle').on('click', function () {
const $this = $(this);
$this.parent().children().removeClass('active');
@@ -37,7 +38,7 @@ export function initRepoDiffFileViewToggle() {
});
}
-export function initRepoDiffConversationForm() {
+function initRepoDiffConversationForm() {
$(document).on('submit', '.conversation-holder form', async (e) => {
e.preventDefault();
@@ -152,7 +153,7 @@ function loadMoreFiles(url, callback) {
});
}
-export function initRepoDiffShowMore() {
+function initRepoDiffShowMore() {
$(document).on('click', 'a#diff-show-more-files', (e) => {
e.preventDefault();
@@ -186,3 +187,15 @@ export function initRepoDiffShowMore() {
});
});
}
+
+export function initRepoDiffView() {
+ const diffFileList = $('#diff-file-list');
+ if (diffFileList.length === 0) return;
+ initDiffFileTree();
+ initRepoDiffShowMore();
+ initRepoDiffReviewButton();
+ initRepoDiffFileViewToggle();
+ initRepoDiffConversationForm();
+ initViewedCheckboxListenerFor();
+ initExpandAndCollapseFilesButton();
+}
diff --git a/web_src/js/index.js b/web_src/js/index.js
index f5584d29403a3..878afb10d7f20 100644
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -21,14 +21,8 @@ import {initRepoIssueContentHistory} from './features/repo-issue-content.js';
import {initStopwatch} from './features/stopwatch.js';
import {initFindFileInRepo} from './features/repo-findfile.js';
import {initCommentContent, initMarkupContent} from './markup/content.js';
-import {initDiffFileTree} from './features/repo-diff-filetree.js';
import {initUserAuthLinkAccountView, initUserAuthOauth2} from './features/user-auth.js';
-import {
- initRepoDiffConversationForm,
- initRepoDiffFileViewToggle,
- initRepoDiffReviewButton, initRepoDiffShowMore,
-} from './features/repo-diff.js';
import {
initRepoIssueDue,
initRepoIssueReferenceRepositorySearch,
@@ -68,7 +62,7 @@ import {
initRepoSettingsCollaboration,
initRepoSettingSearchTeamBox,
} from './features/repo-settings.js';
-import {initViewedCheckboxListenerFor} from './features/pull-view-file.js';
+import {initRepoDiffView} from './features/repo-diff.js';
import {initOrgTeamSearchRepoBox, initOrgTeamSettings} from './features/org-team.js';
import {initUserAuthWebAuthn, initUserAuthWebAuthnRegister} from './features/user-auth-webauthn.js';
import {initRepoRelease, initRepoReleaseNew} from './features/repo-release.js';
@@ -151,11 +145,6 @@ onDomReady(() => {
initRepoCommentForm();
initRepoEllipsisButton();
initRepoCommitLastCommitLoader();
- initRepoDiffConversationForm();
- initRepoDiffFileViewToggle();
- initRepoDiffReviewButton();
- initRepoDiffShowMore();
- initDiffFileTree();
initRepoEditor();
initRepoGraphGit();
initRepoIssueContentHistory();
@@ -190,5 +179,5 @@ onDomReady(() => {
initUserAuthWebAuthn();
initUserAuthWebAuthnRegister();
initUserSettings();
- initViewedCheckboxListenerFor();
+ initRepoDiffView();
});