debian-mirror-gitlab/app/assets/javascripts/notes/mixins/discussion_navigation.js

134 lines
3.9 KiB
JavaScript
Raw Normal View History

2020-03-13 15:44:24 +05:30
import { mapGetters, mapActions, mapState } from 'vuex';
2021-02-22 17:27:13 +05:30
import { scrollToElementWithContext, scrollToElement } from '~/lib/utils/common_utils';
2020-05-24 23:13:21 +05:30
import eventHub from '../event_hub';
2018-11-18 11:00:15 +05:30
2020-04-08 14:13:33 +05:30
/**
* @param {string} selector
* @returns {boolean}
*/
2021-02-22 17:27:13 +05:30
function scrollTo(selector, { withoutContext = false } = {}) {
2020-04-08 14:13:33 +05:30
const el = document.querySelector(selector);
2021-02-22 17:27:13 +05:30
const scrollFunction = withoutContext ? scrollToElement : scrollToElementWithContext;
2020-04-08 14:13:33 +05:30
if (el) {
2021-02-22 17:27:13 +05:30
scrollFunction(el);
2020-04-08 14:13:33 +05:30
return true;
}
return false;
}
/**
* @param {object} self Component instance with mixin applied
* @param {string} id Discussion id we are jumping to
*/
function diffsJump({ expandDiscussion }, id) {
const selector = `ul.notes[data-discussion-id="${id}"]`;
eventHub.$once('scrollToDiscussion', () => scrollTo(selector));
expandDiscussion({ discussionId: id });
}
/**
* @param {object} self Component instance with mixin applied
* @param {string} id Discussion id we are jumping to
* @returns {boolean}
*/
function discussionJump({ expandDiscussion }, id) {
const selector = `div.discussion[data-discussion-id="${id}"]`;
expandDiscussion({ discussionId: id });
2021-02-22 17:27:13 +05:30
return scrollTo(selector, { withoutContext: true });
2020-04-08 14:13:33 +05:30
}
/**
* @param {object} self Component instance with mixin applied
* @param {string} id Discussion id we are jumping to
*/
function switchToDiscussionsTabAndJumpTo(self, id) {
window.mrTabs.eventHub.$once('MergeRequestTabChange', () => {
setTimeout(() => discussionJump(self, id), 0);
});
window.mrTabs.tabShown('show');
}
/**
* @param {object} self Component instance with mixin applied
* @param {object} discussion Discussion we are jumping to
*/
function jumpToDiscussion(self, discussion) {
const { id, diff_discussion: isDiffDiscussion } = discussion;
if (id) {
const activeTab = window.mrTabs.currentAction;
if (activeTab === 'diffs' && isDiffDiscussion) {
diffsJump(self, id);
} else if (activeTab === 'show') {
discussionJump(self, id);
} else {
switchToDiscussionsTabAndJumpTo(self, id);
}
}
}
/**
* @param {object} self Component instance with mixin applied
* @param {function} fn Which function used to get the target discussion's id
* @param {string} [discussionId=this.currentDiscussionId] Current discussion id, will be null if discussions have not been traversed yet
*/
function handleDiscussionJump(self, fn, discussionId = self.currentDiscussionId) {
const isDiffView = window.mrTabs.currentAction === 'diffs';
const targetId = fn(discussionId, isDiffView);
const discussion = self.getDiscussion(targetId);
2020-10-24 23:57:45 +05:30
const discussionFilePath = discussion?.diff_file?.file_path;
2020-07-28 23:09:34 +05:30
if (discussionFilePath) {
self.scrollToFile(discussionFilePath);
}
self.$nextTick(() => {
jumpToDiscussion(self, discussion);
self.setCurrentDiscussionId(targetId);
});
2020-04-08 14:13:33 +05:30
}
2018-11-18 11:00:15 +05:30
export default {
2020-03-13 15:44:24 +05:30
computed: {
...mapGetters([
'nextUnresolvedDiscussionId',
'previousUnresolvedDiscussionId',
'getDiscussion',
]),
...mapState({
2021-03-08 18:12:59 +05:30
currentDiscussionId: (state) => state.notes.currentDiscussionId,
2020-03-13 15:44:24 +05:30
}),
},
2018-11-18 11:00:15 +05:30
methods: {
2020-03-13 15:44:24 +05:30
...mapActions(['expandDiscussion', 'setCurrentDiscussionId']),
2020-07-28 23:09:34 +05:30
...mapActions('diffs', ['scrollToFile']),
2020-03-13 15:44:24 +05:30
jumpToNextDiscussion() {
2020-04-08 14:13:33 +05:30
handleDiscussionJump(this, this.nextUnresolvedDiscussionId);
2020-03-13 15:44:24 +05:30
},
jumpToPreviousDiscussion() {
2020-04-08 14:13:33 +05:30
handleDiscussionJump(this, this.previousUnresolvedDiscussionId);
2020-03-13 15:44:24 +05:30
},
2020-10-24 23:57:45 +05:30
jumpToFirstUnresolvedDiscussion() {
this.setCurrentDiscussionId(null)
.then(() => {
this.jumpToNextDiscussion();
})
.catch(() => {});
},
2020-04-08 14:13:33 +05:30
/**
* Go to the next discussion from the given discussionId
* @param {String} discussionId The id we are jumping from
*/
jumpToNextRelativeDiscussion(discussionId) {
handleDiscussionJump(this, this.nextUnresolvedDiscussionId, discussionId);
2020-03-13 15:44:24 +05:30
},
2018-11-18 11:00:15 +05:30
},
};