diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js index 3c7a3628a02bfe4fec95963ed4d19787c620166d..1c0e20183e2334cb9a1b99421da2e4eeec3df171 100644 --- a/app/assets/javascripts/diffs/store/actions.js +++ b/app/assets/javascripts/diffs/store/actions.js @@ -15,6 +15,7 @@ import notesEventHub from '~/notes/event_hub'; import { generateTreeList } from '~/diffs/utils/tree_worker_utils'; import { sortTree } from '~/ide/stores/utils'; import { containsSensitiveToken, confirmSensitiveAction } from '~/lib/utils/secret_detection'; +import { isCollapsed } from '~/diffs/utils/diff_file'; import { PARALLEL_DIFF_VIEW_TYPE, INLINE_DIFF_VIEW_TYPE, @@ -73,6 +74,7 @@ import { prepareLineForRenamedFile, parseUrlHashAsFileHash, isUrlHashNoteLink, + findDiffFile, } from './utils'; export const setBaseConfig = ({ commit }, options) => { @@ -1041,8 +1043,15 @@ export function reviewFile({ commit, state }, { file, reviewed = true }) { export const disableVirtualScroller = ({ commit }) => commit(types.DISABLE_VIRTUAL_SCROLLING); -export const toggleFileCommentForm = ({ commit }, filePath) => - commit(types.TOGGLE_FILE_COMMENT_FORM, filePath); +export const toggleFileCommentForm = ({ state, commit }, filePath) => { + const file = findDiffFile(state.diffFiles, filePath, 'file_path'); + if (isCollapsed(file)) { + commit(types.SET_FILE_COMMENT_FORM, { filePath, expanded: true }); + } else { + commit(types.TOGGLE_FILE_COMMENT_FORM, filePath); + } + commit(types.SET_FILE_COLLAPSED, { filePath, collapsed: false }); +}; export const addDraftToFile = ({ commit }, { filePath, draft }) => commit(types.ADD_DRAFT_TO_FILE, { filePath, draft }); diff --git a/app/assets/javascripts/diffs/store/mutation_types.js b/app/assets/javascripts/diffs/store/mutation_types.js index c2177bacbcc717a974445ff3a4dfa977552c0059..b155804c70cf6e9dfdb13d1aa7fa96e906051139 100644 --- a/app/assets/javascripts/diffs/store/mutation_types.js +++ b/app/assets/javascripts/diffs/store/mutation_types.js @@ -53,4 +53,5 @@ export const TOGGLE_LINE_DISCUSSIONS = 'TOGGLE_LINE_DISCUSSIONS'; export const DISABLE_VIRTUAL_SCROLLING = 'DISABLE_VIRTUAL_SCROLLING'; export const TOGGLE_FILE_COMMENT_FORM = 'TOGGLE_FILE_COMMENT_FORM'; +export const SET_FILE_COMMENT_FORM = 'SET_FILE_COMMENT_FORM'; export const ADD_DRAFT_TO_FILE = 'ADD_DRAFT_TO_FILE'; diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js index 08c195469e3d174771a6ed6bcb65e7f1c645cbff..bc5ed3c40dfe23a689d61f0e6d1f0c5602e31231 100644 --- a/app/assets/javascripts/diffs/store/mutations.js +++ b/app/assets/javascripts/diffs/store/mutations.js @@ -394,6 +394,11 @@ export default { file.hasCommentForm = !file.hasCommentForm; }, + [types.SET_FILE_COMMENT_FORM](state, { filePath, expanded }) { + const file = findDiffFile(state.diffFiles, filePath, 'file_path'); + + file.hasCommentForm = expanded; + }, [types.ADD_DRAFT_TO_FILE](state, { filePath, draft }) { const file = findDiffFile(state.diffFiles, filePath, 'file_path'); diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js index 88c03cbaece87431ec2eef9acf2b854c4694ccac..be3b30e8e7a9bc571fd44891e9e74ac4e5e885f3 100644 --- a/spec/frontend/diffs/store/actions_spec.js +++ b/spec/frontend/diffs/store/actions_spec.js @@ -2062,11 +2062,48 @@ describe('DiffsStoreActions', () => { describe('toggleFileCommentForm', () => { it('commits TOGGLE_FILE_COMMENT_FORM', () => { + const file = getDiffFileMock(); return testAction( diffActions.toggleFileCommentForm, - 'path', - {}, - [{ type: types.TOGGLE_FILE_COMMENT_FORM, payload: 'path' }], + file.file_path, + { + diffFiles: [file], + }, + [ + { type: types.TOGGLE_FILE_COMMENT_FORM, payload: file.file_path }, + { + type: types.SET_FILE_COLLAPSED, + payload: { filePath: file.file_path, collapsed: false }, + }, + ], + [], + ); + }); + + it('always opens if file is collapsed', () => { + const file = { + ...getDiffFileMock(), + viewer: { + ...getDiffFileMock().viewer, + manuallyCollapsed: true, + }, + }; + return testAction( + diffActions.toggleFileCommentForm, + file.file_path, + { + diffFiles: [file], + }, + [ + { + type: types.SET_FILE_COMMENT_FORM, + payload: { filePath: file.file_path, expanded: true }, + }, + { + type: types.SET_FILE_COLLAPSED, + payload: { filePath: file.file_path, collapsed: false }, + }, + ], [], ); }); diff --git a/spec/frontend/diffs/store/mutations_spec.js b/spec/frontend/diffs/store/mutations_spec.js index fdcf7c3eeab8aec8edbd7886f9b712e1ba2ae075..a5be41aa69f49f3c7eaaf9d3d6d13d5213b60475 100644 --- a/spec/frontend/diffs/store/mutations_spec.js +++ b/spec/frontend/diffs/store/mutations_spec.js @@ -1045,6 +1045,17 @@ describe('DiffsStoreMutations', () => { }); }); + describe('SET_FILE_COMMENT_FORM', () => { + it('toggles diff files hasCommentForm', () => { + const state = { diffFiles: [{ file_path: 'path', hasCommentForm: false }] }; + const expanded = true; + + mutations[types.SET_FILE_COMMENT_FORM](state, { filePath: 'path', expanded }); + + expect(state.diffFiles[0].hasCommentForm).toEqual(expanded); + }); + }); + describe('ADD_DRAFT_TO_FILE', () => { it('adds draft to diff file', () => { const state = { diffFiles: [{ file_path: 'path', drafts: [] }] };