##// END OF EJS Templates
pr-versioning: ux better selectors
marcink -
r1370:34fbad0a default
parent child Browse files
Show More
@@ -1,889 +1,915 b''
1 1 <%inherit file="/base/base.mako"/>
2 2 <%namespace name="base" file="/base/base.mako"/>
3 3
4 4 <%def name="title()">
5 5 ${_('%s Pull Request #%s') % (c.repo_name, c.pull_request.pull_request_id)}
6 6 %if c.rhodecode_name:
7 7 &middot; ${h.branding(c.rhodecode_name)}
8 8 %endif
9 9 </%def>
10 10
11 11 <%def name="breadcrumbs_links()">
12 12 <span id="pr-title">
13 13 ${c.pull_request.title}
14 14 %if c.pull_request.is_closed():
15 15 (${_('Closed')})
16 16 %endif
17 17 </span>
18 18 <div id="pr-title-edit" class="input" style="display: none;">
19 19 ${h.text('pullrequest_title', id_="pr-title-input", class_="large", value=c.pull_request.title)}
20 20 </div>
21 21 </%def>
22 22
23 23 <%def name="menu_bar_nav()">
24 24 ${self.menu_items(active='repositories')}
25 25 </%def>
26 26
27 27 <%def name="menu_bar_subnav()">
28 28 ${self.repo_menu(active='showpullrequest')}
29 29 </%def>
30 30
31 31 <%def name="main()">
32 32
33 33 <script type="text/javascript">
34 34 // TODO: marcink switch this to pyroutes
35 35 AJAX_COMMENT_DELETE_URL = "${url('pullrequest_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__')}";
36 36 templateContext.pull_request_data.pull_request_id = ${c.pull_request.pull_request_id};
37 37 </script>
38 38 <div class="box">
39 39
40 40 <div class="title">
41 41 ${self.repo_page_title(c.rhodecode_db_repo)}
42 42 </div>
43 43
44 44 ${self.breadcrumbs()}
45 45
46 46 <div class="box pr-summary">
47 47
48 48 <div class="summary-details block-left">
49 49 <% summary = lambda n:{False:'summary-short'}.get(n) %>
50 50 <div class="pr-details-title">
51 51 <a href="${h.url('pull_requests_global', pull_request_id=c.pull_request.pull_request_id)}">${_('Pull request #%s') % c.pull_request.pull_request_id}</a> ${_('From')} ${h.format_date(c.pull_request.created_on)}
52 52 %if c.allowed_to_update:
53 53 <div id="delete_pullrequest" class="pull-right action_button ${'' if c.allowed_to_delete else 'disabled' }" style="clear:inherit;padding: 0">
54 54 % if c.allowed_to_delete:
55 55 ${h.secure_form(url('pullrequest_delete', repo_name=c.pull_request.target_repo.repo_name, pull_request_id=c.pull_request.pull_request_id),method='delete')}
56 56 ${h.submit('remove_%s' % c.pull_request.pull_request_id, _('Delete'),
57 57 class_="btn btn-link btn-danger",onclick="return confirm('"+_('Confirm to delete this pull request')+"');")}
58 58 ${h.end_form()}
59 59 % else:
60 60 ${_('Delete')}
61 61 % endif
62 62 </div>
63 63 <div id="open_edit_pullrequest" class="pull-right action_button">${_('Edit')}</div>
64 64 <div id="close_edit_pullrequest" class="pull-right action_button" style="display: none;padding: 0">${_('Cancel')}</div>
65 65 %endif
66 66 </div>
67 67
68 68 <div id="summary" class="fields pr-details-content">
69 69 <div class="field">
70 70 <div class="label-summary">
71 71 <label>${_('Origin')}:</label>
72 72 </div>
73 73 <div class="input">
74 74 <div class="pr-origininfo">
75 75 ## branch link is only valid if it is a branch
76 76 <span class="tag">
77 77 %if c.pull_request.source_ref_parts.type == 'branch':
78 78 <a href="${h.url('changelog_home', repo_name=c.pull_request.source_repo.repo_name, branch=c.pull_request.source_ref_parts.name)}">${c.pull_request.source_ref_parts.type}: ${c.pull_request.source_ref_parts.name}</a>
79 79 %else:
80 80 ${c.pull_request.source_ref_parts.type}: ${c.pull_request.source_ref_parts.name}
81 81 %endif
82 82 </span>
83 83 <span class="clone-url">
84 84 <a href="${h.url('summary_home', repo_name=c.pull_request.source_repo.repo_name)}">${c.pull_request.source_repo.clone_url()}</a>
85 85 </span>
86 86 </div>
87 87 <div class="pr-pullinfo">
88 88 %if h.is_hg(c.pull_request.source_repo):
89 89 <input type="text" value="hg pull -r ${h.short_id(c.source_ref)} ${c.pull_request.source_repo.clone_url()}" readonly="readonly">
90 90 %elif h.is_git(c.pull_request.source_repo):
91 91 <input type="text" value="git pull ${c.pull_request.source_repo.clone_url()} ${c.pull_request.source_ref_parts.name}" readonly="readonly">
92 92 %endif
93 93 </div>
94 94 </div>
95 95 </div>
96 96 <div class="field">
97 97 <div class="label-summary">
98 98 <label>${_('Target')}:</label>
99 99 </div>
100 100 <div class="input">
101 101 <div class="pr-targetinfo">
102 102 ## branch link is only valid if it is a branch
103 103 <span class="tag">
104 104 %if c.pull_request.target_ref_parts.type == 'branch':
105 105 <a href="${h.url('changelog_home', repo_name=c.pull_request.target_repo.repo_name, branch=c.pull_request.target_ref_parts.name)}">${c.pull_request.target_ref_parts.type}: ${c.pull_request.target_ref_parts.name}</a>
106 106 %else:
107 107 ${c.pull_request.target_ref_parts.type}: ${c.pull_request.target_ref_parts.name}
108 108 %endif
109 109 </span>
110 110 <span class="clone-url">
111 111 <a href="${h.url('summary_home', repo_name=c.pull_request.target_repo.repo_name)}">${c.pull_request.target_repo.clone_url()}</a>
112 112 </span>
113 113 </div>
114 114 </div>
115 115 </div>
116 116
117 117 ## Link to the shadow repository.
118 118 <div class="field">
119 119 <div class="label-summary">
120 120 <label>${_('Merge')}:</label>
121 121 </div>
122 122 <div class="input">
123 123 % if not c.pull_request.is_closed() and c.pull_request.shadow_merge_ref:
124 124 <div class="pr-mergeinfo">
125 125 %if h.is_hg(c.pull_request.target_repo):
126 126 <input type="text" value="hg clone -u ${c.pull_request.shadow_merge_ref.name} ${c.shadow_clone_url} pull-request-${c.pull_request.pull_request_id}" readonly="readonly">
127 127 %elif h.is_git(c.pull_request.target_repo):
128 128 <input type="text" value="git clone --branch ${c.pull_request.shadow_merge_ref.name} ${c.shadow_clone_url} pull-request-${c.pull_request.pull_request_id}" readonly="readonly">
129 129 %endif
130 130 </div>
131 131 % else:
132 132 <div class="">
133 133 ${_('Shadow repository data not available')}.
134 134 </div>
135 135 % endif
136 136 </div>
137 137 </div>
138 138
139 139 <div class="field">
140 140 <div class="label-summary">
141 141 <label>${_('Review')}:</label>
142 142 </div>
143 143 <div class="input">
144 144 %if c.pull_request_review_status:
145 145 <div class="${'flag_status %s' % c.pull_request_review_status} tooltip pull-left"></div>
146 146 <span class="changeset-status-lbl tooltip">
147 147 %if c.pull_request.is_closed():
148 148 ${_('Closed')},
149 149 %endif
150 150 ${h.commit_status_lbl(c.pull_request_review_status)}
151 151 </span>
152 152 - ${ungettext('calculated based on %s reviewer vote', 'calculated based on %s reviewers votes', len(c.pull_request_reviewers)) % len(c.pull_request_reviewers)}
153 153 %endif
154 154 </div>
155 155 </div>
156 156 <div class="field">
157 157 <div class="pr-description-label label-summary">
158 158 <label>${_('Description')}:</label>
159 159 </div>
160 160 <div id="pr-desc" class="input">
161 161 <div class="pr-description">${h.urlify_commit_message(c.pull_request.description, c.repo_name)}</div>
162 162 </div>
163 163 <div id="pr-desc-edit" class="input textarea editor" style="display: none;">
164 164 <textarea id="pr-description-input" size="30">${c.pull_request.description}</textarea>
165 165 </div>
166 166 </div>
167 167
168 168 <div class="field">
169 169 <div class="label-summary">
170 170 <label>${_('Versions')}:</label>
171 171 </div>
172 172
173 173 <% outdated_comm_count_ver = len(c.inline_versions[None]['outdated']) %>
174 174 <% general_outdated_comm_count_ver = len(c.comment_versions[None]['outdated']) %>
175 175
176 176 <div class="pr-versions">
177 177 % if c.show_version_changes:
178 178 <% outdated_comm_count_ver = len(c.inline_versions[c.at_version_num]['outdated']) %>
179 179 <% general_outdated_comm_count_ver = len(c.comment_versions[c.at_version_num]['outdated']) %>
180 180 <a id="show-pr-versions" class="input" onclick="return versionController.toggleVersionView(this)" href="#show-pr-versions"
181 181 data-toggle-on="${ungettext('{} version available for this pull request, show it.', '{} versions available for this pull request, show them.', len(c.versions)).format(len(c.versions))}"
182 182 data-toggle-off="${_('Hide all versions of this pull request')}">
183 183 ${ungettext('{} version available for this pull request, show it.', '{} versions available for this pull request, show them.', len(c.versions)).format(len(c.versions))}
184 184 </a>
185 185 <table>
186 186 ## SHOW ALL VERSIONS OF PR
187 187 <% ver_pr = None %>
188 188
189 189 % for data in reversed(list(enumerate(c.versions, 1))):
190 190 <% ver_pos = data[0] %>
191 191 <% ver = data[1] %>
192 192 <% ver_pr = ver.pull_request_version_id %>
193 193 <% display_row = '' if c.at_version and (c.at_version_num == ver_pr or c.from_version_num == ver_pr) else 'none' %>
194 194
195 195 <tr class="version-pr" style="display: ${display_row}">
196 196 <td>
197 197 <code>
198 198 <a href="${h.url.current(version=ver_pr or 'latest')}">v${ver_pos}</a>
199 199 </code>
200 200 </td>
201 201 <td>
202 202 <input ${'checked="checked"' if c.from_version_num == ver_pr else ''} class="compare-radio-button" type="radio" name="ver_source" value="${ver_pr or 'latest'}" data-ver-pos="${ver_pos}"/>
203 203 <input ${'checked="checked"' if c.at_version_num == ver_pr else ''} class="compare-radio-button" type="radio" name="ver_target" value="${ver_pr or 'latest'}" data-ver-pos="${ver_pos}"/>
204 204 </td>
205 205 <td>
206 206 <% review_status = c.review_versions[ver_pr].status if ver_pr in c.review_versions else 'not_reviewed' %>
207 207 <div class="${'flag_status %s' % review_status} tooltip pull-left" title="${_('Your review status at this version')}">
208 208 </div>
209 209 </td>
210 210 <td>
211 211 % if c.at_version_num != ver_pr:
212 212 <i class="icon-comment"></i>
213 213 <code class="tooltip" title="${_('Comment from pull request version {0}, general:{1} inline:{2}').format(ver_pos, len(c.comment_versions[ver_pr]['at']), len(c.inline_versions[ver_pr]['at']))}">
214 ${len(c.comment_versions[ver_pr]['at'])}/${len(c.inline_versions[ver_pr]['at'])}
214 G:${len(c.comment_versions[ver_pr]['at'])} / I:${len(c.inline_versions[ver_pr]['at'])}
215 215 </code>
216 216 % endif
217 217 </td>
218 218 <td>
219 219 ##<code>${ver.source_ref_parts.commit_id[:6]}</code>
220 220 </td>
221 221 <td>
222 222 ${h.age_component(ver.updated_on)}
223 223 </td>
224 224 </tr>
225 225 % endfor
226 226
227 227 <tr>
228 <td colspan="5">
229 <button id="show-version-diff" onclick="return versionController.showVersionDiff()" class="btn btn-sm" style="display: none" data-label-text="${_('show changes between versions')}">
230 ${_('show changes between versions')}
228 <td colspan="6">
229 <button id="show-version-diff" onclick="return versionController.showVersionDiff()" class="btn btn-sm" style="display: none"
230 data-label-text-locked="${_('select versions to show changes')}"
231 data-label-text-diff="${_('show changes between versions')}"
232 data-label-text-show="${_('show pull request for this version')}"
233 >
234 ${_('select versions to show changes')}
231 235 </button>
232 236 </td>
233 237 </tr>
234 238
235 239 ## show comment/inline comments summary
236 240 <%def name="comments_summary()">
237 241 <tr>
238 242 <td colspan="6" class="comments-summary-td">
239 243
240 244 % if c.at_version:
241 245 <% inline_comm_count_ver = len(c.inline_versions[c.at_version_num]['display']) %>
242 246 <% general_comm_count_ver = len(c.comment_versions[c.at_version_num]['display']) %>
243 247 ${_('Comments at this version')}:
244 248 % else:
245 249 <% inline_comm_count_ver = len(c.inline_versions[c.at_version_num]['until']) %>
246 250 <% general_comm_count_ver = len(c.comment_versions[c.at_version_num]['until']) %>
247 251 ${_('Comments for this pull request')}:
248 252 % endif
249 253
250 254
251 255 %if general_comm_count_ver:
252 256 <a href="#comments">${_("%d General ") % general_comm_count_ver}</a>
253 257 %else:
254 258 ${_("%d General ") % general_comm_count_ver}
255 259 %endif
256 260
257 261 %if inline_comm_count_ver:
258 262 , <a href="#" onclick="return Rhodecode.comments.nextComment();" id="inline-comments-counter">${_("%d Inline") % inline_comm_count_ver}</a>
259 263 %else:
260 264 , ${_("%d Inline") % inline_comm_count_ver}
261 265 %endif
262 266
263 267 %if outdated_comm_count_ver:
264 268 , <a href="#" onclick="showOutdated(); Rhodecode.comments.nextOutdatedComment(); return false;">${_("%d Outdated") % outdated_comm_count_ver}</a>
265 269 <a href="#" class="showOutdatedComments" onclick="showOutdated(this); return false;"> | ${_('show outdated comments')}</a>
266 270 <a href="#" class="hideOutdatedComments" style="display: none" onclick="hideOutdated(this); return false;"> | ${_('hide outdated comments')}</a>
267 271 %else:
268 272 , ${_("%d Outdated") % outdated_comm_count_ver}
269 273 %endif
270 274 </td>
271 275 </tr>
272 276 </%def>
273 277 ${comments_summary()}
274 278 </table>
275 279 % else:
276 280 <div class="input">
277 281 ${_('Pull request versions not available')}.
278 282 </div>
279 283 <div>
280 284 <table>
281 285 ${comments_summary()}
282 286 </table>
283 287 </div>
284 288 % endif
285 289 </div>
286 290 </div>
287 291
288 292 <div id="pr-save" class="field" style="display: none;">
289 293 <div class="label-summary"></div>
290 294 <div class="input">
291 295 <span id="edit_pull_request" class="btn btn-small">${_('Save Changes')}</span>
292 296 </div>
293 297 </div>
294 298 </div>
295 299 </div>
296 300 <div>
297 301 ## AUTHOR
298 302 <div class="reviewers-title block-right">
299 303 <div class="pr-details-title">
300 304 ${_('Author')}
301 305 </div>
302 306 </div>
303 307 <div class="block-right pr-details-content reviewers">
304 308 <ul class="group_members">
305 309 <li>
306 310 ${self.gravatar_with_user(c.pull_request.author.email, 16)}
307 311 </li>
308 312 </ul>
309 313 </div>
310 314 ## REVIEWERS
311 315 <div class="reviewers-title block-right">
312 316 <div class="pr-details-title">
313 317 ${_('Pull request reviewers')}
314 318 %if c.allowed_to_update:
315 319 <span id="open_edit_reviewers" class="block-right action_button">${_('Edit')}</span>
316 320 <span id="close_edit_reviewers" class="block-right action_button" style="display: none;">${_('Close')}</span>
317 321 %endif
318 322 </div>
319 323 </div>
320 324 <div id="reviewers" class="block-right pr-details-content reviewers">
321 325 ## members goes here !
322 326 <input type="hidden" name="__start__" value="review_members:sequence">
323 327 <ul id="review_members" class="group_members">
324 328 %for member,reasons,status in c.pull_request_reviewers:
325 329 <li id="reviewer_${member.user_id}">
326 330 <div class="reviewers_member">
327 331 <div class="reviewer_status tooltip" title="${h.tooltip(h.commit_status_lbl(status[0][1].status if status else 'not_reviewed'))}">
328 332 <div class="${'flag_status %s' % (status[0][1].status if status else 'not_reviewed')} pull-left reviewer_member_status"></div>
329 333 </div>
330 334 <div id="reviewer_${member.user_id}_name" class="reviewer_name">
331 335 ${self.gravatar_with_user(member.email, 16)}
332 336 </div>
333 337 <input type="hidden" name="__start__" value="reviewer:mapping">
334 338 <input type="hidden" name="__start__" value="reasons:sequence">
335 339 %for reason in reasons:
336 340 <div class="reviewer_reason">- ${reason}</div>
337 341 <input type="hidden" name="reason" value="${reason}">
338 342
339 343 %endfor
340 344 <input type="hidden" name="__end__" value="reasons:sequence">
341 345 <input id="reviewer_${member.user_id}_input" type="hidden" value="${member.user_id}" name="user_id" />
342 346 <input type="hidden" name="__end__" value="reviewer:mapping">
343 347 %if c.allowed_to_update:
344 348 <div class="reviewer_member_remove action_button" onclick="removeReviewMember(${member.user_id}, true)" style="visibility: hidden;">
345 349 <i class="icon-remove-sign" ></i>
346 350 </div>
347 351 %endif
348 352 </div>
349 353 </li>
350 354 %endfor
351 355 </ul>
352 356 <input type="hidden" name="__end__" value="review_members:sequence">
353 357 %if not c.pull_request.is_closed():
354 358 <div id="add_reviewer_input" class='ac' style="display: none;">
355 359 %if c.allowed_to_update:
356 360 <div class="reviewer_ac">
357 361 ${h.text('user', class_='ac-input', placeholder=_('Add reviewer'))}
358 362 <div id="reviewers_container"></div>
359 363 </div>
360 364 <div>
361 365 <span id="update_pull_request" class="btn btn-small">${_('Save Changes')}</span>
362 366 </div>
363 367 %endif
364 368 </div>
365 369 %endif
366 370 </div>
367 371 </div>
368 372 </div>
369 373 <div class="box">
370 374 ##DIFF
371 375 <div class="table" >
372 376 <div id="changeset_compare_view_content">
373 377 ##CS
374 378 % if c.missing_requirements:
375 379 <div class="box">
376 380 <div class="alert alert-warning">
377 381 <div>
378 382 <strong>${_('Missing requirements:')}</strong>
379 383 ${_('These commits cannot be displayed, because this repository uses the Mercurial largefiles extension, which was not enabled.')}
380 384 </div>
381 385 </div>
382 386 </div>
383 387 % elif c.missing_commits:
384 388 <div class="box">
385 389 <div class="alert alert-warning">
386 390 <div>
387 391 <strong>${_('Missing commits')}:</strong>
388 392 ${_('This pull request cannot be displayed, because one or more commits no longer exist in the source repository.')}
389 393 ${_('Please update this pull request, push the commits back into the source repository, or consider closing this pull request.')}
390 394 </div>
391 395 </div>
392 396 </div>
393 397 % endif
394 398
395 399 <div class="compare_view_commits_title">
396 400 % if not c.compare_mode:
397 401
398 402 % if c.at_version_pos:
399 403 <h4>
400 404 ${_('Showing changes at v%d, commenting is disabled.') % c.at_version_pos}
401 405 </h4>
402 406 % endif
403 407
404 408 <div class="pull-left">
405 409 <div class="btn-group">
406 410 <a
407 411 class="btn"
408 412 href="#"
409 413 onclick="$('.compare_select').show();$('.compare_select_hidden').hide(); return false">
410 414 ${ungettext('Expand %s commit','Expand %s commits', len(c.commit_ranges)) % len(c.commit_ranges)}
411 415 </a>
412 416 <a
413 417 class="btn"
414 418 href="#"
415 419 onclick="$('.compare_select').hide();$('.compare_select_hidden').show(); return false">
416 420 ${ungettext('Collapse %s commit','Collapse %s commits', len(c.commit_ranges)) % len(c.commit_ranges)}
417 421 </a>
418 422 </div>
419 423 </div>
420 424
421 425 <div class="pull-right">
422 426 % if c.allowed_to_update and not c.pull_request.is_closed():
423 427 <a id="update_commits" class="btn btn-primary pull-right">${_('Update commits')}</a>
424 428 % else:
425 429 <a class="tooltip btn disabled pull-right" disabled="disabled" title="${_('Update is disabled for current view')}">${_('Update commits')}</a>
426 430 % endif
427 431
428 432 </div>
429 433 % endif
430 434 </div>
431 435
432 436 % if not c.missing_commits:
433 437 % if c.compare_mode:
434 438 % if c.at_version:
435 439 <h4>
436 440 ${_('Commits and changes between v{ver_from} and {ver_to} of this pull request, commenting is disabled').format(ver_from=c.from_version_pos, ver_to=c.at_version_pos if c.at_version_pos else 'latest')}:
437 441 </h4>
438 442
439 443 <div class="subtitle-compare">
440 444 ${_('commits added: {}, removed: {}').format(len(c.commit_changes_summary.added), len(c.commit_changes_summary.removed))}
441 445 </div>
442 446
443 447 <div class="container">
444 448 <table class="rctable compare_view_commits">
445 449 <tr>
446 450 <th></th>
447 451 <th>${_('Time')}</th>
448 452 <th>${_('Author')}</th>
449 453 <th>${_('Commit')}</th>
450 454 <th></th>
451 455 <th>${_('Description')}</th>
452 456 </tr>
453 457
454 458 % for c_type, commit in c.commit_changes:
455 459 % if c_type in ['a', 'r']:
456 460 <%
457 461 if c_type == 'a':
458 462 cc_title = _('Commit added in displayed changes')
459 463 elif c_type == 'r':
460 464 cc_title = _('Commit removed in displayed changes')
461 465 else:
462 466 cc_title = ''
463 467 %>
464 468 <tr id="row-${commit.raw_id}" commit_id="${commit.raw_id}" class="compare_select">
465 469 <td>
466 470 <div class="commit-change-indicator color-${c_type}-border">
467 471 <div class="commit-change-content color-${c_type} tooltip" title="${cc_title}">
468 472 ${c_type.upper()}
469 473 </div>
470 474 </div>
471 475 </td>
472 476 <td class="td-time">
473 477 ${h.age_component(commit.date)}
474 478 </td>
475 479 <td class="td-user">
476 480 ${base.gravatar_with_user(commit.author, 16)}
477 481 </td>
478 482 <td class="td-hash">
479 483 <code>
480 484 <a href="${h.url('changeset_home', repo_name=c.target_repo.repo_name, revision=commit.raw_id)}">
481 485 r${commit.revision}:${h.short_id(commit.raw_id)}
482 486 </a>
483 487 ${h.hidden('revisions', commit.raw_id)}
484 488 </code>
485 489 </td>
486 490 <td class="expand_commit" data-commit-id="${commit.raw_id}" title="${_( 'Expand commit message')}">
487 491 <div class="show_more_col">
488 492 <i class="show_more"></i>
489 493 </div>
490 494 </td>
491 495 <td class="mid td-description">
492 496 <div class="log-container truncate-wrap">
493 497 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">
494 498 ${h.urlify_commit_message(commit.message, c.repo_name)}
495 499 </div>
496 500 </div>
497 501 </td>
498 502 </tr>
499 503 % endif
500 504 % endfor
501 505 </table>
502 506 </div>
503 507
504 508 <script>
505 509 $('.expand_commit').on('click',function(e){
506 510 var target_expand = $(this);
507 511 var cid = target_expand.data('commitId');
508 512
509 513 if (target_expand.hasClass('open')){
510 514 $('#c-'+cid).css({
511 515 'height': '1.5em',
512 516 'white-space': 'nowrap',
513 517 'text-overflow': 'ellipsis',
514 518 'overflow':'hidden'
515 519 });
516 520 target_expand.removeClass('open');
517 521 }
518 522 else {
519 523 $('#c-'+cid).css({
520 524 'height': 'auto',
521 525 'white-space': 'pre-line',
522 526 'text-overflow': 'initial',
523 527 'overflow':'visible'
524 528 });
525 529 target_expand.addClass('open');
526 530 }
527 531 });
528 532 </script>
529 533
530 534 % endif
531 535
532 536 % else:
533 537 <%include file="/compare/compare_commits.mako" />
534 538 % endif
535 539
536 540 <div class="cs_files">
537 541 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
538 542 ${cbdiffs.render_diffset_menu()}
539 543 ${cbdiffs.render_diffset(
540 544 c.diffset, use_comments=True,
541 545 collapse_when_files_over=30,
542 546 disable_new_comments=not c.allowed_to_comment,
543 547 deleted_files_comments=c.deleted_files_comments)}
544 548 </div>
545 549 % else:
546 550 ## skipping commits we need to clear the view for missing commits
547 551 <div style="clear:both;"></div>
548 552 % endif
549 553
550 554 </div>
551 555 </div>
552 556
553 557 ## template for inline comment form
554 558 <%namespace name="comment" file="/changeset/changeset_file_comment.mako"/>
555 559
556 560 ## render general comments
557 561
558 562 <div id="comment-tr-show">
559 563 <div class="comment">
560 564 % if general_outdated_comm_count_ver:
561 565 <div class="meta">
562 566 % if general_outdated_comm_count_ver == 1:
563 567 ${_('there is {num} general comment from older versions').format(num=general_outdated_comm_count_ver)},
564 568 <a href="#show-hidden-comments" onclick="$('.comment-general.comment-outdated').show(); $(this).parent().hide(); return false;">${_('show it')}</a>
565 569 % else:
566 570 ${_('there are {num} general comments from older versions').format(num=general_outdated_comm_count_ver)},
567 571 <a href="#show-hidden-comments" onclick="$('.comment-general.comment-outdated').show(); $(this).parent().hide(); return false;">${_('show them')}</a>
568 572 % endif
569 573 </div>
570 574 % endif
571 575 </div>
572 576 </div>
573 577
574 578 ${comment.generate_comments(c.comments, include_pull_request=True, is_pull_request=True)}
575 579
576 580 % if not c.pull_request.is_closed():
577 581 ## merge status, and merge action
578 582 <div class="pull-request-merge">
579 583 <%include file="/pullrequests/pullrequest_merge_checks.mako"/>
580 584 </div>
581 585
582 586 ## main comment form and it status
583 587 ${comment.comments(h.url('pullrequest_comment', repo_name=c.repo_name,
584 588 pull_request_id=c.pull_request.pull_request_id),
585 589 c.pull_request_review_status,
586 590 is_pull_request=True, change_status=c.allowed_to_change_status)}
587 591 %endif
588 592
589 593 <script type="text/javascript">
590 594 if (location.hash) {
591 595 var result = splitDelimitedHash(location.hash);
592 596 var line = $('html').find(result.loc);
593 597 // show hidden comments if we use location.hash
594 598 if (line.hasClass('comment-general')) {
595 599 $(line).show();
596 600 } else if (line.hasClass('comment-inline')) {
597 601 $(line).show();
598 602 var $cb = $(line).closest('.cb');
599 603 $cb.removeClass('cb-collapsed')
600 604 }
601 605 if (line.length > 0){
602 606 offsetScroll(line, 70);
603 607 }
604 608 }
605 609
606 610 VersionController = function() {
607 611 var self = this;
608 612 this.$verSource = $('input[name=ver_source]');
609 613 this.$verTarget = $('input[name=ver_target]');
610 614
611 615 this.adjustRadioSelectors = function (curNode) {
612 616 var getVal = function(item) {
613 617 if (item == 'latest'){
614 618 return Number.MAX_SAFE_INTEGER
615 619 }
616 620 else {
617 621 return parseInt(item)
618 622 }
619 623 };
620 624
621 625 var curVal = getVal($(curNode).val());
626 var cleared = false;
627
622 628 $.each(self.$verSource, function(index, value){
623 629 var elVal = getVal($(value).val());
630
624 631 if(elVal > curVal){
632 if ($(value).is(':checked')) {
633 cleared = true;
634 }
625 635 $(value).attr('disabled', 'disabled');
626 636 $(value).removeAttr('checked');
637 $(value).css({'opacity': 0.1});
627 638 }
628 639 else{
640 $(value).css({'opacity': 1});
629 641 $(value).removeAttr('disabled');
630 642 }
631 643 });
632 644
633 self.setLockAction(false, $(curNode).data('verPos'));
645 if (cleared) {
646 // if we unchecked an active, set the next one to same loc.
647 $(this.$verSource).filter('[value={0}]'.format(
648 curVal)).attr('checked', 'checked');
649 }
650
651 self.setLockAction(false,
652 $(curNode).data('verPos'),
653 $(this.$verSource).filter(':checked').data('verPos')
654 );
634 655 };
635 656
636 657
637 658 this.attachVersionListener = function () {
638 659 self.$verTarget.change(function(e){
639 660 self.adjustRadioSelectors(this)
640 661 });
641 662 self.$verSource.change(function(e){
642 663 self.adjustRadioSelectors(self.$verTarget.filter(':checked'))
643 664 });
644 665 };
645 666
646 667 this.init = function () {
647 668
648 669 var curNode = self.$verTarget.filter(':checked');
649 670 self.adjustRadioSelectors(curNode);
650 671 self.setLockAction(true);
651 672 self.attachVersionListener();
652 673
653 674 };
654 675
655 this.setLockAction = function (state, selectedVersion) {
656 if(state){
657 $('#show-version-diff').attr('disabled','disabled')
658 $('#show-version-diff').addClass('disabled')
659 $('#show-version-diff').html($('#show-version-diff').data('labelText'));
676 this.setLockAction = function (state, selectedVersion, otherVersion) {
677 if (state) {
678 $('#show-version-diff').attr('disabled', 'disabled');
679 $('#show-version-diff').addClass('disabled');
680 $('#show-version-diff').html($('#show-version-diff').data('labelTextLocked'));
660 681 }
661 else{
682 else {
662 683 $('#show-version-diff').removeAttr('disabled');
663 $('#show-version-diff').removeClass('disabled')
664 //$('#show-version-diff').html(_gettext('show changes for v') + selectedVersion)
684 $('#show-version-diff').removeClass('disabled');
685
686 if (selectedVersion == otherVersion) {
687 $('#show-version-diff').html($('#show-version-diff').data('labelTextShow'));
688 } else {
689 $('#show-version-diff').html($('#show-version-diff').data('labelTextDiff'));
690 }
665 691 }
666 692
667 693 };
668 694
669 695 this.showVersionDiff = function(){
670 696 var target = self.$verTarget.filter(':checked');
671 697 var source = self.$verSource.filter(':checked');
672 698
673 699 if (target.val() && source.val()) {
674 700 var params = {
675 701 'pull_request_id': ${c.pull_request.pull_request_id},
676 702 'repo_name': templateContext.repo_name,
677 703 'version': target.val(),
678 704 'from_version': source.val()
679 705 };
680 706 window.location = pyroutes.url('pullrequest_show', params)
681 707 }
682 708
683 709 return false;
684 710 };
685 711
686 712 this.toggleVersionView = function (elem) {
687 713
688 714 if ($('#show-version-diff').is(':visible')) {
689 715 $('.version-pr').hide();
690 716 $('#show-version-diff').hide();
691 717 $(elem).html($(elem).data('toggleOn'))
692 718 } else {
693 719 $('.version-pr').show();
694 720 $('#show-version-diff').show();
695 721 $(elem).html($(elem).data('toggleOff'))
696 722 }
697 723
698 724 return false
699 725 }
700 726
701 727 };
702 728
703 729 versionController = new VersionController();
704 730 versionController.init();
705 731
706 732
707 733 $(function(){
708 734 ReviewerAutoComplete('user');
709 735 // custom code mirror
710 736 var codeMirrorInstance = initPullRequestsCodeMirror('#pr-description-input');
711 737
712 738 var PRDetails = {
713 739 editButton: $('#open_edit_pullrequest'),
714 740 closeButton: $('#close_edit_pullrequest'),
715 741 deleteButton: $('#delete_pullrequest'),
716 742 viewFields: $('#pr-desc, #pr-title'),
717 743 editFields: $('#pr-desc-edit, #pr-title-edit, #pr-save'),
718 744
719 745 init: function() {
720 746 var that = this;
721 747 this.editButton.on('click', function(e) { that.edit(); });
722 748 this.closeButton.on('click', function(e) { that.view(); });
723 749 },
724 750
725 751 edit: function(event) {
726 752 this.viewFields.hide();
727 753 this.editButton.hide();
728 754 this.deleteButton.hide();
729 755 this.closeButton.show();
730 756 this.editFields.show();
731 757 codeMirrorInstance.refresh();
732 758 },
733 759
734 760 view: function(event) {
735 761 this.editButton.show();
736 762 this.deleteButton.show();
737 763 this.editFields.hide();
738 764 this.closeButton.hide();
739 765 this.viewFields.show();
740 766 }
741 767 };
742 768
743 769 var ReviewersPanel = {
744 770 editButton: $('#open_edit_reviewers'),
745 771 closeButton: $('#close_edit_reviewers'),
746 772 addButton: $('#add_reviewer_input'),
747 773 removeButtons: $('.reviewer_member_remove'),
748 774
749 775 init: function() {
750 776 var that = this;
751 777 this.editButton.on('click', function(e) { that.edit(); });
752 778 this.closeButton.on('click', function(e) { that.close(); });
753 779 },
754 780
755 781 edit: function(event) {
756 782 this.editButton.hide();
757 783 this.closeButton.show();
758 784 this.addButton.show();
759 785 this.removeButtons.css('visibility', 'visible');
760 786 },
761 787
762 788 close: function(event) {
763 789 this.editButton.show();
764 790 this.closeButton.hide();
765 791 this.addButton.hide();
766 792 this.removeButtons.css('visibility', 'hidden');
767 793 }
768 794 };
769 795
770 796 PRDetails.init();
771 797 ReviewersPanel.init();
772 798
773 799 showOutdated = function(self){
774 800 $('.comment-inline.comment-outdated').show();
775 801 $('.filediff-outdated').show();
776 802 $('.showOutdatedComments').hide();
777 803 $('.hideOutdatedComments').show();
778 804 };
779 805
780 806 hideOutdated = function(self){
781 807 $('.comment-inline.comment-outdated').hide();
782 808 $('.filediff-outdated').hide();
783 809 $('.hideOutdatedComments').hide();
784 810 $('.showOutdatedComments').show();
785 811 };
786 812
787 813 refreshMergeChecks = function(){
788 814 var loadUrl = "${h.url.current(merge_checks=1)}";
789 815 $('.pull-request-merge').css('opacity', 0.3);
790 816 $('.pull-request-merge').load(
791 817 loadUrl,function() {
792 818 $('.pull-request-merge').css('opacity', 1);
793 819 }
794 820 );
795 821 };
796 822
797 823 $('#show-outdated-comments').on('click', function(e){
798 824 var button = $(this);
799 825 var outdated = $('.comment-outdated');
800 826
801 827 if (button.html() === "(Show)") {
802 828 button.html("(Hide)");
803 829 outdated.show();
804 830 } else {
805 831 button.html("(Show)");
806 832 outdated.hide();
807 833 }
808 834 });
809 835
810 836 $('.show-inline-comments').on('change', function(e){
811 837 var show = 'none';
812 838 var target = e.currentTarget;
813 839 if(target.checked){
814 840 show = ''
815 841 }
816 842 var boxid = $(target).attr('id_for');
817 843 var comments = $('#{0} .inline-comments'.format(boxid));
818 844 var fn_display = function(idx){
819 845 $(this).css('display', show);
820 846 };
821 847 $(comments).each(fn_display);
822 848 var btns = $('#{0} .inline-comments-button'.format(boxid));
823 849 $(btns).each(fn_display);
824 850 });
825 851
826 852 $('#merge_pull_request_form').submit(function() {
827 853 if (!$('#merge_pull_request').attr('disabled')) {
828 854 $('#merge_pull_request').attr('disabled', 'disabled');
829 855 }
830 856 return true;
831 857 });
832 858
833 859 $('#edit_pull_request').on('click', function(e){
834 860 var title = $('#pr-title-input').val();
835 861 var description = codeMirrorInstance.getValue();
836 862 editPullRequest(
837 863 "${c.repo_name}", "${c.pull_request.pull_request_id}",
838 864 title, description);
839 865 });
840 866
841 867 $('#update_pull_request').on('click', function(e){
842 868 updateReviewers(undefined, "${c.repo_name}", "${c.pull_request.pull_request_id}");
843 869 });
844 870
845 871 $('#update_commits').on('click', function(e){
846 872 var isDisabled = !$(e.currentTarget).attr('disabled');
847 873 $(e.currentTarget).text(_gettext('Updating...'));
848 874 $(e.currentTarget).attr('disabled', 'disabled');
849 875 if(isDisabled){
850 876 updateCommits("${c.repo_name}", "${c.pull_request.pull_request_id}");
851 877 }
852 878
853 879 });
854 880 // fixing issue with caches on firefox
855 881 $('#update_commits').removeAttr("disabled");
856 882
857 883 $('#close_pull_request').on('click', function(e){
858 884 closePullRequest("${c.repo_name}", "${c.pull_request.pull_request_id}");
859 885 });
860 886
861 887 $('.show-inline-comments').on('click', function(e){
862 888 var boxid = $(this).attr('data-comment-id');
863 889 var button = $(this);
864 890
865 891 if(button.hasClass("comments-visible")) {
866 892 $('#{0} .inline-comments'.format(boxid)).each(function(index){
867 893 $(this).hide();
868 894 });
869 895 button.removeClass("comments-visible");
870 896 } else {
871 897 $('#{0} .inline-comments'.format(boxid)).each(function(index){
872 898 $(this).show();
873 899 });
874 900 button.addClass("comments-visible");
875 901 }
876 902 });
877 903
878 904 // register submit callback on commentForm form to track TODOs
879 905 window.commentFormGlobalSubmitSuccessCallback = function(){
880 906 refreshMergeChecks();
881 907 };
882 908
883 909 })
884 910 </script>
885 911
886 912 </div>
887 913 </div>
888 914
889 915 </%def>
General Comments 0
You need to be logged in to leave comments. Login now