summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/diff_notes/components/jump_to_discussion.js.es6
blob: 83417a2703ed2a7434184e04e085d15b3fe6cb8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
(() => {
  JumpToDiscussion = Vue.extend({
    mixins: [DiscussionMixins],
    props: {
      discussionId: String
    },
    data: function () {
      return {
        discussions: CommentsStore.state,
      };
    },
    computed: {
      discussion: function () {
        return this.discussions[this.discussionId];
      },
      allResolved: function () {
        if (this.discussion) {
          return this.unresolvedDiscussionCount === 0;
        }
      },
      showButton: function () {
        if (this.discussionId) {
          if (this.unresolvedDiscussionCount > 1) {
            return true;
          } else {
            return this.discussionId !== this.lastResolvedId;
          }
        } else {
          return this.unresolvedDiscussionCount >= 1;
        }
      },
      lastResolvedId: function () {
        let lastId;
        for (const discussionId in this.discussions) {
          const discussion = this.discussions[discussionId];

          if (!discussion.isResolved()) {
            lastId = discussion.id;
          }
        }
        return lastId;
      }
    },
    methods: {
      jumpToNextUnresolvedDiscussion: function () {
        let unresolvedIds = CommentsStore.unresolvedDiscussionIds(),
            nextUnresolvedDiscussionId;
        const activePage = $('.merge-request-tabs .active a').attr('data-action'),
              $diffDiscussions = $('.discussion').filter(function () {
                return unresolvedIds.indexOf($(this).attr('data-discussion-id')) !== -1;
              });

        unresolvedIds = unresolvedIds.sort(function (a, b) {
          return $diffDiscussions.index(`[data-discussion-id="${b}"]`) > $diffDiscussions.index(`[data-discussion-id="${a}"]`);
        });

        unresolvedIds.forEach(function (discussionId, i) {
          if (this.discussionId && discussionId === this.discussionId) {
            nextUnresolvedDiscussionId = unresolvedIds[i + 1];
            return;
          }
        }.bind(this));

        nextUnresolvedDiscussionId = nextUnresolvedDiscussionId || unresolvedIds[0];

        if (nextUnresolvedDiscussionId) {
          let selector = '.discussion';

          if (activePage === 'diffs' && $(`${selector}[data-discussion-id="${nextUnresolvedDiscussionId}"]`).length) {
            selector = '.diffs .notes';
          }

          $.scrollTo(`${selector}[data-discussion-id="${nextUnresolvedDiscussionId}"]`, {
            offset: -($('.navbar-gitlab').outerHeight() + $('.layout-nav').outerHeight())
          });
        }
      }
    }
  });

  Vue.component('jump-to-discussion', JumpToDiscussion);
})();