summary.html
739 lines
| 25.8 KiB
| text/html
|
HtmlLexer
r547 | <%inherit file="/base/base.html"/> | |||
<%def name="title()"> | ||||
|
r2417 | ${_('%s Summary') % c.repo_name} - ${c.rhodecode_name} | ||
r547 | </%def> | |||
<%def name="breadcrumbs_links()"> | ||||
|
r3532 | ${_('Summary')} | ||
r547 | </%def> | |||
<%def name="page_nav()"> | ||||
|
r3197 | ${self.menu('summary')} | ||
r547 | </%def> | |||
r2413 | <%def name="head_extra()"> | |||
<link href="${h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s ATOM feed') % c.repo_name}" type="application/atom+xml" /> | ||||
<link href="${h.url('rss_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s RSS feed') % c.repo_name}" type="application/rss+xml" /> | ||||
</%def> | ||||
r547 | <%def name="main()"> | |||
|
r3552 | ${self.context_bar('summary')} | ||
r1728 | <% | |||
summary = lambda n:{False:'summary-short'}.get(n) | ||||
%> | ||||
r1719 | %if c.show_stats: | |||
<div class="box box-left"> | ||||
%else: | ||||
<div class="box"> | ||||
%endif | ||||
r547 | <!-- box / title --> | |||
<div class="title"> | ||||
${self.breadcrumbs()} | ||||
</div> | ||||
<!-- end box / title --> | ||||
|
r3197 | <div class="form"> | ||
<div id="summary" class="fields"> | ||||
r1888 | ||||
|
r3197 | <div class="field"> | ||
<div class="label-summary"> | ||||
<label>${_('Name')}:</label> | ||||
</div> | ||||
<div class="input ${summary(c.show_stats)}"> | ||||
r2973 | ||||
r2932 | ## locking icon | |||
%if c.rhodecode_db_repo.enable_locking: | ||||
%if c.rhodecode_db_repo.locked[0]: | ||||
r2973 | <span class="locking_locked tooltip" title="${_('Repository locked by %s') % h.person_by_id(c.rhodecode_db_repo.locked[0])}"></span> | |||
r2932 | %else: | |||
<span class="locking_unlocked tooltip" title="${_('Repository unlocked')}"></span> | ||||
%endif | ||||
r2973 | %endif | |||
r1180 | ##REPO TYPE | |||
|
r3197 | %if h.is_hg(c.dbrepo): | ||
<img style="margin-bottom:2px" class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url('/images/icons/hgicon.png')}"/> | ||||
%endif | ||||
%if h.is_git(c.dbrepo): | ||||
<img style="margin-bottom:2px" class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url('/images/icons/giticon.png')}"/> | ||||
%endif | ||||
r1888 | ||||
##PUBLIC/PRIVATE | ||||
|
r3197 | %if c.dbrepo.private: | ||
<img style="margin-bottom:2px" class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="${h.url('/images/icons/lock.png')}"/> | ||||
%else: | ||||
<img style="margin-bottom:2px" class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="${h.url('/images/icons/lock_open.png')}"/> | ||||
%endif | ||||
r1888 | ||||
|
r3197 | ##REPO NAME | ||
<span class="repo_name" title="${_('Non changable ID %s') % c.dbrepo.repo_id}">${h.repo_link(c.dbrepo.groups_and_repo)}</span> | ||||
r1888 | ||||
r1180 | ##FORK | |||
|
r3197 | %if c.dbrepo.fork: | ||
|
r3527 | <div style="margin-top:5px;clear:both"> | ||
|
r3197 | <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')}"/> | ||
${_('Fork of')} ${c.dbrepo.fork.repo_name} | ||||
</a> | ||||
</div> | ||||
%endif | ||||
##REMOTE | ||||
%if c.dbrepo.clone_uri: | ||||
r1180 | <div style="margin-top:5px;clear:both"> | |||
r1605 | <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')}"/> | |||
${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)} | ||||
r1180 | </a> | |||
r1888 | </div> | |||
|
r3197 | %endif | ||
</div> | ||||
</div> | ||||
r1888 | ||||
|
r3197 | <div class="field"> | ||
<div class="label-summary"> | ||||
<label>${_('Description')}:</label> | ||||
</div> | ||||
r2674 | %if c.visual.stylify_metatags: | |||
<div class="input ${summary(c.show_stats)} desc">${h.urlify_text(h.desc_stylize(c.dbrepo.description))}</div> | ||||
%else: | ||||
<div class="input ${summary(c.show_stats)} desc">${h.urlify_text(c.dbrepo.description)}</div> | ||||
r2815 | %endif | |||
|
r3197 | </div> | ||
r1888 | ||||
|
r3197 | <div class="field"> | ||
<div class="label-summary"> | ||||
<label>${_('Contact')}:</label> | ||||
</div> | ||||
<div class="input ${summary(c.show_stats)}"> | ||||
<div class="gravatar"> | ||||
<img alt="gravatar" src="${h.gravatar_url(c.dbrepo.user.email)}"/> | ||||
</div> | ||||
${_('Username')}: ${c.dbrepo.user.username}<br/> | ||||
${_('Name')}: ${c.dbrepo.user.name} ${c.dbrepo.user.lastname}<br/> | ||||
${_('Email')}: <a href="mailto:${c.dbrepo.user.email}">${c.dbrepo.user.email}</a> | ||||
</div> | ||||
</div> | ||||
r1888 | ||||
|
r3197 | <div class="field"> | ||
<div class="label-summary"> | ||||
<label>${_('Clone url')}:</label> | ||||
</div> | ||||
<div class="input ${summary(c.show_stats)}"> | ||||
|
r3286 | <input style="width:80%" type="text" id="clone_url" readonly="readonly" value="${c.clone_repo_url}"/> | ||
<input style="display:none;width:80%" type="text" id="clone_url_id" readonly="readonly" value="${c.clone_repo_url_id}"/> | ||||
<div style="display:none" id="clone_by_name" class="ui-btn clone">${_('Show by Name')}</div> | ||||
r1813 | <div id="clone_by_id" class="ui-btn clone">${_('Show by ID')}</div> | |||
|
r3197 | </div> | ||
</div> | ||||
r1888 | ||||
|
r3197 | <div class="field"> | ||
<div class="label-summary"> | ||||
<label>${_('Trending files')}:</label> | ||||
</div> | ||||
<div class="input ${summary(c.show_stats)}"> | ||||
r1719 | %if c.show_stats: | |||
|
r3197 | <div id="lang_stats"></div> | ||
r1719 | %else: | |||
r1888 | ${_('Statistics are disabled for this repository')} | |||
r1719 | %if h.HasPermissionAll('hg.admin')('enable stats on from summary'): | |||
r1756 | ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")} | |||
r1728 | %endif | |||
r1888 | %endif | |||
|
r3197 | </div> | ||
</div> | ||||
r1888 | ||||
|
r3197 | <div class="field"> | ||
<div class="label-summary"> | ||||
<label>${_('Download')}:</label> | ||||
</div> | ||||
<div class="input ${summary(c.show_stats)}"> | ||||
%if len(c.rhodecode_repo.revisions) == 0: | ||||
${_('There are no downloads yet')} | ||||
%elif c.enable_downloads is False: | ||||
${_('Downloads are disabled for this repository')} | ||||
r1719 | %if h.HasPermissionAll('hg.admin')('enable downloads on from summary'): | |||
r1756 | ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")} | |||
r1888 | %endif | |||
|
r3197 | %else: | ||
${h.select('download_options',c.rhodecode_repo.get_changeset().raw_id,c.download_options)} | ||||
<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> | ||||
r1450 | <span style="vertical-align: bottom"> | |||
|
r1920 | <input id="archive_subrepos" type="checkbox" name="subrepos" /> | ||
r2427 | <label for="archive_subrepos" class="tooltip" title="${h.tooltip(_('Check this to download archive with subrepos'))}" >${_('with subrepos')}</label> | |||
r1450 | </span> | |||
|
r3197 | %endif | ||
</div> | ||||
</div> | ||||
|
r3529 | </div> | ||
<div id="summary-menu-stats"> | ||||
<ul> | ||||
<li> | ||||
<a class="followers" title="${_('Followers')}" href="${h.url('repo_followers_home',repo_name=c.repo_name)}"> | ||||
|
r3538 | ${_('Followers')} | ||
r3546 | <span style="float:right" id="current_followers_count">${c.repository_followers}</span> | |||
|
r3529 | </a> | ||
</li> | ||||
<li> | ||||
<a class="forks" title="${_('Forks')}" href="${h.url('repo_forks_home',repo_name=c.repo_name)}"> | ||||
|
r3538 | ${_('Forks')} | ||
r3546 | <span style="float:right">${c.repository_forks}</span> | |||
|
r3529 | </a> | ||
</li> | ||||
r3560 | ||||
%if h.HasRepoPermissionAll('repository.admin')(c.repo_name): | ||||
<li> | ||||
%if h.HasPermissionAll('hg.admin')('access settings on repository'): | ||||
${h.link_to(_('Settings'),h.url('edit_repo',repo_name=c.repo_name),class_='settings')} | ||||
|
r3529 | %else: | ||
r3560 | ${h.link_to(_('Settings'),h.url('repo_settings_home',repo_name=c.repo_name),class_='settings')} | |||
|
r3529 | %endif | ||
</li> | ||||
r3560 | %endif | |||
<li> | ||||
%if c.rhodecode_user.username != 'default': | ||||
${h.link_to(_('Feed'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key),class_='feed')} | ||||
%else: | ||||
${h.link_to(_('Feed'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name),class_='feed')} | ||||
%endif | ||||
</li> | ||||
|
r3529 | %if c.rhodecode_user.username != 'default': | ||
|
r3538 | <li class="repo_size"> | ||
r3541 | <a href="#" class="repo-size" onclick="javascript:showRepoSize('repo_size_2','${c.dbrepo.repo_name}','${str(h.get_token())}')">Repository Size</a> | |||
|
r3529 | <span id="repo_size_2"></span> | ||
</li> | ||||
%endif | ||||
</ul> | ||||
</div> | ||||
|
r3197 | </div> | ||
r547 | </div> | |||
r1719 | ||||
r1888 | %if c.show_stats: | |||
r547 | <div class="box box-right" style="min-height:455px"> | |||
<!-- box / title --> | ||||
<div class="title"> | ||||
<h5>${_('Commit activity by day / author')}</h5> | ||||
</div> | ||||
r1888 | ||||
r1247 | <div class="graph"> | |||
|
r1981 | <div style="padding:0 10px 10px 17px;"> | ||
r800 | %if c.no_data: | |||
r1181 | ${c.no_data_msg} | |||
r917 | %if h.HasPermissionAll('hg.admin')('enable stats on from summary'): | |||
r1756 | ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")} | |||
r1888 | %endif | |||
r1181 | %else: | |||
|
r1981 | ${_('Stats gathered: ')} ${c.stats_percentage}% | ||
r1181 | %endif | |||
r1888 | </div> | |||
r1247 | <div id="commit_history" style="width:450px;height:300px;float:left"></div> | |||
r547 | <div style="clear: both;height: 10px"></div> | |||
r1247 | <div id="overview" style="width:450px;height:100px;float:left"></div> | |||
r1888 | ||||
|
r3197 | <div id="legend_data" style="clear:both;margin-top:10px;"> | ||
<div id="legend_container"></div> | ||||
<div id="legend_choices"> | ||||
<table id="legend_choices_tables" class="noborder" style="font-size:smaller;color:#545454"></table> | ||||
</div> | ||||
</div> | ||||
r547 | </div> | |||
r1888 | </div> | |||
r1719 | %endif | |||
r547 | ||||
r1888 | <div class="box"> | |||
r547 | <div class="title"> | |||
r1736 | <div class="breadcrumbs"> | |||
%if c.repo_changesets: | ||||
|
r3285 | ${h.link_to(_('Latest changes'),h.url('changelog_home',repo_name=c.repo_name))} | ||
r1736 | %else: | |||
${_('Quick start')} | ||||
%endif | ||||
</div> | ||||
r1888 | </div> | |||
r547 | <div class="table"> | |||
r637 | <div id="shortlog_data"> | |||
<%include file='../shortlog/shortlog_data.html'/> | ||||
</div> | ||||
r1605 | </div> | |||
</div> | ||||
%if c.readme_data: | ||||
r2990 | <div id="readme" class="anchor"> | |||
<div class="box" style="background-color: #FAFAFA"> | ||||
<div class="title" title="${_("Readme file at revision '%s'" % c.rhodecode_db_repo.landing_rev)}"> | ||||
r2606 | <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> | ||||
<a class="permalink" href="#readme" title="${_('Permalink to this readme')}">¶</a> | ||||
</div> | ||||
r1888 | </div> | |||
r2990 | <div class="readme"> | |||
r1605 | <div class="readme_box"> | |||
${c.readme_data|n} | ||||
</div> | ||||
r547 | </div> | |||
</div> | ||||
r2990 | </div> | |||
r1605 | %endif | |||
<script type="text/javascript"> | ||||
r1719 | var clone_url = 'clone_url'; | |||
YUE.on(clone_url,'click',function(e){ | ||||
if(YUD.hasClass(clone_url,'selected')){ | ||||
return | ||||
} | ||||
else{ | ||||
YUD.addClass(clone_url,'selected'); | ||||
r1888 | YUD.get(clone_url).select(); | |||
r1719 | } | |||
}) | ||||
r1813 | YUE.on('clone_by_name','click',function(e){ | |||
// show url by name and hide name button | ||||
YUD.setStyle('clone_url','display',''); | ||||
YUD.setStyle('clone_by_name','display','none'); | ||||
r1888 | ||||
r1813 | // hide url by id and show name button | |||
YUD.setStyle('clone_by_id','display',''); | ||||
r1888 | YUD.setStyle('clone_url_id','display','none'); | |||
r1813 | }) | |||
YUE.on('clone_by_id','click',function(e){ | ||||
r1888 | ||||
|
r3197 | // show url by id and hide id button | ||
YUD.setStyle('clone_by_id','display','none'); | ||||
r1813 | YUD.setStyle('clone_url_id','display',''); | |||
r1888 | ||||
r1813 | // hide url by name and show id button | |||
|
r3197 | YUD.setStyle('clone_by_name','display',''); | ||
YUD.setStyle('clone_url','display','none'); | ||||
r1813 | }) | |||
r1719 | var tmpl_links = {}; | |||
%for cnt,archive in enumerate(c.rhodecode_repo._get_archives()): | ||||
r1756 | 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')}'; | |||
r1719 | %endfor | |||
r1605 | ||||
r1719 | YUE.on(['download_options','archive_subrepos'],'change',function(e){ | |||
var sm = YUD.get('download_options'); | ||||
var new_cs = sm.options[sm.selectedIndex]; | ||||
r1888 | ||||
r1719 | for(k in tmpl_links){ | |||
var s = YUD.get(k+'_link'); | ||||
r1751 | if(s){ | |||
var title_tmpl = "${_('Download %s as %s') % ('__CS_NAME__','__CS_EXT__')}"; | ||||
title_tmpl= title_tmpl.replace('__CS_NAME__',new_cs.text); | ||||
title_tmpl = title_tmpl.replace('__CS_EXT__',k); | ||||
r1888 | ||||
r1751 | var url = tmpl_links[k].replace('__CS__',new_cs.value); | |||
var subrepos = YUD.get('archive_subrepos').checked; | ||||
url = url.replace('__SUB__',subrepos); | ||||
url = url.replace('__NAME__',title_tmpl); | ||||
s.innerHTML = url | ||||
} | ||||
r1719 | } | |||
}); | ||||
</script> | ||||
%if c.show_stats: | ||||
<script type="text/javascript"> | ||||
var data = ${c.trending_languages|n}; | ||||
var total = 0; | ||||
var no_data = true; | ||||
var tbl = document.createElement('table'); | ||||
tbl.setAttribute('class','trending_language_tbl'); | ||||
var cnt = 0; | ||||
r1890 | for (var i=0;i<data.length;i++){ | |||
|
r3197 | total+= data[i][1].count; | ||
r1940 | } | |||
for (var i=0;i<data.length;i++){ | ||||
r1719 | cnt += 1; | |||
r1890 | no_data = false; | |||
r1908 | ||||
r1719 | var hide = cnt>2; | |||
var tr = document.createElement('tr'); | ||||
if (hide){ | ||||
tr.setAttribute('style','display:none'); | ||||
tr.setAttribute('class','stats_hidden'); | ||||
} | ||||
r1890 | var k = data[i][0]; | |||
var obj = data[i][1]; | ||||
var percentage = Math.round((obj.count/total*100),2); | ||||
r1908 | ||||
r1719 | var td1 = document.createElement('td'); | |||
td1.width = 150; | ||||
var trending_language_label = document.createElement('div'); | ||||
r1890 | trending_language_label.innerHTML = obj.desc+" ("+k+")"; | |||
r1719 | td1.appendChild(trending_language_label); | |||
r1605 | ||||
r1719 | var td2 = document.createElement('td'); | |||
td2.setAttribute('style','padding-right:14px !important'); | ||||
var trending_language = document.createElement('div'); | ||||
r1890 | var nr_files = obj.count+" ${_('files')}"; | |||
r1888 | ||||
r1719 | trending_language.title = k+" "+nr_files; | |||
r1888 | ||||
r1719 | if (percentage>22){ | |||
r1888 | trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"% "+nr_files+ "</b>"; | |||
r1719 | } | |||
else{ | ||||
trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"%</b>"; | ||||
} | ||||
r1888 | ||||
r1719 | trending_language.setAttribute("class", 'trending_language top-right-rounded-corner bottom-right-rounded-corner'); | |||
trending_language.style.width=percentage+"%"; | ||||
td2.appendChild(trending_language); | ||||
r1888 | ||||
r1719 | tr.appendChild(td1); | |||
tr.appendChild(td2); | ||||
tbl.appendChild(tr); | ||||
if(cnt == 3){ | ||||
var show_more = document.createElement('tr'); | ||||
var td = document.createElement('td'); | ||||
lnk = document.createElement('a'); | ||||
r1888 | ||||
r1719 | lnk.href='#'; | |||
lnk.innerHTML = "${_('show more')}"; | ||||
lnk.id='code_stats_show_more'; | ||||
td.appendChild(lnk); | ||||
r1888 | ||||
r1719 | show_more.appendChild(td); | |||
show_more.appendChild(document.createElement('td')); | ||||
tbl.appendChild(show_more); | ||||
} | ||||
r1888 | ||||
r1719 | } | |||
YUD.get('lang_stats').appendChild(tbl); | ||||
YUE.on('code_stats_show_more','click',function(){ | ||||
l = YUD.getElementsByClassName('stats_hidden') | ||||
for (e in l){ | ||||
YUD.setStyle(l[e],'display',''); | ||||
}; | ||||
YUD.setStyle(YUD.get('code_stats_show_more'), | ||||
'display','none'); | ||||
}); | ||||
r1888 | </script> | |||
r1719 | <script type="text/javascript"> | |||
/** | ||||
* 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]; | ||||
var choiceContainer = YUD.get("legend_choices"); | ||||
var choiceContainerTable = YUD.get("legend_choices_tables"); | ||||
var plotContainer = YUD.get('commit_history'); | ||||
var overviewContainer = YUD.get('overview'); | ||||
r1888 | ||||
r1719 | 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: { | ||||
r1888 | mode: "time", | |||
r1719 | timeformat: "%d/%m", | |||
min:from, | ||||
r1888 | max:to, | |||
}, | ||||
r1719 | grid: { | |||
r1888 | hoverable: true, | |||
r1719 | clickable: true, | |||
autoHighlight:true, | ||||
color: "#999" | ||||
}, | ||||
//selection: {mode: "x"} | ||||
}; | ||||
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,tickDecimals:0,}, | ||||
grid: {color: "#999",}, | ||||
selection: {mode: "x"} | ||||
}; | ||||
/** | ||||
*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', | ||||
r1605 | } | |||
r1719 | } | |||
r1888 | ||||
r1719 | /** | |||
* generate checkboxes accordindly to data | ||||
* @param keys | ||||
* @returns | ||||
*/ | ||||
function generateCheckboxes(data) { | ||||
//append checkboxes | ||||
var i = 0; | ||||
choiceContainerTable.innerHTML = ''; | ||||
for(var pos in data) { | ||||
r1888 | ||||
r1719 | data[pos].color = i; | |||
i++; | ||||
if(data[pos].label != ''){ | ||||
|
r1922 | choiceContainerTable.innerHTML += | ||
'<tr><td><input type="checkbox" id="id_user_{0}" name="{0}" checked="checked" /> \ | ||||
<label for="id_user_{0}">{0}</label></td></tr>'.format(data[pos].label); | ||||
r1719 | } | |||
r1888 | } | |||
r1719 | } | |||
r1888 | ||||
r1719 | /** | |||
* 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); | ||||
} | ||||
YUD.setStyle(div, 'opacity', 0); | ||||
div.innerHTML = contents; | ||||
div.style.top=(y + 5) + "px"; | ||||
div.style.left=(x + 5) + "px"; | ||||
var anim = new YAHOO.util.Anim(div, {opacity: {to: 0.8}}, 0.2); | ||||
anim.animate(); | ||||
} | ||||
r1888 | ||||
r1719 | /** | |||
r1888 | * This function will detect if selected period has some changesets | |||
r1719 | 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) { | ||||
r1888 | ||||
r1719 | var data = []; | |||
var new_dataset = {}; | ||||
var keys = []; | ||||
var max_commits = 0; | ||||
for(var key in dataset){ | ||||
r1888 | ||||
r1719 | for(var ds in dataset[key].data){ | |||
commit_data = dataset[key].data[ds]; | ||||
if (commit_data.time >= ranges.xaxis.from && commit_data.time <= ranges.xaxis.to){ | ||||
r1605 | ||||
r1719 | if(new_dataset[key] === undefined){ | |||
r1888 | new_dataset[key] = {data:[],schema:["commits"],label:key}; | |||
r1719 | } | |||
new_dataset[key].data.push(commit_data); | ||||
r1605 | } | |||
} | ||||
r1719 | if (new_dataset[key] !== undefined){ | |||
r1888 | data.push(new_dataset[key]); | |||
r1605 | } | |||
r1719 | } | |||
r1605 | ||||
r1719 | if (data.length > 0){ | |||
r1888 | return data; | |||
r1719 | } | |||
else{ | ||||
//just return dummy data for graph to plot itself | ||||
r1888 | return [getDummyData('')]; | |||
r1719 | } | |||
} | ||||
r1888 | ||||
r1719 | /** | |||
* redraw using new checkbox data | ||||
*/ | ||||
function plotchoiced(e,args){ | ||||
var cur_data = args[0]; | ||||
var cur_ranges = args[1]; | ||||
r1888 | ||||
r1719 | var new_data = []; | |||
var inputs = choiceContainer.getElementsByTagName("input"); | ||||
r1605 | ||||
r1719 | //show only checked labels | |||
for(var i=0; i<inputs.length; i++) { | ||||
var checkbox_key = inputs[i].name; | ||||
r1888 | ||||
r1719 | if(inputs[i].checked){ | |||
for(var d in cur_data){ | ||||
if(cur_data[d].label == checkbox_key){ | ||||
new_data.push(cur_data[d]); | ||||
r1605 | } | |||
r1888 | } | |||
r1719 | } | |||
else{ | ||||
//push dummy data to not hide the label | ||||
new_data.push(getDummyData(checkbox_key)); | ||||
r1605 | } | |||
r1719 | } | |||
r1888 | ||||
r1719 | var new_options = YAHOO.lang.merge(plot_options, { | |||
r1888 | xaxis: { | |||
min: cur_ranges.xaxis.from, | ||||
r1719 | 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); | ||||
r1888 | ||||
r1719 | plot.subscribe("plotselected", plotselected); | |||
r1605 | ||||
r1719 | //resubscribe plothover | |||
plot.subscribe("plothover", plothover); | ||||
r1888 | ||||
// don't fire event on the overview to prevent eternal loop | ||||
r1719 | overview.setSelection(cur_ranges, true); | |||
} | ||||
r1888 | ||||
r1719 | /** | |||
* plot only selected items from overview | ||||
* @param ranges | ||||
* @returns | ||||
*/ | ||||
function plotselected(ranges,cur_data) { | ||||
//updates the data for new plot | ||||
var data = getDataAccordingToRanges(ranges); | ||||
generateCheckboxes(data); | ||||
r1888 | ||||
r1719 | var new_options = YAHOO.lang.merge(plot_options, { | |||
r1888 | xaxis: { | |||
min: ranges.xaxis.from, | ||||
r1719 | max: ranges.xaxis.to, | |||
mode:"time", | ||||
timeformat: "%d/%m", | ||||
}, | ||||
}); | ||||
r1888 | // do the zooming | |||
r1719 | plot = YAHOO.widget.Flot(plotContainer, data, new_options); | |||
plot.subscribe("plotselected", plotselected); | ||||
//resubscribe plothover | ||||
plot.subscribe("plothover", plothover); | ||||
r1888 | ||||
r1719 | // don't fire event on the overview to prevent eternal loop | |||
overview.setSelection(ranges, true); | ||||
r1888 | //resubscribe choiced | |||
r1719 | YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, ranges]); | |||
} | ||||
r1888 | ||||
r1719 | var previousPoint = null; | |||
function plothover(o) { | ||||
var pos = o.pos; | ||||
var item = o.item; | ||||
r1888 | ||||
r1719 | //YUD.get("x").innerHTML = pos.x.toFixed(2); | |||
//YUD.get("y").innerHTML = pos.y.toFixed(2); | ||||
if (item) { | ||||
if (previousPoint != item.datapoint) { | ||||
previousPoint = item.datapoint; | ||||
r1888 | ||||
r1719 | var tooltip = YUD.get("tooltip"); | |||
if(tooltip) { | ||||
tooltip.parentNode.removeChild(tooltip); | ||||
} | ||||
var x = item.datapoint.x.toFixed(2); | ||||
var y = item.datapoint.y.toFixed(2); | ||||
r1888 | ||||
r1719 | if (!item.series.label){ | |||
item.series.label = 'commits'; | ||||
} | ||||
var d = new Date(x*1000); | ||||
var fd = d.toDateString() | ||||
var nr_commits = parseInt(y); | ||||
r1888 | ||||
r1719 | 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; | ||||
r1888 | ||||
r1719 | var nr_commits_suffix = " ${_('commits')} "; | |||
var added_suffix = " ${_('files added')} "; | ||||
var changed_suffix = " ${_('files changed')} "; | ||||
var removed_suffix = " ${_('files removed')} "; | ||||
r1605 | ||||
r1888 | ||||
r1719 | 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')} ";} | ||||
r1888 | ||||
r1719 | 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/>'); | ||||
r1605 | } | |||
r1719 | } | |||
else { | ||||
var tooltip = YUD.get("tooltip"); | ||||
r1888 | ||||
r1719 | if(tooltip) { | |||
tooltip.parentNode.removeChild(tooltip); | ||||
} | ||||
previousPoint = null; | ||||
} | ||||
} | ||||
r1888 | ||||
r1719 | /** | |||
* MAIN EXECUTION | ||||
*/ | ||||
r1888 | ||||
var data = getDataAccordingToRanges(initial_ranges); | ||||
r1719 | generateCheckboxes(data); | |||
r1888 | ||||
//main plot | ||||
r1719 | var plot = YAHOO.widget.Flot(plotContainer,data,plot_options); | |||
r1888 | ||||
//overview | ||||
var overview = YAHOO.widget.Flot(overviewContainer, | ||||
r1719 | overview_dataset, overview_options); | |||
r1888 | ||||
//show initial selection on overview | ||||
overview.setSelection(initial_ranges); | ||||
r1719 | plot.subscribe("plotselected", plotselected); | |||
plot.subscribe("plothover", plothover) | ||||
r1888 | ||||
r1719 | overview.subscribe("plotselected", function (ranges) { | |||
plot.setSelection(ranges); | ||||
r1888 | }); | |||
r1605 | ||||
r1719 | // user choices on overview | |||
YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, initial_ranges]); | ||||
} | ||||
r1888 | SummaryPlot(${c.ts_min},${c.ts_max},${c.commit_data|n},${c.overview_data|n}); | |||
r1719 | </script> | |||
%endif | ||||
r547 | ||||
r1888 | </%def> | |||