diff options
author | Phil Hughes <me@iamphill.com> | 2018-10-19 14:09:16 +0100 |
---|---|---|
committer | Phil Hughes <me@iamphill.com> | 2018-10-24 13:30:30 +0100 |
commit | 80a689fab83861aa412a14983411710c3f04fb15 (patch) | |
tree | eb98af8f02ac4c003adbb28e56bfb4e6dafebe1f /app/assets/javascripts/diffs/store | |
parent | 0baa0c4b14073e1fced374ecf8a2d76d01efd729 (diff) | |
download | gitlab-ce-80a689fab83861aa412a14983411710c3f04fb15.tar.gz |
Impove diff discussion datamr-diff-data
Pre-request to https://gitlab.com/gitlab-org/gitlab-ce/issues/48956
Diffstat (limited to 'app/assets/javascripts/diffs/store')
-rw-r--r-- | app/assets/javascripts/diffs/store/actions.js | 42 | ||||
-rw-r--r-- | app/assets/javascripts/diffs/store/mutations.js | 73 |
2 files changed, 62 insertions, 53 deletions
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js index 1e0b27b538d..e79351454ab 100644 --- a/app/assets/javascripts/diffs/store/actions.js +++ b/app/assets/javascripts/diffs/store/actions.js @@ -5,7 +5,6 @@ import createFlash from '~/flash'; import { s__ } from '~/locale'; import { handleLocationHash, historyPushState } from '~/lib/utils/common_utils'; import { mergeUrlParams, getLocationHash } from '~/lib/utils/url_utility'; -import { reduceDiscussionsToLineCodes } from '../../notes/stores/utils'; import { getDiffPositionByLineCode, getNoteFormData } from './utils'; import * as types from './mutation_types'; import { @@ -36,18 +35,33 @@ export const fetchDiffFiles = ({ state, commit }) => { // This is adding line discussions to the actual lines in the diff tree // once for parallel and once for inline mode -export const assignDiscussionsToDiff = ({ state, commit }, allLineDiscussions) => { +export const assignDiscussionsToDiff = ( + { commit, state, rootState }, + discussionsToAssign = rootState.notes.discussions, +) => { const diffPositionByLineCode = getDiffPositionByLineCode(state.diffFiles); - - Object.values(allLineDiscussions).forEach(discussions => { - if (discussions.length > 0) { - const { fileHash } = discussions[0]; - commit(types.SET_LINE_DISCUSSIONS_FOR_FILE, { - fileHash, - discussions, - diffPositionByLineCode, - }); - } + const discussionsByDiffFile = discussionsToAssign + .filter(discussion => discussion.diff_discussion) + .reduce((acc, discussion) => { + const discussions = ( + acc[discussion.diff_file.file_hash] || { discussions: [] } + ).discussions.concat(discussion); + + return { + ...acc, + [discussion.diff_file.file_hash]: { + diffFile: state.diffFiles.find(file => file.fileHash === discussion.diff_file.file_hash), + discussions, + }, + }; + }, {}); + + Object.values(discussionsByDiffFile).forEach(({ discussions, diffFile }) => { + commit(types.SET_LINE_DISCUSSIONS_FOR_FILE, { + diffFile, + discussions, + diffPositionByLineCode, + }); }); }; @@ -190,9 +204,7 @@ export const saveDiffDiscussion = ({ dispatch }, { note, formData }) => { return dispatch('saveNote', postData, { root: true }) .then(result => dispatch('updateDiscussion', result.discussion, { root: true })) - .then(discussion => - dispatch('assignDiscussionsToDiff', reduceDiscussionsToLineCodes([discussion])), - ) + .then(discussion => dispatch('assignDiscussionsToDiff', [discussion])) .catch(() => createFlash(s__('MergeRequests|Saving the comment failed'))); }; diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js index 0b4485ecdb5..6a57a075579 100644 --- a/app/assets/javascripts/diffs/store/mutations.js +++ b/app/assets/javascripts/diffs/store/mutations.js @@ -90,53 +90,50 @@ export default { })); }, - [types.SET_LINE_DISCUSSIONS_FOR_FILE](state, { fileHash, discussions, diffPositionByLineCode }) { - const selectedFile = state.diffFiles.find(f => f.fileHash === fileHash); - const firstDiscussion = discussions[0]; - const isDiffDiscussion = firstDiscussion.diff_discussion; - const hasLineCode = firstDiscussion.line_code; - const diffPosition = diffPositionByLineCode[firstDiscussion.line_code]; - - if ( - selectedFile && - isDiffDiscussion && - hasLineCode && - diffPosition && - isDiscussionApplicableToLine({ - discussion: firstDiscussion, - diffPosition, - latestDiff: state.latestDiff, - }) - ) { - const targetLine = selectedFile.parallelDiffLines.find( - line => - (line.left && line.left.lineCode === firstDiscussion.line_code) || - (line.right && line.right.lineCode === firstDiscussion.line_code), - ); - if (targetLine) { - if (targetLine.left && targetLine.left.lineCode === firstDiscussion.line_code) { - Object.assign(targetLine.left, { - discussions, - }); - } else { - Object.assign(targetLine.right, { - discussions, + [types.SET_LINE_DISCUSSIONS_FOR_FILE](state, { diffFile, discussions, diffPositionByLineCode }) { + const { latestDiff } = state; + + discussions.forEach(discussion => { + const discussionLineCode = discussion.line_code; + const lineCheck = ({ lineCode }) => + lineCode === discussionLineCode && + isDiscussionApplicableToLine({ + discussion, + diffPosition: diffPositionByLineCode[lineCode], + latestDiff, + }); + + if (diffFile.highlightedDiffLines) { + const line = diffFile.highlightedDiffLines.find(lineCheck); + + if (line) { + Object.assign(line, { + discussions: line.discussions.concat(discussion), }); } } - if (selectedFile.highlightedDiffLines) { - const targetInlineLine = selectedFile.highlightedDiffLines.find( - line => line.lineCode === firstDiscussion.line_code, + if (diffFile.parallelDiffLines) { + const { left, right } = diffFile.parallelDiffLines.find( + parallelLine => + (parallelLine.left && lineCheck(parallelLine.left)) || + (parallelLine.right && lineCheck(parallelLine.right)), ); + const line = left && left.lineCode === discussionLineCode ? left : right; - if (targetInlineLine) { - Object.assign(targetInlineLine, { - discussions, + if (line) { + Object.assign(line, { + discussions: line.discussions.concat(discussion), }); } } - } + + if (!diffFile.parallelDiffLines || !diffFile.highlightedDiffLines) { + Object.assign(diffFile, { + discussions: diffFile.discussions.concat(discussion), + }); + } + }); }, [types.REMOVE_LINE_DISCUSSIONS_FOR_FILE](state, { fileHash, lineCode }) { |