From 937abb6fb8affeb3acf2172e489f0b2a36f02c5c Mon Sep 17 00:00:00 2001 From: Stanislav Lashmanov Date: Tue, 5 Dec 2023 02:54:07 +0400 Subject: [PATCH] Add pinned file to merge requests --- .../javascripts/diffs/components/app.vue | 30 +++- .../diffs/components/diff_file.vue | 15 +- .../diffs/components/diff_file_header.vue | 34 +++- .../javascripts/diffs/components/diff_row.vue | 6 +- .../diffs/components/diff_row_utils.js | 18 +- .../diffs/components/tree_list.vue | 54 +++++- app/assets/javascripts/diffs/index.js | 1 + app/assets/javascripts/diffs/store/actions.js | 77 +++++++-- app/assets/javascripts/diffs/store/getters.js | 15 ++ .../diffs/store/modules/diff_state.js | 1 + .../javascripts/diffs/store/mutation_types.js | 2 + .../javascripts/diffs/store/mutations.js | 21 ++- app/assets/javascripts/diffs/store/utils.js | 28 ++- .../vue_shared/components/file_row.vue | 4 +- app/assets/stylesheets/framework/diffs.scss | 9 + .../projects/merge_requests_controller.rb | 10 ++ app/helpers/merge_requests_helper.rb | 3 +- .../projects/merge_requests/_page.html.haml | 1 + .../feature_flags/development/pinned_file.yml | 8 + locale/gitlab.pot | 6 + .../merge_requests_controller_spec.rb | 18 ++ .../__snapshots__/tree_list_spec.js.snap | 160 ++++++++++++++++++ spec/frontend/diffs/components/app_spec.js | 39 ++++- .../diffs/components/diff_file_header_spec.js | 27 ++- .../diffs/components/diff_file_spec.js | 146 ++++++++-------- .../diffs/components/diff_row_utils_spec.js | 39 ++++- .../diffs/components/tree_list_spec.js | 103 ++++++++++- spec/frontend/diffs/store/actions_spec.js | 124 +++++++++++--- spec/frontend/diffs/store/getters_spec.js | 32 ++++ spec/frontend/diffs/store/mutations_spec.js | 57 ++++++- spec/frontend/diffs/store/utils_spec.js | 11 ++ .../vue_shared/components/file_row_spec.js | 13 ++ 32 files changed, 947 insertions(+), 165 deletions(-) create mode 100644 config/feature_flags/development/pinned_file.yml create mode 100644 spec/frontend/diffs/components/__snapshots__/tree_list_spec.js.snap diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue index 00fd9f43a4fb56..698fd3909edb51 100644 --- a/app/assets/javascripts/diffs/components/app.vue +++ b/app/assets/javascripts/diffs/components/app.vue @@ -144,6 +144,11 @@ export default { required: false, default: '', }, + pinnedFileUrl: { + type: String, + required: false, + default: '', + }, }, data() { return { @@ -153,6 +158,7 @@ export default { autoScrolled: false, activeProject: undefined, hasScannerError: false, + pinnedFileStatus: '', }; }, apollo: { @@ -215,7 +221,6 @@ export default { ...mapState('findingsDrawer', ['activeDrawer']), ...mapState('diffs', [ 'isLoading', - 'diffFiles', 'diffViewType', 'commit', 'renderOverflowWarning', @@ -245,6 +250,7 @@ export default { 'isBatchLoading', 'isBatchLoadingError', 'flatBlobsList', + 'diffFiles', ]), ...mapGetters(['isNotesFetched', 'getNoteableData']), ...mapGetters('findingsDrawer', ['activeDrawer']), @@ -355,7 +361,7 @@ export default { const id = window?.location?.hash; if (id && id.indexOf('#note') !== 0) { - this.setHighlightedRow(id.split('diff-content').pop().slice(1)); + this.setHighlightedRow({ lineCode: id.split('diff-content').pop().slice(1) }); } const events = []; @@ -438,6 +444,7 @@ export default { 'setFileByFile', 'disableVirtualScroller', 'setGenerateTestFilePath', + 'fetchPinnedFile', ]), ...mapActions('findingsDrawer', ['setDrawer']), closeDrawer() { @@ -509,6 +516,20 @@ export default { return !this.diffFiles.length; }, fetchData({ toggleTree = true, fetchMeta = true } = {}) { + if (this.pinnedFileUrl && this.pinnedFileStatus !== 'loaded') { + this.pinnedFileStatus = 'loading'; + this.fetchPinnedFile(this.pinnedFileUrl) + .then(() => { + this.pinnedFileStatus = 'loaded'; + if (toggleTree) this.setTreeDisplay(); + }) + .catch(() => { + this.pinnedFileStatus = 'error'; + createAlert({ + message: __("Couldn't fetch the pinned file."), + }); + }); + } if (fetchMeta) { this.fetchDiffFilesMeta() .then((data) => { @@ -539,7 +560,7 @@ export default { } if (!this.viewDiffsFileByFile) { - this.fetchDiffFilesBatch() + this.fetchDiffFilesBatch(Boolean(this.pinnedFileUrl)) .then(() => { if (toggleTree) this.setTreeDisplay(); // Guarantee the discussions are assigned after the batch finishes. @@ -724,6 +745,9 @@ export default {