diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js index 04f08e869552af640079f6bf9143aed72addcb21..5e7fe8b5cd83cf42756c93aa73bdd07d8a7f3b9a 100644 --- a/app/assets/javascripts/diffs/store/mutations.js +++ b/app/assets/javascripts/diffs/store/mutations.js @@ -15,6 +15,7 @@ import { prepareDiffData, isDiscussionApplicableToLine, updateLineInFile, + markTreeEntriesLoaded, } from './utils'; function updateDiffFilesInState(state, files) { @@ -82,9 +83,15 @@ export default { }, [types.SET_DIFF_DATA_BATCH](state, data) { - state.diffFiles = prepareDiffData({ - diff: data, - priorFiles: state.diffFiles, + Object.assign(state, { + diffFiles: prepareDiffData({ + diff: data, + priorFiles: state.diffFiles, + }), + treeEntries: markTreeEntriesLoaded({ + priorEntries: state.treeEntries, + loadedFiles: data.diff_files, + }), }); }, diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js index 84a2af6c5936d23f6d248ec94722c54e2ea891a0..3739ef0cd55c8a6e9111569d10bf10ef4f68b5d5 100644 --- a/app/assets/javascripts/diffs/store/utils.js +++ b/app/assets/javascripts/diffs/store/utils.js @@ -585,3 +585,17 @@ export function parseUrlHashAsFileHash(urlHash, currentDiffFileId = '') { return id; } + +export function markTreeEntriesLoaded({ priorEntries, loadedFiles }) { + const newEntries = { ...priorEntries }; + + loadedFiles.forEach((newFile) => { + const entry = newEntries[newFile.new_path]; + + if (entry) { + entry.diffLoaded = true; + } + }); + + return newEntries; +} diff --git a/app/assets/javascripts/diffs/utils/tree_worker_utils.js b/app/assets/javascripts/diffs/utils/tree_worker_utils.js index a90c1a5c64e3e771bb4e0fbce21f724ba3e8af4a..8689809cfa9d75f284acdab15c32c009c3794fd6 100644 --- a/app/assets/javascripts/diffs/utils/tree_worker_utils.js +++ b/app/assets/javascripts/diffs/utils/tree_worker_utils.js @@ -85,6 +85,11 @@ export const generateTreeList = (files) => { if (type === 'blob') { Object.assign(entry, { changed: true, + diffLoaded: false, + filePaths: { + old: file.old_path, + new: file.new_path, + }, tempFile: file.new_file, deleted: file.deleted_file, fileHash: file.file_hash, diff --git a/spec/frontend/diffs/store/mutations_spec.js b/spec/frontend/diffs/store/mutations_spec.js index 031e4fe2be24b6143fc11ba1c64f0a3e829b356f..ed8d7397bbc5f5ce7e6418ce7ef4ca703ab0f582 100644 --- a/spec/frontend/diffs/store/mutations_spec.js +++ b/spec/frontend/diffs/store/mutations_spec.js @@ -93,15 +93,20 @@ describe('DiffsStoreMutations', () => { describe('SET_DIFF_DATA_BATCH_DATA', () => { it('should set diff data batch type properly', () => { - const state = { diffFiles: [] }; + const mockFile = getDiffFileMock(); + const state = { + diffFiles: [], + treeEntries: { [mockFile.file_path]: { fileHash: mockFile.file_hash } }, + }; const diffMock = { - diff_files: [getDiffFileMock()], + diff_files: [mockFile], }; mutations[types.SET_DIFF_DATA_BATCH](state, diffMock); expect(state.diffFiles[0].renderIt).toEqual(true); expect(state.diffFiles[0].collapsed).toEqual(false); + expect(state.treeEntries[mockFile.file_path].diffLoaded).toBe(true); }); }); diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js index 68bbbdbe17637a9b9cd5d44fa7fcd71ba6a4e808..4760a8b7166eaf4903d8cc00f570ffdab16124d3 100644 --- a/spec/frontend/diffs/store/utils_spec.js +++ b/spec/frontend/diffs/store/utils_spec.js @@ -936,4 +936,17 @@ describe('DiffsStoreUtils', () => { expect(utils.parseUrlHashAsFileHash(input, currentDiffId)).toBe(resultId); }); }); + + describe('markTreeEntriesLoaded', () => { + it.each` + desc | entries | loaded | outcome + ${'marks an existing entry as loaded'} | ${{ abc: {} }} | ${[{ new_path: 'abc' }]} | ${{ abc: { diffLoaded: true } }} + ${'does nothing if the new file is not found in the tree entries'} | ${{ abc: {} }} | ${[{ new_path: 'def' }]} | ${{ abc: {} }} + ${'leaves entries unmodified if they are not in the loaded files'} | ${{ abc: {}, def: { diffLoaded: true }, ghi: {} }} | ${[{ new_path: 'ghi' }]} | ${{ abc: {}, def: { diffLoaded: true }, ghi: { diffLoaded: true } }} + `('$desc', ({ entries, loaded, outcome }) => { + expect(utils.markTreeEntriesLoaded({ priorEntries: entries, loadedFiles: loaded })).toEqual( + outcome, + ); + }); + }); }); diff --git a/spec/frontend/diffs/utils/tree_worker_utils_spec.js b/spec/frontend/diffs/utils/tree_worker_utils_spec.js index 4df5fe75004f7e21bbe76b038ad7967439a96930..b8bd4fcd0814a63f70ffabe1d57ad1b60328b67c 100644 --- a/spec/frontend/diffs/utils/tree_worker_utils_spec.js +++ b/spec/frontend/diffs/utils/tree_worker_utils_spec.js @@ -75,8 +75,13 @@ describe('~/diffs/utils/tree_worker_utils', () => { { addedLines: 0, changed: true, + diffLoaded: false, deleted: false, fileHash: 'test', + filePaths: { + new: 'app/index.js', + old: undefined, + }, key: 'app/index.js', name: 'index.js', parentPath: 'app/', @@ -97,8 +102,13 @@ describe('~/diffs/utils/tree_worker_utils', () => { { addedLines: 0, changed: true, + diffLoaded: false, deleted: false, fileHash: 'test', + filePaths: { + new: 'app/test/index.js', + old: undefined, + }, key: 'app/test/index.js', name: 'index.js', parentPath: 'app/test/', @@ -112,8 +122,13 @@ describe('~/diffs/utils/tree_worker_utils', () => { { addedLines: 0, changed: true, + diffLoaded: false, deleted: false, fileHash: 'test', + filePaths: { + new: 'app/test/filepathneedstruncating.js', + old: undefined, + }, key: 'app/test/filepathneedstruncating.js', name: 'filepathneedstruncating.js', parentPath: 'app/test/', @@ -138,8 +153,13 @@ describe('~/diffs/utils/tree_worker_utils', () => { { addedLines: 42, changed: true, + diffLoaded: false, deleted: false, fileHash: 'test', + filePaths: { + new: 'constructor/test/aFile.js', + old: undefined, + }, key: 'constructor/test/aFile.js', name: 'aFile.js', parentPath: 'constructor/test/', @@ -160,10 +180,15 @@ describe('~/diffs/utils/tree_worker_utils', () => { name: 'submodule @ abcdef123', type: 'blob', changed: true, + diffLoaded: false, tempFile: true, submodule: true, deleted: false, fileHash: 'test', + filePaths: { + new: 'submodule @ abcdef123', + old: undefined, + }, addedLines: 1, removedLines: 0, tree: [], @@ -175,10 +200,15 @@ describe('~/diffs/utils/tree_worker_utils', () => { name: 'package.json', type: 'blob', changed: true, + diffLoaded: false, tempFile: false, submodule: undefined, deleted: true, fileHash: 'test', + filePaths: { + new: 'package.json', + old: undefined, + }, addedLines: 0, removedLines: 0, tree: [],