##// END OF EJS Templates
code garden for changeset ranges and comments...
marcink -
r1787:d4a7b6c8 beta
parent child Browse files
Show More
@@ -0,0 +1,50 b''
1 ## -*- coding: utf-8 -*-
2 ##usage:
3 ## <%namespace name="diff_block" file="/changeset/diff_block.html"/>
4 ## ${diff_block.diff_block(changes)}
5 ##
6 <%def name="diff_block(changes)">
7
8 %for change,filenode,diff,cs1,cs2,stat in changes:
9 %if change !='removed':
10 <div id="${h.FID(filenode.changeset.raw_id,filenode.path)}" style="clear:both;height:90px;margin-top:-60px"></div>
11 <div class="diffblock margined comm">
12 <div class="code-header">
13 <div class="changeset_header">
14 <div class="changeset_file">
15 ${h.link_to_if(change!='removed',h.safe_unicode(filenode.path),h.url('files_home',repo_name=c.repo_name,
16 revision=filenode.changeset.raw_id,f_path=h.safe_unicode(filenode.path)))}
17 </div>
18 <div class="diff-menu-wrapper">
19 <img class="diff-menu-activate" style="margin-bottom:-6px;cursor: pointer" alt="diff-menu" src="${h.url('/images/icons/script_gear.png')}" />
20 <div class="diff-menu" style="display:none">
21 <ul>
22 <li>${h.link_to(_('diff'),h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='diff'))}</li>
23 <li>${h.link_to(_('raw diff'),h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='raw'))}</li>
24 <li>${h.link_to(_('download diff'),h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='download'))}</li>
25 <li>${c.ignorews_url(h.FID(filenode.changeset.raw_id,filenode.path))}</li>
26 <li>${c.context_url(h.FID(filenode.changeset.raw_id,filenode.path))}</li>
27 </ul>
28 </div>
29 </div>
30 <span style="float:right;margin-top:-3px">
31 <label>
32 ${_('show inline comments')}
33 ${h.checkbox('',checked="checked",class_="show-inline-comments",id_for=h.FID(filenode.changeset.raw_id,filenode.path))}
34 </label>
35 </span>
36 </div>
37 </div>
38 <div class="code-body">
39 <div class="full_f_path" path="${h.safe_unicode(filenode.path)}"></div>
40 %if diff:
41 ${diff|n}
42 %else:
43 ${_('No changes in this file')}
44 %endif
45 </div>
46 </div>
47 %endif
48 %endfor
49
50 </%def> No newline at end of file
@@ -54,6 +54,7 b' def anchor_url(revision,path):'
54 54 fid = h.FID(revision, path)
55 55 return h.url.current(anchor=fid,**request.GET)
56 56
57
57 58 def get_ignore_ws(fid, GET):
58 59 ig_ws_global = request.GET.get('ignorews')
59 60 ig_ws = filter(lambda k:k.startswith('WS'),GET.getall(fid))
@@ -64,6 +65,7 b' def get_ignore_ws(fid, GET):'
64 65 pass
65 66 return ig_ws_global
66 67
68
67 69 def _ignorews_url(fileid=None):
68 70
69 71 params = defaultdict(list)
@@ -92,6 +94,7 b' def _ignorews_url(fileid=None):'
92 94 params['anchor'] = fileid
93 95 return h.link_to(lbl, h.url.current(**params))
94 96
97
95 98 def get_line_ctx(fid, GET):
96 99 ln_ctx_global = request.GET.get('context')
97 100 ln_ctx = filter(lambda k:k.startswith('C'),GET.getall(fid))
@@ -106,6 +109,7 b' def get_line_ctx(fid, GET):'
106 109 except:
107 110 return
108 111
112
109 113 def _context_url(fileid=None):
110 114 """
111 115 Generates url for context lines
@@ -140,14 +144,16 b' def _context_url(fileid=None):'
140 144 params['anchor'] = fileid
141 145 return h.link_to(lbl, h.url.current(**params))
142 146
147
143 148 def wrap_to_table(str_):
144 149 return '''<table class="code-difftable">
145 <tr class="line">
150 <tr class="line no-comment">
146 151 <td class="lineno new"></td>
147 <td class="code"><pre>%s</pre></td>
152 <td class="code no-comment"><pre>%s</pre></td>
148 153 </tr>
149 154 </table>''' % str_
150 155
156
151 157 class ChangesetController(BaseRepoController):
152 158
153 159 @LoginRequired()
@@ -165,9 +171,10 b' class ChangesetController(BaseRepoContro'
165 171
166 172 #get ranges of revisions if preset
167 173 rev_range = revision.split('...')[:2]
168
174 enable_comments = True
169 175 try:
170 176 if len(rev_range) == 2:
177 enable_comments = False
171 178 rev_start = rev_range[0]
172 179 rev_end = rev_range[1]
173 180 rev_ranges = c.rhodecode_repo.get_changesets(start=rev_start,
@@ -233,7 +240,7 b' class ChangesetController(BaseRepoContro'
233 240 d = diffs.DiffProcessor(f_gitdiff, format='gitdiff')
234 241
235 242 st = d.stat()
236 diff = d.as_html()
243 diff = d.as_html(enable_comments=enable_comments)
237 244
238 245 else:
239 246 diff = wrap_to_table(_('Changeset is to big and '
@@ -281,7 +288,7 b' class ChangesetController(BaseRepoContro'
281 288 'and was cut off, see '
282 289 'raw diff instead'))
283 290 else:
284 diff = d.as_html()
291 diff = d.as_html(enable_comments=enable_comments)
285 292
286 293 if diff:
287 294 c.sum_removed += len(diff)
@@ -404,4 +411,3 b' class ChangesetController(BaseRepoContro'
404 411 return True
405 412 else:
406 413 raise HTTPForbidden()
407
@@ -114,15 +114,17 b' class DiffProcessor(object):'
114 114 try:
115 115 if line1.startswith('--- ') and line2.startswith('+++ '):
116 116 l1 = line1[4:].split(None, 1)
117 old_filename = l1[0].lstrip('a/') if len(l1) >= 1 else None
117 old_filename = (l1[0].replace('a/', '', 1)
118 if len(l1) >= 1 else None)
118 119 old_rev = l1[1] if len(l1) == 2 else 'old'
119 120
120 121 l2 = line2[4:].split(None, 1)
121 new_filename = l2[0].lstrip('b/') if len(l1) >= 1 else None
122 new_filename = (l2[0].replace('b/', '', 1)
123 if len(l1) >= 1 else None)
122 124 new_rev = l2[1] if len(l2) == 2 else 'new'
123 125
124 filename = old_filename if (old_filename !=
125 'dev/null') else new_filename
126 filename = (old_filename
127 if old_filename != '/dev/null' else new_filename)
126 128
127 129 return filename, new_rev, old_rev
128 130 except (ValueError, IndexError):
@@ -359,7 +361,7 b' class DiffProcessor(object):'
359 361
360 362 def as_html(self, table_class='code-difftable', line_class='line',
361 363 new_lineno_class='lineno old', old_lineno_class='lineno new',
362 code_class='code'):
364 code_class='code', enable_comments=False):
363 365 """
364 366 Return udiff as html table with customized css classes
365 367 """
@@ -429,8 +431,10 b' class DiffProcessor(object):'
429 431 ###########################################################
430 432 # CODE
431 433 ###########################################################
432 _html.append('''\t<td class="%(code_class)s">''' \
433 % {'code_class': code_class})
434 comments = '' if enable_comments else 'no-comment'
435 _html.append('''\t<td class="%(code_class)s %(in-comments)s">''' \
436 % {'code_class': code_class,
437 'in-comments': comments})
434 438 _html.append('''\n\t\t<pre>%(code)s</pre>\n''' \
435 439 % {'code': change['line']})
436 440 _html.append('''\t</td>''')
@@ -3898,17 +3898,19 b' form.comment-inline-form {'
3898 3898 text-decoration: none !important;
3899 3899 }
3900 3900 .notification-header{
3901
3901 padding-top:6px;
3902 3902 }
3903 3903 .notification-header .desc{
3904 3904 font-size: 16px;
3905 3905 height: 24px;
3906 padding-top: 6px;
3907 3906 float: left
3908 3907 }
3909 3908 .notification-list .container.unread{
3910 3909
3911 3910 }
3911 .notification-header .gravatar{
3912
3913 }
3912 3914 .notification-header .desc.unread{
3913 3915 font-weight: bold;
3914 3916 font-size: 17px;
@@ -4069,4 +4071,10 b' table.code-difftable .code pre{'
4069 4071 background-repeat:no-repeat !important;
4070 4072 background-position: right !important;
4071 4073 background-position: 0% 50% !important;
4074 }
4075 .diffblock.margined.comm .line .code.no-comment:hover{
4076 background-image: none !important;
4077 cursor: auto !important;
4078 background-color: inherit !important;
4079
4072 4080 } No newline at end of file
@@ -343,7 +343,7 b' var createInlineForm = function(parent_t'
343 343 return form
344 344 };
345 345 var injectInlineForm = function(tr){
346 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context')){
346 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(tr,'no-comment')){
347 347 return
348 348 }
349 349 YUD.addClass(tr,'form-open');
@@ -115,88 +115,16 b''
115 115
116 116 </div>
117 117
118 %for change,filenode,diff,cs1,cs2,stat in c.changes:
119 %if change !='removed':
120 <div id="${h.FID(filenode.changeset.raw_id,filenode.path)}" style="clear:both;height:90px;margin-top:-60px"></div>
121 <div class="diffblock margined comm">
122 <div class="code-header">
123 <div class="changeset_header">
124 <div class="changeset_file">
125 ${h.link_to_if(change!='removed',h.safe_unicode(filenode.path),h.url('files_home',repo_name=c.repo_name,
126 revision=filenode.changeset.raw_id,f_path=h.safe_unicode(filenode.path)))}
127 </div>
128 <div class="diff-menu-wrapper">
129 <img class="diff-menu-activate" style="margin-bottom:-6px;cursor: pointer" alt="diff-menu" src="${h.url('/images/icons/script_gear.png')}" />
130 <div class="diff-menu" style="display:none">
131 <ul>
132 <li>${h.link_to(_('diff'),h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='diff'))}</li>
133 <li>${h.link_to(_('raw diff'),h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='raw'))}</li>
134 <li>${h.link_to(_('download diff'),h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='download'))}</li>
135 <li>${c.ignorews_url(h.FID(filenode.changeset.raw_id,filenode.path))}</li>
136 <li>${c.context_url(h.FID(filenode.changeset.raw_id,filenode.path))}</li>
137 </ul>
138 </div>
139 </div>
140 <span style="float:right;margin-top:-3px">
141 <label>
142 ${_('show inline comments')}
143 ${h.checkbox('',checked="checked",class_="show-inline-comments",id_for=h.FID(filenode.changeset.raw_id,filenode.path))}
144 </label>
145 </span>
146 </div>
147 </div>
148 <div class="code-body">
149 <div class="full_f_path" path="${filenode.path}"></div>
150 %if diff:
151 ${diff|n}
152 %else:
153 ${_('No changes in this file')}
154 %endif
155 </div>
156 </div>
157 %endif
158 %endfor
118 ## diff block
119 <%namespace name="diff_block" file="/changeset/diff_block.html"/>
120 ${diff_block.diff_block(c.changes)}
159 121
122 ## template for inline comment form
160 123 <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
161 ## template for inline comment form
162 ${comment.comment_inline_form()}
163
164 <div class="comments">
165 <div class="comments-number">${len(c.comments)} comment(s) (${c.inline_cnt} ${_('inline')})</div>
166
167 %for path, lines in c.inline_comments:
168 <div style="display:none" class="inline-comment-placeholder" path="${path}" target_id="${h.FID(c.changeset.raw_id,path)}">
169 % for line,comments in lines.iteritems():
170 <div class="inline-comment-placeholder-line" line="${line}" target_id="${h.safeid(h.safe_unicode(path))}">
171 %for co in comments:
172 ${comment.comment_block(co)}
173 %endfor
174 </div>
175 %endfor
176 </div>
177 %endfor
124 ${comment.comment_inline_form(c.changeset)}
178 125
179 %for co in c.comments:
180 ${comment.comment_block(co)}
181 %endfor
182 %if c.rhodecode_user.username != 'default':
183 <div class="comment-form">
184 ${h.form(h.url('changeset_comment', repo_name=c.repo_name, revision=c.changeset.raw_id))}
185 <strong>${_('Leave a comment')}</strong>
186 <div class="clearfix">
187 <div class="comment-help">
188 ${_('Comments parsed using')} <a href="${h.url('rst_help')}">RST</a> ${_('syntax')}
189 ${_('with')} <span style="color:#003367" class="tooltip" title="${_('Use @username inside this text to send notification to this RhodeCode user')}">@mention</span> ${_('support')}
190 </div>
191 ${h.textarea('text')}
192 </div>
193 <div class="comment-button">
194 ${h.submit('save', _('Comment'), class_='ui-button')}
195 </div>
196 ${h.end_form()}
197 </div>
198 %endif
199 </div>
126 ${comment.comments(c.changeset)}
127
200 128 <script type="text/javascript">
201 129 var deleteComment = function(comment_id){
202 130
@@ -264,11 +192,14 b''
264 192
265 193 var comment = new YAHOO.util.Element(tableTr('inline-comments',inline.innerHTML))
266 194 YUD.insertAfter(comment,target_line.parentNode);
267 }catch(e){}
195 }catch(e){
196 console.log(e);
197 }
268 198 }
269 199 }
270 200 })
271 201
272 202 </script>
203
273 204 </div>
274 205 </%def>
@@ -1,3 +1,4 b''
1 ## -*- coding: utf-8 -*-
1 2 ##usage:
2 3 ## <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
3 4 ## ${comment.comment_block(co)}
@@ -33,12 +34,11 b''
33 34 </%def>
34 35
35 36
36
37 <%def name="comment_inline_form()">
37 <%def name="comment_inline_form(changeset)">
38 38 <div id='comment-inline-form-template' style="display:none">
39 39 <div class="comment-inline-form">
40 40 %if c.rhodecode_user.username != 'default':
41 ${h.form(h.url('changeset_comment', repo_name=c.repo_name, revision=c.changeset.raw_id))}
41 ${h.form(h.url('changeset_comment', repo_name=c.repo_name, revision=changeset.raw_id))}
42 42 <div class="clearfix">
43 43 <div class="comment-help">${_('Commenting on line')} {1}. ${_('Comments parsed using')}
44 44 <a href="${h.url('rst_help')}">RST</a> ${_('syntax')} ${_('with')}
@@ -67,4 +67,45 b''
67 67 %endif
68 68 </div>
69 69 </div>
70 </%def> No newline at end of file
70 </%def>
71
72
73 <%def name="comments(changeset)">
74
75 <div class="comments">
76 <div class="comments-number">${len(c.comments)} comment(s) (${c.inline_cnt} ${_('inline')})</div>
77
78 %for path, lines in c.inline_comments:
79 <div style="display:none" class="inline-comment-placeholder" path="${path}" target_id="${h.FID(changeset.raw_id,path)}">
80 % for line,comments in lines.iteritems():
81 <div class="inline-comment-placeholder-line" line="${line}" target_id="${h.safeid(h.safe_unicode(path))}">
82 %for co in comments:
83 ${comment_block(co)}
84 %endfor
85 </div>
86 %endfor
87 </div>
88 %endfor
89
90 %for co in c.comments:
91 ${comment.comment_block(co)}
92 %endfor
93 %if c.rhodecode_user.username != 'default':
94 <div class="comment-form">
95 ${h.form(h.url('changeset_comment', repo_name=c.repo_name, revision=changeset.raw_id))}
96 <strong>${_('Leave a comment')}</strong>
97 <div class="clearfix">
98 <div class="comment-help">
99 ${_('Comments parsed using')} <a href="${h.url('rst_help')}">RST</a> ${_('syntax')}
100 ${_('with')} <span style="color:#003367" class="tooltip" title="${_('Use @username inside this text to send notification to this RhodeCode user')}">@mention</span> ${_('support')}
101 </div>
102 ${h.textarea('text')}
103 </div>
104 <div class="comment-button">
105 ${h.submit('save', _('Comment'), class_='ui-button')}
106 </div>
107 ${h.end_form()}
108 </div>
109 %endif
110 </div>
111 </%def>
@@ -1,3 +1,4 b''
1 ## -*- coding: utf-8 -*-
1 2 <%inherit file="/base/base.html"/>
2 3
3 4 <%def name="title()">
@@ -24,8 +25,8 b''
24 25 </div>
25 26 <div class="table">
26 27 <div id="body" class="diffblock">
27 <div class="code-header">
28 <h3>${_('Compare View')}</h3>
28 <div class="code-header cv">
29 <h3 class="code-header-title">${_('Compare View')}</h3>
29 30 <div>
30 31 ${_('Changesets')} - r${c.cs_ranges[0].revision}:${h.short_id(c.cs_ranges[0].raw_id)} -> r${c.cs_ranges[-1].revision}:${h.short_id(c.cs_ranges[-1].raw_id)}
31 32 </div>
@@ -57,37 +58,32 b''
57 58 </div>
58 59
59 60 </div>
61 <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
62 <%namespace name="diff_block" file="/changeset/diff_block.html"/>
60 63 %for cs in c.cs_ranges:
61 %for change,filenode,diff,cs1,cs2,st in c.changes[cs.raw_id]:
62 %if change !='removed':
63 <div style="clear:both;height:10px"></div>
64 <div class="diffblock margined">
65 <div id="${h.FID(cs.raw_id,filenode.path)}" class="code-header">
66 <div class="changeset_header">
67 <span class="changeset_file">
68 ${h.link_to_if(change!='removed',h.safe_unicode(filenode.path),h.url('files_home',repo_name=c.repo_name,
69 revision=filenode.changeset.raw_id,f_path=h.safe_unicode(filenode.path)))}
70 </span>
71 %if 1:
72 &raquo; <span>${h.link_to(_('diff'),
73 h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='diff'))}</span>
74 &raquo; <span>${h.link_to(_('raw diff'),
75 h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='raw'))}</span>
76 &raquo; <span>${h.link_to(_('download diff'),
77 h.url('files_diff_home',repo_name=c.repo_name,f_path=h.safe_unicode(filenode.path),diff2=cs2,diff1=cs1,diff='download'))}</span>
78 %endif
79 </div>
80 </div>
81 <div class="code-body">
82 %if diff:
83 ${diff|n}
84 %else:
85 ${_('No changes in this file')}
86 %endif
87 </div>
88 </div>
89 %endif
64 ##${comment.comment_inline_form(cs)}
65 ## diff block
66 <h3 style="border:none;padding-top:8px;">${'r%s:%s' % (cs.revision,h.short_id(cs.raw_id))}</h3>
67 ${diff_block.diff_block(c.changes[cs.raw_id])}
68 ##${comment.comments(cs)}
69
90 70 %endfor
91 %endfor
71 <script type="text/javascript">
72
73 YUE.onDOMReady(function(){
74
75 YUE.on(YUQ('.diff-menu-activate'),'click',function(e){
76 var act = e.currentTarget.nextElementSibling;
77
78 if(YUD.hasClass(act,'active')){
79 YUD.removeClass(act,'active');
80 YUD.setStyle(act,'display','none');
81 }else{
82 YUD.addClass(act,'active');
83 YUD.setStyle(act,'display','');
84 }
85 });
86 })
87 </script>
92 88 </div>
93 89 </%def> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now