##// END OF EJS Templates
labels for users in "commit activity"
Vladislav Poluhin -
r1921:4237cae4 beta
parent child Browse files
Show More
@@ -1,698 +1,700 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;
455 456 choiceContainerTable.innerHTML += '<tr><td>'+
456 '<input type="checkbox" name="' + data[pos].label +'" checked="checked" />'
457 +data[pos].label+
458 '</td></tr>';
457 '<input type="checkbox" id="id_user_' + l + '" name="' + l +'" checked="checked" />' +
458 '<label for="id_user_' + l + '">' + l + '</label></td></tr>';
459 459 }
460 460 }
461
462 console.log(data);
461 463 }
462 464
463 465 /**
464 466 * ToolTip show
465 467 */
466 468 function showTooltip(x, y, contents) {
467 469 var div=document.getElementById('tooltip');
468 470 if(!div) {
469 471 div = document.createElement('div');
470 472 div.id="tooltip";
471 473 div.style.position="absolute";
472 474 div.style.border='1px solid #fdd';
473 475 div.style.padding='2px';
474 476 div.style.backgroundColor='#fee';
475 477 document.body.appendChild(div);
476 478 }
477 479 YUD.setStyle(div, 'opacity', 0);
478 480 div.innerHTML = contents;
479 481 div.style.top=(y + 5) + "px";
480 482 div.style.left=(x + 5) + "px";
481 483
482 484 var anim = new YAHOO.util.Anim(div, {opacity: {to: 0.8}}, 0.2);
483 485 anim.animate();
484 486 }
485 487
486 488 /**
487 489 * This function will detect if selected period has some changesets
488 490 for this user if it does this data is then pushed for displaying
489 491 Additionally it will only display users that are selected by the checkbox
490 492 */
491 493 function getDataAccordingToRanges(ranges) {
492 494
493 495 var data = [];
494 496 var new_dataset = {};
495 497 var keys = [];
496 498 var max_commits = 0;
497 499 for(var key in dataset){
498 500
499 501 for(var ds in dataset[key].data){
500 502 commit_data = dataset[key].data[ds];
501 503 if (commit_data.time >= ranges.xaxis.from && commit_data.time <= ranges.xaxis.to){
502 504
503 505 if(new_dataset[key] === undefined){
504 506 new_dataset[key] = {data:[],schema:["commits"],label:key};
505 507 }
506 508 new_dataset[key].data.push(commit_data);
507 509 }
508 510 }
509 511 if (new_dataset[key] !== undefined){
510 512 data.push(new_dataset[key]);
511 513 }
512 514 }
513 515
514 516 if (data.length > 0){
515 517 return data;
516 518 }
517 519 else{
518 520 //just return dummy data for graph to plot itself
519 521 return [getDummyData('')];
520 522 }
521 523 }
522 524
523 525 /**
524 526 * redraw using new checkbox data
525 527 */
526 528 function plotchoiced(e,args){
527 529 var cur_data = args[0];
528 530 var cur_ranges = args[1];
529 531
530 532 var new_data = [];
531 533 var inputs = choiceContainer.getElementsByTagName("input");
532 534
533 535 //show only checked labels
534 536 for(var i=0; i<inputs.length; i++) {
535 537 var checkbox_key = inputs[i].name;
536 538
537 539 if(inputs[i].checked){
538 540 for(var d in cur_data){
539 541 if(cur_data[d].label == checkbox_key){
540 542 new_data.push(cur_data[d]);
541 543 }
542 544 }
543 545 }
544 546 else{
545 547 //push dummy data to not hide the label
546 548 new_data.push(getDummyData(checkbox_key));
547 549 }
548 550 }
549 551
550 552 var new_options = YAHOO.lang.merge(plot_options, {
551 553 xaxis: {
552 554 min: cur_ranges.xaxis.from,
553 555 max: cur_ranges.xaxis.to,
554 556 mode:"time",
555 557 timeformat: "%d/%m",
556 558 },
557 559 });
558 560 if (!new_data){
559 561 new_data = [[0,1]];
560 562 }
561 563 // do the zooming
562 564 plot = YAHOO.widget.Flot(plotContainer, new_data, new_options);
563 565
564 566 plot.subscribe("plotselected", plotselected);
565 567
566 568 //resubscribe plothover
567 569 plot.subscribe("plothover", plothover);
568 570
569 571 // don't fire event on the overview to prevent eternal loop
570 572 overview.setSelection(cur_ranges, true);
571 573
572 574 }
573 575
574 576 /**
575 577 * plot only selected items from overview
576 578 * @param ranges
577 579 * @returns
578 580 */
579 581 function plotselected(ranges,cur_data) {
580 582 //updates the data for new plot
581 583 var data = getDataAccordingToRanges(ranges);
582 584 generateCheckboxes(data);
583 585
584 586 var new_options = YAHOO.lang.merge(plot_options, {
585 587 xaxis: {
586 588 min: ranges.xaxis.from,
587 589 max: ranges.xaxis.to,
588 590 mode:"time",
589 591 timeformat: "%d/%m",
590 592 },
591 593 });
592 594 // do the zooming
593 595 plot = YAHOO.widget.Flot(plotContainer, data, new_options);
594 596
595 597 plot.subscribe("plotselected", plotselected);
596 598
597 599 //resubscribe plothover
598 600 plot.subscribe("plothover", plothover);
599 601
600 602 // don't fire event on the overview to prevent eternal loop
601 603 overview.setSelection(ranges, true);
602 604
603 605 //resubscribe choiced
604 606 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, ranges]);
605 607 }
606 608
607 609 var previousPoint = null;
608 610
609 611 function plothover(o) {
610 612 var pos = o.pos;
611 613 var item = o.item;
612 614
613 615 //YUD.get("x").innerHTML = pos.x.toFixed(2);
614 616 //YUD.get("y").innerHTML = pos.y.toFixed(2);
615 617 if (item) {
616 618 if (previousPoint != item.datapoint) {
617 619 previousPoint = item.datapoint;
618 620
619 621 var tooltip = YUD.get("tooltip");
620 622 if(tooltip) {
621 623 tooltip.parentNode.removeChild(tooltip);
622 624 }
623 625 var x = item.datapoint.x.toFixed(2);
624 626 var y = item.datapoint.y.toFixed(2);
625 627
626 628 if (!item.series.label){
627 629 item.series.label = 'commits';
628 630 }
629 631 var d = new Date(x*1000);
630 632 var fd = d.toDateString()
631 633 var nr_commits = parseInt(y);
632 634
633 635 var cur_data = dataset[item.series.label].data[item.dataIndex];
634 636 var added = cur_data.added;
635 637 var changed = cur_data.changed;
636 638 var removed = cur_data.removed;
637 639
638 640 var nr_commits_suffix = " ${_('commits')} ";
639 641 var added_suffix = " ${_('files added')} ";
640 642 var changed_suffix = " ${_('files changed')} ";
641 643 var removed_suffix = " ${_('files removed')} ";
642 644
643 645
644 646 if(nr_commits == 1){nr_commits_suffix = " ${_('commit')} ";}
645 647 if(added==1){added_suffix=" ${_('file added')} ";}
646 648 if(changed==1){changed_suffix=" ${_('file changed')} ";}
647 649 if(removed==1){removed_suffix=" ${_('file removed')} ";}
648 650
649 651 showTooltip(item.pageX, item.pageY, item.series.label + " on " + fd
650 652 +'<br/>'+
651 653 nr_commits + nr_commits_suffix+'<br/>'+
652 654 added + added_suffix +'<br/>'+
653 655 changed + changed_suffix + '<br/>'+
654 656 removed + removed_suffix + '<br/>');
655 657 }
656 658 }
657 659 else {
658 660 var tooltip = YUD.get("tooltip");
659 661
660 662 if(tooltip) {
661 663 tooltip.parentNode.removeChild(tooltip);
662 664 }
663 665 previousPoint = null;
664 666 }
665 667 }
666 668
667 669 /**
668 670 * MAIN EXECUTION
669 671 */
670 672
671 673 var data = getDataAccordingToRanges(initial_ranges);
672 674 generateCheckboxes(data);
673 675
674 676 //main plot
675 677 var plot = YAHOO.widget.Flot(plotContainer,data,plot_options);
676 678
677 679 //overview
678 680 var overview = YAHOO.widget.Flot(overviewContainer,
679 681 overview_dataset, overview_options);
680 682
681 683 //show initial selection on overview
682 684 overview.setSelection(initial_ranges);
683 685
684 686 plot.subscribe("plotselected", plotselected);
685 687 plot.subscribe("plothover", plothover)
686 688
687 689 overview.subscribe("plotselected", function (ranges) {
688 690 plot.setSelection(ranges);
689 691 });
690 692
691 693 // user choices on overview
692 694 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, initial_ranges]);
693 695 }
694 696 SummaryPlot(${c.ts_min},${c.ts_max},${c.commit_data|n},${c.overview_data|n});
695 697 </script>
696 698 %endif
697 699
698 700 </%def>
General Comments 0
You need to be logged in to leave comments. Login now