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