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