##// END OF EJS Templates
labels "commit activity" using format
Vladislav Poluhin -
r1922:0ef681e3 beta
parent child Browse files
Show More
@@ -1,700 +1,697 b''
1 1 <%inherit file="/base/base.html"/>
2 2
3 3 <%def name="title()">
4 4 ${c.repo_name} ${_('Summary')} - ${c.rhodecode_name}
5 5 </%def>
6 6
7 7 <%def name="breadcrumbs_links()">
8 8 ${h.link_to(u'Home',h.url('/'))}
9 9 &raquo;
10 10 ${h.link_to(c.dbrepo.just_name,h.url('summary_home',repo_name=c.repo_name))}
11 11 &raquo;
12 12 ${_('summary')}
13 13 </%def>
14 14
15 15 <%def name="page_nav()">
16 16 ${self.menu('summary')}
17 17 </%def>
18 18
19 19 <%def name="main()">
20 20 <%
21 21 summary = lambda n:{False:'summary-short'}.get(n)
22 22 %>
23 23 %if c.show_stats:
24 24 <div class="box box-left">
25 25 %else:
26 26 <div class="box">
27 27 %endif
28 28 <!-- box / title -->
29 29 <div class="title">
30 30 ${self.breadcrumbs()}
31 31 </div>
32 32 <!-- end box / title -->
33 33 <div class="form">
34 34 <div id="summary" class="fields">
35 35
36 36 <div class="field">
37 37 <div class="label-summary">
38 38 <label>${_('Name')}:</label>
39 39 </div>
40 40 <div class="input ${summary(c.show_stats)}">
41 41 <div style="float:right;padding:5px 0px 0px 5px">
42 42 %if c.rhodecode_user.username != 'default':
43 43 ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key),class_='rss_icon')}
44 44 ${h.link_to(_('ATOM'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key),class_='atom_icon')}
45 45 %else:
46 46 ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.dbrepo.repo_name),class_='rss_icon')}
47 47 ${h.link_to(_('ATOM'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name),class_='atom_icon')}
48 48 %endif
49 49 </div>
50 50 %if c.rhodecode_user.username != 'default':
51 51 %if c.following:
52 52 <span id="follow_toggle" class="following" title="${_('Stop following this repository')}"
53 53 onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
54 54 </span>
55 55 %else:
56 56 <span id="follow_toggle" class="follow" title="${_('Start following this repository')}"
57 57 onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
58 58 </span>
59 59 %endif
60 60 %endif:
61 61 ##REPO TYPE
62 62 %if c.dbrepo.repo_type =='hg':
63 63 <img style="margin-bottom:2px" class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url('/images/icons/hgicon.png')}"/>
64 64 %endif
65 65 %if c.dbrepo.repo_type =='git':
66 66 <img style="margin-bottom:2px" class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url('/images/icons/giticon.png')}"/>
67 67 %endif
68 68
69 69 ##PUBLIC/PRIVATE
70 70 %if c.dbrepo.private:
71 71 <img style="margin-bottom:2px" class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="${h.url('/images/icons/lock.png')}"/>
72 72 %else:
73 73 <img style="margin-bottom:2px" class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="${h.url('/images/icons/lock_open.png')}"/>
74 74 %endif
75 75
76 76 ##REPO NAME
77 77 <span class="repo_name" title="${_('Non changable ID %s') % c.dbrepo.repo_id}">${h.repo_link(c.dbrepo.groups_and_repo)}</span>
78 78
79 79 ##FORK
80 80 %if c.dbrepo.fork:
81 81 <div style="margin-top:5px;clear:both"">
82 82 <a href="${h.url('summary_home',repo_name=c.dbrepo.fork.repo_name)}"><img class="icon" alt="${_('public')}" title="${_('Fork of')} ${c.dbrepo.fork.repo_name}" src="${h.url('/images/icons/arrow_divide.png')}"/>
83 83 ${_('Fork of')} ${c.dbrepo.fork.repo_name}
84 84 </a>
85 85 </div>
86 86 %endif
87 87 ##REMOTE
88 88 %if c.dbrepo.clone_uri:
89 89 <div style="margin-top:5px;clear:both">
90 90 <a href="${h.url(str(h.hide_credentials(c.dbrepo.clone_uri)))}"><img class="icon" alt="${_('remote clone')}" title="${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}" src="${h.url('/images/icons/connect.png')}"/>
91 91 ${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}
92 92 </a>
93 93 </div>
94 94 %endif
95 95 </div>
96 96 </div>
97 97
98 98 <div class="field">
99 99 <div class="label-summary">
100 100 <label>${_('Description')}:</label>
101 101 </div>
102 102 <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(c.dbrepo.description)}</div>
103 103 </div>
104 104
105 105 <div class="field">
106 106 <div class="label-summary">
107 107 <label>${_('Contact')}:</label>
108 108 </div>
109 109 <div class="input ${summary(c.show_stats)}">
110 110 <div class="gravatar">
111 111 <img alt="gravatar" src="${h.gravatar_url(c.dbrepo.user.email)}"/>
112 112 </div>
113 113 ${_('Username')}: ${c.dbrepo.user.username}<br/>
114 114 ${_('Name')}: ${c.dbrepo.user.name} ${c.dbrepo.user.lastname}<br/>
115 115 ${_('Email')}: <a href="mailto:${c.dbrepo.user.email}">${c.dbrepo.user.email}</a>
116 116 </div>
117 117 </div>
118 118
119 119 <div class="field">
120 120 <div class="label-summary">
121 121 <label>${_('Clone url')}:</label>
122 122 </div>
123 123 <div class="input ${summary(c.show_stats)}">
124 124 <div style="display:none" id="clone_by_name" class="ui-btn clone">${_('Show by Name')}</div>
125 125 <div id="clone_by_id" class="ui-btn clone">${_('Show by ID')}</div>
126 126 <input style="width:80%;margin-left:105px" type="text" id="clone_url" readonly="readonly" value="${c.clone_repo_url}"/>
127 127 <input style="display:none;width:80%;margin-left:105px" type="text" id="clone_url_id" readonly="readonly" value="${c.clone_repo_url_id}"/>
128 128 </div>
129 129 </div>
130 130
131 131 <div class="field">
132 132 <div class="label-summary">
133 133 <label>${_('Trending files')}:</label>
134 134 </div>
135 135 <div class="input ${summary(c.show_stats)}">
136 136 %if c.show_stats:
137 137 <div id="lang_stats"></div>
138 138 %else:
139 139 ${_('Statistics are disabled for this repository')}
140 140 %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
141 141 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
142 142 %endif
143 143 %endif
144 144 </div>
145 145 </div>
146 146
147 147 <div class="field">
148 148 <div class="label-summary">
149 149 <label>${_('Download')}:</label>
150 150 </div>
151 151 <div class="input ${summary(c.show_stats)}">
152 152 %if len(c.rhodecode_repo.revisions) == 0:
153 153 ${_('There are no downloads yet')}
154 154 %elif c.enable_downloads is False:
155 155 ${_('Downloads are disabled for this repository')}
156 156 %if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
157 157 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
158 158 %endif
159 159 %else:
160 160 ${h.select('download_options',c.rhodecode_repo.get_changeset().raw_id,c.download_options)}
161 161 <span id="${'zip_link'}">${h.link_to('Download as zip',h.url('files_archive_home',repo_name=c.dbrepo.repo_name,fname='tip.zip'),class_="archive_icon ui-btn")}</span>
162 162 <span style="vertical-align: bottom">
163 163 <input id="archive_subrepos" type="checkbox" name="subrepos" />
164 164 <label for="archive_subrepos" class="tooltip" title="${_('Check this to download archive with subrepos')}" >${_('with subrepos')}</label>
165 165 </span>
166 166 %endif
167 167 </div>
168 168 </div>
169 169 </div>
170 170 </div>
171 171 </div>
172 172
173 173 %if c.show_stats:
174 174 <div class="box box-right" style="min-height:455px">
175 175 <!-- box / title -->
176 176 <div class="title">
177 177 <h5>${_('Commit activity by day / author')}</h5>
178 178 </div>
179 179
180 180 <div class="graph">
181 181 <div style="padding:0 10px 10px 15px;font-size: 1.2em;">
182 182 %if c.no_data:
183 183 ${c.no_data_msg}
184 184 %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
185 185 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
186 186 %endif
187 187 %else:
188 188 ${_('Loaded in')} ${c.stats_percentage} %
189 189 %endif
190 190 </div>
191 191 <div id="commit_history" style="width:450px;height:300px;float:left"></div>
192 192 <div style="clear: both;height: 10px"></div>
193 193 <div id="overview" style="width:450px;height:100px;float:left"></div>
194 194
195 195 <div id="legend_data" style="clear:both;margin-top:10px;">
196 196 <div id="legend_container"></div>
197 197 <div id="legend_choices">
198 198 <table id="legend_choices_tables" class="noborder" style="font-size:smaller;color:#545454"></table>
199 199 </div>
200 200 </div>
201 201 </div>
202 202 </div>
203 203 %endif
204 204
205 205 <div class="box">
206 206 <div class="title">
207 207 <div class="breadcrumbs">
208 208 %if c.repo_changesets:
209 209 ${h.link_to(_('Shortlog'),h.url('shortlog_home',repo_name=c.repo_name))}
210 210 %else:
211 211 ${_('Quick start')}
212 212 %endif
213 213 </div>
214 214 </div>
215 215 <div class="table">
216 216 <div id="shortlog_data">
217 217 <%include file='../shortlog/shortlog_data.html'/>
218 218 </div>
219 219 </div>
220 220 </div>
221 221
222 222 %if c.readme_data:
223 223 <div class="box" style="background-color: #FAFAFA">
224 224 <div class="title">
225 225 <div class="breadcrumbs"><a href="${h.url('files_home',repo_name=c.repo_name,revision='tip',f_path=c.readme_file)}">${c.readme_file}</a></div>
226 226 </div>
227 227 <div class="readme">
228 228 <div class="readme_box">
229 229 ${c.readme_data|n}
230 230 </div>
231 231 </div>
232 232 </div>
233 233 %endif
234 234
235 235 <script type="text/javascript">
236 236 var clone_url = 'clone_url';
237 237 YUE.on(clone_url,'click',function(e){
238 238 if(YUD.hasClass(clone_url,'selected')){
239 239 return
240 240 }
241 241 else{
242 242 YUD.addClass(clone_url,'selected');
243 243 YUD.get(clone_url).select();
244 244 }
245 245 })
246 246
247 247 YUE.on('clone_by_name','click',function(e){
248 248 // show url by name and hide name button
249 249 YUD.setStyle('clone_url','display','');
250 250 YUD.setStyle('clone_by_name','display','none');
251 251
252 252 // hide url by id and show name button
253 253 YUD.setStyle('clone_by_id','display','');
254 254 YUD.setStyle('clone_url_id','display','none');
255 255
256 256 })
257 257 YUE.on('clone_by_id','click',function(e){
258 258
259 259 // show url by id and hide id button
260 260 YUD.setStyle('clone_by_id','display','none');
261 261 YUD.setStyle('clone_url_id','display','');
262 262
263 263 // hide url by name and show id button
264 264 YUD.setStyle('clone_by_name','display','');
265 265 YUD.setStyle('clone_url','display','none');
266 266 })
267 267
268 268
269 269 var tmpl_links = {};
270 270 %for cnt,archive in enumerate(c.rhodecode_repo._get_archives()):
271 271 tmpl_links["${archive['type']}"] = '${h.link_to('__NAME__', h.url('files_archive_home',repo_name=c.dbrepo.repo_name, fname='__CS__'+archive['extension'],subrepos='__SUB__'),class_='archive_icon ui-btn')}';
272 272 %endfor
273 273
274 274 YUE.on(['download_options','archive_subrepos'],'change',function(e){
275 275 var sm = YUD.get('download_options');
276 276 var new_cs = sm.options[sm.selectedIndex];
277 277
278 278 for(k in tmpl_links){
279 279 var s = YUD.get(k+'_link');
280 280 if(s){
281 281 var title_tmpl = "${_('Download %s as %s') % ('__CS_NAME__','__CS_EXT__')}";
282 282 title_tmpl= title_tmpl.replace('__CS_NAME__',new_cs.text);
283 283 title_tmpl = title_tmpl.replace('__CS_EXT__',k);
284 284
285 285 var url = tmpl_links[k].replace('__CS__',new_cs.value);
286 286 var subrepos = YUD.get('archive_subrepos').checked;
287 287 url = url.replace('__SUB__',subrepos);
288 288 url = url.replace('__NAME__',title_tmpl);
289 289 s.innerHTML = url
290 290 }
291 291 }
292 292 });
293 293 </script>
294 294 %if c.show_stats:
295 295 <script type="text/javascript">
296 296 var data = ${c.trending_languages|n};
297 297 var total = 0;
298 298 var no_data = true;
299 299 var tbl = document.createElement('table');
300 300 tbl.setAttribute('class','trending_language_tbl');
301 301 var cnt = 0;
302 302
303 303 for (var i=0;i<data.length;i++){
304 304 total += data[i][1].count;
305 305 cnt += 1;
306 306 no_data = false;
307 307
308 308 var hide = cnt>2;
309 309 var tr = document.createElement('tr');
310 310 if (hide){
311 311 tr.setAttribute('style','display:none');
312 312 tr.setAttribute('class','stats_hidden');
313 313 }
314 314 var k = data[i][0];
315 315 var obj = data[i][1];
316 316 var percentage = Math.round((obj.count/total*100),2);
317 317
318 318 var td1 = document.createElement('td');
319 319 td1.width = 150;
320 320 var trending_language_label = document.createElement('div');
321 321 trending_language_label.innerHTML = obj.desc+" ("+k+")";
322 322 td1.appendChild(trending_language_label);
323 323
324 324 var td2 = document.createElement('td');
325 325 td2.setAttribute('style','padding-right:14px !important');
326 326 var trending_language = document.createElement('div');
327 327 var nr_files = obj.count+" ${_('files')}";
328 328
329 329 trending_language.title = k+" "+nr_files;
330 330
331 331 if (percentage>22){
332 332 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"% "+nr_files+ "</b>";
333 333 }
334 334 else{
335 335 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"%</b>";
336 336 }
337 337
338 338 trending_language.setAttribute("class", 'trending_language top-right-rounded-corner bottom-right-rounded-corner');
339 339 trending_language.style.width=percentage+"%";
340 340 td2.appendChild(trending_language);
341 341
342 342 tr.appendChild(td1);
343 343 tr.appendChild(td2);
344 344 tbl.appendChild(tr);
345 345 if(cnt == 3){
346 346 var show_more = document.createElement('tr');
347 347 var td = document.createElement('td');
348 348 lnk = document.createElement('a');
349 349
350 350 lnk.href='#';
351 351 lnk.innerHTML = "${_('show more')}";
352 352 lnk.id='code_stats_show_more';
353 353 td.appendChild(lnk);
354 354
355 355 show_more.appendChild(td);
356 356 show_more.appendChild(document.createElement('td'));
357 357 tbl.appendChild(show_more);
358 358 }
359 359
360 360 }
361 361
362 362 YUD.get('lang_stats').appendChild(tbl);
363 363 YUE.on('code_stats_show_more','click',function(){
364 364 l = YUD.getElementsByClassName('stats_hidden')
365 365 for (e in l){
366 366 YUD.setStyle(l[e],'display','');
367 367 };
368 368 YUD.setStyle(YUD.get('code_stats_show_more'),
369 369 'display','none');
370 370 });
371 371 </script>
372 372 <script type="text/javascript">
373 373 /**
374 374 * Plots summary graph
375 375 *
376 376 * @class SummaryPlot
377 377 * @param {from} initial from for detailed graph
378 378 * @param {to} initial to for detailed graph
379 379 * @param {dataset}
380 380 * @param {overview_dataset}
381 381 */
382 382 function SummaryPlot(from,to,dataset,overview_dataset) {
383 383 var initial_ranges = {
384 384 "xaxis":{
385 385 "from":from,
386 386 "to":to,
387 387 },
388 388 };
389 389 var dataset = dataset;
390 390 var overview_dataset = [overview_dataset];
391 391 var choiceContainer = YUD.get("legend_choices");
392 392 var choiceContainerTable = YUD.get("legend_choices_tables");
393 393 var plotContainer = YUD.get('commit_history');
394 394 var overviewContainer = YUD.get('overview');
395 395
396 396 var plot_options = {
397 397 bars: {show:true,align:'center',lineWidth:4},
398 398 legend: {show:true, container:"legend_container"},
399 399 points: {show:true,radius:0,fill:false},
400 400 yaxis: {tickDecimals:0,},
401 401 xaxis: {
402 402 mode: "time",
403 403 timeformat: "%d/%m",
404 404 min:from,
405 405 max:to,
406 406 },
407 407 grid: {
408 408 hoverable: true,
409 409 clickable: true,
410 410 autoHighlight:true,
411 411 color: "#999"
412 412 },
413 413 //selection: {mode: "x"}
414 414 };
415 415 var overview_options = {
416 416 legend:{show:false},
417 417 bars: {show:true,barWidth: 2,},
418 418 shadowSize: 0,
419 419 xaxis: {mode: "time", timeformat: "%d/%m/%y",},
420 420 yaxis: {ticks: 3, min: 0,tickDecimals:0,},
421 421 grid: {color: "#999",},
422 422 selection: {mode: "x"}
423 423 };
424 424
425 425 /**
426 426 *get dummy data needed in few places
427 427 */
428 428 function getDummyData(label){
429 429 return {"label":label,
430 430 "data":[{"time":0,
431 431 "commits":0,
432 432 "added":0,
433 433 "changed":0,
434 434 "removed":0,
435 435 }],
436 436 "schema":["commits"],
437 437 "color":'#ffffff',
438 438 }
439 439 }
440 440
441 441 /**
442 442 * generate checkboxes accordindly to data
443 443 * @param keys
444 444 * @returns
445 445 */
446 446 function generateCheckboxes(data) {
447 447 //append checkboxes
448 448 var i = 0;
449 449 choiceContainerTable.innerHTML = '';
450 450 for(var pos in data) {
451 451
452 452 data[pos].color = i;
453 453 i++;
454 454 if(data[pos].label != ''){
455 var l = data[pos].label;
456 choiceContainerTable.innerHTML += '<tr><td>'+
457 '<input type="checkbox" id="id_user_' + l + '" name="' + l +'" checked="checked" />' +
458 '<label for="id_user_' + l + '">' + l + '</label></td></tr>';
455 choiceContainerTable.innerHTML +=
456 '<tr><td><input type="checkbox" id="id_user_{0}" name="{0}" checked="checked" /> \
457 <label for="id_user_{0}">{0}</label></td></tr>'.format(data[pos].label);
459 458 }
460 459 }
461
462 console.log(data);
463 460 }
464 461
465 462 /**
466 463 * ToolTip show
467 464 */
468 465 function showTooltip(x, y, contents) {
469 466 var div=document.getElementById('tooltip');
470 467 if(!div) {
471 468 div = document.createElement('div');
472 469 div.id="tooltip";
473 470 div.style.position="absolute";
474 471 div.style.border='1px solid #fdd';
475 472 div.style.padding='2px';
476 473 div.style.backgroundColor='#fee';
477 474 document.body.appendChild(div);
478 475 }
479 476 YUD.setStyle(div, 'opacity', 0);
480 477 div.innerHTML = contents;
481 478 div.style.top=(y + 5) + "px";
482 479 div.style.left=(x + 5) + "px";
483 480
484 481 var anim = new YAHOO.util.Anim(div, {opacity: {to: 0.8}}, 0.2);
485 482 anim.animate();
486 483 }
487 484
488 485 /**
489 486 * This function will detect if selected period has some changesets
490 487 for this user if it does this data is then pushed for displaying
491 488 Additionally it will only display users that are selected by the checkbox
492 489 */
493 490 function getDataAccordingToRanges(ranges) {
494 491
495 492 var data = [];
496 493 var new_dataset = {};
497 494 var keys = [];
498 495 var max_commits = 0;
499 496 for(var key in dataset){
500 497
501 498 for(var ds in dataset[key].data){
502 499 commit_data = dataset[key].data[ds];
503 500 if (commit_data.time >= ranges.xaxis.from && commit_data.time <= ranges.xaxis.to){
504 501
505 502 if(new_dataset[key] === undefined){
506 503 new_dataset[key] = {data:[],schema:["commits"],label:key};
507 504 }
508 505 new_dataset[key].data.push(commit_data);
509 506 }
510 507 }
511 508 if (new_dataset[key] !== undefined){
512 509 data.push(new_dataset[key]);
513 510 }
514 511 }
515 512
516 513 if (data.length > 0){
517 514 return data;
518 515 }
519 516 else{
520 517 //just return dummy data for graph to plot itself
521 518 return [getDummyData('')];
522 519 }
523 520 }
524 521
525 522 /**
526 523 * redraw using new checkbox data
527 524 */
528 525 function plotchoiced(e,args){
529 526 var cur_data = args[0];
530 527 var cur_ranges = args[1];
531 528
532 529 var new_data = [];
533 530 var inputs = choiceContainer.getElementsByTagName("input");
534 531
535 532 //show only checked labels
536 533 for(var i=0; i<inputs.length; i++) {
537 534 var checkbox_key = inputs[i].name;
538 535
539 536 if(inputs[i].checked){
540 537 for(var d in cur_data){
541 538 if(cur_data[d].label == checkbox_key){
542 539 new_data.push(cur_data[d]);
543 540 }
544 541 }
545 542 }
546 543 else{
547 544 //push dummy data to not hide the label
548 545 new_data.push(getDummyData(checkbox_key));
549 546 }
550 547 }
551 548
552 549 var new_options = YAHOO.lang.merge(plot_options, {
553 550 xaxis: {
554 551 min: cur_ranges.xaxis.from,
555 552 max: cur_ranges.xaxis.to,
556 553 mode:"time",
557 554 timeformat: "%d/%m",
558 555 },
559 556 });
560 557 if (!new_data){
561 558 new_data = [[0,1]];
562 559 }
563 560 // do the zooming
564 561 plot = YAHOO.widget.Flot(plotContainer, new_data, new_options);
565 562
566 563 plot.subscribe("plotselected", plotselected);
567 564
568 565 //resubscribe plothover
569 566 plot.subscribe("plothover", plothover);
570 567
571 568 // don't fire event on the overview to prevent eternal loop
572 569 overview.setSelection(cur_ranges, true);
573 570
574 571 }
575 572
576 573 /**
577 574 * plot only selected items from overview
578 575 * @param ranges
579 576 * @returns
580 577 */
581 578 function plotselected(ranges,cur_data) {
582 579 //updates the data for new plot
583 580 var data = getDataAccordingToRanges(ranges);
584 581 generateCheckboxes(data);
585 582
586 583 var new_options = YAHOO.lang.merge(plot_options, {
587 584 xaxis: {
588 585 min: ranges.xaxis.from,
589 586 max: ranges.xaxis.to,
590 587 mode:"time",
591 588 timeformat: "%d/%m",
592 589 },
593 590 });
594 591 // do the zooming
595 592 plot = YAHOO.widget.Flot(plotContainer, data, new_options);
596 593
597 594 plot.subscribe("plotselected", plotselected);
598 595
599 596 //resubscribe plothover
600 597 plot.subscribe("plothover", plothover);
601 598
602 599 // don't fire event on the overview to prevent eternal loop
603 600 overview.setSelection(ranges, true);
604 601
605 602 //resubscribe choiced
606 603 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, ranges]);
607 604 }
608 605
609 606 var previousPoint = null;
610 607
611 608 function plothover(o) {
612 609 var pos = o.pos;
613 610 var item = o.item;
614 611
615 612 //YUD.get("x").innerHTML = pos.x.toFixed(2);
616 613 //YUD.get("y").innerHTML = pos.y.toFixed(2);
617 614 if (item) {
618 615 if (previousPoint != item.datapoint) {
619 616 previousPoint = item.datapoint;
620 617
621 618 var tooltip = YUD.get("tooltip");
622 619 if(tooltip) {
623 620 tooltip.parentNode.removeChild(tooltip);
624 621 }
625 622 var x = item.datapoint.x.toFixed(2);
626 623 var y = item.datapoint.y.toFixed(2);
627 624
628 625 if (!item.series.label){
629 626 item.series.label = 'commits';
630 627 }
631 628 var d = new Date(x*1000);
632 629 var fd = d.toDateString()
633 630 var nr_commits = parseInt(y);
634 631
635 632 var cur_data = dataset[item.series.label].data[item.dataIndex];
636 633 var added = cur_data.added;
637 634 var changed = cur_data.changed;
638 635 var removed = cur_data.removed;
639 636
640 637 var nr_commits_suffix = " ${_('commits')} ";
641 638 var added_suffix = " ${_('files added')} ";
642 639 var changed_suffix = " ${_('files changed')} ";
643 640 var removed_suffix = " ${_('files removed')} ";
644 641
645 642
646 643 if(nr_commits == 1){nr_commits_suffix = " ${_('commit')} ";}
647 644 if(added==1){added_suffix=" ${_('file added')} ";}
648 645 if(changed==1){changed_suffix=" ${_('file changed')} ";}
649 646 if(removed==1){removed_suffix=" ${_('file removed')} ";}
650 647
651 648 showTooltip(item.pageX, item.pageY, item.series.label + " on " + fd
652 649 +'<br/>'+
653 650 nr_commits + nr_commits_suffix+'<br/>'+
654 651 added + added_suffix +'<br/>'+
655 652 changed + changed_suffix + '<br/>'+
656 653 removed + removed_suffix + '<br/>');
657 654 }
658 655 }
659 656 else {
660 657 var tooltip = YUD.get("tooltip");
661 658
662 659 if(tooltip) {
663 660 tooltip.parentNode.removeChild(tooltip);
664 661 }
665 662 previousPoint = null;
666 663 }
667 664 }
668 665
669 666 /**
670 667 * MAIN EXECUTION
671 668 */
672 669
673 670 var data = getDataAccordingToRanges(initial_ranges);
674 671 generateCheckboxes(data);
675 672
676 673 //main plot
677 674 var plot = YAHOO.widget.Flot(plotContainer,data,plot_options);
678 675
679 676 //overview
680 677 var overview = YAHOO.widget.Flot(overviewContainer,
681 678 overview_dataset, overview_options);
682 679
683 680 //show initial selection on overview
684 681 overview.setSelection(initial_ranges);
685 682
686 683 plot.subscribe("plotselected", plotselected);
687 684 plot.subscribe("plothover", plothover)
688 685
689 686 overview.subscribe("plotselected", function (ranges) {
690 687 plot.setSelection(ranges);
691 688 });
692 689
693 690 // user choices on overview
694 691 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, initial_ranges]);
695 692 }
696 693 SummaryPlot(${c.ts_min},${c.ts_max},${c.commit_data|n},${c.overview_data|n});
697 694 </script>
698 695 %endif
699 696
700 697 </%def>
General Comments 0
You need to be logged in to leave comments. Login now