##// END OF EJS Templates
pull request: urlify PRs and fix javascript injection
Mads Kiilerich -
r3998:6133e598 default
parent child Browse files
Show More
@@ -1,252 +1,252 b''
1 1 <%inherit file="/base/base.html"/>
2 2
3 3 <%def name="title()">
4 4 ${_('%s Pull Request #%s') % (c.repo_name, c.pull_request.pull_request_id)} &middot; ${c.rhodecode_name}
5 5 </%def>
6 6
7 7 <%def name="breadcrumbs_links()">
8 8 ${_('Pull request #%s') % c.pull_request.pull_request_id}
9 9 </%def>
10 10
11 11 <%def name="page_nav()">
12 12 ${self.menu('repositories')}
13 13 </%def>
14 14
15 15 <%def name="main()">
16 16 ${self.repo_context_bar('showpullrequest')}
17 17 <div class="box">
18 18 <!-- box / title -->
19 19 <div class="title">
20 20 ${self.breadcrumbs()}
21 21 </div>
22 22
23 23 <h3 class="${'closed' if c.pull_request.is_closed() else ''}">
24 24 <img src="${h.url('/images/icons/flag_status_%s.png' % str(c.pull_request.last_review_status))}" />
25 25 ${_('Title')}: ${c.pull_request.title}
26 26 %if c.pull_request.is_closed():
27 27 (${_('Closed')})
28 28 %endif
29 29 </h3>
30 30
31 31 <div class="form">
32 32 <div id="summary" class="fields">
33 33 <div class="field">
34 34 <div class="label-summary">
35 35 <label>${_('Review status')}:</label>
36 36 </div>
37 37 <div class="input">
38 38 <div class="changeset-status-container" style="float:none;clear:both">
39 39 %if c.current_changeset_status:
40 40 <div title="${_('Pull request status')}" class="changeset-status-lbl">
41 41 %if c.pull_request.is_closed():
42 42 ${_('Closed')},
43 43 %endif
44 44 ${h.changeset_status_lbl(c.current_changeset_status)}
45 45 </div>
46 46 <div class="changeset-status-ico" style="padding:1px 4px"><img src="${h.url('/images/icons/flag_status_%s.png' % c.current_changeset_status)}" /></div>
47 47 %endif
48 48 </div>
49 49 </div>
50 50 </div>
51 51 <div class="field">
52 52 <div class="label-summary">
53 53 <label>${_('Still not reviewed by')}:</label>
54 54 </div>
55 55 <div class="input">
56 56 % if len(c.pull_request_pending_reviewers) > 0:
57 57 <div class="tooltip" title="${h.tooltip(', '.join([x.username for x in c.pull_request_pending_reviewers]))}">${ungettext('%d reviewer', '%d reviewers',len(c.pull_request_pending_reviewers)) % len(c.pull_request_pending_reviewers)}</div>
58 58 %else:
59 59 <div>${_('Pull request was reviewed by all reviewers')}</div>
60 60 %endif
61 61 </div>
62 62 </div>
63 63 <div class="field">
64 64 <div class="label-summary">
65 65 <label>${_('Origin repository')}:</label>
66 66 </div>
67 67 <div class="input">
68 68 <div>
69 69 ##%if h.is_hg(c.pull_request.org_repo):
70 70 ## <img class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url('/images/icons/hgicon.png')}"/>
71 71 ##%elif h.is_git(c.pull_request.org_repo):
72 72 ## <img class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url('/images/icons/giticon.png')}"/>
73 73 ##%endif
74 74 <span class="spantag">${c.pull_request.org_ref_parts[0]}: ${c.pull_request.org_ref_parts[1]}</span>
75 75 <span><a href="${h.url('summary_home', repo_name=c.pull_request.org_repo.repo_name)}">${c.pull_request.org_repo.clone_url()}</a></span>
76 76 </div>
77 77 </div>
78 78 </div>
79 79 <div class="field">
80 80 <div class="label-summary">
81 81 <label>${_('Description')}:</label>
82 82 </div>
83 83 <div class="input">
84 <div style="white-space:pre-wrap">${h.literal(c.pull_request.description)}</div>
84 <div style="white-space:pre-wrap">${h.urlify_commit(c.pull_request.description)}</div>
85 85 </div>
86 86 </div>
87 87 <div class="field">
88 88 <div class="label-summary">
89 89 <label>${_('Created on')}:</label>
90 90 </div>
91 91 <div class="input">
92 92 <div>${h.fmt_date(c.pull_request.created_on)}</div>
93 93 </div>
94 94 </div>
95 95 </div>
96 96 </div>
97 97
98 98 <div style="overflow: auto;">
99 99 ##DIFF
100 100 <div class="table" style="float:left;clear:none">
101 101 <div id="body" class="diffblock">
102 102 <div style="white-space:pre-wrap;padding:5px">${_('Compare view')}</div>
103 103 </div>
104 104 <div id="changeset_compare_view_content">
105 105 ##CS
106 106 <div style="font-size:1.1em;font-weight: bold;clear:both;padding-top:10px">${ungettext('Showing %s commit','Showing %s commits', len(c.cs_ranges)) % len(c.cs_ranges)}</div>
107 107 <%include file="/compare/compare_cs.html" />
108 108
109 109 ## FILES
110 110 <div style="font-size:1.1em;font-weight: bold;clear:both;padding-top:10px">
111 111
112 112 % if c.limited_diff:
113 113 ${ungettext('%s file changed', '%s files changed', len(c.files)) % len(c.files)}
114 114 % else:
115 115 ${ungettext('%s file changed with %s insertions and %s deletions','%s files changed with %s insertions and %s deletions', len(c.files)) % (len(c.files),c.lines_added,c.lines_deleted)}:
116 116 %endif
117 117
118 118 </div>
119 119 <div class="cs_files">
120 120 %if not c.files:
121 121 <span class="empty_data">${_('No files')}</span>
122 122 %endif
123 123 %for fid, change, f, stat in c.files:
124 124 <div class="cs_${change}">
125 125 <div class="node">${h.link_to(h.safe_unicode(f),h.url.current(anchor=fid))}</div>
126 126 <div class="changes">${h.fancy_file_stats(stat)}</div>
127 127 </div>
128 128 %endfor
129 129 </div>
130 130 % if c.limited_diff:
131 131 <h5>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}" onclick="return confirm('${_("Showing a huge diff might take some time and resources")}')">${_('Show full diff')}</a></h5>
132 132 % endif
133 133 </div>
134 134 </div>
135 135 ## REVIEWERS
136 136 <div style="float:left; border-left:1px dashed #eee">
137 137 <h4>${_('Pull request reviewers')}</h4>
138 138 <div id="reviewers" style="padding:0px 0px 5px 10px">
139 139 ## members goes here !
140 140 <div class="group_members_wrap" style="min-height:45px">
141 141 <ul id="review_members" class="group_members">
142 142 %for member,status in c.pull_request_reviewers:
143 143 <li id="reviewer_${member.user_id}">
144 144 <div class="reviewers_member">
145 145 <div style="float:left;padding:0px 3px 0px 0px" class="tooltip" title="${h.tooltip(h.changeset_status_lbl(status[0][1].status if status else 'not_reviewed'))}">
146 146 <img src="${h.url(str('/images/icons/flag_status_%s.png' % (status[0][1].status if status else 'not_reviewed')))}"/>
147 147 </div>
148 148 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(member.email,14)}"/> </div>
149 149 <div style="float:left">${member.full_name} (${_('owner') if c.pull_request.user_id == member.user_id else _('reviewer')})</div>
150 150 <input type="hidden" value="${member.user_id}" name="review_members" />
151 151 %if not c.pull_request.is_closed() and (h.HasPermissionAny('hg.admin', 'repository.admin')() or c.pull_request.user_id == c.rhodecode_user.user_id):
152 152 <span class="delete_icon action_button" onclick="removeReviewMember(${member.user_id})"></span>
153 153 %endif
154 154 </div>
155 155 </li>
156 156 %endfor
157 157 </ul>
158 158 </div>
159 159 %if not c.pull_request.is_closed():
160 160 <div class='ac'>
161 161 %if h.HasPermissionAny('hg.admin', 'repository.admin')() or c.pull_request.author.user_id == c.rhodecode_user.user_id:
162 162 <div class="reviewer_ac">
163 163 ${h.text('user', class_='yui-ac-input')}
164 164 <span class="help-block">${_('Add or remove reviewer to this pull request.')}</span>
165 165 <div id="reviewers_container"></div>
166 166 </div>
167 167 <div style="padding:0px 10px">
168 168 <span id="update_pull_request" class="ui-btn xsmall">${_('Save changes')}</span>
169 169 </div>
170 170 %endif
171 171 </div>
172 172 %endif
173 173 </div>
174 174 </div>
175 175 </div>
176 176 <script>
177 177 var _USERS_AC_DATA = ${c.users_array|n};
178 178 var _GROUPS_AC_DATA = ${c.users_groups_array|n};
179 179 // TODO: switch this to pyroutes
180 180 AJAX_COMMENT_URL = "${url('pullrequest_comment',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id)}";
181 181 AJAX_COMMENT_DELETE_URL = "${url('pullrequest_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__')}";
182 182
183 183 pyroutes.register('pullrequest_comment', "${url('pullrequest_comment',repo_name='%(repo_name)s',pull_request_id='%(pull_request_id)s')}", ['repo_name', 'pull_request_id']);
184 184 pyroutes.register('pullrequest_comment_delete', "${url('pullrequest_comment_delete',repo_name='%(repo_name)s',comment_id='%(comment_id)s')}", ['repo_name', 'comment_id']);
185 185 pyroutes.register('pullrequest_update', "${url('pullrequest_update',repo_name='%(repo_name)s',pull_request_id='%(pull_request_id)s')}", ['repo_name', 'pull_request_id']);
186 186
187 187 </script>
188 188
189 189 ## diff block
190 190 <%namespace name="diff_block" file="/changeset/diff_block.html"/>
191 191 %for fid, change, f, stat in c.files:
192 192 ${diff_block.diff_block_simple([c.changes[fid]])}
193 193 %endfor
194 194 % if c.limited_diff:
195 195 <h4>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}" onclick="return confirm('${_("Showing a huge diff might take some time and resources")}')">${_('Show full diff')}</a></h4>
196 196 % endif
197 197
198 198
199 199 ## template for inline comment form
200 200 <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
201 201 ${comment.comment_inline_form()}
202 202
203 203 ## render comments and inlines
204 204 ${comment.generate_comments(include_pr=True)}
205 205
206 206 % if not c.pull_request.is_closed():
207 207 ## main comment form and it status
208 208 ${comment.comments(h.url('pullrequest_comment', repo_name=c.repo_name,
209 209 pull_request_id=c.pull_request.pull_request_id),
210 210 c.current_changeset_status,
211 211 close_btn=True, change_status=c.allowed_to_change_status)}
212 212 %endif
213 213
214 214 <script type="text/javascript">
215 215 YUE.onDOMReady(function(){
216 216 PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
217 217
218 218 YUE.on(YUQ('.show-inline-comments'),'change',function(e){
219 219 var show = 'none';
220 220 var target = e.currentTarget;
221 221 if(target.checked){
222 222 var show = ''
223 223 }
224 224 var boxid = YUD.getAttribute(target,'id_for');
225 225 var comments = YUQ('#{0} .inline-comments'.format(boxid));
226 226 for(c in comments){
227 227 YUD.setStyle(comments[c],'display',show);
228 228 }
229 229 var btns = YUQ('#{0} .inline-comments-button'.format(boxid));
230 230 for(c in btns){
231 231 YUD.setStyle(btns[c],'display',show);
232 232 }
233 233 })
234 234
235 235 YUE.on(YUQ('.line'),'click',function(e){
236 236 var tr = e.currentTarget;
237 237 injectInlineForm(tr);
238 238 });
239 239
240 240 // inject comments into they proper positions
241 241 var file_comments = YUQ('.inline-comment-placeholder');
242 242 renderInlineComments(file_comments);
243 243
244 244 YUE.on(YUD.get('update_pull_request'),'click',function(e){
245 245 updateReviewers(undefined, "${c.repo_name}", "${c.pull_request.pull_request_id}");
246 246 })
247 247 })
248 248 </script>
249 249
250 250 </div>
251 251
252 252 </%def>
General Comments 0
You need to be logged in to leave comments. Login now