Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-12-18 03:10:04 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-12-18 03:10:04 +0300
commit35aeb676e824679d7e1ec8772c668b91b1dbc1bc (patch)
tree392f452d92c8a4bb15ea24322ae6532f45912243 /app/assets/javascripts/diffs
parent43678813e8265b8a00b3039fce155f4c20947a7a (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/diffs')
-rw-r--r--app/assets/javascripts/diffs/components/app.vue14
-rw-r--r--app/assets/javascripts/diffs/components/diff_file.vue5
-rw-r--r--app/assets/javascripts/diffs/index.js7
-rw-r--r--app/assets/javascripts/diffs/store/actions.js14
-rw-r--r--app/assets/javascripts/diffs/store/getters.js5
-rw-r--r--app/assets/javascripts/diffs/store/modules/diff_state.js1
-rw-r--r--app/assets/javascripts/diffs/store/mutation_types.js2
-rw-r--r--app/assets/javascripts/diffs/store/mutations.js5
-rw-r--r--app/assets/javascripts/diffs/utils/file_reviews.js61
-rw-r--r--app/assets/javascripts/diffs/utils/merge_request.js10
10 files changed, 123 insertions, 1 deletions
diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue
index 7827c78b658..1825e118575 100644
--- a/app/assets/javascripts/diffs/components/app.vue
+++ b/app/assets/javascripts/diffs/components/app.vue
@@ -124,6 +124,11 @@ export default {
required: false,
default: false,
},
+ mrReviews: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
},
data() {
const treeWidth =
@@ -161,7 +166,12 @@ export default {
'hasConflicts',
'viewDiffsFileByFile',
]),
- ...mapGetters('diffs', ['whichCollapsedTypes', 'isParallelView', 'currentDiffIndex']),
+ ...mapGetters('diffs', [
+ 'whichCollapsedTypes',
+ 'isParallelView',
+ 'currentDiffIndex',
+ 'fileReviews',
+ ]),
...mapGetters(['isNotesFetched', 'getNoteableData']),
diffs() {
if (!this.viewDiffsFileByFile) {
@@ -261,6 +271,7 @@ export default {
dismissEndpoint: this.dismissEndpoint,
showSuggestPopover: this.showSuggestPopover,
viewDiffsFileByFile: fileByFile(this.fileByFileUserPreference),
+ mrReviews: this.mrReviews || {},
});
if (this.shouldShow) {
@@ -519,6 +530,7 @@ export default {
v-for="(file, index) in diffs"
:key="file.newPath"
:file="file"
+ :reviewed="fileReviews[index]"
:is-first-file="index === 0"
:is-last-file="index === diffs.length - 1"
:help-page-path="helpPagePath"
diff --git a/app/assets/javascripts/diffs/components/diff_file.vue b/app/assets/javascripts/diffs/components/diff_file.vue
index ed94cabe124..343cee7ad83 100644
--- a/app/assets/javascripts/diffs/components/diff_file.vue
+++ b/app/assets/javascripts/diffs/components/diff_file.vue
@@ -37,6 +37,11 @@ export default {
type: Object,
required: true,
},
+ reviewed: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
isFirstFile: {
type: Boolean,
required: false,
diff --git a/app/assets/javascripts/diffs/index.js b/app/assets/javascripts/diffs/index.js
index 587220488be..6cc9cbf750d 100644
--- a/app/assets/javascripts/diffs/index.js
+++ b/app/assets/javascripts/diffs/index.js
@@ -5,6 +5,10 @@ import { parseBoolean } from '~/lib/utils/common_utils';
import FindFile from '~/vue_shared/components/file_finder/index.vue';
import eventHub from '../notes/event_hub';
import diffsApp from './components/app.vue';
+
+import { getDerivedMergeRequestInformation } from './utils/merge_request';
+import { getReviewsForMergeRequest } from './utils/file_reviews';
+
import { TREE_LIST_STORAGE_KEY, DIFF_WHITESPACE_COOKIE_NAME } from './constants';
export default function initDiffsApp(store) {
@@ -102,6 +106,8 @@ export default function initDiffsApp(store) {
...mapActions('diffs', ['setRenderTreeList', 'setShowWhitespace']),
},
render(createElement) {
+ const { mrPath } = getDerivedMergeRequestInformation({ endpoint: this.endpoint });
+
return createElement('diffs-app', {
props: {
endpoint: this.endpoint,
@@ -117,6 +123,7 @@ export default function initDiffsApp(store) {
dismissEndpoint: this.dismissEndpoint,
showSuggestPopover: this.showSuggestPopover,
fileByFileUserPreference: this.viewDiffsFileByFile,
+ mrReviews: getReviewsForMergeRequest(mrPath),
},
});
},
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index 5b410051705..f2d9d86997d 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -50,6 +50,8 @@ import {
} from '../constants';
import { diffViewerModes } from '~/ide/constants';
import { isCollapsed } from '../utils/diff_file';
+import { getDerivedMergeRequestInformation } from '../utils/merge_request';
+import { markFileReview, setReviewsForMergeRequest } from '../utils/file_reviews';
export const setBaseConfig = ({ commit }, options) => {
const {
@@ -61,6 +63,7 @@ export const setBaseConfig = ({ commit }, options) => {
dismissEndpoint,
showSuggestPopover,
viewDiffsFileByFile,
+ mrReviews,
} = options;
commit(types.SET_BASE_CONFIG, {
endpoint,
@@ -71,6 +74,7 @@ export const setBaseConfig = ({ commit }, options) => {
dismissEndpoint,
showSuggestPopover,
viewDiffsFileByFile,
+ mrReviews,
});
};
@@ -741,3 +745,13 @@ export const setFileByFile = ({ commit }, { fileByFile }) => {
mergeUrlParams({ [DIFF_FILE_BY_FILE_COOKIE_NAME]: fileViewMode }, window.location.href),
);
};
+
+export function reviewFile({ commit, state, getters }, { file, reviewed = true }) {
+ const { mrPath } = getDerivedMergeRequestInformation({ endpoint: file.load_collapsed_diff_url });
+ const reviews = setReviewsForMergeRequest(
+ mrPath,
+ markFileReview(getters.fileReviews(state), file, reviewed),
+ );
+
+ commit(types.SET_MR_FILE_REVIEWS, reviews);
+}
diff --git a/app/assets/javascripts/diffs/store/getters.js b/app/assets/javascripts/diffs/store/getters.js
index baf54188932..6afc6f91fec 100644
--- a/app/assets/javascripts/diffs/store/getters.js
+++ b/app/assets/javascripts/diffs/store/getters.js
@@ -1,5 +1,6 @@
import { __, n__ } from '~/locale';
import { parallelizeDiffLines } from './utils';
+import { isFileReviewed } from '../utils/file_reviews';
import {
PARALLEL_DIFF_VIEW_TYPE,
INLINE_DIFF_VIEW_TYPE,
@@ -149,3 +150,7 @@ export const diffLines = state => (file, unifiedDiffComponents) => {
state.diffViewType === INLINE_DIFF_VIEW_TYPE,
);
};
+
+export function fileReviews(state) {
+ return state.diffFiles.map(file => isFileReviewed(state.mrReviews, file));
+}
diff --git a/app/assets/javascripts/diffs/store/modules/diff_state.js b/app/assets/javascripts/diffs/store/modules/diff_state.js
index c331e52c887..2aa971374ec 100644
--- a/app/assets/javascripts/diffs/store/modules/diff_state.js
+++ b/app/assets/javascripts/diffs/store/modules/diff_state.js
@@ -45,4 +45,5 @@ export default () => ({
fileFinderVisible: false,
dismissEndpoint: '',
showSuggestPopover: true,
+ mrReviews: {},
});
diff --git a/app/assets/javascripts/diffs/store/mutation_types.js b/app/assets/javascripts/diffs/store/mutation_types.js
index 30097239aaa..4641731c4b6 100644
--- a/app/assets/javascripts/diffs/store/mutation_types.js
+++ b/app/assets/javascripts/diffs/store/mutation_types.js
@@ -7,6 +7,8 @@ export const SET_DIFF_METADATA = 'SET_DIFF_METADATA';
export const SET_DIFF_DATA_BATCH = 'SET_DIFF_DATA_BATCH';
export const SET_DIFF_FILES = 'SET_DIFF_FILES';
+export const SET_MR_FILE_REVIEWS = 'SET_MR_FILE_REVIEWS';
+
export const SET_DIFF_VIEW_TYPE = 'SET_DIFF_VIEW_TYPE';
export const SET_COVERAGE_DATA = 'SET_COVERAGE_DATA';
export const SET_MERGE_REQUEST_DIFFS = 'SET_MERGE_REQUEST_DIFFS';
diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js
index 19122c3096f..d3827a92426 100644
--- a/app/assets/javascripts/diffs/store/mutations.js
+++ b/app/assets/javascripts/diffs/store/mutations.js
@@ -37,6 +37,7 @@ export default {
dismissEndpoint,
showSuggestPopover,
viewDiffsFileByFile,
+ mrReviews,
} = options;
Object.assign(state, {
endpoint,
@@ -47,6 +48,7 @@ export default {
dismissEndpoint,
showSuggestPopover,
viewDiffsFileByFile,
+ mrReviews,
});
},
@@ -353,4 +355,7 @@ export default {
[types.SET_FILE_BY_FILE](state, fileByFile) {
state.viewDiffsFileByFile = fileByFile;
},
+ [types.SET_MR_FILE_REVIEWS](state, newReviews) {
+ state.mrReviews = newReviews;
+ },
};
diff --git a/app/assets/javascripts/diffs/utils/file_reviews.js b/app/assets/javascripts/diffs/utils/file_reviews.js
new file mode 100644
index 00000000000..0047955643a
--- /dev/null
+++ b/app/assets/javascripts/diffs/utils/file_reviews.js
@@ -0,0 +1,61 @@
+function getFileReviewsKey(mrPath) {
+ return `${mrPath}-file-reviews`;
+}
+
+export function getReviewsForMergeRequest(mrPath) {
+ const reviewsForMr = localStorage.getItem(getFileReviewsKey(mrPath));
+ let reviews = {};
+
+ if (reviewsForMr) {
+ try {
+ reviews = JSON.parse(reviewsForMr);
+ } catch (err) {
+ reviews = {};
+ }
+ }
+
+ return reviews;
+}
+
+export function setReviewsForMergeRequest(mrPath, reviews) {
+ localStorage.setItem(getFileReviewsKey(mrPath), JSON.stringify(reviews));
+
+ return reviews;
+}
+
+export function isFileReviewed(reviews, file) {
+ const fileReviews = reviews[file.file_identifier_hash];
+
+ return file?.id && fileReviews?.length ? new Set(fileReviews).has(file.id) : false;
+}
+
+export function reviewable(file) {
+ return Boolean(file.id) && Boolean(file.file_identifier_hash);
+}
+
+export function markFileReview(reviews, file, reviewed = true) {
+ const usableReviews = { ...(reviews || {}) };
+ let updatedReviews = usableReviews;
+ let fileReviews;
+
+ if (reviewable(file)) {
+ fileReviews = new Set([...(usableReviews[file.file_identifier_hash] || [])]);
+
+ if (reviewed) {
+ fileReviews.add(file.id);
+ } else {
+ fileReviews.delete(file.id);
+ }
+
+ updatedReviews = {
+ ...usableReviews,
+ [file.file_identifier_hash]: Array.from(fileReviews),
+ };
+
+ if (updatedReviews[file.file_identifier_hash].length === 0) {
+ delete updatedReviews[file.file_identifier_hash];
+ }
+ }
+
+ return updatedReviews;
+}
diff --git a/app/assets/javascripts/diffs/utils/merge_request.js b/app/assets/javascripts/diffs/utils/merge_request.js
new file mode 100644
index 00000000000..10e2a4b2cf2
--- /dev/null
+++ b/app/assets/javascripts/diffs/utils/merge_request.js
@@ -0,0 +1,10 @@
+export function getDerivedMergeRequestInformation({ endpoint } = {}) {
+ const mrPath = endpoint
+ ?.split('/')
+ .slice(0, -1)
+ .join('/');
+
+ return {
+ mrPath,
+ };
+}