summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/diff.js
blob: 8e6519aabe5b5172be26b0cf99eb9729a3e22909 (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
this.Diff = (function() {
  var UNFOLD_COUNT;

  UNFOLD_COUNT = 20;

  function Diff() {
    $('.files .diff-file').singleFileDiff();
    this.filesCommentButton = $('.files .diff-file').filesCommentButton();
    $(document).off('click', '.js-unfold');
    $(document).on('click', '.js-unfold', (function(_this) {
      return function(event) {
        var line_number, link, offset, old_line, params, prev_new_line, prev_old_line, ref, ref1, since, target, to, unfold, unfoldBottom;
        target = $(event.target);
        unfoldBottom = target.hasClass('js-unfold-bottom');
        unfold = true;
        ref = _this.lineNumbers(target.parent()), old_line = ref[0], line_number = ref[1];
        offset = line_number - old_line;
        if (unfoldBottom) {
          line_number += 1;
          since = line_number;
          to = line_number + UNFOLD_COUNT;
        } else {
          ref1 = _this.lineNumbers(target.parent().prev()), prev_old_line = ref1[0], prev_new_line = ref1[1];
          line_number -= 1;
          to = line_number;
          if (line_number - UNFOLD_COUNT > prev_new_line + 1) {
            since = line_number - UNFOLD_COUNT;
          } else {
            since = prev_new_line + 1;
            unfold = false;
          }
        }
        link = target.parents('.diff-file').attr('data-blob-diff-path');
        params = {
          since: since,
          to: to,
          bottom: unfoldBottom,
          offset: offset,
          unfold: unfold,
          indent: 1
        };
        return $.get(link, params, function(response) {
          return target.parent().replaceWith(response);
        });
      };
    })(this));
  }

  Diff.prototype.lineNumbers = function(line) {
    var i, l, len, line_number, line_numbers, lines, results;
    if (!line.children().length) {
      return [0, 0];
    }
    lines = line.children().slice(0, 2);
    line_numbers = (function() {
      var i, len, results;
      results = [];
      for (i = 0, len = lines.length; i < len; i++) {
        l = lines[i];
        results.push($(l).attr('data-linenumber'));
      }
      return results;
    })();
    results = [];
    for (i = 0, len = line_numbers.length; i < len; i++) {
      line_number = line_numbers[i];
      results.push(parseInt(line_number));
    }
    return results;
  };

  return Diff;

})();