diff options
Diffstat (limited to 'app/assets/javascripts/diffs/store')
-rw-r--r-- | app/assets/javascripts/diffs/store/actions.js | 57 | ||||
-rw-r--r-- | app/assets/javascripts/diffs/store/getters.js | 21 | ||||
-rw-r--r-- | app/assets/javascripts/diffs/store/mutation_types.js | 1 | ||||
-rw-r--r-- | app/assets/javascripts/diffs/store/mutations.js | 52 | ||||
-rw-r--r-- | app/assets/javascripts/diffs/store/utils.js | 8 |
5 files changed, 94 insertions, 45 deletions
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js index 966b706fc31..91c4c51487f 100644 --- a/app/assets/javascripts/diffs/store/actions.js +++ b/app/assets/javascripts/diffs/store/actions.js @@ -8,7 +8,8 @@ import { __, s__ } from '~/locale'; import { handleLocationHash, historyPushState, scrollToElement } from '~/lib/utils/common_utils'; import { mergeUrlParams, getLocationHash } from '~/lib/utils/url_utility'; import TreeWorker from '../workers/tree_worker'; -import eventHub from '../../notes/event_hub'; +import notesEventHub from '../../notes/event_hub'; +import eventHub from '../event_hub'; import { getDiffPositionByLineCode, getNoteFormData, @@ -40,8 +41,14 @@ import { DIFF_WHITESPACE_COOKIE_NAME, SHOW_WHITESPACE, NO_SHOW_WHITESPACE, + DIFF_FILE_MANUAL_COLLAPSE, + DIFF_FILE_AUTOMATIC_COLLAPSE, + EVT_PERF_MARK_FILE_TREE_START, + EVT_PERF_MARK_FILE_TREE_END, + EVT_PERF_MARK_DIFF_FILES_START, } from '../constants'; import { diffViewerModes } from '~/ide/constants'; +import { isCollapsed } from '../diff_file'; export const setBaseConfig = ({ commit }, options) => { const { @@ -75,6 +82,7 @@ export const fetchDiffFilesBatch = ({ commit, state, dispatch }) => { commit(types.SET_BATCH_LOADING, true); commit(types.SET_RETRIEVING_BATCHES, true); + eventHub.$emit(EVT_PERF_MARK_DIFF_FILES_START); const getBatch = (page = 1) => axios @@ -136,9 +144,11 @@ export const fetchDiffFilesMeta = ({ commit, state }) => { }; commit(types.SET_LOADING, true); + eventHub.$emit(EVT_PERF_MARK_FILE_TREE_START); worker.addEventListener('message', ({ data }) => { commit(types.SET_TREE_DATA, data); + eventHub.$emit(EVT_PERF_MARK_FILE_TREE_END); worker.terminate(); }); @@ -212,7 +222,7 @@ export const assignDiscussionsToDiff = ( } Vue.nextTick(() => { - eventHub.$emit('scrollToDiscussion'); + notesEventHub.$emit('scrollToDiscussion'); }); }; @@ -237,10 +247,17 @@ export const renderFileForDiscussionId = ({ commit, rootState, state }, discussi } if (file.viewer.automaticallyCollapsed) { - eventHub.$emit(`loadCollapsedDiff/${file.file_hash}`); + notesEventHub.$emit(`loadCollapsedDiff/${file.file_hash}`); scrollToElement(document.getElementById(file.file_hash)); + } else if (file.viewer.manuallyCollapsed) { + commit(types.SET_FILE_COLLAPSED, { + filePath: file.file_path, + collapsed: false, + trigger: DIFF_FILE_AUTOMATIC_COLLAPSE, + }); + notesEventHub.$emit('scrollToDiscussion'); } else { - eventHub.$emit('scrollToDiscussion'); + notesEventHub.$emit('scrollToDiscussion'); } } } @@ -252,8 +269,7 @@ export const startRenderDiffsQueue = ({ state, commit }) => { const nextFile = state.diffFiles.find( file => !file.renderIt && - (file.viewer && - (!file.viewer.automaticallyCollapsed || file.viewer.name !== diffViewerModes.text)), + (file.viewer && (!isCollapsed(file) || file.viewer.name !== diffViewerModes.text)), ); if (nextFile) { @@ -355,10 +371,6 @@ export const loadCollapsedDiff = ({ commit, getters, state }, file) => }); }); -export const expandAllFiles = ({ commit }) => { - commit(types.EXPAND_ALL_FILES); -}; - /** * Toggles the file discussions after user clicked on the toggle discussions button. * @@ -480,7 +492,7 @@ export const setShowWhitespace = ({ commit }, { showWhitespace, pushState = fals historyPushState(mergeUrlParams({ w }, window.location.href)); } - eventHub.$emit('refetchDiffData'); + notesEventHub.$emit('refetchDiffData'); }; export const toggleFileFinder = ({ commit }, visible) => { @@ -531,15 +543,20 @@ export const setExpandedDiffLines = ({ commit, state }, { file, data }) => { }), }), }; + const unifiedDiffLinesEnabled = window.gon?.features?.unifiedDiffLines; const currentDiffLinesKey = - state.diffViewType === INLINE_DIFF_VIEW_TYPE ? INLINE_DIFF_LINES_KEY : PARALLEL_DIFF_LINES_KEY; + state.diffViewType === INLINE_DIFF_VIEW_TYPE || unifiedDiffLinesEnabled + ? INLINE_DIFF_LINES_KEY + : PARALLEL_DIFF_LINES_KEY; const hiddenDiffLinesKey = state.diffViewType === INLINE_DIFF_VIEW_TYPE ? PARALLEL_DIFF_LINES_KEY : INLINE_DIFF_LINES_KEY; - commit(types.SET_HIDDEN_VIEW_DIFF_FILE_LINES, { - filePath: file.file_path, - lines: expandedDiffLines[hiddenDiffLinesKey], - }); + if (!unifiedDiffLinesEnabled) { + commit(types.SET_HIDDEN_VIEW_DIFF_FILE_LINES, { + filePath: file.file_path, + lines: expandedDiffLines[hiddenDiffLinesKey], + }); + } if (expandedDiffLines[currentDiffLinesKey].length > MAX_RENDERING_DIFF_LINES) { let index = START_RENDERING_INDEX; @@ -621,7 +638,7 @@ export function switchToFullDiffFromRenamedFile({ commit, dispatch, state }, { d .then(({ data }) => { const lines = data.map((line, index) => prepareLineForRenamedFile({ - diffViewType: state.diffViewType, + diffViewType: window.gon?.features?.unifiedDiffLines ? 'inline' : state.diffViewType, line, diffFile, index, @@ -633,6 +650,7 @@ export function switchToFullDiffFromRenamedFile({ commit, dispatch, state }, { d viewer: { ...diffFile.alternate_viewer, automaticallyCollapsed: false, + manuallyCollapsed: false, }, }); commit(types.SET_CURRENT_VIEW_DIFF_FILE_LINES, { filePath: diffFile.file_path, lines }); @@ -641,8 +659,9 @@ export function switchToFullDiffFromRenamedFile({ commit, dispatch, state }, { d }); } -export const setFileCollapsed = ({ commit }, { filePath, collapsed }) => - commit(types.SET_FILE_COLLAPSED, { filePath, collapsed }); +export const setFileCollapsedByUser = ({ commit }, { filePath, collapsed }) => { + commit(types.SET_FILE_COLLAPSED, { filePath, collapsed, trigger: DIFF_FILE_MANUAL_COLLAPSE }); +}; export const setSuggestPopoverDismissed = ({ commit, state }) => axios diff --git a/app/assets/javascripts/diffs/store/getters.js b/app/assets/javascripts/diffs/store/getters.js index 91425c7825b..9ee73998177 100644 --- a/app/assets/javascripts/diffs/store/getters.js +++ b/app/assets/javascripts/diffs/store/getters.js @@ -8,8 +8,16 @@ export const isParallelView = state => state.diffViewType === PARALLEL_DIFF_VIEW export const isInlineView = state => state.diffViewType === INLINE_DIFF_VIEW_TYPE; -export const hasCollapsedFile = state => - state.diffFiles.some(file => file.viewer && file.viewer.automaticallyCollapsed); +export const whichCollapsedTypes = state => { + const automatic = state.diffFiles.some(file => file.viewer?.automaticallyCollapsed); + const manual = state.diffFiles.some(file => file.viewer?.manuallyCollapsed); + + return { + any: automatic || manual, + automatic, + manual, + }; +}; export const commitId = state => (state.commit && state.commit.id ? state.commit.id : null); @@ -157,10 +165,13 @@ export const fileLineCoverage = state => (file, line) => { export const currentDiffIndex = state => Math.max(0, state.diffFiles.findIndex(diff => diff.file_hash === state.currentDiffFileId)); -export const diffLines = state => file => { - if (state.diffViewType === INLINE_DIFF_VIEW_TYPE) { +export const diffLines = state => (file, unifiedDiffComponents) => { + if (!unifiedDiffComponents && state.diffViewType === INLINE_DIFF_VIEW_TYPE) { return null; } - return parallelizeDiffLines(file.highlighted_diff_lines || []); + return parallelizeDiffLines( + file.highlighted_diff_lines || [], + state.diffViewType === INLINE_DIFF_VIEW_TYPE, + ); }; diff --git a/app/assets/javascripts/diffs/store/mutation_types.js b/app/assets/javascripts/diffs/store/mutation_types.js index 5dba2e9d10d..19a9e65edc9 100644 --- a/app/assets/javascripts/diffs/store/mutation_types.js +++ b/app/assets/javascripts/diffs/store/mutation_types.js @@ -13,7 +13,6 @@ export const SET_MERGE_REQUEST_DIFFS = 'SET_MERGE_REQUEST_DIFFS'; export const TOGGLE_LINE_HAS_FORM = 'TOGGLE_LINE_HAS_FORM'; export const ADD_CONTEXT_LINES = 'ADD_CONTEXT_LINES'; export const ADD_COLLAPSED_DIFFS = 'ADD_COLLAPSED_DIFFS'; -export const EXPAND_ALL_FILES = 'EXPAND_ALL_FILES'; export const RENDER_FILE = 'RENDER_FILE'; export const SET_LINE_DISCUSSIONS_FOR_FILE = 'SET_LINE_DISCUSSIONS_FOR_FILE'; export const REMOVE_LINE_DISCUSSIONS_FOR_FILE = 'REMOVE_LINE_DISCUSSIONS_FOR_FILE'; diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js index 13ecf6a997d..096c4f69439 100644 --- a/app/assets/javascripts/diffs/store/mutations.js +++ b/app/assets/javascripts/diffs/store/mutations.js @@ -1,6 +1,10 @@ import Vue from 'vue'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; -import { INLINE_DIFF_VIEW_TYPE } from '../constants'; +import { + DIFF_FILE_MANUAL_COLLAPSE, + DIFF_FILE_AUTOMATIC_COLLAPSE, + INLINE_DIFF_VIEW_TYPE, +} from '../constants'; import { findDiffFile, addLineReferences, @@ -16,6 +20,12 @@ function updateDiffFilesInState(state, files) { return Object.assign(state, { diffFiles: files }); } +function renderFile(file) { + Object.assign(file, { + renderIt: true, + }); +} + export default { [types.SET_BASE_CONFIG](state, options) { const { @@ -81,9 +91,7 @@ export default { }, [types.RENDER_FILE](state, file) { - Object.assign(file, { - renderIt: true, - }); + renderFile(file); }, [types.SET_MERGE_REQUEST_DIFFS](state, mergeRequestDiffs) { @@ -168,16 +176,6 @@ export default { Object.assign(selectedFile, { ...newFileData }); }, - [types.EXPAND_ALL_FILES](state) { - state.diffFiles.forEach(file => { - Object.assign(file, { - viewer: Object.assign(file.viewer, { - automaticallyCollapsed: false, - }), - }); - }); - }, - [types.SET_LINE_DISCUSSIONS_FOR_FILE](state, { discussion, diffPositionByLineCode, hash }) { const { latestDiff } = state; @@ -351,11 +349,24 @@ export default { file.isShowingFullFile = true; file.isLoadingFullFile = false; }, - [types.SET_FILE_COLLAPSED](state, { filePath, collapsed }) { + [types.SET_FILE_COLLAPSED]( + state, + { filePath, collapsed, trigger = DIFF_FILE_AUTOMATIC_COLLAPSE }, + ) { const file = state.diffFiles.find(f => f.file_path === filePath); if (file && file.viewer) { - file.viewer.automaticallyCollapsed = collapsed; + if (trigger === DIFF_FILE_MANUAL_COLLAPSE) { + file.viewer.automaticallyCollapsed = false; + file.viewer.manuallyCollapsed = collapsed; + } else if (trigger === DIFF_FILE_AUTOMATIC_COLLAPSE) { + file.viewer.automaticallyCollapsed = collapsed; + file.viewer.manuallyCollapsed = null; + } + } + + if (file && !collapsed) { + renderFile(file); } }, [types.SET_HIDDEN_VIEW_DIFF_FILE_LINES](state, { filePath, lines }) { @@ -367,8 +378,13 @@ export default { }, [types.SET_CURRENT_VIEW_DIFF_FILE_LINES](state, { filePath, lines }) { const file = state.diffFiles.find(f => f.file_path === filePath); - const currentDiffLinesKey = - state.diffViewType === 'inline' ? 'highlighted_diff_lines' : 'parallel_diff_lines'; + let currentDiffLinesKey; + + if (window.gon?.features?.unifiedDiffLines || state.diffViewType === 'inline') { + currentDiffLinesKey = 'highlighted_diff_lines'; + } else { + currentDiffLinesKey = 'parallel_diff_lines'; + } file[currentDiffLinesKey] = lines; }, diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js index 69330ffae2f..f87f57c32c3 100644 --- a/app/assets/javascripts/diffs/store/utils.js +++ b/app/assets/javascripts/diffs/store/utils.js @@ -36,9 +36,12 @@ export const isMeta = line => ['match', 'new-nonewline', 'old-nonewline'].includ * * @param {Object[]} diffLines - inline diff lines * + * @param {Boolean} inline - is inline context or not + * * @returns {Object[]} parallel lines */ -export const parallelizeDiffLines = (diffLines = []) => { + +export const parallelizeDiffLines = (diffLines, inline) => { let freeRightIndex = null; const lines = []; @@ -57,7 +60,7 @@ export const parallelizeDiffLines = (diffLines = []) => { } index += 1; } else if (isAdded(line)) { - if (freeRightIndex !== null) { + if (freeRightIndex !== null && !inline) { // If an old line came before this without a line on the right, this // line can be put to the right of it. lines[freeRightIndex].right = line; @@ -664,6 +667,7 @@ export const generateTreeList = files => { addedLines: file.added_lines, removedLines: file.removed_lines, parentPath: parent ? `${parent.path}/` : '/', + submodule: file.submodule, }); } else { Object.assign(entry, { |