gitlab-org--gitlab-foss/app/assets/javascripts/diffs/components/app.vue

234 lines
6.6 KiB
Vue
Raw Normal View History

2018-06-21 08:22:40 -04:00
<script>
import { mapState, mapGetters, mapActions } from 'vuex';
import Icon from '~/vue_shared/components/icon.vue';
import { __ } from '~/locale';
import createFlash from '~/flash';
2018-11-16 14:29:11 -05:00
import { GlLoadingIcon } from '@gitlab/ui';
import eventHub from '../../notes/event_hub';
2018-06-21 08:22:40 -04:00
import CompareVersions from './compare_versions.vue';
import DiffFile from './diff_file.vue';
import NoChanges from './no_changes.vue';
import HiddenFilesWarning from './hidden_files_warning.vue';
import CommitWidget from './commit_widget.vue';
import TreeList from './tree_list.vue';
2018-06-21 08:22:40 -04:00
export default {
name: 'DiffsApp',
components: {
Icon,
CompareVersions,
DiffFile,
NoChanges,
HiddenFilesWarning,
CommitWidget,
TreeList,
GlLoadingIcon,
2018-06-21 08:22:40 -04:00
},
props: {
endpoint: {
type: String,
required: true,
},
projectPath: {
type: String,
required: true,
},
2018-06-21 08:22:40 -04:00
shouldShow: {
type: Boolean,
required: false,
default: false,
},
currentUser: {
type: Object,
required: true,
},
},
data() {
return {
assignedDiscussions: false,
};
},
2018-06-21 08:22:40 -04:00
computed: {
...mapState({
isLoading: state => state.diffs.isLoading,
diffFiles: state => state.diffs.diffFiles,
diffViewType: state => state.diffs.diffViewType,
mergeRequestDiffs: state => state.diffs.mergeRequestDiffs,
mergeRequestDiff: state => state.diffs.mergeRequestDiff,
latestVersionPath: state => state.diffs.latestVersionPath,
startVersion: state => state.diffs.startVersion,
commit: state => state.diffs.commit,
targetBranchName: state => state.diffs.targetBranchName,
renderOverflowWarning: state => state.diffs.renderOverflowWarning,
numTotalFiles: state => state.diffs.realSize,
numVisibleFiles: state => state.diffs.size,
plainDiffPath: state => state.diffs.plainDiffPath,
emailPatchPath: state => state.diffs.emailPatchPath,
}),
...mapState('diffs', ['showTreeList', 'isLoading']),
...mapGetters('diffs', ['isParallelView']),
...mapGetters(['isNotesFetched', 'getNoteableData']),
2018-06-21 08:22:40 -04:00
targetBranch() {
return {
branchName: this.targetBranchName,
versionIndex: -1,
path: '',
};
},
notAllCommentsDisplayed() {
if (this.commit) {
return __('Only comments from the following commit are shown below');
} else if (this.startVersion) {
return __(
"Not all comments are displayed because you're comparing two versions of the diff.",
);
}
return __(
"Not all comments are displayed because you're viewing an old version of the diff.",
);
},
showLatestVersion() {
if (this.commit) {
return __('Show latest version of the diff');
}
return __('Show latest version');
},
canCurrentUserFork() {
return this.currentUser.can_fork === true && this.currentUser.can_create_merge_request;
},
showCompareVersions() {
return this.mergeRequestDiffs && this.mergeRequestDiff;
},
2018-06-21 08:22:40 -04:00
},
watch: {
diffViewType() {
this.adjustView();
},
shouldShow() {
// When the shouldShow property changed to true, the route is rendered for the first time
// and if we have the isLoading as true this means we didn't fetch the data
if (this.isLoading) {
this.fetchData();
}
2018-06-21 08:22:40 -04:00
this.adjustView();
},
isLoading: 'adjustView',
showTreeList: 'adjustView',
2018-06-21 08:22:40 -04:00
},
mounted() {
this.setBaseConfig({ endpoint: this.endpoint, projectPath: this.projectPath });
if (this.shouldShow) {
this.fetchData();
}
2018-06-21 08:22:40 -04:00
},
created() {
this.adjustView();
eventHub.$once('fetchedNotesData', this.setDiscussions);
2018-06-21 08:22:40 -04:00
},
methods: {
...mapActions(['startTaskList']),
2018-08-13 04:47:54 -04:00
...mapActions('diffs', [
'setBaseConfig',
'fetchDiffFiles',
'startRenderDiffsQueue',
'assignDiscussionsToDiff',
]),
fetchData() {
2018-08-07 05:14:00 -04:00
this.fetchDiffFiles()
.then(() => {
2018-08-13 04:47:54 -04:00
requestIdleCallback(
() => {
this.setDiscussions();
this.startRenderDiffsQueue();
2018-08-13 04:47:54 -04:00
},
{ timeout: 1000 },
);
2018-08-07 05:14:00 -04:00
})
.catch(() => {
createFlash(__('Something went wrong on our end. Please try again!'));
});
if (!this.isNotesFetched) {
eventHub.$emit('fetchNotesData');
}
},
setDiscussions() {
if (this.isNotesFetched && !this.assignedDiscussions && !this.isLoading) {
this.assignedDiscussions = true;
requestIdleCallback(
() =>
this.assignDiscussionsToDiff()
.then(this.$nextTick)
.then(this.startTaskList),
{ timeout: 1000 },
);
}
},
2018-06-21 08:22:40 -04:00
adjustView() {
if (this.shouldShow) {
this.$nextTick(() => {
window.mrTabs.resetViewContainer();
window.mrTabs.expandViewContainer(this.showTreeList);
});
2018-06-21 08:22:40 -04:00
}
},
},
};
</script>
<template>
<div v-show="shouldShow">
2018-11-16 15:07:38 -05:00
<div v-if="isLoading" class="loading"><gl-loading-icon /></div>
<div v-else id="diffs" :class="{ active: shouldShow }" class="diffs tab-pane">
2018-06-21 08:22:40 -04:00
<compare-versions
v-if="showCompareVersions"
2018-06-21 08:22:40 -04:00
:merge-request-diffs="mergeRequestDiffs"
:merge-request-diff="mergeRequestDiff"
:start-version="startVersion"
:target-branch="targetBranch"
/>
<hidden-files-warning
v-if="renderOverflowWarning"
:visible="numVisibleFiles"
:total="numTotalFiles"
:plain-diff-path="plainDiffPath"
:email-patch-path="emailPatchPath"
/>
<div
v-if="commit || startVersion || (mergeRequestDiff && !mergeRequestDiff.latest)"
class="mr-version-controls"
>
<div class="content-block comments-disabled-notif clearfix">
2018-11-16 15:07:38 -05:00
<i class="fa fa-info-circle"></i> {{ notAllCommentsDisplayed }}
2018-06-21 08:22:40 -04:00
<div class="pull-right">
2018-11-16 15:07:38 -05:00
<a :href="latestVersionPath" class="btn btn-sm"> {{ showLatestVersion }} </a>
2018-06-21 08:22:40 -04:00
</div>
</div>
</div>
2018-11-16 15:07:38 -05:00
<commit-widget v-if="commit" :commit="commit" />
<div
:data-can-create-note="getNoteableData.current_user.can_create_note"
class="files d-flex prepend-top-default"
>
2018-11-16 15:07:38 -05:00
<div v-show="showTreeList" class="diff-tree-list"><tree-list /></div>
<div v-if="diffFiles.length > 0" class="diff-files-holder">
<diff-file
v-for="file in diffFiles"
:key="file.newPath"
:file="file"
:can-current-user-fork="canCurrentUserFork"
/>
</div>
<no-changes v-else />
2018-06-21 08:22:40 -04:00
</div>
</div>
</div>
</template>