~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/static/javascript/diff.js

Merge maxb's update to jam's removal of start/stop loggerhead scripts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
var unified = true;
 
2
 
 
3
function make_unified(chunk) {
 
4
  var pending_added = [];
 
5
  function flush_adds(before) {
 
6
    for (var i = 0; i < pending_added.length; i++) {
 
7
      before.ancestor().insertBefore(pending_added[i], before);
 
8
    }
 
9
    pending_added.length = 0;
 
10
  }
 
11
  chunk.get('children').filter(".pseudorow").each(
 
12
    function (line) {
 
13
      if (line.hasClass("context-row")) {
 
14
        flush_adds(line);
 
15
        line.removeChild(line.query('.code'));
 
16
      }
 
17
      else if (line.hasClass("both-row")) {
 
18
        var added_line = line.create('<div class="pseudorow insert-row"><div class="lineNumber first">&nbsp;</div><div class="clear">&nbsp;</div></div>');
 
19
        var clear = added_line.query('.clear');
 
20
        added_line.insertBefore(line.query('.lineNumber.second'), clear);
 
21
        added_line.insertBefore(line.query('.code.insert'), clear);
 
22
        pending_added[pending_added.length] = added_line;
 
23
        line.insertBefore(line.create('<div class="lineNumber second">&nbsp;</div>'), line.query('.code.delete'));
 
24
        line.replaceClass("both-row", "delete-row");
 
25
      }
 
26
      else if (line.hasClass("insert-row")) {
 
27
        flush_adds(line);
 
28
        line.removeChild(line.query('.blank'));
 
29
      }
 
30
      else if (line.hasClass("delete-row")) {
 
31
        line.removeChild(line.query('.blank'));
 
32
        line.insertBefore(line.query('.lineNumber.second'), line.query('.code.delete'));
 
33
      }
 
34
    });
 
35
  flush_adds(null);
 
36
  chunk.replaceClass('sbs', 'unified');
 
37
}
 
38
 
 
39
function make_sbs(chunk) {
 
40
  var added = [];
 
41
  var removed = [];
 
42
  function clear_bufs(before) {
 
43
    if (!added.length && !removed.length) return;
 
44
    var common = Math.min(added.length, removed.length);
 
45
    for (var i = 0; i < common; i++) {
 
46
      var a = added[i];
 
47
      var r = removed[i];
 
48
      a.ancestor().removeChild(a);
 
49
      r.removeChild(r.query('.lineNumber.second'));
 
50
      r.insertBefore(a.query('.lineNumber.second'), r.query('.clear'));
 
51
      r.insertBefore(a.query('.code.insert'), r.query('.clear'));
 
52
      r.replaceClass('removed-row', 'both-row');
 
53
    }
 
54
    if (added.length > removed.length) {
 
55
      for (var j = common; j < added.length; j++) {
 
56
        a = added[j];
 
57
        a.insertBefore(a.create('<div class="blank">&nbsp;</div>'), a.query('.lineNumber.second'));
 
58
      }
 
59
    }
 
60
    else if (added.length < removed.length) {
 
61
      for (var j = common; j < removed.length; j++) {
 
62
        r = removed[j];
 
63
        r.insertBefore(r.query('.code.delete'), r.query('.lineNumber.second'));
 
64
        r.insertBefore(r.create('<div class="blank">&nbsp;</div>'), r.query('.clear'));
 
65
      }
 
66
    }
 
67
    added.length = 0;
 
68
    removed.length = 0;
 
69
  }
 
70
  chunk.get('children').filter(".pseudorow").each(
 
71
    function (line) {
 
72
      if (line.hasClass("context-row")) {
 
73
        clear_bufs(line);
 
74
        line.insertBefore(line.query('.code').cloneNode(true), line.query(".second"));
 
75
      }
 
76
      else if (line.hasClass("insert-row")) {
 
77
        added[added.length] = line;
 
78
      }
 
79
      else if (line.hasClass("delete-row")) {
 
80
        removed[removed.length] = line;
 
81
      }
 
82
    });
 
83
  clear_bufs(null);
 
84
  chunk.replaceClass('unified', 'sbs');
 
85
 
 
86
}
 
87
 
 
88
function toggle_unified_sbs(event) {
 
89
  event.preventDefault();
 
90
  var pts = Y.all(".pseudotable");
 
91
  if (unified) {
 
92
    pts && pts.each(make_sbs);
 
93
    unified = false;
 
94
    Y.get("#toggle_unified_sbs").set('innerHTML', "Show unified diffs");
 
95
  }
 
96
  else {
 
97
    pts && pts.each(make_unified);
 
98
    unified = true;
 
99
    Y.get("#toggle_unified_sbs").set('innerHTML', "Show diffs side-by-side");
 
100
  }
 
101
}
 
102
 
 
103
Y.on("click", toggle_unified_sbs, '#toggle_unified_sbs');
 
104
 
 
105
function toggle_expand_all_revisionview(action)
 
106
{
 
107
  var diffs = Y.all('.diff');
 
108
  if (diffs == null) return;
 
109
  diffs.each(
 
110
    function(item, i)
 
111
    {
 
112
      var collapsable = item.collapsable;
 
113
      if(action == 'close')
 
114
      {
 
115
        Y.get('#expand_all').setStyle('display','block');
 
116
        Y.get('#collapse_all').setStyle('display','none');
 
117
        collapsable.close();
 
118
      }
 
119
      else if(action == 'open')
 
120
      {
 
121
        Y.get('#expand_all').setStyle('display','none');
 
122
        Y.get('#collapse_all').setStyle('display','block');
 
123
        collapsable.open();
 
124
      }
 
125
    });
 
126
}
 
127
 
 
128
Y.on(
 
129
  'click',
 
130
  function (event) {
 
131
    event.preventDefault();
 
132
    toggle_expand_all_revisionview('open');
 
133
  },
 
134
  '#expand_all a'
 
135
);
 
136
 
 
137
Y.on(
 
138
  'click',
 
139
  function (event) {
 
140
    event.preventDefault();
 
141
    toggle_expand_all_revisionview('close');
 
142
  },
 
143
  '#collapse_all a'
 
144
);
 
145
 
 
146
function node_process(node) {
 
147
  if (!unified) {
 
148
    node.get('children').filter('.pseudotable').each(make_sbs);
 
149
  }
 
150
}
 
151
 
 
152
function zoom_to_diff (path) {
 
153
  var collapsable = Y.get('#' + path_to_id[path]).collapsable;
 
154
  if (!collapsable.is_open) {
 
155
    collapsable.open(
 
156
      function () {
 
157
        window.location.hash = '#' + path;
 
158
      });
 
159
  }
 
160
}
 
161
 
 
162
Y.on(
 
163
  "domready", function () {
 
164
    Y.all(".show_if_js").removeClass("show_if_js");
 
165
    if (!specific_path) {
 
166
      Y.all("#list-files a").on(
 
167
        'click',
 
168
        function (e) {
 
169
          e.preventDefault();
 
170
          var path = decodeURIComponent(e.target.get('href').split('#')[1]);
 
171
          window.location.hash = '#' + path;
 
172
          zoom_to_diff(path);
 
173
        });
 
174
    }
 
175
    var diffs = Y.all('.diff');
 
176
    if (diffs == null) return;
 
177
    diffs.each(
 
178
      function(item, i)
 
179
      {
 
180
        var source_url = null;
 
181
        if (!specific_path)
 
182
          source_url = global_path + '+filediff/' + link_data[item.get('id')];
 
183
        item.query('.the-link').on(
 
184
          'click',
 
185
          function(e) {
 
186
            e.preventDefault();
 
187
            collapsable.toggle();
 
188
          });
 
189
        var collapsable = new Collapsable(
 
190
          {
 
191
            expand_icon: item.query('.expand_diff'),
 
192
            open_node: item.query('.diffinfo'),
 
193
            close_node: null,
 
194
            source: source_url,
 
195
            is_open: specific_path != null,
 
196
            loading: item.query('.loading'),
 
197
            node_process: node_process
 
198
          });
 
199
       item.collapsable=collapsable;
 
200
       });
 
201
    if (window.location.hash && !specific_path) {
 
202
      zoom_to_diff(window.location.hash.substring(1));
 
203
    }
 
204
  });