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