##// END OF EJS Templates
Small addition to render the Download button translatable.
Vincent Duvert -
r2415:b9abef8d beta
parent child Browse files
Show More
@@ -1,698 +1,698
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 h.is_hg(c.dbrepo):
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 h.is_git(c.dbrepo):
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 <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>
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 17px;">
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 ${_('Stats gathered: ')} ${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 id="readme" class="box header-pos-fix" style="background-color: #FAFAFA">
224 224 <div id="readme" 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 id="readme" 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 for (var i=0;i<data.length;i++){
303 303 total+= data[i][1].count;
304 304 }
305 305 for (var i=0;i<data.length;i++){
306 306 cnt += 1;
307 307 no_data = false;
308 308
309 309 var hide = cnt>2;
310 310 var tr = document.createElement('tr');
311 311 if (hide){
312 312 tr.setAttribute('style','display:none');
313 313 tr.setAttribute('class','stats_hidden');
314 314 }
315 315 var k = data[i][0];
316 316 var obj = data[i][1];
317 317 var percentage = Math.round((obj.count/total*100),2);
318 318
319 319 var td1 = document.createElement('td');
320 320 td1.width = 150;
321 321 var trending_language_label = document.createElement('div');
322 322 trending_language_label.innerHTML = obj.desc+" ("+k+")";
323 323 td1.appendChild(trending_language_label);
324 324
325 325 var td2 = document.createElement('td');
326 326 td2.setAttribute('style','padding-right:14px !important');
327 327 var trending_language = document.createElement('div');
328 328 var nr_files = obj.count+" ${_('files')}";
329 329
330 330 trending_language.title = k+" "+nr_files;
331 331
332 332 if (percentage>22){
333 333 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"% "+nr_files+ "</b>";
334 334 }
335 335 else{
336 336 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"%</b>";
337 337 }
338 338
339 339 trending_language.setAttribute("class", 'trending_language top-right-rounded-corner bottom-right-rounded-corner');
340 340 trending_language.style.width=percentage+"%";
341 341 td2.appendChild(trending_language);
342 342
343 343 tr.appendChild(td1);
344 344 tr.appendChild(td2);
345 345 tbl.appendChild(tr);
346 346 if(cnt == 3){
347 347 var show_more = document.createElement('tr');
348 348 var td = document.createElement('td');
349 349 lnk = document.createElement('a');
350 350
351 351 lnk.href='#';
352 352 lnk.innerHTML = "${_('show more')}";
353 353 lnk.id='code_stats_show_more';
354 354 td.appendChild(lnk);
355 355
356 356 show_more.appendChild(td);
357 357 show_more.appendChild(document.createElement('td'));
358 358 tbl.appendChild(show_more);
359 359 }
360 360
361 361 }
362 362
363 363 YUD.get('lang_stats').appendChild(tbl);
364 364 YUE.on('code_stats_show_more','click',function(){
365 365 l = YUD.getElementsByClassName('stats_hidden')
366 366 for (e in l){
367 367 YUD.setStyle(l[e],'display','');
368 368 };
369 369 YUD.setStyle(YUD.get('code_stats_show_more'),
370 370 'display','none');
371 371 });
372 372 </script>
373 373 <script type="text/javascript">
374 374 /**
375 375 * Plots summary graph
376 376 *
377 377 * @class SummaryPlot
378 378 * @param {from} initial from for detailed graph
379 379 * @param {to} initial to for detailed graph
380 380 * @param {dataset}
381 381 * @param {overview_dataset}
382 382 */
383 383 function SummaryPlot(from,to,dataset,overview_dataset) {
384 384 var initial_ranges = {
385 385 "xaxis":{
386 386 "from":from,
387 387 "to":to,
388 388 },
389 389 };
390 390 var dataset = dataset;
391 391 var overview_dataset = [overview_dataset];
392 392 var choiceContainer = YUD.get("legend_choices");
393 393 var choiceContainerTable = YUD.get("legend_choices_tables");
394 394 var plotContainer = YUD.get('commit_history');
395 395 var overviewContainer = YUD.get('overview');
396 396
397 397 var plot_options = {
398 398 bars: {show:true,align:'center',lineWidth:4},
399 399 legend: {show:true, container:"legend_container"},
400 400 points: {show:true,radius:0,fill:false},
401 401 yaxis: {tickDecimals:0,},
402 402 xaxis: {
403 403 mode: "time",
404 404 timeformat: "%d/%m",
405 405 min:from,
406 406 max:to,
407 407 },
408 408 grid: {
409 409 hoverable: true,
410 410 clickable: true,
411 411 autoHighlight:true,
412 412 color: "#999"
413 413 },
414 414 //selection: {mode: "x"}
415 415 };
416 416 var overview_options = {
417 417 legend:{show:false},
418 418 bars: {show:true,barWidth: 2,},
419 419 shadowSize: 0,
420 420 xaxis: {mode: "time", timeformat: "%d/%m/%y",},
421 421 yaxis: {ticks: 3, min: 0,tickDecimals:0,},
422 422 grid: {color: "#999",},
423 423 selection: {mode: "x"}
424 424 };
425 425
426 426 /**
427 427 *get dummy data needed in few places
428 428 */
429 429 function getDummyData(label){
430 430 return {"label":label,
431 431 "data":[{"time":0,
432 432 "commits":0,
433 433 "added":0,
434 434 "changed":0,
435 435 "removed":0,
436 436 }],
437 437 "schema":["commits"],
438 438 "color":'#ffffff',
439 439 }
440 440 }
441 441
442 442 /**
443 443 * generate checkboxes accordindly to data
444 444 * @param keys
445 445 * @returns
446 446 */
447 447 function generateCheckboxes(data) {
448 448 //append checkboxes
449 449 var i = 0;
450 450 choiceContainerTable.innerHTML = '';
451 451 for(var pos in data) {
452 452
453 453 data[pos].color = i;
454 454 i++;
455 455 if(data[pos].label != ''){
456 456 choiceContainerTable.innerHTML +=
457 457 '<tr><td><input type="checkbox" id="id_user_{0}" name="{0}" checked="checked" /> \
458 458 <label for="id_user_{0}">{0}</label></td></tr>'.format(data[pos].label);
459 459 }
460 460 }
461 461 }
462 462
463 463 /**
464 464 * ToolTip show
465 465 */
466 466 function showTooltip(x, y, contents) {
467 467 var div=document.getElementById('tooltip');
468 468 if(!div) {
469 469 div = document.createElement('div');
470 470 div.id="tooltip";
471 471 div.style.position="absolute";
472 472 div.style.border='1px solid #fdd';
473 473 div.style.padding='2px';
474 474 div.style.backgroundColor='#fee';
475 475 document.body.appendChild(div);
476 476 }
477 477 YUD.setStyle(div, 'opacity', 0);
478 478 div.innerHTML = contents;
479 479 div.style.top=(y + 5) + "px";
480 480 div.style.left=(x + 5) + "px";
481 481
482 482 var anim = new YAHOO.util.Anim(div, {opacity: {to: 0.8}}, 0.2);
483 483 anim.animate();
484 484 }
485 485
486 486 /**
487 487 * This function will detect if selected period has some changesets
488 488 for this user if it does this data is then pushed for displaying
489 489 Additionally it will only display users that are selected by the checkbox
490 490 */
491 491 function getDataAccordingToRanges(ranges) {
492 492
493 493 var data = [];
494 494 var new_dataset = {};
495 495 var keys = [];
496 496 var max_commits = 0;
497 497 for(var key in dataset){
498 498
499 499 for(var ds in dataset[key].data){
500 500 commit_data = dataset[key].data[ds];
501 501 if (commit_data.time >= ranges.xaxis.from && commit_data.time <= ranges.xaxis.to){
502 502
503 503 if(new_dataset[key] === undefined){
504 504 new_dataset[key] = {data:[],schema:["commits"],label:key};
505 505 }
506 506 new_dataset[key].data.push(commit_data);
507 507 }
508 508 }
509 509 if (new_dataset[key] !== undefined){
510 510 data.push(new_dataset[key]);
511 511 }
512 512 }
513 513
514 514 if (data.length > 0){
515 515 return data;
516 516 }
517 517 else{
518 518 //just return dummy data for graph to plot itself
519 519 return [getDummyData('')];
520 520 }
521 521 }
522 522
523 523 /**
524 524 * redraw using new checkbox data
525 525 */
526 526 function plotchoiced(e,args){
527 527 var cur_data = args[0];
528 528 var cur_ranges = args[1];
529 529
530 530 var new_data = [];
531 531 var inputs = choiceContainer.getElementsByTagName("input");
532 532
533 533 //show only checked labels
534 534 for(var i=0; i<inputs.length; i++) {
535 535 var checkbox_key = inputs[i].name;
536 536
537 537 if(inputs[i].checked){
538 538 for(var d in cur_data){
539 539 if(cur_data[d].label == checkbox_key){
540 540 new_data.push(cur_data[d]);
541 541 }
542 542 }
543 543 }
544 544 else{
545 545 //push dummy data to not hide the label
546 546 new_data.push(getDummyData(checkbox_key));
547 547 }
548 548 }
549 549
550 550 var new_options = YAHOO.lang.merge(plot_options, {
551 551 xaxis: {
552 552 min: cur_ranges.xaxis.from,
553 553 max: cur_ranges.xaxis.to,
554 554 mode:"time",
555 555 timeformat: "%d/%m",
556 556 },
557 557 });
558 558 if (!new_data){
559 559 new_data = [[0,1]];
560 560 }
561 561 // do the zooming
562 562 plot = YAHOO.widget.Flot(plotContainer, new_data, new_options);
563 563
564 564 plot.subscribe("plotselected", plotselected);
565 565
566 566 //resubscribe plothover
567 567 plot.subscribe("plothover", plothover);
568 568
569 569 // don't fire event on the overview to prevent eternal loop
570 570 overview.setSelection(cur_ranges, true);
571 571
572 572 }
573 573
574 574 /**
575 575 * plot only selected items from overview
576 576 * @param ranges
577 577 * @returns
578 578 */
579 579 function plotselected(ranges,cur_data) {
580 580 //updates the data for new plot
581 581 var data = getDataAccordingToRanges(ranges);
582 582 generateCheckboxes(data);
583 583
584 584 var new_options = YAHOO.lang.merge(plot_options, {
585 585 xaxis: {
586 586 min: ranges.xaxis.from,
587 587 max: ranges.xaxis.to,
588 588 mode:"time",
589 589 timeformat: "%d/%m",
590 590 },
591 591 });
592 592 // do the zooming
593 593 plot = YAHOO.widget.Flot(plotContainer, data, new_options);
594 594
595 595 plot.subscribe("plotselected", plotselected);
596 596
597 597 //resubscribe plothover
598 598 plot.subscribe("plothover", plothover);
599 599
600 600 // don't fire event on the overview to prevent eternal loop
601 601 overview.setSelection(ranges, true);
602 602
603 603 //resubscribe choiced
604 604 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, ranges]);
605 605 }
606 606
607 607 var previousPoint = null;
608 608
609 609 function plothover(o) {
610 610 var pos = o.pos;
611 611 var item = o.item;
612 612
613 613 //YUD.get("x").innerHTML = pos.x.toFixed(2);
614 614 //YUD.get("y").innerHTML = pos.y.toFixed(2);
615 615 if (item) {
616 616 if (previousPoint != item.datapoint) {
617 617 previousPoint = item.datapoint;
618 618
619 619 var tooltip = YUD.get("tooltip");
620 620 if(tooltip) {
621 621 tooltip.parentNode.removeChild(tooltip);
622 622 }
623 623 var x = item.datapoint.x.toFixed(2);
624 624 var y = item.datapoint.y.toFixed(2);
625 625
626 626 if (!item.series.label){
627 627 item.series.label = 'commits';
628 628 }
629 629 var d = new Date(x*1000);
630 630 var fd = d.toDateString()
631 631 var nr_commits = parseInt(y);
632 632
633 633 var cur_data = dataset[item.series.label].data[item.dataIndex];
634 634 var added = cur_data.added;
635 635 var changed = cur_data.changed;
636 636 var removed = cur_data.removed;
637 637
638 638 var nr_commits_suffix = " ${_('commits')} ";
639 639 var added_suffix = " ${_('files added')} ";
640 640 var changed_suffix = " ${_('files changed')} ";
641 641 var removed_suffix = " ${_('files removed')} ";
642 642
643 643
644 644 if(nr_commits == 1){nr_commits_suffix = " ${_('commit')} ";}
645 645 if(added==1){added_suffix=" ${_('file added')} ";}
646 646 if(changed==1){changed_suffix=" ${_('file changed')} ";}
647 647 if(removed==1){removed_suffix=" ${_('file removed')} ";}
648 648
649 649 showTooltip(item.pageX, item.pageY, item.series.label + " on " + fd
650 650 +'<br/>'+
651 651 nr_commits + nr_commits_suffix+'<br/>'+
652 652 added + added_suffix +'<br/>'+
653 653 changed + changed_suffix + '<br/>'+
654 654 removed + removed_suffix + '<br/>');
655 655 }
656 656 }
657 657 else {
658 658 var tooltip = YUD.get("tooltip");
659 659
660 660 if(tooltip) {
661 661 tooltip.parentNode.removeChild(tooltip);
662 662 }
663 663 previousPoint = null;
664 664 }
665 665 }
666 666
667 667 /**
668 668 * MAIN EXECUTION
669 669 */
670 670
671 671 var data = getDataAccordingToRanges(initial_ranges);
672 672 generateCheckboxes(data);
673 673
674 674 //main plot
675 675 var plot = YAHOO.widget.Flot(plotContainer,data,plot_options);
676 676
677 677 //overview
678 678 var overview = YAHOO.widget.Flot(overviewContainer,
679 679 overview_dataset, overview_options);
680 680
681 681 //show initial selection on overview
682 682 overview.setSelection(initial_ranges);
683 683
684 684 plot.subscribe("plotselected", plotselected);
685 685 plot.subscribe("plothover", plothover)
686 686
687 687 overview.subscribe("plotselected", function (ranges) {
688 688 plot.setSelection(ranges);
689 689 });
690 690
691 691 // user choices on overview
692 692 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, initial_ranges]);
693 693 }
694 694 SummaryPlot(${c.ts_min},${c.ts_max},${c.commit_data|n},${c.overview_data|n});
695 695 </script>
696 696 %endif
697 697
698 698 </%def>
General Comments 0
You need to be logged in to leave comments. Login now