##// END OF EJS Templates
pull-requests: confirm close without merge
marcink -
r4054:c11100bc default
parent child Browse files
Show More
@@ -1,791 +1,794 b''
1 <%inherit file="/base/base.mako"/>
1 <%inherit file="/base/base.mako"/>
2 <%namespace name="base" file="/base/base.mako"/>
2 <%namespace name="base" file="/base/base.mako"/>
3 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
3 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
4
4
5 <%def name="title()">
5 <%def name="title()">
6 ${_('{} Pull Request !{}').format(c.repo_name, c.pull_request.pull_request_id)}
6 ${_('{} Pull Request !{}').format(c.repo_name, c.pull_request.pull_request_id)}
7 %if c.rhodecode_name:
7 %if c.rhodecode_name:
8 &middot; ${h.branding(c.rhodecode_name)}
8 &middot; ${h.branding(c.rhodecode_name)}
9 %endif
9 %endif
10 </%def>
10 </%def>
11
11
12 <%def name="breadcrumbs_links()">
12 <%def name="breadcrumbs_links()">
13 <span id="pr-title">
13 <span id="pr-title">
14 ${c.pull_request.title}
14 ${c.pull_request.title}
15 %if c.pull_request.is_closed():
15 %if c.pull_request.is_closed():
16 (${_('Closed')})
16 (${_('Closed')})
17 %endif
17 %endif
18 </span>
18 </span>
19 <div id="pr-title-edit" class="input" style="display: none;">
19 <div id="pr-title-edit" class="input" style="display: none;">
20 ${h.text('pullrequest_title', id_="pr-title-input", class_="large", value=c.pull_request.title)}
20 ${h.text('pullrequest_title', id_="pr-title-input", class_="large", value=c.pull_request.title)}
21 </div>
21 </div>
22 </%def>
22 </%def>
23
23
24 <%def name="menu_bar_nav()">
24 <%def name="menu_bar_nav()">
25 ${self.menu_items(active='repositories')}
25 ${self.menu_items(active='repositories')}
26 </%def>
26 </%def>
27
27
28 <%def name="menu_bar_subnav()">
28 <%def name="menu_bar_subnav()">
29 ${self.repo_menu(active='showpullrequest')}
29 ${self.repo_menu(active='showpullrequest')}
30 </%def>
30 </%def>
31
31
32 <%def name="main()">
32 <%def name="main()">
33
33
34 <script type="text/javascript">
34 <script type="text/javascript">
35 // TODO: marcink switch this to pyroutes
35 // TODO: marcink switch this to pyroutes
36 AJAX_COMMENT_DELETE_URL = "${h.route_path('pullrequest_comment_delete',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id,comment_id='__COMMENT_ID__')}";
36 AJAX_COMMENT_DELETE_URL = "${h.route_path('pullrequest_comment_delete',repo_name=c.repo_name,pull_request_id=c.pull_request.pull_request_id,comment_id='__COMMENT_ID__')}";
37 templateContext.pull_request_data.pull_request_id = ${c.pull_request.pull_request_id};
37 templateContext.pull_request_data.pull_request_id = ${c.pull_request.pull_request_id};
38 </script>
38 </script>
39 <div class="box">
39 <div class="box">
40
40
41 ${self.breadcrumbs()}
41 ${self.breadcrumbs()}
42
42
43 <div class="box pr-summary">
43 <div class="box pr-summary">
44
44
45 <div class="summary-details block-left">
45 <div class="summary-details block-left">
46 <% summary = lambda n:{False:'summary-short'}.get(n) %>
46 <% summary = lambda n:{False:'summary-short'}.get(n) %>
47 <div class="pr-details-title">
47 <div class="pr-details-title">
48 <a href="${h.route_path('pull_requests_global', pull_request_id=c.pull_request.pull_request_id)}">${_('Pull request !{}').format(c.pull_request.pull_request_id)}</a> ${_('From')} ${h.format_date(c.pull_request.created_on)}
48 <a href="${h.route_path('pull_requests_global', pull_request_id=c.pull_request.pull_request_id)}">${_('Pull request !{}').format(c.pull_request.pull_request_id)}</a> ${_('From')} ${h.format_date(c.pull_request.created_on)}
49 %if c.allowed_to_update:
49 %if c.allowed_to_update:
50 <div id="delete_pullrequest" class="pull-right action_button ${'' if c.allowed_to_delete else 'disabled' }" style="clear:inherit;padding: 0">
50 <div id="delete_pullrequest" class="pull-right action_button ${'' if c.allowed_to_delete else 'disabled' }" style="clear:inherit;padding: 0">
51 % if c.allowed_to_delete:
51 % if c.allowed_to_delete:
52 ${h.secure_form(h.route_path('pullrequest_delete', repo_name=c.pull_request.target_repo.repo_name, pull_request_id=c.pull_request.pull_request_id), request=request)}
52 ${h.secure_form(h.route_path('pullrequest_delete', repo_name=c.pull_request.target_repo.repo_name, pull_request_id=c.pull_request.pull_request_id), request=request)}
53 ${h.submit('remove_%s' % c.pull_request.pull_request_id, _('Delete'),
53 ${h.submit('remove_%s' % c.pull_request.pull_request_id, _('Delete'),
54 class_="btn btn-link btn-danger no-margin",onclick="return confirm('"+_('Confirm to delete this pull request')+"');")}
54 class_="btn btn-link btn-danger no-margin",onclick="return confirm('"+_('Confirm to delete this pull request')+"');")}
55 ${h.end_form()}
55 ${h.end_form()}
56 % else:
56 % else:
57 ${_('Delete')}
57 ${_('Delete')}
58 % endif
58 % endif
59 </div>
59 </div>
60 <div id="open_edit_pullrequest" class="pull-right action_button">${_('Edit')}</div>
60 <div id="open_edit_pullrequest" class="pull-right action_button">${_('Edit')}</div>
61 <div id="close_edit_pullrequest" class="pull-right action_button" style="display: none;padding: 0">${_('Cancel')}</div>
61 <div id="close_edit_pullrequest" class="pull-right action_button" style="display: none;padding: 0">${_('Cancel')}</div>
62 %endif
62 %endif
63 </div>
63 </div>
64
64
65 <div id="summary" class="fields pr-details-content">
65 <div id="summary" class="fields pr-details-content">
66 <div class="field">
66 <div class="field">
67 <div class="label-summary">
67 <div class="label-summary">
68 <label>${_('Source')}:</label>
68 <label>${_('Source')}:</label>
69 </div>
69 </div>
70 <div class="input">
70 <div class="input">
71 <div class="pr-origininfo">
71 <div class="pr-origininfo">
72 ## branch link is only valid if it is a branch
72 ## branch link is only valid if it is a branch
73 <span class="tag">
73 <span class="tag">
74 %if c.pull_request.source_ref_parts.type == 'branch':
74 %if c.pull_request.source_ref_parts.type == 'branch':
75 <a href="${h.route_path('repo_commits', repo_name=c.pull_request.source_repo.repo_name, _query=dict(branch=c.pull_request.source_ref_parts.name))}">${c.pull_request.source_ref_parts.type}: ${c.pull_request.source_ref_parts.name}</a>
75 <a href="${h.route_path('repo_commits', repo_name=c.pull_request.source_repo.repo_name, _query=dict(branch=c.pull_request.source_ref_parts.name))}">${c.pull_request.source_ref_parts.type}: ${c.pull_request.source_ref_parts.name}</a>
76 %else:
76 %else:
77 ${c.pull_request.source_ref_parts.type}: ${c.pull_request.source_ref_parts.name}
77 ${c.pull_request.source_ref_parts.type}: ${c.pull_request.source_ref_parts.name}
78 %endif
78 %endif
79 </span>
79 </span>
80 <span class="clone-url">
80 <span class="clone-url">
81 <a href="${h.route_path('repo_summary', repo_name=c.pull_request.source_repo.repo_name)}">${c.pull_request.source_repo.clone_url()}</a>
81 <a href="${h.route_path('repo_summary', repo_name=c.pull_request.source_repo.repo_name)}">${c.pull_request.source_repo.clone_url()}</a>
82 </span>
82 </span>
83 <br/>
83 <br/>
84 % if c.ancestor_commit:
84 % if c.ancestor_commit:
85 ${_('Common ancestor')}:
85 ${_('Common ancestor')}:
86 <code><a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=c.ancestor_commit.raw_id)}">${h.show_id(c.ancestor_commit)}</a></code>
86 <code><a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=c.ancestor_commit.raw_id)}">${h.show_id(c.ancestor_commit)}</a></code>
87 % endif
87 % endif
88 </div>
88 </div>
89 %if h.is_hg(c.pull_request.source_repo):
89 %if h.is_hg(c.pull_request.source_repo):
90 <% clone_url = 'hg pull -r {} {}'.format(h.short_id(c.source_ref), c.pull_request.source_repo.clone_url()) %>
90 <% clone_url = 'hg pull -r {} {}'.format(h.short_id(c.source_ref), c.pull_request.source_repo.clone_url()) %>
91 %elif h.is_git(c.pull_request.source_repo):
91 %elif h.is_git(c.pull_request.source_repo):
92 <% clone_url = 'git pull {} {}'.format(c.pull_request.source_repo.clone_url(), c.pull_request.source_ref_parts.name) %>
92 <% clone_url = 'git pull {} {}'.format(c.pull_request.source_repo.clone_url(), c.pull_request.source_ref_parts.name) %>
93 %endif
93 %endif
94
94
95 <div class="">
95 <div class="">
96 <input type="text" class="input-monospace pr-pullinfo" value="${clone_url}" readonly="readonly">
96 <input type="text" class="input-monospace pr-pullinfo" value="${clone_url}" readonly="readonly">
97 <i class="tooltip icon-clipboard clipboard-action pull-right pr-pullinfo-copy" data-clipboard-text="${clone_url}" title="${_('Copy the pull url')}"></i>
97 <i class="tooltip icon-clipboard clipboard-action pull-right pr-pullinfo-copy" data-clipboard-text="${clone_url}" title="${_('Copy the pull url')}"></i>
98 </div>
98 </div>
99
99
100 </div>
100 </div>
101 </div>
101 </div>
102 <div class="field">
102 <div class="field">
103 <div class="label-summary">
103 <div class="label-summary">
104 <label>${_('Target')}:</label>
104 <label>${_('Target')}:</label>
105 </div>
105 </div>
106 <div class="input">
106 <div class="input">
107 <div class="pr-targetinfo">
107 <div class="pr-targetinfo">
108 ## branch link is only valid if it is a branch
108 ## branch link is only valid if it is a branch
109 <span class="tag">
109 <span class="tag">
110 %if c.pull_request.target_ref_parts.type == 'branch':
110 %if c.pull_request.target_ref_parts.type == 'branch':
111 <a href="${h.route_path('repo_commits', repo_name=c.pull_request.target_repo.repo_name, _query=dict(branch=c.pull_request.target_ref_parts.name))}">${c.pull_request.target_ref_parts.type}: ${c.pull_request.target_ref_parts.name}</a>
111 <a href="${h.route_path('repo_commits', repo_name=c.pull_request.target_repo.repo_name, _query=dict(branch=c.pull_request.target_ref_parts.name))}">${c.pull_request.target_ref_parts.type}: ${c.pull_request.target_ref_parts.name}</a>
112 %else:
112 %else:
113 ${c.pull_request.target_ref_parts.type}: ${c.pull_request.target_ref_parts.name}
113 ${c.pull_request.target_ref_parts.type}: ${c.pull_request.target_ref_parts.name}
114 %endif
114 %endif
115 </span>
115 </span>
116 <span class="clone-url">
116 <span class="clone-url">
117 <a href="${h.route_path('repo_summary', repo_name=c.pull_request.target_repo.repo_name)}">${c.pull_request.target_repo.clone_url()}</a>
117 <a href="${h.route_path('repo_summary', repo_name=c.pull_request.target_repo.repo_name)}">${c.pull_request.target_repo.clone_url()}</a>
118 </span>
118 </span>
119 </div>
119 </div>
120 </div>
120 </div>
121 </div>
121 </div>
122
122
123 ## Link to the shadow repository.
123 ## Link to the shadow repository.
124 <div class="field">
124 <div class="field">
125 <div class="label-summary">
125 <div class="label-summary">
126 <label>${_('Merge')}:</label>
126 <label>${_('Merge')}:</label>
127 </div>
127 </div>
128 <div class="input">
128 <div class="input">
129 % if not c.pull_request.is_closed() and c.pull_request.shadow_merge_ref:
129 % if not c.pull_request.is_closed() and c.pull_request.shadow_merge_ref:
130 %if h.is_hg(c.pull_request.target_repo):
130 %if h.is_hg(c.pull_request.target_repo):
131 <% clone_url = 'hg clone --update {} {} pull-request-{}'.format(c.pull_request.shadow_merge_ref.name, c.shadow_clone_url, c.pull_request.pull_request_id) %>
131 <% clone_url = 'hg clone --update {} {} pull-request-{}'.format(c.pull_request.shadow_merge_ref.name, c.shadow_clone_url, c.pull_request.pull_request_id) %>
132 %elif h.is_git(c.pull_request.target_repo):
132 %elif h.is_git(c.pull_request.target_repo):
133 <% clone_url = 'git clone --branch {} {} pull-request-{}'.format(c.pull_request.shadow_merge_ref.name, c.shadow_clone_url, c.pull_request.pull_request_id) %>
133 <% clone_url = 'git clone --branch {} {} pull-request-{}'.format(c.pull_request.shadow_merge_ref.name, c.shadow_clone_url, c.pull_request.pull_request_id) %>
134 %endif
134 %endif
135 <div class="">
135 <div class="">
136 <input type="text" class="input-monospace pr-mergeinfo" value="${clone_url}" readonly="readonly">
136 <input type="text" class="input-monospace pr-mergeinfo" value="${clone_url}" readonly="readonly">
137 <i class="tooltip icon-clipboard clipboard-action pull-right pr-mergeinfo-copy" data-clipboard-text="${clone_url}" title="${_('Copy the clone url')}"></i>
137 <i class="tooltip icon-clipboard clipboard-action pull-right pr-mergeinfo-copy" data-clipboard-text="${clone_url}" title="${_('Copy the clone url')}"></i>
138 </div>
138 </div>
139 % else:
139 % else:
140 <div class="">
140 <div class="">
141 ${_('Shadow repository data not available')}.
141 ${_('Shadow repository data not available')}.
142 </div>
142 </div>
143 % endif
143 % endif
144 </div>
144 </div>
145 </div>
145 </div>
146
146
147 <div class="field">
147 <div class="field">
148 <div class="label-summary">
148 <div class="label-summary">
149 <label>${_('Review')}:</label>
149 <label>${_('Review')}:</label>
150 </div>
150 </div>
151 <div class="input">
151 <div class="input">
152 %if c.pull_request_review_status:
152 %if c.pull_request_review_status:
153 <i class="icon-circle review-status-${c.pull_request_review_status}"></i>
153 <i class="icon-circle review-status-${c.pull_request_review_status}"></i>
154 <span class="changeset-status-lbl tooltip">
154 <span class="changeset-status-lbl tooltip">
155 %if c.pull_request.is_closed():
155 %if c.pull_request.is_closed():
156 ${_('Closed')},
156 ${_('Closed')},
157 %endif
157 %endif
158 ${h.commit_status_lbl(c.pull_request_review_status)}
158 ${h.commit_status_lbl(c.pull_request_review_status)}
159 </span>
159 </span>
160 - ${_ungettext('calculated based on %s reviewer vote', 'calculated based on %s reviewers votes', len(c.pull_request_reviewers)) % len(c.pull_request_reviewers)}
160 - ${_ungettext('calculated based on %s reviewer vote', 'calculated based on %s reviewers votes', len(c.pull_request_reviewers)) % len(c.pull_request_reviewers)}
161 %endif
161 %endif
162 </div>
162 </div>
163 </div>
163 </div>
164 <div class="field">
164 <div class="field">
165 <div class="pr-description-label label-summary" title="${_('Rendered using {} renderer').format(c.renderer)}">
165 <div class="pr-description-label label-summary" title="${_('Rendered using {} renderer').format(c.renderer)}">
166 <label>${_('Description')}:</label>
166 <label>${_('Description')}:</label>
167 </div>
167 </div>
168 <div id="pr-desc" class="input">
168 <div id="pr-desc" class="input">
169 <div class="pr-description">${h.render(c.pull_request.description, renderer=c.renderer, repo_name=c.repo_name)}</div>
169 <div class="pr-description">${h.render(c.pull_request.description, renderer=c.renderer, repo_name=c.repo_name)}</div>
170 </div>
170 </div>
171 <div id="pr-desc-edit" class="input textarea editor" style="display: none;">
171 <div id="pr-desc-edit" class="input textarea editor" style="display: none;">
172 <input id="pr-renderer-input" type="hidden" name="description_renderer" value="${c.visual.default_renderer}">
172 <input id="pr-renderer-input" type="hidden" name="description_renderer" value="${c.visual.default_renderer}">
173 ${dt.markup_form('pr-description-input', form_text=c.pull_request.description)}
173 ${dt.markup_form('pr-description-input', form_text=c.pull_request.description)}
174 </div>
174 </div>
175 </div>
175 </div>
176
176
177 <div class="field">
177 <div class="field">
178 <div class="label-summary">
178 <div class="label-summary">
179 <label>${_('Versions')}:</label>
179 <label>${_('Versions')}:</label>
180 </div>
180 </div>
181
181
182 <% outdated_comm_count_ver = len(c.inline_versions[None]['outdated']) %>
182 <% outdated_comm_count_ver = len(c.inline_versions[None]['outdated']) %>
183 <% general_outdated_comm_count_ver = len(c.comment_versions[None]['outdated']) %>
183 <% general_outdated_comm_count_ver = len(c.comment_versions[None]['outdated']) %>
184
184
185 <div class="pr-versions">
185 <div class="pr-versions">
186 % if c.show_version_changes:
186 % if c.show_version_changes:
187 <% outdated_comm_count_ver = len(c.inline_versions[c.at_version_num]['outdated']) %>
187 <% outdated_comm_count_ver = len(c.inline_versions[c.at_version_num]['outdated']) %>
188 <% general_outdated_comm_count_ver = len(c.comment_versions[c.at_version_num]['outdated']) %>
188 <% general_outdated_comm_count_ver = len(c.comment_versions[c.at_version_num]['outdated']) %>
189 <a id="show-pr-versions" class="input" onclick="return versionController.toggleVersionView(this)" href="#show-pr-versions"
189 <a id="show-pr-versions" class="input" onclick="return versionController.toggleVersionView(this)" href="#show-pr-versions"
190 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))}"
190 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))}"
191 data-toggle-off="${_('Hide all versions of this pull request')}">
191 data-toggle-off="${_('Hide all versions of this pull request')}">
192 ${_ungettext('{} version available for this pull request, show it.', '{} versions available for this pull request, show them.', len(c.versions)).format(len(c.versions))}
192 ${_ungettext('{} version available for this pull request, show it.', '{} versions available for this pull request, show them.', len(c.versions)).format(len(c.versions))}
193 </a>
193 </a>
194 <table>
194 <table>
195 ## SHOW ALL VERSIONS OF PR
195 ## SHOW ALL VERSIONS OF PR
196 <% ver_pr = None %>
196 <% ver_pr = None %>
197
197
198 % for data in reversed(list(enumerate(c.versions, 1))):
198 % for data in reversed(list(enumerate(c.versions, 1))):
199 <% ver_pos = data[0] %>
199 <% ver_pos = data[0] %>
200 <% ver = data[1] %>
200 <% ver = data[1] %>
201 <% ver_pr = ver.pull_request_version_id %>
201 <% ver_pr = ver.pull_request_version_id %>
202 <% display_row = '' if c.at_version and (c.at_version_num == ver_pr or c.from_version_num == ver_pr) else 'none' %>
202 <% display_row = '' if c.at_version and (c.at_version_num == ver_pr or c.from_version_num == ver_pr) else 'none' %>
203
203
204 <tr class="version-pr" style="display: ${display_row}">
204 <tr class="version-pr" style="display: ${display_row}">
205 <td>
205 <td>
206 <code>
206 <code>
207 <a href="${request.current_route_path(_query=dict(version=ver_pr or 'latest'))}">v${ver_pos}</a>
207 <a href="${request.current_route_path(_query=dict(version=ver_pr or 'latest'))}">v${ver_pos}</a>
208 </code>
208 </code>
209 </td>
209 </td>
210 <td>
210 <td>
211 <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}"/>
211 <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}"/>
212 <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}"/>
212 <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}"/>
213 </td>
213 </td>
214 <td>
214 <td>
215 <% review_status = c.review_versions[ver_pr].status if ver_pr in c.review_versions else 'not_reviewed' %>
215 <% review_status = c.review_versions[ver_pr].status if ver_pr in c.review_versions else 'not_reviewed' %>
216 <i class="tooltip icon-circle review-status-${review_status}" title="${_('Your review status at this version')}"></i>
216 <i class="tooltip icon-circle review-status-${review_status}" title="${_('Your review status at this version')}"></i>
217 </div>
217 </div>
218 </td>
218 </td>
219 <td>
219 <td>
220 % if c.at_version_num != ver_pr:
220 % if c.at_version_num != ver_pr:
221 <i class="icon-comment"></i>
221 <i class="icon-comment"></i>
222 <code class="tooltip" title="${_('Comment from pull request version v{0}, general:{1} inline:{2}').format(ver_pos, len(c.comment_versions[ver_pr]['at']), len(c.inline_versions[ver_pr]['at']))}">
222 <code class="tooltip" title="${_('Comment from pull request version v{0}, general:{1} inline:{2}').format(ver_pos, len(c.comment_versions[ver_pr]['at']), len(c.inline_versions[ver_pr]['at']))}">
223 G:${len(c.comment_versions[ver_pr]['at'])} / I:${len(c.inline_versions[ver_pr]['at'])}
223 G:${len(c.comment_versions[ver_pr]['at'])} / I:${len(c.inline_versions[ver_pr]['at'])}
224 </code>
224 </code>
225 % endif
225 % endif
226 </td>
226 </td>
227 <td>
227 <td>
228 ##<code>${ver.source_ref_parts.commit_id[:6]}</code>
228 ##<code>${ver.source_ref_parts.commit_id[:6]}</code>
229 </td>
229 </td>
230 <td>
230 <td>
231 ${h.age_component(ver.updated_on, time_is_local=True)}
231 ${h.age_component(ver.updated_on, time_is_local=True)}
232 </td>
232 </td>
233 </tr>
233 </tr>
234 % endfor
234 % endfor
235
235
236 <tr>
236 <tr>
237 <td colspan="6">
237 <td colspan="6">
238 <button id="show-version-diff" onclick="return versionController.showVersionDiff()" class="btn btn-sm" style="display: none"
238 <button id="show-version-diff" onclick="return versionController.showVersionDiff()" class="btn btn-sm" style="display: none"
239 data-label-text-locked="${_('select versions to show changes')}"
239 data-label-text-locked="${_('select versions to show changes')}"
240 data-label-text-diff="${_('show changes between versions')}"
240 data-label-text-diff="${_('show changes between versions')}"
241 data-label-text-show="${_('show pull request for this version')}"
241 data-label-text-show="${_('show pull request for this version')}"
242 >
242 >
243 ${_('select versions to show changes')}
243 ${_('select versions to show changes')}
244 </button>
244 </button>
245 </td>
245 </td>
246 </tr>
246 </tr>
247 </table>
247 </table>
248 % else:
248 % else:
249 <div class="input">
249 <div class="input">
250 ${_('Pull request versions not available')}.
250 ${_('Pull request versions not available')}.
251 </div>
251 </div>
252 % endif
252 % endif
253 </div>
253 </div>
254 </div>
254 </div>
255
255
256 <div id="pr-save" class="field" style="display: none;">
256 <div id="pr-save" class="field" style="display: none;">
257 <div class="label-summary"></div>
257 <div class="label-summary"></div>
258 <div class="input">
258 <div class="input">
259 <span id="edit_pull_request" class="btn btn-small no-margin">${_('Save Changes')}</span>
259 <span id="edit_pull_request" class="btn btn-small no-margin">${_('Save Changes')}</span>
260 </div>
260 </div>
261 </div>
261 </div>
262 </div>
262 </div>
263 </div>
263 </div>
264 <div>
264 <div>
265 ## AUTHOR
265 ## AUTHOR
266 <div class="reviewers-title block-right">
266 <div class="reviewers-title block-right">
267 <div class="pr-details-title">
267 <div class="pr-details-title">
268 ${_('Author of this pull request')}
268 ${_('Author of this pull request')}
269 </div>
269 </div>
270 </div>
270 </div>
271 <div class="block-right pr-details-content reviewers">
271 <div class="block-right pr-details-content reviewers">
272 <ul class="group_members">
272 <ul class="group_members">
273 <li>
273 <li>
274 ${self.gravatar_with_user(c.pull_request.author.email, 16, tooltip=True)}
274 ${self.gravatar_with_user(c.pull_request.author.email, 16, tooltip=True)}
275 </li>
275 </li>
276 </ul>
276 </ul>
277 </div>
277 </div>
278
278
279 ## REVIEW RULES
279 ## REVIEW RULES
280 <div id="review_rules" style="display: none" class="reviewers-title block-right">
280 <div id="review_rules" style="display: none" class="reviewers-title block-right">
281 <div class="pr-details-title">
281 <div class="pr-details-title">
282 ${_('Reviewer rules')}
282 ${_('Reviewer rules')}
283 %if c.allowed_to_update:
283 %if c.allowed_to_update:
284 <span id="close_edit_reviewers" class="block-right action_button last-item" style="display: none;">${_('Close')}</span>
284 <span id="close_edit_reviewers" class="block-right action_button last-item" style="display: none;">${_('Close')}</span>
285 %endif
285 %endif
286 </div>
286 </div>
287 <div class="pr-reviewer-rules">
287 <div class="pr-reviewer-rules">
288 ## review rules will be appended here, by default reviewers logic
288 ## review rules will be appended here, by default reviewers logic
289 </div>
289 </div>
290 <input id="review_data" type="hidden" name="review_data" value="">
290 <input id="review_data" type="hidden" name="review_data" value="">
291 </div>
291 </div>
292
292
293 ## REVIEWERS
293 ## REVIEWERS
294 <div class="reviewers-title block-right">
294 <div class="reviewers-title block-right">
295 <div class="pr-details-title">
295 <div class="pr-details-title">
296 ${_('Pull request reviewers')}
296 ${_('Pull request reviewers')}
297 %if c.allowed_to_update:
297 %if c.allowed_to_update:
298 <span id="open_edit_reviewers" class="block-right action_button last-item">${_('Edit')}</span>
298 <span id="open_edit_reviewers" class="block-right action_button last-item">${_('Edit')}</span>
299 %endif
299 %endif
300 </div>
300 </div>
301 </div>
301 </div>
302 <div id="reviewers" class="block-right pr-details-content reviewers">
302 <div id="reviewers" class="block-right pr-details-content reviewers">
303
303
304 ## members redering block
304 ## members redering block
305 <input type="hidden" name="__start__" value="review_members:sequence">
305 <input type="hidden" name="__start__" value="review_members:sequence">
306 <ul id="review_members" class="group_members">
306 <ul id="review_members" class="group_members">
307
307
308 % for review_obj, member, reasons, mandatory, status in c.pull_request_reviewers:
308 % for review_obj, member, reasons, mandatory, status in c.pull_request_reviewers:
309 <script>
309 <script>
310 var member = ${h.json.dumps(h.reviewer_as_json(member, reasons=reasons, mandatory=mandatory, user_group=review_obj.rule_user_group_data()))|n};
310 var member = ${h.json.dumps(h.reviewer_as_json(member, reasons=reasons, mandatory=mandatory, user_group=review_obj.rule_user_group_data()))|n};
311 var status = "${(status[0][1].status if status else 'not_reviewed')}";
311 var status = "${(status[0][1].status if status else 'not_reviewed')}";
312 var status_lbl = "${h.commit_status_lbl(status[0][1].status if status else 'not_reviewed')}";
312 var status_lbl = "${h.commit_status_lbl(status[0][1].status if status else 'not_reviewed')}";
313 var allowed_to_update = ${h.json.dumps(c.allowed_to_update)};
313 var allowed_to_update = ${h.json.dumps(c.allowed_to_update)};
314
314
315 var entry = renderTemplate('reviewMemberEntry', {
315 var entry = renderTemplate('reviewMemberEntry', {
316 'member': member,
316 'member': member,
317 'mandatory': member.mandatory,
317 'mandatory': member.mandatory,
318 'reasons': member.reasons,
318 'reasons': member.reasons,
319 'allowed_to_update': allowed_to_update,
319 'allowed_to_update': allowed_to_update,
320 'review_status': status,
320 'review_status': status,
321 'review_status_label': status_lbl,
321 'review_status_label': status_lbl,
322 'user_group': member.user_group,
322 'user_group': member.user_group,
323 'create': false
323 'create': false
324 });
324 });
325 $('#review_members').append(entry)
325 $('#review_members').append(entry)
326 </script>
326 </script>
327
327
328 % endfor
328 % endfor
329
329
330 </ul>
330 </ul>
331
331
332 <input type="hidden" name="__end__" value="review_members:sequence">
332 <input type="hidden" name="__end__" value="review_members:sequence">
333 ## end members redering block
333 ## end members redering block
334
334
335 %if not c.pull_request.is_closed():
335 %if not c.pull_request.is_closed():
336 <div id="add_reviewer" class="ac" style="display: none;">
336 <div id="add_reviewer" class="ac" style="display: none;">
337 %if c.allowed_to_update:
337 %if c.allowed_to_update:
338 % if not c.forbid_adding_reviewers:
338 % if not c.forbid_adding_reviewers:
339 <div id="add_reviewer_input" class="reviewer_ac">
339 <div id="add_reviewer_input" class="reviewer_ac">
340 ${h.text('user', class_='ac-input', placeholder=_('Add reviewer or reviewer group'))}
340 ${h.text('user', class_='ac-input', placeholder=_('Add reviewer or reviewer group'))}
341 <div id="reviewers_container"></div>
341 <div id="reviewers_container"></div>
342 </div>
342 </div>
343 % endif
343 % endif
344 <div class="pull-right">
344 <div class="pull-right">
345 <button id="update_pull_request" class="btn btn-small no-margin">${_('Save Changes')}</button>
345 <button id="update_pull_request" class="btn btn-small no-margin">${_('Save Changes')}</button>
346 </div>
346 </div>
347 %endif
347 %endif
348 </div>
348 </div>
349 %endif
349 %endif
350 </div>
350 </div>
351 </div>
351 </div>
352 </div>
352 </div>
353 <div class="box">
353 <div class="box">
354 ##DIFF
354 ##DIFF
355 <div class="table" >
355 <div class="table" >
356 <div id="changeset_compare_view_content">
356 <div id="changeset_compare_view_content">
357 ##CS
357 ##CS
358 % if c.missing_requirements:
358 % if c.missing_requirements:
359 <div class="box">
359 <div class="box">
360 <div class="alert alert-warning">
360 <div class="alert alert-warning">
361 <div>
361 <div>
362 <strong>${_('Missing requirements:')}</strong>
362 <strong>${_('Missing requirements:')}</strong>
363 ${_('These commits cannot be displayed, because this repository uses the Mercurial largefiles extension, which was not enabled.')}
363 ${_('These commits cannot be displayed, because this repository uses the Mercurial largefiles extension, which was not enabled.')}
364 </div>
364 </div>
365 </div>
365 </div>
366 </div>
366 </div>
367 % elif c.missing_commits:
367 % elif c.missing_commits:
368 <div class="box">
368 <div class="box">
369 <div class="alert alert-warning">
369 <div class="alert alert-warning">
370 <div>
370 <div>
371 <strong>${_('Missing commits')}:</strong>
371 <strong>${_('Missing commits')}:</strong>
372 ${_('This pull request cannot be displayed, because one or more commits no longer exist in the source repository.')}
372 ${_('This pull request cannot be displayed, because one or more commits no longer exist in the source repository.')}
373 ${_('Please update this pull request, push the commits back into the source repository, or consider closing this pull request.')}
373 ${_('Please update this pull request, push the commits back into the source repository, or consider closing this pull request.')}
374 ${_('Consider doing a {force_refresh_url} in case you think this is an error.').format(force_refresh_url=h.link_to('force refresh', h.current_route_path(request, force_refresh='1')))|n}
374 ${_('Consider doing a {force_refresh_url} in case you think this is an error.').format(force_refresh_url=h.link_to('force refresh', h.current_route_path(request, force_refresh='1')))|n}
375 </div>
375 </div>
376 </div>
376 </div>
377 </div>
377 </div>
378 % endif
378 % endif
379
379
380 <div class="compare_view_commits_title">
380 <div class="compare_view_commits_title">
381 % if not c.compare_mode:
381 % if not c.compare_mode:
382
382
383 % if c.at_version_pos:
383 % if c.at_version_pos:
384 <h4>
384 <h4>
385 ${_('Showing changes at v%d, commenting is disabled.') % c.at_version_pos}
385 ${_('Showing changes at v%d, commenting is disabled.') % c.at_version_pos}
386 </h4>
386 </h4>
387 % endif
387 % endif
388
388
389 <div class="pull-left">
389 <div class="pull-left">
390 <div class="btn-group">
390 <div class="btn-group">
391 <a
391 <a
392 class="btn"
392 class="btn"
393 href="#"
393 href="#"
394 onclick="$('.compare_select').show();$('.compare_select_hidden').hide(); return false">
394 onclick="$('.compare_select').show();$('.compare_select_hidden').hide(); return false">
395 ${_ungettext('Expand %s commit','Expand %s commits', len(c.commit_ranges)) % len(c.commit_ranges)}
395 ${_ungettext('Expand %s commit','Expand %s commits', len(c.commit_ranges)) % len(c.commit_ranges)}
396 </a>
396 </a>
397 <a
397 <a
398 class="btn"
398 class="btn"
399 href="#"
399 href="#"
400 onclick="$('.compare_select').hide();$('.compare_select_hidden').show(); return false">
400 onclick="$('.compare_select').hide();$('.compare_select_hidden').show(); return false">
401 ${_ungettext('Collapse %s commit','Collapse %s commits', len(c.commit_ranges)) % len(c.commit_ranges)}
401 ${_ungettext('Collapse %s commit','Collapse %s commits', len(c.commit_ranges)) % len(c.commit_ranges)}
402 </a>
402 </a>
403 </div>
403 </div>
404 </div>
404 </div>
405
405
406 <div class="pull-right">
406 <div class="pull-right">
407 % if c.allowed_to_update and not c.pull_request.is_closed():
407 % if c.allowed_to_update and not c.pull_request.is_closed():
408 <a id="update_commits" class="btn btn-primary no-margin pull-right">${_('Update commits')}</a>
408 <a id="update_commits" class="btn btn-primary no-margin pull-right">${_('Update commits')}</a>
409 % else:
409 % else:
410 <a class="tooltip btn disabled pull-right" disabled="disabled" title="${_('Update is disabled for current view')}">${_('Update commits')}</a>
410 <a class="tooltip btn disabled pull-right" disabled="disabled" title="${_('Update is disabled for current view')}">${_('Update commits')}</a>
411 % endif
411 % endif
412
412
413 </div>
413 </div>
414 % endif
414 % endif
415 </div>
415 </div>
416
416
417 % if not c.missing_commits:
417 % if not c.missing_commits:
418 % if c.compare_mode:
418 % if c.compare_mode:
419 % if c.at_version:
419 % if c.at_version:
420 <h4>
420 <h4>
421 ${_('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')}:
421 ${_('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')}:
422 </h4>
422 </h4>
423
423
424 <div class="subtitle-compare">
424 <div class="subtitle-compare">
425 ${_('commits added: {}, removed: {}').format(len(c.commit_changes_summary.added), len(c.commit_changes_summary.removed))}
425 ${_('commits added: {}, removed: {}').format(len(c.commit_changes_summary.added), len(c.commit_changes_summary.removed))}
426 </div>
426 </div>
427
427
428 <div class="container">
428 <div class="container">
429 <table class="rctable compare_view_commits">
429 <table class="rctable compare_view_commits">
430 <tr>
430 <tr>
431 <th></th>
431 <th></th>
432 <th>${_('Time')}</th>
432 <th>${_('Time')}</th>
433 <th>${_('Author')}</th>
433 <th>${_('Author')}</th>
434 <th>${_('Commit')}</th>
434 <th>${_('Commit')}</th>
435 <th></th>
435 <th></th>
436 <th>${_('Description')}</th>
436 <th>${_('Description')}</th>
437 </tr>
437 </tr>
438
438
439 % for c_type, commit in c.commit_changes:
439 % for c_type, commit in c.commit_changes:
440 % if c_type in ['a', 'r']:
440 % if c_type in ['a', 'r']:
441 <%
441 <%
442 if c_type == 'a':
442 if c_type == 'a':
443 cc_title = _('Commit added in displayed changes')
443 cc_title = _('Commit added in displayed changes')
444 elif c_type == 'r':
444 elif c_type == 'r':
445 cc_title = _('Commit removed in displayed changes')
445 cc_title = _('Commit removed in displayed changes')
446 else:
446 else:
447 cc_title = ''
447 cc_title = ''
448 %>
448 %>
449 <tr id="row-${commit.raw_id}" commit_id="${commit.raw_id}" class="compare_select">
449 <tr id="row-${commit.raw_id}" commit_id="${commit.raw_id}" class="compare_select">
450 <td>
450 <td>
451 <div class="commit-change-indicator color-${c_type}-border">
451 <div class="commit-change-indicator color-${c_type}-border">
452 <div class="commit-change-content color-${c_type} tooltip" title="${h.tooltip(cc_title)}">
452 <div class="commit-change-content color-${c_type} tooltip" title="${h.tooltip(cc_title)}">
453 ${c_type.upper()}
453 ${c_type.upper()}
454 </div>
454 </div>
455 </div>
455 </div>
456 </td>
456 </td>
457 <td class="td-time">
457 <td class="td-time">
458 ${h.age_component(commit.date)}
458 ${h.age_component(commit.date)}
459 </td>
459 </td>
460 <td class="td-user">
460 <td class="td-user">
461 ${base.gravatar_with_user(commit.author, 16, tooltip=True)}
461 ${base.gravatar_with_user(commit.author, 16, tooltip=True)}
462 </td>
462 </td>
463 <td class="td-hash">
463 <td class="td-hash">
464 <code>
464 <code>
465 <a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=commit.raw_id)}">
465 <a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=commit.raw_id)}">
466 r${commit.idx}:${h.short_id(commit.raw_id)}
466 r${commit.idx}:${h.short_id(commit.raw_id)}
467 </a>
467 </a>
468 ${h.hidden('revisions', commit.raw_id)}
468 ${h.hidden('revisions', commit.raw_id)}
469 </code>
469 </code>
470 </td>
470 </td>
471 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_( 'Expand commit message')}" onclick="commitsController.expandCommit(this); return false">
471 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_( 'Expand commit message')}" onclick="commitsController.expandCommit(this); return false">
472 <i class="icon-expand-linked"></i>
472 <i class="icon-expand-linked"></i>
473 </td>
473 </td>
474 <td class="mid td-description">
474 <td class="mid td-description">
475 <div class="log-container truncate-wrap">
475 <div class="log-container truncate-wrap">
476 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${h.urlify_commit_message(commit.message, c.repo_name)}</div>
476 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${h.urlify_commit_message(commit.message, c.repo_name)}</div>
477 </div>
477 </div>
478 </td>
478 </td>
479 </tr>
479 </tr>
480 % endif
480 % endif
481 % endfor
481 % endfor
482 </table>
482 </table>
483 </div>
483 </div>
484
484
485 % endif
485 % endif
486
486
487 % else:
487 % else:
488 <%include file="/compare/compare_commits.mako" />
488 <%include file="/compare/compare_commits.mako" />
489 % endif
489 % endif
490
490
491 <div class="cs_files">
491 <div class="cs_files">
492 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
492 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
493 % if c.at_version:
493 % if c.at_version:
494 <% c.inline_cnt = len(c.inline_versions[c.at_version_num]['display']) %>
494 <% c.inline_cnt = len(c.inline_versions[c.at_version_num]['display']) %>
495 <% c.comments = c.comment_versions[c.at_version_num]['display'] %>
495 <% c.comments = c.comment_versions[c.at_version_num]['display'] %>
496 % else:
496 % else:
497 <% c.inline_cnt = len(c.inline_versions[c.at_version_num]['until']) %>
497 <% c.inline_cnt = len(c.inline_versions[c.at_version_num]['until']) %>
498 <% c.comments = c.comment_versions[c.at_version_num]['until'] %>
498 <% c.comments = c.comment_versions[c.at_version_num]['until'] %>
499 % endif
499 % endif
500
500
501 <%
501 <%
502 pr_menu_data = {
502 pr_menu_data = {
503 'outdated_comm_count_ver': outdated_comm_count_ver
503 'outdated_comm_count_ver': outdated_comm_count_ver
504 }
504 }
505 %>
505 %>
506
506
507 ${cbdiffs.render_diffset_menu(c.diffset, range_diff_on=c.range_diff_on)}
507 ${cbdiffs.render_diffset_menu(c.diffset, range_diff_on=c.range_diff_on)}
508
508
509 % if c.range_diff_on:
509 % if c.range_diff_on:
510 % for commit in c.commit_ranges:
510 % for commit in c.commit_ranges:
511 ${cbdiffs.render_diffset(
511 ${cbdiffs.render_diffset(
512 c.changes[commit.raw_id],
512 c.changes[commit.raw_id],
513 commit=commit, use_comments=True,
513 commit=commit, use_comments=True,
514 collapse_when_files_over=5,
514 collapse_when_files_over=5,
515 disable_new_comments=True,
515 disable_new_comments=True,
516 deleted_files_comments=c.deleted_files_comments,
516 deleted_files_comments=c.deleted_files_comments,
517 inline_comments=c.inline_comments,
517 inline_comments=c.inline_comments,
518 pull_request_menu=pr_menu_data)}
518 pull_request_menu=pr_menu_data)}
519 % endfor
519 % endfor
520 % else:
520 % else:
521 ${cbdiffs.render_diffset(
521 ${cbdiffs.render_diffset(
522 c.diffset, use_comments=True,
522 c.diffset, use_comments=True,
523 collapse_when_files_over=30,
523 collapse_when_files_over=30,
524 disable_new_comments=not c.allowed_to_comment,
524 disable_new_comments=not c.allowed_to_comment,
525 deleted_files_comments=c.deleted_files_comments,
525 deleted_files_comments=c.deleted_files_comments,
526 inline_comments=c.inline_comments,
526 inline_comments=c.inline_comments,
527 pull_request_menu=pr_menu_data)}
527 pull_request_menu=pr_menu_data)}
528 % endif
528 % endif
529
529
530 </div>
530 </div>
531 % else:
531 % else:
532 ## skipping commits we need to clear the view for missing commits
532 ## skipping commits we need to clear the view for missing commits
533 <div style="clear:both;"></div>
533 <div style="clear:both;"></div>
534 % endif
534 % endif
535
535
536 </div>
536 </div>
537 </div>
537 </div>
538
538
539 ## template for inline comment form
539 ## template for inline comment form
540 <%namespace name="comment" file="/changeset/changeset_file_comment.mako"/>
540 <%namespace name="comment" file="/changeset/changeset_file_comment.mako"/>
541
541
542 ## comments heading with count
542 ## comments heading with count
543 <div class="comments-heading">
543 <div class="comments-heading">
544 <i class="icon-comment"></i>
544 <i class="icon-comment"></i>
545 ${_('Comments')} ${len(c.comments)}
545 ${_('Comments')} ${len(c.comments)}
546 </div>
546 </div>
547
547
548 ## render general comments
548 ## render general comments
549 <div id="comment-tr-show">
549 <div id="comment-tr-show">
550 % if general_outdated_comm_count_ver:
550 % if general_outdated_comm_count_ver:
551 <div class="info-box">
551 <div class="info-box">
552 % if general_outdated_comm_count_ver == 1:
552 % if general_outdated_comm_count_ver == 1:
553 ${_('there is {num} general comment from older versions').format(num=general_outdated_comm_count_ver)},
553 ${_('there is {num} general comment from older versions').format(num=general_outdated_comm_count_ver)},
554 <a href="#show-hidden-comments" onclick="$('.comment-general.comment-outdated').show(); $(this).parent().hide(); return false;">${_('show it')}</a>
554 <a href="#show-hidden-comments" onclick="$('.comment-general.comment-outdated').show(); $(this).parent().hide(); return false;">${_('show it')}</a>
555 % else:
555 % else:
556 ${_('there are {num} general comments from older versions').format(num=general_outdated_comm_count_ver)},
556 ${_('there are {num} general comments from older versions').format(num=general_outdated_comm_count_ver)},
557 <a href="#show-hidden-comments" onclick="$('.comment-general.comment-outdated').show(); $(this).parent().hide(); return false;">${_('show them')}</a>
557 <a href="#show-hidden-comments" onclick="$('.comment-general.comment-outdated').show(); $(this).parent().hide(); return false;">${_('show them')}</a>
558 % endif
558 % endif
559 </div>
559 </div>
560 % endif
560 % endif
561 </div>
561 </div>
562
562
563 ${comment.generate_comments(c.comments, include_pull_request=True, is_pull_request=True)}
563 ${comment.generate_comments(c.comments, include_pull_request=True, is_pull_request=True)}
564
564
565 % if not c.pull_request.is_closed():
565 % if not c.pull_request.is_closed():
566 ## main comment form and it status
566 ## main comment form and it status
567 ${comment.comments(h.route_path('pullrequest_comment_create', repo_name=c.repo_name,
567 ${comment.comments(h.route_path('pullrequest_comment_create', repo_name=c.repo_name,
568 pull_request_id=c.pull_request.pull_request_id),
568 pull_request_id=c.pull_request.pull_request_id),
569 c.pull_request_review_status,
569 c.pull_request_review_status,
570 is_pull_request=True, change_status=c.allowed_to_change_status)}
570 is_pull_request=True, change_status=c.allowed_to_change_status)}
571
571
572 ## merge status, and merge action
572 ## merge status, and merge action
573 <div class="pull-request-merge">
573 <div class="pull-request-merge">
574 <%include file="/pullrequests/pullrequest_merge_checks.mako"/>
574 <%include file="/pullrequests/pullrequest_merge_checks.mako"/>
575 </div>
575 </div>
576
576
577 %endif
577 %endif
578
578
579 <script type="text/javascript">
579 <script type="text/javascript">
580
580
581 versionController = new VersionController();
581 versionController = new VersionController();
582 versionController.init();
582 versionController.init();
583
583
584 reviewersController = new ReviewersController();
584 reviewersController = new ReviewersController();
585 commitsController = new CommitsController();
585 commitsController = new CommitsController();
586
586
587 $(function(){
587 $(function(){
588
588
589 // custom code mirror
589 // custom code mirror
590 var codeMirrorInstance = $('#pr-description-input').get(0).MarkupForm.cm;
590 var codeMirrorInstance = $('#pr-description-input').get(0).MarkupForm.cm;
591
591
592 var PRDetails = {
592 var PRDetails = {
593 editButton: $('#open_edit_pullrequest'),
593 editButton: $('#open_edit_pullrequest'),
594 closeButton: $('#close_edit_pullrequest'),
594 closeButton: $('#close_edit_pullrequest'),
595 deleteButton: $('#delete_pullrequest'),
595 deleteButton: $('#delete_pullrequest'),
596 viewFields: $('#pr-desc, #pr-title'),
596 viewFields: $('#pr-desc, #pr-title'),
597 editFields: $('#pr-desc-edit, #pr-title-edit, #pr-save'),
597 editFields: $('#pr-desc-edit, #pr-title-edit, #pr-save'),
598
598
599 init: function() {
599 init: function() {
600 var that = this;
600 var that = this;
601 this.editButton.on('click', function(e) { that.edit(); });
601 this.editButton.on('click', function(e) { that.edit(); });
602 this.closeButton.on('click', function(e) { that.view(); });
602 this.closeButton.on('click', function(e) { that.view(); });
603 },
603 },
604
604
605 edit: function(event) {
605 edit: function(event) {
606 this.viewFields.hide();
606 this.viewFields.hide();
607 this.editButton.hide();
607 this.editButton.hide();
608 this.deleteButton.hide();
608 this.deleteButton.hide();
609 this.closeButton.show();
609 this.closeButton.show();
610 this.editFields.show();
610 this.editFields.show();
611 codeMirrorInstance.refresh();
611 codeMirrorInstance.refresh();
612 },
612 },
613
613
614 view: function(event) {
614 view: function(event) {
615 this.editButton.show();
615 this.editButton.show();
616 this.deleteButton.show();
616 this.deleteButton.show();
617 this.editFields.hide();
617 this.editFields.hide();
618 this.closeButton.hide();
618 this.closeButton.hide();
619 this.viewFields.show();
619 this.viewFields.show();
620 }
620 }
621 };
621 };
622
622
623 var ReviewersPanel = {
623 var ReviewersPanel = {
624 editButton: $('#open_edit_reviewers'),
624 editButton: $('#open_edit_reviewers'),
625 closeButton: $('#close_edit_reviewers'),
625 closeButton: $('#close_edit_reviewers'),
626 addButton: $('#add_reviewer'),
626 addButton: $('#add_reviewer'),
627 removeButtons: $('.reviewer_member_remove,.reviewer_member_mandatory_remove'),
627 removeButtons: $('.reviewer_member_remove,.reviewer_member_mandatory_remove'),
628
628
629 init: function() {
629 init: function() {
630 var self = this;
630 var self = this;
631 this.editButton.on('click', function(e) { self.edit(); });
631 this.editButton.on('click', function(e) { self.edit(); });
632 this.closeButton.on('click', function(e) { self.close(); });
632 this.closeButton.on('click', function(e) { self.close(); });
633 },
633 },
634
634
635 edit: function(event) {
635 edit: function(event) {
636 this.editButton.hide();
636 this.editButton.hide();
637 this.closeButton.show();
637 this.closeButton.show();
638 this.addButton.show();
638 this.addButton.show();
639 this.removeButtons.css('visibility', 'visible');
639 this.removeButtons.css('visibility', 'visible');
640 // review rules
640 // review rules
641 reviewersController.loadReviewRules(
641 reviewersController.loadReviewRules(
642 ${c.pull_request.reviewer_data_json | n});
642 ${c.pull_request.reviewer_data_json | n});
643 },
643 },
644
644
645 close: function(event) {
645 close: function(event) {
646 this.editButton.show();
646 this.editButton.show();
647 this.closeButton.hide();
647 this.closeButton.hide();
648 this.addButton.hide();
648 this.addButton.hide();
649 this.removeButtons.css('visibility', 'hidden');
649 this.removeButtons.css('visibility', 'hidden');
650 // hide review rules
650 // hide review rules
651 reviewersController.hideReviewRules()
651 reviewersController.hideReviewRules()
652 }
652 }
653 };
653 };
654
654
655 PRDetails.init();
655 PRDetails.init();
656 ReviewersPanel.init();
656 ReviewersPanel.init();
657
657
658 showOutdated = function(self){
658 showOutdated = function(self){
659 $('.comment-inline.comment-outdated').show();
659 $('.comment-inline.comment-outdated').show();
660 $('.filediff-outdated').show();
660 $('.filediff-outdated').show();
661 $('.showOutdatedComments').hide();
661 $('.showOutdatedComments').hide();
662 $('.hideOutdatedComments').show();
662 $('.hideOutdatedComments').show();
663 };
663 };
664
664
665 hideOutdated = function(self){
665 hideOutdated = function(self){
666 $('.comment-inline.comment-outdated').hide();
666 $('.comment-inline.comment-outdated').hide();
667 $('.filediff-outdated').hide();
667 $('.filediff-outdated').hide();
668 $('.hideOutdatedComments').hide();
668 $('.hideOutdatedComments').hide();
669 $('.showOutdatedComments').show();
669 $('.showOutdatedComments').show();
670 };
670 };
671
671
672 refreshMergeChecks = function(){
672 refreshMergeChecks = function(){
673 var loadUrl = "${request.current_route_path(_query=dict(merge_checks=1))}";
673 var loadUrl = "${request.current_route_path(_query=dict(merge_checks=1))}";
674 $('.pull-request-merge').css('opacity', 0.3);
674 $('.pull-request-merge').css('opacity', 0.3);
675 $('.action-buttons-extra').css('opacity', 0.3);
675 $('.action-buttons-extra').css('opacity', 0.3);
676
676
677 $('.pull-request-merge').load(
677 $('.pull-request-merge').load(
678 loadUrl, function() {
678 loadUrl, function() {
679 $('.pull-request-merge').css('opacity', 1);
679 $('.pull-request-merge').css('opacity', 1);
680
680
681 $('.action-buttons-extra').css('opacity', 1);
681 $('.action-buttons-extra').css('opacity', 1);
682 }
682 }
683 );
683 );
684 };
684 };
685
685
686 closePullRequest = function (status) {
686 closePullRequest = function (status) {
687 if (!confirm(_gettext('Are you sure to close this pull request without merging?'))) {
688 return false;
689 }
687 // inject closing flag
690 // inject closing flag
688 $('.action-buttons-extra').append('<input type="hidden" class="close-pr-input" id="close_pull_request" value="1">');
691 $('.action-buttons-extra').append('<input type="hidden" class="close-pr-input" id="close_pull_request" value="1">');
689 $(generalCommentForm.statusChange).select2("val", status).trigger('change');
692 $(generalCommentForm.statusChange).select2("val", status).trigger('change');
690 $(generalCommentForm.submitForm).submit();
693 $(generalCommentForm.submitForm).submit();
691 };
694 };
692
695
693 $('#show-outdated-comments').on('click', function(e){
696 $('#show-outdated-comments').on('click', function(e){
694 var button = $(this);
697 var button = $(this);
695 var outdated = $('.comment-outdated');
698 var outdated = $('.comment-outdated');
696
699
697 if (button.html() === "(Show)") {
700 if (button.html() === "(Show)") {
698 button.html("(Hide)");
701 button.html("(Hide)");
699 outdated.show();
702 outdated.show();
700 } else {
703 } else {
701 button.html("(Show)");
704 button.html("(Show)");
702 outdated.hide();
705 outdated.hide();
703 }
706 }
704 });
707 });
705
708
706 $('.show-inline-comments').on('change', function(e){
709 $('.show-inline-comments').on('change', function(e){
707 var show = 'none';
710 var show = 'none';
708 var target = e.currentTarget;
711 var target = e.currentTarget;
709 if(target.checked){
712 if(target.checked){
710 show = ''
713 show = ''
711 }
714 }
712 var boxid = $(target).attr('id_for');
715 var boxid = $(target).attr('id_for');
713 var comments = $('#{0} .inline-comments'.format(boxid));
716 var comments = $('#{0} .inline-comments'.format(boxid));
714 var fn_display = function(idx){
717 var fn_display = function(idx){
715 $(this).css('display', show);
718 $(this).css('display', show);
716 };
719 };
717 $(comments).each(fn_display);
720 $(comments).each(fn_display);
718 var btns = $('#{0} .inline-comments-button'.format(boxid));
721 var btns = $('#{0} .inline-comments-button'.format(boxid));
719 $(btns).each(fn_display);
722 $(btns).each(fn_display);
720 });
723 });
721
724
722 $('#merge_pull_request_form').submit(function() {
725 $('#merge_pull_request_form').submit(function() {
723 if (!$('#merge_pull_request').attr('disabled')) {
726 if (!$('#merge_pull_request').attr('disabled')) {
724 $('#merge_pull_request').attr('disabled', 'disabled');
727 $('#merge_pull_request').attr('disabled', 'disabled');
725 }
728 }
726 return true;
729 return true;
727 });
730 });
728
731
729 $('#edit_pull_request').on('click', function(e){
732 $('#edit_pull_request').on('click', function(e){
730 var title = $('#pr-title-input').val();
733 var title = $('#pr-title-input').val();
731 var description = codeMirrorInstance.getValue();
734 var description = codeMirrorInstance.getValue();
732 var renderer = $('#pr-renderer-input').val();
735 var renderer = $('#pr-renderer-input').val();
733 editPullRequest(
736 editPullRequest(
734 "${c.repo_name}", "${c.pull_request.pull_request_id}",
737 "${c.repo_name}", "${c.pull_request.pull_request_id}",
735 title, description, renderer);
738 title, description, renderer);
736 });
739 });
737
740
738 $('#update_pull_request').on('click', function(e){
741 $('#update_pull_request').on('click', function(e){
739 $(this).attr('disabled', 'disabled');
742 $(this).attr('disabled', 'disabled');
740 $(this).addClass('disabled');
743 $(this).addClass('disabled');
741 $(this).html(_gettext('Saving...'));
744 $(this).html(_gettext('Saving...'));
742 reviewersController.updateReviewers(
745 reviewersController.updateReviewers(
743 "${c.repo_name}", "${c.pull_request.pull_request_id}");
746 "${c.repo_name}", "${c.pull_request.pull_request_id}");
744 });
747 });
745
748
746 $('#update_commits').on('click', function(e){
749 $('#update_commits').on('click', function(e){
747 var isDisabled = !$(e.currentTarget).attr('disabled');
750 var isDisabled = !$(e.currentTarget).attr('disabled');
748 $(e.currentTarget).attr('disabled', 'disabled');
751 $(e.currentTarget).attr('disabled', 'disabled');
749 $(e.currentTarget).addClass('disabled');
752 $(e.currentTarget).addClass('disabled');
750 $(e.currentTarget).removeClass('btn-primary');
753 $(e.currentTarget).removeClass('btn-primary');
751 $(e.currentTarget).text(_gettext('Updating...'));
754 $(e.currentTarget).text(_gettext('Updating...'));
752 if(isDisabled){
755 if(isDisabled){
753 updateCommits(
756 updateCommits(
754 "${c.repo_name}", "${c.pull_request.pull_request_id}");
757 "${c.repo_name}", "${c.pull_request.pull_request_id}");
755 }
758 }
756 });
759 });
757 // fixing issue with caches on firefox
760 // fixing issue with caches on firefox
758 $('#update_commits').removeAttr("disabled");
761 $('#update_commits').removeAttr("disabled");
759
762
760 $('.show-inline-comments').on('click', function(e){
763 $('.show-inline-comments').on('click', function(e){
761 var boxid = $(this).attr('data-comment-id');
764 var boxid = $(this).attr('data-comment-id');
762 var button = $(this);
765 var button = $(this);
763
766
764 if(button.hasClass("comments-visible")) {
767 if(button.hasClass("comments-visible")) {
765 $('#{0} .inline-comments'.format(boxid)).each(function(index){
768 $('#{0} .inline-comments'.format(boxid)).each(function(index){
766 $(this).hide();
769 $(this).hide();
767 });
770 });
768 button.removeClass("comments-visible");
771 button.removeClass("comments-visible");
769 } else {
772 } else {
770 $('#{0} .inline-comments'.format(boxid)).each(function(index){
773 $('#{0} .inline-comments'.format(boxid)).each(function(index){
771 $(this).show();
774 $(this).show();
772 });
775 });
773 button.addClass("comments-visible");
776 button.addClass("comments-visible");
774 }
777 }
775 });
778 });
776
779
777 // register submit callback on commentForm form to track TODOs
780 // register submit callback on commentForm form to track TODOs
778 window.commentFormGlobalSubmitSuccessCallback = function(){
781 window.commentFormGlobalSubmitSuccessCallback = function(){
779 refreshMergeChecks();
782 refreshMergeChecks();
780 };
783 };
781
784
782 ReviewerAutoComplete('#user');
785 ReviewerAutoComplete('#user');
783
786
784 })
787 })
785
788
786 </script>
789 </script>
787
790
788 </div>
791 </div>
789 </div>
792 </div>
790
793
791 </%def>
794 </%def>
General Comments 0
You need to be logged in to leave comments. Login now