comparison rhodecode/templates/changelog/changelog.html @ 2031:82a88013a3fd

merge 1.3 into stable
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 26 Feb 2012 17:25:09 +0200
parents bf263968da47 7a7ffe24b82c
children dc2584ba5fbc
comparison
equal deleted inserted replaced
2005:ab0e122b38a7 2031:82a88013a3fd
9 <%def name="breadcrumbs_links()"> 9 <%def name="breadcrumbs_links()">
10 ${h.link_to(u'Home',h.url('/'))} 10 ${h.link_to(u'Home',h.url('/'))}
11 &raquo; 11 &raquo;
12 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))} 12 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
13 &raquo; 13 &raquo;
14 ${_('Changelog')} - ${_('showing ')} ${c.size if c.size <= c.total_cs else c.total_cs} ${_('out of')} ${c.total_cs} ${_('revisions')} 14 ${_('Changelog')} - ${_('showing ')} ${c.size if c.size <= c.total_cs else c.total_cs} ${_('out of')} ${c.total_cs} ${_('revisions')}
15 </%def> 15 </%def>
16 16
17 <%def name="page_nav()"> 17 <%def name="page_nav()">
18 ${self.menu('changelog')} 18 ${self.menu('changelog')}
19 </%def> 19 </%def>
20 20
21 <%def name="main()"> 21 <%def name="main()">
22 <div class="box"> 22 <div class="box">
23 <!-- box / title --> 23 <!-- box / title -->
31 <canvas id="graph_canvas"></canvas> 31 <canvas id="graph_canvas"></canvas>
32 </div> 32 </div>
33 <div id="graph_content"> 33 <div id="graph_content">
34 <div class="container_header"> 34 <div class="container_header">
35 ${h.form(h.url.current(),method='get')} 35 ${h.form(h.url.current(),method='get')}
36 <div class="info_box"> 36 <div class="info_box" style="float:left">
37 ${h.submit('set',_('Show'),class_="ui-button-small")} 37 ${h.submit('set',_('Show'),class_="ui-btn")}
38 ${h.text('size',size=1,value=c.size)} 38 ${h.text('size',size=1,value=c.size)}
39 <span class="rev">${_('revisions')}</span> 39 ${_('revisions')}
40 </div> 40 </div>
41 ${h.end_form()} 41 ${h.end_form()}
42 <div id="rev_range_container" style="display:none"></div> 42 <div id="rev_range_container" style="display:none"></div>
43 <div style="float:right">${h.select('branch_filter',c.branch_name,c.branch_filters)}</div>
43 </div> 44 </div>
44 45
45 %for cnt,cs in enumerate(c.pagination): 46 %for cnt,cs in enumerate(c.pagination):
46 <div id="chg_${cnt+1}" class="container"> 47 <div id="chg_${cnt+1}" class="container ${'tablerow%s' % (cnt%2)}">
47 <div class="left"> 48 <div class="left">
48 <div class="date"> 49 <div>
49 ${h.checkbox(cs.short_id,class_="changeset_range")} 50 ${h.checkbox(cs.short_id,class_="changeset_range")}
50 <span>${_('commit')} ${cs.revision}: ${h.short_id(cs.raw_id)}@${cs.date}</span> 51 <span class="tooltip" title="${h.age(cs.date)}"><a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}"><span class="changeset_id">${cs.revision}:<span class="changeset_hash">${h.short_id(cs.raw_id)}</span></span></a></span>
51 </div> 52 </div>
52 <div class="author"> 53 <div class="author">
53 <div class="gravatar"> 54 <div class="gravatar">
54 <img alt="gravatar" src="${h.gravatar_url(h.email(cs.author),16)}"/> 55 <img alt="gravatar" src="${h.gravatar_url(h.email(cs.author),16)}"/>
55 </div> 56 </div>
56 <div title="${h.email_or_none(cs.author)}" class="user">${h.person(cs.author)}</div> 57 <div title="${cs.author}" class="user">${h.person(cs.author)}</div>
57 ##<span><a href="mailto:${h.email_or_none(cs.author)}">${h.email_or_none(cs.author)}</a></span><br/>
58 </div> 58 </div>
59 <div class="message">${h.link_to(h.wrap_paragraphs(cs.message),h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div> 59 <div class="date">${cs.date}</div>
60 </div> 60 </div>
61 <div class="mid">
62 <div class="message">${h.urlify_commit(h.wrap_paragraphs(cs.message),c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
63 <div class="expand"><span class="expandtext">&darr; ${_('show more')} &darr;</span></div>
64 </div>
61 <div class="right"> 65 <div class="right">
62 <div id="${cs.raw_id}_changes_info" class="changes"> 66 <div id="${cs.raw_id}_changes_info" class="changes">
63 <span id="${cs.raw_id}" class="changed_total tooltip" title="${_('Affected number of files, click to show more details')}">${len(cs.affected_files)}</span> 67 <div id="${cs.raw_id}" style="float:right;" class="changed_total tooltip" title="${_('Affected number of files, click to show more details')}">${len(cs.affected_files)}</div>
64 </div> 68 <div class="comments-container">
65 %if len(cs.parents)>1: 69 %if len(c.comments.get(cs.raw_id,[])) > 0:
66 <div class="merge"> 70 <div class="comments-cnt" title="${('comments')}">
67 ${_('merge')}<img alt="merge" src="${h.url('/images/icons/arrow_join.png')}"/> 71 <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}">
68 </div> 72 <div class="comments-cnt">${len(c.comments[cs.raw_id])}</div>
69 %endif 73 <img src="${h.url('/images/icons/comments.png')}">
70 %if cs.parents: 74 </a>
75 </div>
76 %endif
77 </div>
78 </div>
79 %if cs.parents:
71 %for p_cs in reversed(cs.parents): 80 %for p_cs in reversed(cs.parents):
72 <div class="parent">${_('Parent')} ${p_cs.revision}: ${h.link_to(h.short_id(p_cs.raw_id), 81 <div class="parent">${_('Parent')}
73 h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.raw_id),title=p_cs.message)} 82 <span class="changeset_id">${p_cs.revision}:<span class="changeset_hash">${h.link_to(h.short_id(p_cs.raw_id),
83 h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.raw_id),title=p_cs.message)}</span></span>
74 </div> 84 </div>
75 %endfor 85 %endfor
76 %else: 86 %else:
77 <div class="parent">${_('No parents')}</div> 87 <div class="parent">${_('No parents')}</div>
78 %endif 88 %endif
79 89
80 <span class="logtags"> 90 <span class="logtags">
81 %if cs.branch: 91 %if len(cs.parents)>1:
92 <span class="merge">${_('merge')}</span>
93 %endif
94 %if h.is_hg(c.rhodecode_repo) and cs.branch:
82 <span class="branchtag" title="${'%s %s' % (_('branch'),cs.branch)}"> 95 <span class="branchtag" title="${'%s %s' % (_('branch'),cs.branch)}">
83 ${h.link_to(cs.branch,h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span> 96 ${h.link_to(cs.branch,h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span>
84 %endif 97 %endif
85 %for tag in cs.tags: 98 %for tag in cs.tags:
86 <span class="tagtag" title="${'%s %s' % (_('tag'),tag)}"> 99 <span class="tagtag" title="${'%s %s' % (_('tag'),tag)}">
87 ${h.link_to(tag,h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span> 100 ${h.link_to(tag,h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span>
88 %endfor 101 %endfor
89 </span> 102 </span>
90 </div> 103 </div>
91 </div> 104 </div>
92 105
93 %endfor 106 %endfor
94 <div class="pagination-wh pagination-left"> 107 <div class="pagination-wh pagination-left">
95 ${c.pagination.pager('$link_previous ~2~ $link_next')} 108 ${c.pagination.pager('$link_previous ~2~ $link_next')}
96 </div> 109 </div>
97 </div> 110 </div>
98 </div> 111 </div>
99 112
100 <script type="text/javascript" src="${h.url('/js/graph.js')}"></script> 113 <script type="text/javascript" src="${h.url('/js/graph.js')}"></script>
101 <script type="text/javascript"> 114 <script type="text/javascript">
102 YAHOO.util.Event.onDOMReady(function(){ 115 YAHOO.util.Event.onDOMReady(function(){
103 116
104 //Monitor range checkboxes and build a link to changesets 117 //Monitor range checkboxes and build a link to changesets
105 //ranges 118 //ranges
106 var checkboxes = YUD.getElementsByClassName('changeset_range'); 119 var checkboxes = YUD.getElementsByClassName('changeset_range');
107 var url_tmpl = "${h.url('changeset_home',repo_name=c.repo_name,revision='__REVRANGE__')}"; 120 var url_tmpl = "${h.url('changeset_home',repo_name=c.repo_name,revision='__REVRANGE__')}";
108 YUE.on(checkboxes,'click',function(e){ 121 YUE.on(checkboxes,'click',function(e){
109 var checked_checkboxes = []; 122 var checked_checkboxes = [];
110 for (pos in checkboxes){ 123 for (pos in checkboxes){
111 if(checkboxes[pos].checked){ 124 if(checkboxes[pos].checked){
112 checked_checkboxes.push(checkboxes[pos]); 125 checked_checkboxes.push(checkboxes[pos]);
113 } 126 }
114 } 127 }
115 if(checked_checkboxes.length>1){ 128 if(checked_checkboxes.length>1){
116 var rev_end = checked_checkboxes[0].name; 129 var rev_end = checked_checkboxes[0].name;
117 var rev_start = checked_checkboxes[checked_checkboxes.length-1].name; 130 var rev_start = checked_checkboxes[checked_checkboxes.length-1].name;
118 131
119 var url = url_tmpl.replace('__REVRANGE__', 132 var url = url_tmpl.replace('__REVRANGE__',
120 rev_start+'...'+rev_end); 133 rev_start+'...'+rev_end);
121 134
122 var link = "<a href="+url+">${_('Show selected changes __S -> __E')}</a>" 135 var link = "<a href="+url+">${_('Show selected changes __S -> __E')}</a>"
123 link = link.replace('__S',rev_start); 136 link = link.replace('__S',rev_start);
124 link = link.replace('__E',rev_end); 137 link = link.replace('__E',rev_end);
125 YUD.get('rev_range_container').innerHTML = link; 138 YUD.get('rev_range_container').innerHTML = link;
126 YUD.setStyle('rev_range_container','display',''); 139 YUD.setStyle('rev_range_container','display','');
127 } 140 }
128 else{ 141 else{
129 YUD.setStyle('rev_range_container','display','none'); 142 YUD.setStyle('rev_range_container','display','none');
130 143
131 } 144 }
132 }); 145 });
133 146
134 //Fetch changeset details 147 var msgs = YUQ('.message');
148 // get first element height
149 var el = YUQ('#graph_content .container')[0];
150 var row_h = el.clientHeight;
151 for(var i=0;i<msgs.length;i++){
152 var m = msgs[i];
153
154 var h = m.clientHeight;
155 var pad = YUD.getStyle(m,'padding');
156 if(h > row_h){
157 var offset = row_h - (h+12);
158 YUD.setStyle(m.nextElementSibling,'display','block');
159 YUD.setStyle(m.nextElementSibling,'margin-top',offset+'px');
160 };
161 }
162 YUE.on(YUQ('.expand'),'click',function(e){
163 var elem = e.currentTarget.parentNode.parentNode;
164 YUD.setStyle(e.currentTarget,'display','none');
165 YUD.setStyle(elem,'height','auto');
166
167 //redraw the graph, max_w and jsdata are global vars
168 set_canvas(max_w);
169
170 var r = new BranchRenderer();
171 r.render(jsdata,max_w);
172
173 })
174
175 // Fetch changeset details
135 YUE.on(YUD.getElementsByClassName('changed_total'),'click',function(e){ 176 YUE.on(YUD.getElementsByClassName('changed_total'),'click',function(e){
136 var id = e.currentTarget.id 177 var id = e.currentTarget.id
137 var url = "${h.url('changelog_details',repo_name=c.repo_name,cs='__CS__')}" 178 var url = "${h.url('changelog_details',repo_name=c.repo_name,cs='__CS__')}"
138 var url = url.replace('__CS__',id); 179 var url = url.replace('__CS__',id);
139 ypjax(url,id+'_changes_info',function(){tooltip_activate()}); 180 ypjax(url,id+'_changes_info',function(){tooltip_activate()});
140 }); 181 });
141 182
142 183 // change branch filter
184 YUE.on(YUD.get('branch_filter'),'change',function(e){
185 var selected_branch = e.currentTarget.options[e.currentTarget.selectedIndex].value;
186 var url_main = "${h.url('changelog_home',repo_name=c.repo_name)}";
187 var url = "${h.url('changelog_home',repo_name=c.repo_name,branch='__BRANCH__')}";
188 var url = url.replace('__BRANCH__',selected_branch);
189 if(selected_branch != ''){
190 window.location = url;
191 }else{
192 window.location = url_main;
193 }
194
195 });
196
143 function set_canvas(heads) { 197 function set_canvas(heads) {
144 var c = document.getElementById('graph_nodes'); 198 var c = document.getElementById('graph_nodes');
145 var t = document.getElementById('graph_content'); 199 var t = document.getElementById('graph_content');
146 canvas = document.getElementById('graph_canvas'); 200 canvas = document.getElementById('graph_canvas');
147 var div_h = t.clientHeight; 201 var div_h = t.clientHeight;
151 canvas.setAttribute('width',max_w); 205 canvas.setAttribute('width',max_w);
152 }; 206 };
153 var heads = 1; 207 var heads = 1;
154 var max_heads = 0; 208 var max_heads = 0;
155 var jsdata = ${c.jsdata|n}; 209 var jsdata = ${c.jsdata|n};
156 210
157 for( var i=0;i<jsdata.length;i++){ 211 for( var i=0;i<jsdata.length;i++){
158 var m = Math.max.apply(Math, jsdata[i][1]); 212 var m = Math.max.apply(Math, jsdata[i][1]);
159 if (m>max_heads){ 213 if (m>max_heads){
160 max_heads = m; 214 max_heads = m;
161 } 215 }
162 } 216 }
163 var max_w = Math.max(100,max_heads*25); 217 var max_w = Math.max(100,max_heads*25);
164 set_canvas(max_w); 218 set_canvas(max_w);
165 219
166 var r = new BranchRenderer(); 220 var r = new BranchRenderer();
167 r.render(jsdata,max_w); 221 r.render(jsdata,max_w);
168 222
169 }); 223 });
170 </script> 224 </script>
171 %else: 225 %else:
172 ${_('There are no changes yet')} 226 ${_('There are no changes yet')}
173 %endif 227 %endif
174 </div> 228 </div>
175 </div> 229 </div>
176 </%def> 230 </%def>