summary.html
507 lines
| 15.5 KiB
| text/html
|
HtmlLexer
r183 | <%inherit file="/base/base.html"/> | ||
r362 | |||
r183 | <%def name="title()"> | ||
r362 | ${_('Mercurial Repository Overview')} | ||
r183 | </%def> | ||
r362 | |||
<%def name="breadcrumbs_links()"> | |||
r183 | ${h.link_to(u'Home',h.url('/'))} | ||
r362 | » | ||
r183 | ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} | ||
r362 | » | ||
r183 | ${_('summary')} | ||
</%def> | |||
r362 | |||
r183 | <%def name="page_nav()"> | ||
r189 | ${self.menu('summary')} | ||
r183 | </%def> | ||
r219 | |||
r362 | <%def name="main()"> | ||
r219 | <script type="text/javascript"> | ||
var E = YAHOO.util.Event; | |||
var D = YAHOO.util.Dom; | |||
E.onDOMReady(function(e){ | |||
id = 'clone_url'; | |||
r362 | E.addListener(id,'click',function(e){ | ||
D.get('clone_url').select(); | |||
}) | |||
r219 | }) | ||
</script> | |||
r362 | <div class="box box-left"> | ||
<!-- box / title --> | |||
<div class="title"> | |||
${self.breadcrumbs()} | |||
</div> | |||
<!-- end box / title --> | |||
<div class="form"> | |||
<div class="fields"> | |||
<div class="field"> | |||
<div class="label"> | |||
<label>${_('Name')}:</label> | |||
</div> | |||
<div class="input-short"> | |||
r447 | <span style="font-size: 1.6em;font-weight: bold">${c.repo_info.name}</span> | ||
r362 | </div> | ||
</div> | |||
<div class="field"> | |||
<div class="label"> | |||
<label>${_('Description')}:</label> | |||
</div> | |||
<div class="input-short"> | |||
${c.repo_info.description} | |||
</div> | |||
</div> | |||
<div class="field"> | |||
<div class="label"> | |||
<label>${_('Contact')}:</label> | |||
</div> | |||
<div class="input-short"> | |||
r400 | <div class="gravatar"> | ||
<img alt="gravatar" src="${h.gravatar_url(c.repo_info.dbrepo.user.email)}"/> | |||
</div> | |||
${_('Username')}: ${c.repo_info.dbrepo.user.username}<br/> | |||
${_('Name')}: ${c.repo_info.dbrepo.user.name} ${c.repo_info.dbrepo.user.lastname}<br/> | |||
${_('Email')}: <a href="mailto:${c.repo_info.dbrepo.user.email}">${c.repo_info.dbrepo.user.email}</a> | |||
r362 | </div> | ||
</div> | |||
<div class="field"> | |||
<div class="label"> | |||
<label>${_('Last change')}:</label> | |||
</div> | |||
<div class="input-short"> | |||
r487 | ${h.age(c.repo_info.last_change)} - ${h.rfc822date(c.repo_info.last_change)} | ||
r489 | ${_('by')} ${h.get_changeset_safe(c.repo_info,'tip').author} | ||
r487 | |||
r362 | </div> | ||
</div> | |||
<div class="field"> | |||
<div class="label"> | |||
<label>${_('Clone url')}:</label> | |||
</div> | |||
<div class="input-short"> | |||
r409 | <input type="text" id="clone_url" readonly="readonly" value="hg clone ${c.clone_repo_url}" size="70"/> | ||
r362 | </div> | ||
</div> | |||
<div class="field"> | |||
<div class="label"> | |||
<label>${_('Download')}:</label> | |||
</div> | |||
<div class="input-short"> | |||
%for cnt,archive in enumerate(c.repo_info._get_archives()): | |||
%if cnt >=1: | |||
| | |||
%endif | |||
${h.link_to(c.repo_info.name+'.'+archive['type'], | |||
h.url('files_archive_home',repo_name=c.repo_info.name, | |||
revision='tip',fileformat=archive['extension']),class_="archive_icon")} | |||
%endfor | |||
</div> | |||
</div> | |||
<div class="field"> | |||
<div class="label"> | |||
<label>${_('Feeds')}:</label> | |||
</div> | |||
<div class="input-short"> | |||
${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.repo_info.name),class_='rss_icon')} | |||
${h.link_to(_('Atom'),h.url('atom_feed_home',repo_name=c.repo_info.name),class_='atom_icon')} | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
r410 | <div class="box box-right" style="min-height:455px"> | ||
r362 | <!-- box / title --> | ||
<div class="title"> | |||
r493 | <h5>${_('Commit activity by day / author')}</h5> | ||
r362 | </div> | ||
<div class="table"> | |||
r410 | <div id="commit_history" style="width:560px;height:300px;float:left"></div> | ||
r486 | <div style="clear: both;height: 10px"></div> | ||
<div id="overview" style="width:560px;height:100px;float:left"></div> | |||
<div id="legend_data" style="clear:both;margin-top:10px;"> | |||
r362 | <div id="legend_container"></div> | ||
<div id="legend_choices"> | |||
r379 | <table id="legend_choices_tables" style="font-size:smaller;color:#545454"></table> | ||
r362 | </div> | ||
</div> | |||
<script type="text/javascript"> | |||
r487 | /** | ||
* Plots summary graph | |||
* | |||
* @class SummaryPlot | |||
* @param {from} initial from for detailed graph | |||
* @param {to} initial to for detailed graph | |||
* @param {dataset} | |||
* @param {overview_dataset} | |||
*/ | |||
function SummaryPlot(from,to,dataset,overview_dataset) { | |||
var initial_ranges = { | |||
"xaxis":{ | |||
"from":from, | |||
"to":to, | |||
}, | |||
}; | |||
var dataset = dataset; | |||
var overview_dataset = [overview_dataset]; | |||
r362 | var choiceContainer = YAHOO.util.Dom.get("legend_choices"); | ||
var choiceContainerTable = YAHOO.util.Dom.get("legend_choices_tables"); | |||
r487 | var plotContainer = YAHOO.util.Dom.get('commit_history'); | ||
var overviewContainer = YAHOO.util.Dom.get('overview'); | |||
var plot_options = { | |||
bars: {show:true,align:'center',lineWidth:4}, | |||
legend: {show:true, container:"legend_container"}, | |||
points: {show:true,radius:0,fill:false}, | |||
yaxis: {tickDecimals:0,}, | |||
xaxis: { | |||
mode: "time", | |||
timeformat: "%d/%m", | |||
min:from, | |||
max:to, | |||
}, | |||
grid: { | |||
hoverable: true, | |||
clickable: true, | |||
autoHighlight:true, | |||
color: "#999" | |||
}, | |||
//selection: {mode: "x"} | |||
r362 | }; | ||
r487 | var overview_options = { | ||
legend:{show:false}, | |||
bars: {show:true,barWidth: 2,}, | |||
shadowSize: 0, | |||
xaxis: {mode: "time", timeformat: "%d/%m/%y",}, | |||
yaxis: {ticks: 3, min: 0,}, | |||
grid: {color: "#999",}, | |||
selection: {mode: "x"} | |||
}; | |||
r410 | |||
r487 | /** | ||
*get dummy data needed in few places | |||
*/ | |||
function getDummyData(label){ | |||
return {"label":label, | |||
"data":[{"time":0, | |||
"commits":0, | |||
"added":0, | |||
"changed":0, | |||
"removed":0, | |||
}], | |||
"schema":["commits"], | |||
"color":'#ffffff', | |||
} | |||
} | |||
/** | |||
* generate checkboxes accordindly to data | |||
* @param keys | |||
* @returns | |||
*/ | |||
function generateCheckboxes(data) { | |||
//append checkboxes | |||
var i = 0; | |||
choiceContainerTable.innerHTML = ''; | |||
for(var pos in data) { | |||
data[pos].color = i; | |||
i++; | |||
if(data[pos].label != ''){ | |||
choiceContainerTable.innerHTML += '<tr><td>'+ | |||
'<input type="checkbox" name="' + data[pos].label +'" checked="checked" />' | |||
+data[pos].label+ | |||
'</td></tr>'; | |||
} | |||
} | |||
} | |||
/** | |||
* ToolTip show | |||
*/ | |||
function showTooltip(x, y, contents) { | |||
var div=document.getElementById('tooltip'); | |||
if(!div) { | |||
div = document.createElement('div'); | |||
div.id="tooltip"; | |||
div.style.position="absolute"; | |||
div.style.border='1px solid #fdd'; | |||
div.style.padding='2px'; | |||
div.style.backgroundColor='#fee'; | |||
document.body.appendChild(div); | |||
} | |||
YAHOO.util.Dom.setStyle(div, 'opacity', 0); | |||
div.innerHTML = contents; | |||
div.style.top=(y + 5) + "px"; | |||
div.style.left=(x + 5) + "px"; | |||
r486 | |||
r487 | var anim = new YAHOO.util.Anim(div, {opacity: {to: 0.8}}, 0.2); | ||
anim.animate(); | |||
} | |||
/** | |||
* This function will detect if selected period has some changesets for this user | |||
if it does this data is then pushed for displaying | |||
Additionally it will only display users that are selected by the checkbox | |||
*/ | |||
function getDataAccordingToRanges(ranges) { | |||
var data = []; | |||
var keys = []; | |||
for(var key in dataset){ | |||
var push = false; | |||
//method1 slow !! | |||
///* | |||
for(var ds in dataset[key].data){ | |||
commit_data = dataset[key].data[ds]; | |||
//console.log(key); | |||
//console.log(new Date(commit_data.time*1000)); | |||
//console.log(new Date(ranges.xaxis.from*1000)); | |||
//console.log(new Date(ranges.xaxis.to*1000)); | |||
if (commit_data.time >= ranges.xaxis.from && commit_data.time <= ranges.xaxis.to){ | |||
push = true; | |||
break; | |||
} | |||
r362 | } | ||
r487 | //*/ | ||
/*//method2 sorted commit data !!! | |||
var first_commit = dataset[key].data[0].time; | |||
var last_commit = dataset[key].data[dataset[key].data.length-1].time; | |||
r486 | |||
r487 | console.log(first_commit); | ||
console.log(last_commit); | |||
if (first_commit >= ranges.xaxis.from && last_commit <= ranges.xaxis.to){ | |||
push = true; | |||
} | |||
*/ | |||
if(push){ | |||
data.push(dataset[key]); | |||
} | |||
} | |||
if(data.length >= 1){ | |||
return data; | |||
} | |||
else{ | |||
//just return dummy data for graph to plot itself | |||
return [getDummyData('')]; | |||
} | |||
} | |||
/** | |||
* redraw using new checkbox data | |||
*/ | |||
function plotchoiced(e,args){ | |||
var cur_data = args[0]; | |||
var cur_ranges = args[1]; | |||
var new_data = []; | |||
var inputs = choiceContainer.getElementsByTagName("input"); | |||
r486 | |||
r487 | //show only checked labels | ||
for(var i=0; i<inputs.length; i++) { | |||
var checkbox_key = inputs[i].name; | |||
if(inputs[i].checked){ | |||
for(var d in cur_data){ | |||
if(cur_data[d].label == checkbox_key){ | |||
new_data.push(cur_data[d]); | |||
} | |||
} | |||
} | |||
else{ | |||
//push dummy data to not hide the label | |||
new_data.push(getDummyData(checkbox_key)); | |||
} | |||
} | |||
var new_options = YAHOO.lang.merge(plot_options, { | |||
xaxis: { | |||
min: cur_ranges.xaxis.from, | |||
max: cur_ranges.xaxis.to, | |||
mode:"time", | |||
timeformat: "%d/%m", | |||
} | |||
}); | |||
if (!new_data){ | |||
new_data = [[0,1]]; | |||
} | |||
// do the zooming | |||
plot = YAHOO.widget.Flot(plotContainer, new_data, new_options); | |||
plot.subscribe("plotselected", plotselected); | |||
//resubscribe plothover | |||
plot.subscribe("plothover", plothover); | |||
// don't fire event on the overview to prevent eternal loop | |||
overview.setSelection(cur_ranges, true); | |||
} | |||
/** | |||
* plot only selected items from overview | |||
* @param ranges | |||
* @returns | |||
*/ | |||
function plotselected(ranges,cur_data) { | |||
//updates the data for new plot | |||
data = getDataAccordingToRanges(ranges); | |||
generateCheckboxes(data); | |||
var new_options = YAHOO.lang.merge(plot_options, { | |||
xaxis: { | |||
min: ranges.xaxis.from, | |||
max: ranges.xaxis.to, | |||
mode:"time", | |||
timeformat: "%d/%m", | |||
} | |||
}); | |||
// do the zooming | |||
plot = YAHOO.widget.Flot(plotContainer, data, new_options); | |||
plot.subscribe("plotselected", plotselected); | |||
//resubscribe plothover | |||
plot.subscribe("plothover", plothover); | |||
// don't fire event on the overview to prevent eternal loop | |||
overview.setSelection(ranges, true); | |||
//resubscribe choiced | |||
YAHOO.util.Event.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, ranges]); | |||
} | |||
var previousPoint = null; | |||
r410 | |||
r487 | function plothover(o) { | ||
var pos = o.pos; | |||
var item = o.item; | |||
//YAHOO.util.Dom.get("x").innerHTML = pos.x.toFixed(2); | |||
//YAHOO.util.Dom.get("y").innerHTML = pos.y.toFixed(2); | |||
if (item) { | |||
if (previousPoint != item.datapoint) { | |||
previousPoint = item.datapoint; | |||
var tooltip = YAHOO.util.Dom.get("tooltip"); | |||
if(tooltip) { | |||
tooltip.parentNode.removeChild(tooltip); | |||
r362 | } | ||
r487 | var x = item.datapoint.x.toFixed(2); | ||
var y = item.datapoint.y.toFixed(2); | |||
if (!item.series.label){ | |||
item.series.label = 'commits'; | |||
r362 | } | ||
r487 | var d = new Date(x*1000); | ||
var fd = d.toDateString() | |||
var nr_commits = parseInt(y); | |||
var cur_data = dataset[item.series.label].data[item.dataIndex]; | |||
var added = cur_data.added; | |||
var changed = cur_data.changed; | |||
var removed = cur_data.removed; | |||
var nr_commits_suffix = " ${_('commits')} "; | |||
var added_suffix = " ${_('files added')} "; | |||
var changed_suffix = " ${_('files changed')} "; | |||
var removed_suffix = " ${_('files removed')} "; | |||
r183 | |||
r487 | |||
if(nr_commits == 1){nr_commits_suffix = " ${_('commit')} ";} | |||
if(added==1){added_suffix=" ${_('file added')} ";} | |||
if(changed==1){changed_suffix=" ${_('file changed')} ";} | |||
if(removed==1){removed_suffix=" ${_('file removed')} ";} | |||
showTooltip(item.pageX, item.pageY, item.series.label + " on " + fd | |||
+'<br/>'+ | |||
nr_commits + nr_commits_suffix+'<br/>'+ | |||
added + added_suffix +'<br/>'+ | |||
changed + changed_suffix + '<br/>'+ | |||
removed + removed_suffix + '<br/>'); | |||
} | |||
} | |||
else { | |||
var tooltip = YAHOO.util.Dom.get("tooltip"); | |||
if(tooltip) { | |||
tooltip.parentNode.removeChild(tooltip); | |||
} | |||
previousPoint = null; | |||
} | |||
r362 | } | ||
r487 | |||
/** | |||
* MAIN EXECUTION | |||
*/ | |||
var data = getDataAccordingToRanges(initial_ranges); | |||
generateCheckboxes(data); | |||
//main plot | |||
var plot = YAHOO.widget.Flot(plotContainer,data,plot_options); | |||
//overview | |||
var overview = YAHOO.widget.Flot(overviewContainer, overview_dataset, overview_options); | |||
//show initial selection on overview | |||
overview.setSelection(initial_ranges); | |||
plot.subscribe("plotselected", plotselected); | |||
overview.subscribe("plotselected", function (ranges) { | |||
plot.setSelection(ranges); | |||
}); | |||
plot.subscribe("plothover", plothover); | |||
r362 | |||
r487 | YAHOO.util.Event.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, initial_ranges]); | ||
} | |||
SummaryPlot(${c.ts_min},${c.ts_max},${c.commit_data|n},${c.overview_data|n}); | |||
</script> | |||
r362 | |||
</div> | |||
</div> | |||
<div class="box"> | |||
<div class="title"> | |||
<div class="breadcrumbs">${h.link_to(_('Last ten changes'),h.url('changelog_home',repo_name=c.repo_name))}</div> | |||
</div> | |||
<div class="table"> | |||
<%include file='../shortlog/shortlog_data.html'/> | |||
r410 | ${h.link_to(_('show more'),h.url('changelog_home',repo_name=c.repo_name))} | ||
r362 | </div> | ||
</div> | |||
<div class="box"> | |||
<div class="title"> | |||
<div class="breadcrumbs">${h.link_to(_('Last ten tags'),h.url('tags_home',repo_name=c.repo_name))}</div> | |||
</div> | |||
<div class="table"> | |||
<%include file='../tags/tags_data.html'/> | |||
r410 | ${h.link_to(_('show more'),h.url('tags_home',repo_name=c.repo_name))} | ||
r362 | </div> | ||
</div> | |||
<div class="box"> | |||
<div class="title"> | |||
<div class="breadcrumbs">${h.link_to(_('Last ten branches'),h.url('branches_home',repo_name=c.repo_name))}</div> | |||
</div> | |||
<div class="table"> | |||
<%include file='../branches/branches_data.html'/> | |||
r410 | ${h.link_to(_('show more'),h.url('branches_home',repo_name=c.repo_name))} | ||
r362 | </div> | ||
</div> | |||
r183 | |||
</%def> |