mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 02:46:04 +01:00 
			
		
		
		
	Use git diff-tree for DiffFileTree on diff pages (#33514)
				
					
				
			Modify Diff View FileTree to show all files ## Changes * removes Show Status button on diff * uses `git diff-tree` to generate the file tree for the diff * doesn't reload the diff tree each time we load more files in the preview * selecting and unloaded file will keep loading until that file is loaded * removes `DiffFileList.vue` and "Show Stats" in diff options ## Open Questions * selecting and unloaded file will keep loading until that file is loaded. Is this behaviour okay? It matches what github does. ### Demo In this demo I set `git.MAX_GIT_DIFF_FILES=1` in my `app.ini` to demonstrate a worst case example. In most cases the behaviour isn't nearly as jarring as we load a bunch of files at a time. https://github.com/user-attachments/assets/72f29663-d6fc-472d-94fa-7fb5950c2836 --------- Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| import $ from 'jquery'; | ||||
| import {initCompReactionSelector} from './comp/ReactionSelector.ts'; | ||||
| import {initRepoIssueContentHistory} from './repo-issue-content.ts'; | ||||
| import {initDiffFileTree, initDiffFileList} from './repo-diff-filetree.ts'; | ||||
| import {initDiffFileTree} from './repo-diff-filetree.ts'; | ||||
| import {initDiffCommitSelect} from './repo-diff-commitselect.ts'; | ||||
| import {validateTextareaNonEmpty} from './comp/ComboMarkdownEditor.ts'; | ||||
| import {initViewedCheckboxListenerFor, countAndUpdateViewedFiles, initExpandAndCollapseFilesButton} from './pull-view-file.ts'; | ||||
| @@ -21,7 +21,7 @@ import {fomanticQuery} from '../modules/fomantic/base.ts'; | ||||
| import {createTippy} from '../modules/tippy.ts'; | ||||
| import {invertFileFolding} from './file-fold.ts'; | ||||
|  | ||||
| const {pageData, i18n} = window.config; | ||||
| const {i18n} = window.config; | ||||
|  | ||||
| function initRepoDiffFileViewToggle() { | ||||
|   $('.file-view-toggle').on('click', function () { | ||||
| @@ -161,6 +161,7 @@ function initDiffHeaderPopup() { | ||||
|  | ||||
| // Will be called when the show more (files) button has been pressed | ||||
| function onShowMoreFiles() { | ||||
|   // FIXME: here the init calls are incomplete: at least it misses dropdown & initCompReactionSelector | ||||
|   initRepoIssueContentHistory(); | ||||
|   initViewedCheckboxListenerFor(); | ||||
|   countAndUpdateViewedFiles(); | ||||
| @@ -168,41 +169,35 @@ function onShowMoreFiles() { | ||||
|   initDiffHeaderPopup(); | ||||
| } | ||||
|  | ||||
| export async function loadMoreFiles(url: string) { | ||||
|   const target = document.querySelector('a#diff-show-more-files'); | ||||
|   if (target?.classList.contains('disabled') || pageData.diffFileInfo.isLoadingNewData) { | ||||
|     return; | ||||
| async function loadMoreFiles(btn: Element): Promise<boolean> { | ||||
|   if (btn.classList.contains('disabled')) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   pageData.diffFileInfo.isLoadingNewData = true; | ||||
|   target?.classList.add('disabled'); | ||||
|  | ||||
|   btn.classList.add('disabled'); | ||||
|   const url = btn.getAttribute('data-href'); | ||||
|   try { | ||||
|     const response = await GET(url); | ||||
|     const resp = await response.text(); | ||||
|     const $resp = $(resp); | ||||
|     // the response is a full HTML page, we need to extract the relevant contents: | ||||
|     // 1. append the newly loaded file list items to the existing list | ||||
|     // * append the newly loaded file list items to the existing list | ||||
|     $('#diff-incomplete').replaceWith($resp.find('#diff-file-boxes').children()); | ||||
|     // 2. re-execute the script to append the newly loaded items to the JS variables to refresh the DiffFileTree | ||||
|     $('body').append($resp.find('script#diff-data-script')); | ||||
|  | ||||
|     onShowMoreFiles(); | ||||
|     return true; | ||||
|   } catch (error) { | ||||
|     console.error('Error:', error); | ||||
|     showErrorToast('An error occurred while loading more files.'); | ||||
|   } finally { | ||||
|     target?.classList.remove('disabled'); | ||||
|     pageData.diffFileInfo.isLoadingNewData = false; | ||||
|     btn.classList.remove('disabled'); | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| function initRepoDiffShowMore() { | ||||
|   $(document).on('click', 'a#diff-show-more-files', (e) => { | ||||
|   addDelegatedEventListener(document, 'click', 'a#diff-show-more-files', (el, e) => { | ||||
|     e.preventDefault(); | ||||
|  | ||||
|     const linkLoadMore = e.target.getAttribute('data-href'); | ||||
|     loadMoreFiles(linkLoadMore); | ||||
|     loadMoreFiles(el); | ||||
|   }); | ||||
|  | ||||
|   $(document).on('click', 'a.diff-load-button', async (e) => { | ||||
| @@ -234,17 +229,49 @@ function initRepoDiffShowMore() { | ||||
|   }); | ||||
| } | ||||
|  | ||||
| async function loadUntilFound() { | ||||
|   const hashTargetSelector = window.location.hash; | ||||
|   if (!hashTargetSelector.startsWith('#diff-') && !hashTargetSelector.startsWith('#issuecomment-')) { | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   while (true) { | ||||
|     // use getElementById to avoid querySelector throws an error when the hash is invalid | ||||
|     // eslint-disable-next-line unicorn/prefer-query-selector | ||||
|     const targetElement = document.getElementById(hashTargetSelector.substring(1)); | ||||
|     if (targetElement) { | ||||
|       targetElement.scrollIntoView(); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     // the button will be refreshed after each "load more", so query it every time | ||||
|     const showMoreButton = document.querySelector('#diff-show-more-files'); | ||||
|     if (!showMoreButton) { | ||||
|       return; // nothing more to load | ||||
|     } | ||||
|  | ||||
|     // Load more files, await ensures we don't block progress | ||||
|     const ok = await loadMoreFiles(showMoreButton); | ||||
|     if (!ok) return; // failed to load more files | ||||
|   } | ||||
| } | ||||
|  | ||||
| function initRepoDiffHashChangeListener() { | ||||
|   window.addEventListener('hashchange', loadUntilFound); | ||||
|   loadUntilFound(); | ||||
| } | ||||
|  | ||||
| export function initRepoDiffView() { | ||||
|   initRepoDiffConversationForm(); | ||||
|   if (!$('#diff-file-list').length) return; | ||||
|   if (!$('#diff-file-boxes').length) return; | ||||
|   initDiffFileTree(); | ||||
|   initDiffFileList(); | ||||
|   initDiffCommitSelect(); | ||||
|   initRepoDiffShowMore(); | ||||
|   initDiffHeaderPopup(); | ||||
|   initRepoDiffFileViewToggle(); | ||||
|   initViewedCheckboxListenerFor(); | ||||
|   initExpandAndCollapseFilesButton(); | ||||
|   initRepoDiffHashChangeListener(); | ||||
|  | ||||
|   addDelegatedEventListener(document, 'click', '.fold-file', (el) => { | ||||
|     invertFileFolding(el.closest('.file-content'), el); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user