Show More
The requested changes are too big and content was truncated. Show full diff
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
@@ -0,0 +1,52 b'' | |||||
|
1 | # -*- coding: utf-8 -*- | |||
|
2 | ||||
|
3 | import logging | |||
|
4 | from sqlalchemy import * | |||
|
5 | ||||
|
6 | from alembic.migration import MigrationContext | |||
|
7 | from alembic.operations import Operations | |||
|
8 | ||||
|
9 | from rhodecode.lib.dbmigrate.versions import _reset_base | |||
|
10 | from rhodecode.model import meta, init_model_encryption | |||
|
11 | ||||
|
12 | ||||
|
13 | log = logging.getLogger(__name__) | |||
|
14 | ||||
|
15 | ||||
|
16 | def upgrade(migrate_engine): | |||
|
17 | """ | |||
|
18 | Upgrade operations go here. | |||
|
19 | Don't create your own engine; bind migrate_engine to your metadata | |||
|
20 | """ | |||
|
21 | _reset_base(migrate_engine) | |||
|
22 | from rhodecode.lib.dbmigrate.schema import db_4_20_0_0 as db | |||
|
23 | ||||
|
24 | init_model_encryption(db) | |||
|
25 | ||||
|
26 | context = MigrationContext.configure(migrate_engine.connect()) | |||
|
27 | op = Operations(context) | |||
|
28 | ||||
|
29 | table = db.PullRequestReviewers.__table__ | |||
|
30 | with op.batch_alter_table(table.name) as batch_op: | |||
|
31 | new_column = Column('role', Unicode(255), nullable=True) | |||
|
32 | batch_op.add_column(new_column) | |||
|
33 | ||||
|
34 | _fill_reviewers_role(db, op, meta.Session) | |||
|
35 | ||||
|
36 | ||||
|
37 | def downgrade(migrate_engine): | |||
|
38 | meta = MetaData() | |||
|
39 | meta.bind = migrate_engine | |||
|
40 | ||||
|
41 | ||||
|
42 | def fixups(models, _SESSION): | |||
|
43 | pass | |||
|
44 | ||||
|
45 | ||||
|
46 | def _fill_reviewers_role(models, op, session): | |||
|
47 | params = {'role': 'reviewer'} | |||
|
48 | query = text( | |||
|
49 | 'UPDATE pull_request_reviewers SET role = :role' | |||
|
50 | ).bindparams(**params) | |||
|
51 | op.execute(query) | |||
|
52 | session().commit() |
@@ -48,7 +48,7 b' PYRAMID_SETTINGS = {}' | |||||
48 | EXTENSIONS = {} |
|
48 | EXTENSIONS = {} | |
49 |
|
49 | |||
50 | __version__ = ('.'.join((str(each) for each in VERSION[:3]))) |
|
50 | __version__ = ('.'.join((str(each) for each in VERSION[:3]))) | |
51 |
__dbversion__ = 10 |
|
51 | __dbversion__ = 109 # defines current db version for migrations | |
52 | __platform__ = platform.system() |
|
52 | __platform__ = platform.system() | |
53 | __license__ = 'AGPLv3, and Commercial License' |
|
53 | __license__ = 'AGPLv3, and Commercial License' | |
54 | __author__ = 'RhodeCode GmbH' |
|
54 | __author__ = 'RhodeCode GmbH' |
@@ -166,8 +166,8 b' class RepoCommitsView(RepoAppView):' | |||||
166 | if method == 'show': |
|
166 | if method == 'show': | |
167 | inline_comments = CommentsModel().get_inline_comments( |
|
167 | inline_comments = CommentsModel().get_inline_comments( | |
168 | self.db_repo.repo_id, revision=commit.raw_id) |
|
168 | self.db_repo.repo_id, revision=commit.raw_id) | |
169 |
c.inline_cnt = CommentsModel().get_inline_comments_ |
|
169 | c.inline_cnt = len(CommentsModel().get_inline_comments_as_list( | |
170 | inline_comments) |
|
170 | inline_comments)) | |
171 | c.inline_comments = inline_comments |
|
171 | c.inline_comments = inline_comments | |
172 |
|
172 | |||
173 | cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path( |
|
173 | cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path( |
@@ -641,7 +641,7 b' class CommentsModel(BaseModel):' | |||||
641 | q = self._get_inline_comments_query(repo_id, revision, pull_request) |
|
641 | q = self._get_inline_comments_query(repo_id, revision, pull_request) | |
642 | return self._group_comments_by_path_and_line_number(q) |
|
642 | return self._group_comments_by_path_and_line_number(q) | |
643 |
|
643 | |||
644 |
def get_inline_comments_ |
|
644 | def get_inline_comments_as_list(self, inline_comments, skip_outdated=True, | |
645 | version=None): |
|
645 | version=None): | |
646 | inline_cnt = 0 |
|
646 | inline_cnt = 0 | |
647 | for fname, per_line_comments in inline_comments.iteritems(): |
|
647 | for fname, per_line_comments in inline_comments.iteritems(): |
@@ -3810,6 +3810,10 b' class ChangesetComment(Base, BaseModel):' | |||||
3810 | return self.display_state == self.COMMENT_OUTDATED |
|
3810 | return self.display_state == self.COMMENT_OUTDATED | |
3811 |
|
3811 | |||
3812 | @property |
|
3812 | @property | |
|
3813 | def outdated_js(self): | |||
|
3814 | return json.dumps(self.display_state == self.COMMENT_OUTDATED) | |||
|
3815 | ||||
|
3816 | @property | |||
3813 | def immutable(self): |
|
3817 | def immutable(self): | |
3814 | return self.immutable_state == self.OP_IMMUTABLE |
|
3818 | return self.immutable_state == self.OP_IMMUTABLE | |
3815 |
|
3819 | |||
@@ -4492,6 +4496,8 b' class PullRequestReviewers(Base, BaseMod' | |||||
4492 | __table_args__ = ( |
|
4496 | __table_args__ = ( | |
4493 | base_table_args, |
|
4497 | base_table_args, | |
4494 | ) |
|
4498 | ) | |
|
4499 | ROLE_REVIEWER = u'reviewer' | |||
|
4500 | ROLE_OBSERVER = u'observer' | |||
4495 |
|
4501 | |||
4496 | @hybrid_property |
|
4502 | @hybrid_property | |
4497 | def reasons(self): |
|
4503 | def reasons(self): | |
@@ -4519,6 +4525,8 b' class PullRequestReviewers(Base, BaseMod' | |||||
4519 | JsonType('list', dialect_map=dict(mysql=UnicodeText(16384))))) |
|
4525 | JsonType('list', dialect_map=dict(mysql=UnicodeText(16384))))) | |
4520 |
|
4526 | |||
4521 | mandatory = Column("mandatory", Boolean(), nullable=False, default=False) |
|
4527 | mandatory = Column("mandatory", Boolean(), nullable=False, default=False) | |
|
4528 | role = Column('role', Unicode(255), nullable=True, default=ROLE_REVIEWER) | |||
|
4529 | ||||
4522 | user = relationship('User') |
|
4530 | user = relationship('User') | |
4523 | pull_request = relationship('PullRequest') |
|
4531 | pull_request = relationship('PullRequest') | |
4524 |
|
4532 |
@@ -484,10 +484,6 b' ul.auth_plugins {' | |||||
484 | white-space: pre-line; |
|
484 | white-space: pre-line; | |
485 | } |
|
485 | } | |
486 |
|
486 | |||
487 | .pr-details-title { |
|
|||
488 | height: 16px |
|
|||
489 | } |
|
|||
490 |
|
||||
491 | .pr-details-title-author-pref { |
|
487 | .pr-details-title-author-pref { | |
492 | padding-right: 10px |
|
488 | padding-right: 10px | |
493 | } |
|
489 | } | |
@@ -1492,26 +1488,17 b' table.integrations {' | |||||
1492 |
|
1488 | |||
1493 | // Pull Requests |
|
1489 | // Pull Requests | |
1494 | .summary-details { |
|
1490 | .summary-details { | |
1495 |
width: |
|
1491 | width: 100%; | |
1496 | } |
|
1492 | } | |
1497 | .pr-summary { |
|
1493 | .pr-summary { | |
1498 | border-bottom: @border-thickness solid @grey5; |
|
1494 | border-bottom: @border-thickness solid @grey5; | |
1499 | margin-bottom: @space; |
|
1495 | margin-bottom: @space; | |
1500 | } |
|
1496 | } | |
1501 |
|
1497 | |||
1502 | .reviewers-title { |
|
|||
1503 | width: 25%; |
|
|||
1504 | min-width: 200px; |
|
|||
1505 |
|
||||
1506 | &.first-panel { |
|
|||
1507 | margin-top: 34px; |
|
|||
1508 | } |
|
|||
1509 | } |
|
|||
1510 |
|
||||
1511 | .reviewers { |
|
1498 | .reviewers { | |
1512 |
|
|
1499 | width: 98%; | |
1513 | min-width: 200px; |
|
1500 | } | |
1514 | } |
|
1501 | ||
1515 | .reviewers ul li { |
|
1502 | .reviewers ul li { | |
1516 | position: relative; |
|
1503 | position: relative; | |
1517 | width: 100%; |
|
1504 | width: 100%; | |
@@ -1593,6 +1580,9 b' table.integrations {' | |||||
1593 | cursor: pointer; |
|
1580 | cursor: pointer; | |
1594 | } |
|
1581 | } | |
1595 | .pr-details-title { |
|
1582 | .pr-details-title { | |
|
1583 | height: 20px; | |||
|
1584 | line-height: 20px; | |||
|
1585 | ||||
1596 | padding-bottom: 8px; |
|
1586 | padding-bottom: 8px; | |
1597 | border-bottom: @border-thickness solid @grey5; |
|
1587 | border-bottom: @border-thickness solid @grey5; | |
1598 |
|
1588 | |||
@@ -1617,7 +1607,7 b' table.integrations {' | |||||
1617 | text-decoration: line-through; |
|
1607 | text-decoration: line-through; | |
1618 | } |
|
1608 | } | |
1619 |
|
1609 | |||
1620 | .todo-table { |
|
1610 | .todo-table, .comments-table { | |
1621 | width: 100%; |
|
1611 | width: 100%; | |
1622 |
|
1612 | |||
1623 | td { |
|
1613 | td { |
@@ -38,10 +38,12 b'' | |||||
38 | <div class="main"> |
|
38 | <div class="main"> | |
39 | ${next.main()} |
|
39 | ${next.main()} | |
40 | </div> |
|
40 | </div> | |
|
41 | ||||
41 | </div> |
|
42 | </div> | |
42 | <!-- END CONTENT --> |
|
43 | <!-- END CONTENT --> | |
43 |
|
44 | |||
44 | </div> |
|
45 | </div> | |
|
46 | ||||
45 | <!-- FOOTER --> |
|
47 | <!-- FOOTER --> | |
46 | <div id="footer"> |
|
48 | <div id="footer"> | |
47 | <div id="footer-inner" class="title wrapper"> |
|
49 | <div id="footer-inner" class="title wrapper"> |
@@ -159,45 +159,45 b" return '%s_%s_%i' % (h.md5_safe(commit+f" | |||||
159 | </div> |
|
159 | </div> | |
160 | % endif |
|
160 | % endif | |
161 |
|
161 | |||
162 |
|
|
162 | ## ## comments | |
163 | <div class="pull-right"> |
|
163 | ## <div class="pull-right"> | |
164 |
|
|
164 | ## <div class="comments-number" style="padding-left: 10px"> | |
165 | % if hasattr(c, 'comments') and hasattr(c, 'inline_cnt'): |
|
165 | ## % if hasattr(c, 'comments') and hasattr(c, 'inline_cnt'): | |
166 |
|
|
166 | ## <i class="icon-comment" style="color: #949494">COMMENTS:</i> | |
167 | % if c.comments: |
|
167 | ## % if c.comments: | |
168 | <a href="#comments">${_ungettext("{} General", "{} General", len(c.comments)).format(len(c.comments))}</a>, |
|
168 | ## <a href="#comments">${_ungettext("{} General", "{} General", len(c.comments)).format(len(c.comments))}</a>, | |
169 | % else: |
|
169 | ## % else: | |
170 |
|
|
170 | ## ${_('0 General')} | |
171 |
|
|
171 | ## % endif | |
172 |
|
172 | ## | ||
173 |
|
|
173 | ## % if c.inline_cnt: | |
174 |
|
|
174 | ## <a href="#" onclick="return Rhodecode.comments.nextComment();" | |
175 | id="inline-comments-counter">${_ungettext("{} Inline", "{} Inline", c.inline_cnt).format(c.inline_cnt)} |
|
175 | ## id="inline-comments-counter">${_ungettext("{} Inline", "{} Inline", c.inline_cnt).format(c.inline_cnt)} | |
176 |
|
|
176 | ## </a> | |
177 | % else: |
|
177 | ## % else: | |
178 |
|
|
178 | ## ${_('0 Inline')} | |
179 |
|
|
179 | ## % endif | |
180 | % endif |
|
180 | ## % endif | |
181 |
|
181 | ## | ||
182 |
|
|
182 | ## % if pull_request_menu: | |
183 |
|
|
183 | ## <% | |
184 | outdated_comm_count_ver = pull_request_menu['outdated_comm_count_ver'] |
|
184 | ## outdated_comm_count_ver = pull_request_menu['outdated_comm_count_ver'] | |
185 | %> |
|
185 | ## %> | |
186 |
|
186 | ## | ||
187 |
|
|
187 | ## % if outdated_comm_count_ver: | |
188 |
|
|
188 | ## <a href="#" onclick="showOutdated(); Rhodecode.comments.nextOutdatedComment(); return false;"> | |
189 | (${_("{} Outdated").format(outdated_comm_count_ver)}) |
|
189 | ## (${_("{} Outdated").format(outdated_comm_count_ver)}) | |
190 |
|
|
190 | ## </a> | |
191 |
|
|
191 | ## <a href="#" class="showOutdatedComments" onclick="showOutdated(this); return false;"> | ${_('show outdated')}</a> | |
192 |
|
|
192 | ## <a href="#" class="hideOutdatedComments" style="display: none" onclick="hideOutdated(this); return false;"> | ${_('hide outdated')}</a> | |
193 | % else: |
|
193 | ## % else: | |
194 | (${_("{} Outdated").format(outdated_comm_count_ver)}) |
|
194 | ## (${_("{} Outdated").format(outdated_comm_count_ver)}) | |
195 | % endif |
|
195 | ## % endif | |
196 |
|
196 | ## | ||
197 |
|
|
197 | ## % endif | |
198 |
|
198 | ## | ||
199 |
|
|
199 | ## </div> | |
200 |
|
|
200 | ## </div> | |
201 |
|
201 | |||
202 | </div> |
|
202 | </div> | |
203 |
|
203 | |||
@@ -934,7 +934,7 b' def get_comments_for(diff_type, comments' | |||||
934 | </span> |
|
934 | </span> | |
935 | %endif |
|
935 | %endif | |
936 | % if commit or pull_request_menu: |
|
936 | % if commit or pull_request_menu: | |
937 | <span id="diff_nav">Loading diff...:</span> |
|
937 | <span class="tooltip" title="Navigate to previous or next change inside files." id="diff_nav">Loading diff...:</span> | |
938 | <span class="cursor-pointer" onclick="scrollToPrevChunk(); return false"> |
|
938 | <span class="cursor-pointer" onclick="scrollToPrevChunk(); return false"> | |
939 | <i class="icon-angle-up"></i> |
|
939 | <i class="icon-angle-up"></i> | |
940 | </span> |
|
940 | </span> |
@@ -39,8 +39,6 b' var CG = new ColorGenerator();' | |||||
39 | </script> |
|
39 | </script> | |
40 |
|
40 | |||
41 | <script id="ejs_reviewMemberEntry" type="text/template" class="ejsTemplate"> |
|
41 | <script id="ejs_reviewMemberEntry" type="text/template" class="ejsTemplate"> | |
42 |
|
||||
43 | <li id="reviewer_<%= member.user_id %>" class="reviewer_entry"> |
|
|||
44 |
|
|
42 | <% | |
45 |
|
|
43 | if (create) { | |
46 |
|
|
44 | var edit_visibility = 'visible'; | |
@@ -49,15 +47,18 b' var CG = new ColorGenerator();' | |||||
49 |
|
|
47 | } | |
50 |
|
48 | |||
51 |
|
|
49 | if (member.user_group && member.user_group.vote_rule) { | |
52 |
|
|
50 | var groupStyle = 'border-right: 2px solid '+CG.asRGB(CG.getColor(member.user_group.vote_rule)); | |
53 |
|
|
51 | } else { | |
54 |
|
|
52 | var groupStyle = 'border-right: 2px solid transparent'; | |
55 |
|
|
53 | } | |
56 |
|
|
54 | %> | |
57 |
|
55 | |||
58 | <div class="reviewers_member" style="<%= groupStyle%>" > |
|
56 | <li id="reviewer_<%= member.user_id %>" class="reviewer_entry" style="<%= groupStyle%>" tooltip="Review Group"> | |
|
57 | ||||
|
58 | <div class="reviewers_member"> | |||
59 | <div class="reviewer_status tooltip" title="<%= review_status_label %>"> |
|
59 | <div class="reviewer_status tooltip" title="<%= review_status_label %>"> | |
60 | <i class="icon-circle review-status-<%= review_status %>"></i> |
|
60 | <i class="icon-circle review-status-<%= review_status %>"></i> | |
|
61 | ||||
61 |
|
|
62 | </div> | |
62 | <div id="reviewer_<%= member.user_id %>_name" class="reviewer_name"> |
|
63 | <div id="reviewer_<%= member.user_id %>_name" class="reviewer_name"> | |
63 | <% if (mandatory) { %> |
|
64 | <% if (mandatory) { %> |
This diff has been collapsed as it changes many lines, (580 lines changed) Show them Hide them | |||||
@@ -280,154 +280,9 b'' | |||||
280 |
|
280 | |||
281 | </div> |
|
281 | </div> | |
282 |
|
282 | |||
283 | ## REVIEW RULES |
|
|||
284 | <div id="review_rules" style="display: none" class="reviewers-title block-right"> |
|
|||
285 | <div class="pr-details-title"> |
|
|||
286 | ${_('Reviewer rules')} |
|
|||
287 | %if c.allowed_to_update: |
|
|||
288 | <span id="close_edit_reviewers" class="block-right action_button last-item" style="display: none;">${_('Close')}</span> |
|
|||
289 | %endif |
|
|||
290 | </div> |
|
|||
291 | <div class="pr-reviewer-rules"> |
|
|||
292 | ## review rules will be appended here, by default reviewers logic |
|
|||
293 | </div> |
|
|||
294 | <input id="review_data" type="hidden" name="review_data" value=""> |
|
|||
295 | </div> |
|
|||
296 |
|
283 | |||
297 | ## REVIEWERS |
|
|||
298 | <div class="reviewers-title first-panel block-right"> |
|
|||
299 | <div class="pr-details-title"> |
|
|||
300 | ${_('Pull request reviewers')} |
|
|||
301 | %if c.allowed_to_update: |
|
|||
302 | <span id="open_edit_reviewers" class="block-right action_button last-item">${_('Edit')}</span> |
|
|||
303 | %endif |
|
|||
304 | </div> |
|
|||
305 | </div> |
|
|||
306 | <div id="reviewers" class="block-right pr-details-content reviewers"> |
|
|||
307 |
|
||||
308 | ## members redering block |
|
|||
309 | <input type="hidden" name="__start__" value="review_members:sequence"> |
|
|||
310 | <ul id="review_members" class="group_members"> |
|
|||
311 |
|
||||
312 | % for review_obj, member, reasons, mandatory, status in c.pull_request_reviewers: |
|
|||
313 | <script> |
|
|||
314 | var member = ${h.json.dumps(h.reviewer_as_json(member, reasons=reasons, mandatory=mandatory, user_group=review_obj.rule_user_group_data()))|n}; |
|
|||
315 | var status = "${(status[0][1].status if status else 'not_reviewed')}"; |
|
|||
316 | var status_lbl = "${h.commit_status_lbl(status[0][1].status if status else 'not_reviewed')}"; |
|
|||
317 | var allowed_to_update = ${h.json.dumps(c.allowed_to_update)}; |
|
|||
318 |
|
||||
319 | var entry = renderTemplate('reviewMemberEntry', { |
|
|||
320 | 'member': member, |
|
|||
321 | 'mandatory': member.mandatory, |
|
|||
322 | 'reasons': member.reasons, |
|
|||
323 | 'allowed_to_update': allowed_to_update, |
|
|||
324 | 'review_status': status, |
|
|||
325 | 'review_status_label': status_lbl, |
|
|||
326 | 'user_group': member.user_group, |
|
|||
327 | 'create': false |
|
|||
328 | }); |
|
|||
329 | $('#review_members').append(entry) |
|
|||
330 | </script> |
|
|||
331 |
|
||||
332 | % endfor |
|
|||
333 |
|
||||
334 | </ul> |
|
|||
335 |
|
||||
336 | <input type="hidden" name="__end__" value="review_members:sequence"> |
|
|||
337 | ## end members redering block |
|
|||
338 |
|
||||
339 | %if not c.pull_request.is_closed(): |
|
|||
340 | <div id="add_reviewer" class="ac" style="display: none;"> |
|
|||
341 | %if c.allowed_to_update: |
|
|||
342 | % if not c.forbid_adding_reviewers: |
|
|||
343 | <div id="add_reviewer_input" class="reviewer_ac"> |
|
|||
344 | ${h.text('user', class_='ac-input', placeholder=_('Add reviewer or reviewer group'))} |
|
|||
345 | <div id="reviewers_container"></div> |
|
|||
346 | </div> |
|
|||
347 | % endif |
|
|||
348 | <div class="pull-right"> |
|
|||
349 | <button id="update_pull_request" class="btn btn-small no-margin">${_('Save Changes')}</button> |
|
|||
350 | </div> |
|
|||
351 | %endif |
|
|||
352 | </div> |
|
|||
353 | %endif |
|
|||
354 | </div> |
|
|||
355 |
|
284 | |||
356 | ## TODOs will be listed here |
|
|||
357 | <div class="reviewers-title block-right"> |
|
|||
358 | <div class="pr-details-title"> |
|
|||
359 | ## Only show unresolved, that is only what matters |
|
|||
360 | TODO Comments - ${len(c.unresolved_comments)} / ${(len(c.unresolved_comments) + len(c.resolved_comments))} |
|
|||
361 |
|
285 | |||
362 | % if not c.at_version: |
|
|||
363 | % if c.resolved_comments: |
|
|||
364 | <span class="block-right action_button last-item noselect" onclick="$('.unresolved-todo-text').toggle(); return versionController.toggleElement(this, '.unresolved-todo');" data-toggle-on="Show resolved" data-toggle-off="Hide resolved">Show resolved</span> |
|
|||
365 | % else: |
|
|||
366 | <span class="block-right last-item noselect">Show resolved</span> |
|
|||
367 | % endif |
|
|||
368 | % endif |
|
|||
369 | </div> |
|
|||
370 | </div> |
|
|||
371 | <div class="block-right pr-details-content reviewers"> |
|
|||
372 |
|
||||
373 | <table class="todo-table"> |
|
|||
374 | <% |
|
|||
375 | def sorter(entry): |
|
|||
376 | user_id = entry.author.user_id |
|
|||
377 | resolved = '1' if entry.resolved else '0' |
|
|||
378 | if user_id == c.rhodecode_user.user_id: |
|
|||
379 | # own comments first |
|
|||
380 | user_id = 0 |
|
|||
381 | return '{}_{}_{}'.format(resolved, user_id, str(entry.comment_id).zfill(100)) |
|
|||
382 | %> |
|
|||
383 |
|
||||
384 | % if c.at_version: |
|
|||
385 | <tr> |
|
|||
386 | <td class="unresolved-todo-text">${_('unresolved TODOs unavailable in this view')}.</td> |
|
|||
387 | </tr> |
|
|||
388 | % else: |
|
|||
389 | % for todo_comment in sorted(c.unresolved_comments + c.resolved_comments, key=sorter): |
|
|||
390 | <% resolved = todo_comment.resolved %> |
|
|||
391 | % if inline: |
|
|||
392 | <% outdated_at_ver = todo_comment.outdated_at_version(getattr(c, 'at_version_num', None)) %> |
|
|||
393 | % else: |
|
|||
394 | <% outdated_at_ver = todo_comment.older_than_version(getattr(c, 'at_version_num', None)) %> |
|
|||
395 | % endif |
|
|||
396 |
|
||||
397 | <tr ${('class="unresolved-todo" style="display: none"' if resolved else '') |n}> |
|
|||
398 |
|
||||
399 | <td class="td-todo-number"> |
|
|||
400 | % if resolved: |
|
|||
401 | <a class="permalink todo-resolved tooltip" title="${_('Resolved by comment #{}').format(todo_comment.resolved.comment_id)}" href="#comment-${todo_comment.comment_id}" onclick="return Rhodecode.comments.scrollToComment($('#comment-${todo_comment.comment_id}'), 0, ${h.json.dumps(outdated_at_ver)})"> |
|
|||
402 | <i class="icon-flag-filled"></i> ${todo_comment.comment_id}</a> |
|
|||
403 | % else: |
|
|||
404 | <a class="permalink" href="#comment-${todo_comment.comment_id}" onclick="return Rhodecode.comments.scrollToComment($('#comment-${todo_comment.comment_id}'), 0, ${h.json.dumps(outdated_at_ver)})"> |
|
|||
405 | <i class="icon-flag-filled"></i> ${todo_comment.comment_id}</a> |
|
|||
406 | % endif |
|
|||
407 | </td> |
|
|||
408 | <td class="td-todo-gravatar"> |
|
|||
409 | ${base.gravatar(todo_comment.author.email, 16, user=todo_comment.author, tooltip=True, extra_class=['no-margin'])} |
|
|||
410 | </td> |
|
|||
411 | <td class="todo-comment-text-wrapper"> |
|
|||
412 | <div class="todo-comment-text"> |
|
|||
413 | <code>${h.chop_at_smart(todo_comment.text, '\n', suffix_if_chopped='...')}</code> |
|
|||
414 | </div> |
|
|||
415 | </td> |
|
|||
416 |
|
||||
417 | </tr> |
|
|||
418 | % endfor |
|
|||
419 |
|
||||
420 | % if len(c.unresolved_comments) == 0: |
|
|||
421 | <tr> |
|
|||
422 | <td class="unresolved-todo-text">${_('No unresolved TODOs')}.</td> |
|
|||
423 | </tr> |
|
|||
424 | % endif |
|
|||
425 |
|
||||
426 | % endif |
|
|||
427 |
|
||||
428 | </table> |
|
|||
429 |
|
||||
430 | </div> |
|
|||
431 | </div> |
|
286 | </div> | |
432 |
|
287 | |||
433 |
|
|
288 | </div> | |
@@ -616,9 +471,11 b'' | |||||
616 | <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/> |
|
471 | <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/> | |
617 | % if c.at_version: |
|
472 | % if c.at_version: | |
618 | <% c.inline_cnt = len(c.inline_versions[c.at_version_num]['display']) %> |
|
473 | <% c.inline_cnt = len(c.inline_versions[c.at_version_num]['display']) %> | |
|
474 | <% c.inline_comments_flat = c.inline_versions[c.at_version_num]['display'] %> | |||
619 | <% c.comments = c.comment_versions[c.at_version_num]['display'] %> |
|
475 | <% c.comments = c.comment_versions[c.at_version_num]['display'] %> | |
620 | % else: |
|
476 | % else: | |
621 | <% c.inline_cnt = len(c.inline_versions[c.at_version_num]['until']) %> |
|
477 | <% c.inline_cnt = len(c.inline_versions[c.at_version_num]['until']) %> | |
|
478 | <% c.inline_comments_flat = c.inline_versions[c.at_version_num]['until'] %> | |||
622 | <% c.comments = c.comment_versions[c.at_version_num]['until'] %> |
|
479 | <% c.comments = c.comment_versions[c.at_version_num]['until'] %> | |
623 | % endif |
|
480 | % endif | |
624 |
|
481 | |||
@@ -916,6 +773,439 b'' | |||||
916 |
|
773 | |||
917 | </script> |
|
774 | </script> | |
918 |
|
775 | |||
|
776 | ||||
|
777 | ### NAVBOG RIGHT | |||
|
778 | <style> | |||
|
779 | ||||
|
780 | .right-sidebar { | |||
|
781 | position: fixed; | |||
|
782 | top: 0px; | |||
|
783 | bottom: 0; | |||
|
784 | right: 0; | |||
|
785 | ||||
|
786 | background: #fafafa; | |||
|
787 | z-index: 200; | |||
|
788 | } | |||
|
789 | ||||
|
790 | .right-sidebar { | |||
|
791 | border-left: 1px solid #dbdbdb; | |||
|
792 | } | |||
|
793 | ||||
|
794 | .right-sidebar.right-sidebar-expanded { | |||
|
795 | width: 320px; | |||
|
796 | overflow: scroll; | |||
|
797 | } | |||
|
798 | ||||
|
799 | .right-sidebar.right-sidebar-collapsed { | |||
|
800 | width: 62px; | |||
|
801 | padding: 0; | |||
|
802 | display: block; | |||
|
803 | overflow: hidden; | |||
|
804 | } | |||
|
805 | ||||
|
806 | .sidenav { | |||
|
807 | float: right; | |||
|
808 | will-change: min-height; | |||
|
809 | background: #fafafa; | |||
|
810 | width: 100%; | |||
|
811 | } | |||
|
812 | ||||
|
813 | .sidebar-toggle { | |||
|
814 | height: 30px; | |||
|
815 | text-align: center; | |||
|
816 | margin: 15px 0 0 0; | |||
|
817 | } | |||
|
818 | .sidebar-toggle a { | |||
|
819 | ||||
|
820 | } | |||
|
821 | ||||
|
822 | .sidebar-content { | |||
|
823 | margin-left: 5px; | |||
|
824 | margin-right: 5px; | |||
|
825 | } | |||
|
826 | ||||
|
827 | .sidebar-heading { | |||
|
828 | font-size: 1.2em; | |||
|
829 | font-weight: 700; | |||
|
830 | margin-top: 10px; | |||
|
831 | } | |||
|
832 | ||||
|
833 | .sidebar-element { | |||
|
834 | margin-top: 20px; | |||
|
835 | } | |||
|
836 | .right-sidebar-collapsed-state { | |||
|
837 | display: flex; | |||
|
838 | flex-direction: column; | |||
|
839 | justify-content: center; | |||
|
840 | align-items: center; | |||
|
841 | padding: 0 10px; | |||
|
842 | cursor: pointer; | |||
|
843 | font-size: 1.3em; | |||
|
844 | margin: 0 -10px; | |||
|
845 | } | |||
|
846 | ||||
|
847 | .right-sidebar-collapsed-state:hover { | |||
|
848 | background-color: #dbd9da; | |||
|
849 | } | |||
|
850 | ||||
|
851 | .navbar__inner { | |||
|
852 | height: 100%; | |||
|
853 | background: #fafafa; | |||
|
854 | position: relative; | |||
|
855 | } | |||
|
856 | ||||
|
857 | </style> | |||
|
858 | ||||
|
859 | ||||
|
860 | ||||
|
861 | <aside class="right-sidebar right-sidebar-expanded"> | |||
|
862 | <div class="sidenav"> | |||
|
863 | ## TOGGLE | |||
|
864 | <div class="sidebar-toggle" onclick="toggleSidebar(); return false"> | |||
|
865 | <a href="#toggleSidebar"> | |||
|
866 | ||||
|
867 | </a> | |||
|
868 | </div> | |||
|
869 | ||||
|
870 | ## CONTENT | |||
|
871 | <div class="sidebar-content"> | |||
|
872 | ||||
|
873 | ## RULES SUMMARY/RULES | |||
|
874 | <div class="sidebar-element clear-both"> | |||
|
875 | ||||
|
876 | <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${_('Reviewers')}"> | |||
|
877 | <i class="icon-circle review-status-${c.pull_request_review_status}"></i> | |||
|
878 | <br/>${len(c.pull_request_reviewers)} | |||
|
879 | </div> | |||
|
880 | ||||
|
881 | ## REVIEW RULES | |||
|
882 | <div id="review_rules" style="display: none" class=""> | |||
|
883 | <div class="pr-details-title"> | |||
|
884 | <span class="sidebar-heading"> | |||
|
885 | ${_('Reviewer rules')} | |||
|
886 | </span> | |||
|
887 | ||||
|
888 | </div> | |||
|
889 | <div class="pr-reviewer-rules"> | |||
|
890 | ## review rules will be appended here, by default reviewers logic | |||
|
891 | </div> | |||
|
892 | <input id="review_data" type="hidden" name="review_data" value=""> | |||
|
893 | </div> | |||
|
894 | ||||
|
895 | ## REVIEWERS | |||
|
896 | <div class="right-sidebar-expanded-state pr-details-title"> | |||
|
897 | <span class="sidebar-heading"> | |||
|
898 | <i class="icon-circle review-status-${c.pull_request_review_status}"></i> | |||
|
899 | ${_('Reviewers')} - ${len(c.pull_request_reviewers)} | |||
|
900 | </span> | |||
|
901 | %if c.allowed_to_update: | |||
|
902 | <span id="open_edit_reviewers" class="block-right action_button last-item">${_('Edit')}</span> | |||
|
903 | <span id="close_edit_reviewers" class="block-right action_button last-item" style="display: none;">${_('Close')}</span> | |||
|
904 | %endif | |||
|
905 | </div> | |||
|
906 | <div id="reviewers" class="right-sidebar-expanded-state pr-details-content reviewers"> | |||
|
907 | ||||
|
908 | ## members redering block | |||
|
909 | <input type="hidden" name="__start__" value="review_members:sequence"> | |||
|
910 | <ul id="review_members" class="group_members"> | |||
|
911 | ||||
|
912 | % for review_obj, member, reasons, mandatory, status in c.pull_request_reviewers: | |||
|
913 | <script> | |||
|
914 | var member = ${h.json.dumps(h.reviewer_as_json(member, reasons=reasons, mandatory=mandatory, user_group=review_obj.rule_user_group_data()))|n}; | |||
|
915 | var status = "${(status[0][1].status if status else 'not_reviewed')}"; | |||
|
916 | var status_lbl = "${h.commit_status_lbl(status[0][1].status if status else 'not_reviewed')}"; | |||
|
917 | var allowed_to_update = ${h.json.dumps(c.allowed_to_update)}; | |||
|
918 | ||||
|
919 | var entry = renderTemplate('reviewMemberEntry', { | |||
|
920 | 'member': member, | |||
|
921 | 'mandatory': member.mandatory, | |||
|
922 | 'reasons': member.reasons, | |||
|
923 | 'allowed_to_update': allowed_to_update, | |||
|
924 | 'review_status': status, | |||
|
925 | 'review_status_label': status_lbl, | |||
|
926 | 'user_group': member.user_group, | |||
|
927 | 'create': false | |||
|
928 | }); | |||
|
929 | $('#review_members').append(entry) | |||
|
930 | </script> | |||
|
931 | ||||
|
932 | % endfor | |||
|
933 | ||||
|
934 | </ul> | |||
|
935 | ||||
|
936 | <input type="hidden" name="__end__" value="review_members:sequence"> | |||
|
937 | ## end members redering block | |||
|
938 | ||||
|
939 | %if not c.pull_request.is_closed(): | |||
|
940 | <div id="add_reviewer" class="ac" style="display: none;"> | |||
|
941 | %if c.allowed_to_update: | |||
|
942 | % if not c.forbid_adding_reviewers: | |||
|
943 | <div id="add_reviewer_input" class="reviewer_ac"> | |||
|
944 | ${h.text('user', class_='ac-input', placeholder=_('Add reviewer or reviewer group'))} | |||
|
945 | <div id="reviewers_container"></div> | |||
|
946 | </div> | |||
|
947 | % endif | |||
|
948 | <div class="pull-right"> | |||
|
949 | <button id="update_pull_request" class="btn btn-small no-margin">${_('Save Changes')}</button> | |||
|
950 | </div> | |||
|
951 | %endif | |||
|
952 | </div> | |||
|
953 | %endif | |||
|
954 | </div> | |||
|
955 | </div> | |||
|
956 | ||||
|
957 | ## OBSERVERS | |||
|
958 | <div class="sidebar-element clear-both"> | |||
|
959 | <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${_('Observers')}"> | |||
|
960 | <i class="icon-eye"></i> | |||
|
961 | <br/> 0 | |||
|
962 | </div> | |||
|
963 | ||||
|
964 | <div class="right-sidebar-expanded-state pr-details-title"> | |||
|
965 | <span class="sidebar-heading"> | |||
|
966 | <i class="icon-eye"></i> | |||
|
967 | ${_('Observers')} | |||
|
968 | </span> | |||
|
969 | </div> | |||
|
970 | <div class="right-sidebar-expanded-state pr-details-content"> | |||
|
971 | No observers - 0 | |||
|
972 | </div> | |||
|
973 | </div> | |||
|
974 | ||||
|
975 | ## TODOs | |||
|
976 | <div class="sidebar-element clear-both"> | |||
|
977 | <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="TODOs"> | |||
|
978 | <i class="icon-flag-filled"></i> | |||
|
979 | <br/> ${len(c.unresolved_comments)} | |||
919 | </div> |
|
980 | </div> | |
920 |
|
981 | |||
|
982 | ## TODOs will be listed here | |||
|
983 | <div class="right-sidebar-expanded-state pr-details-title"> | |||
|
984 | ## Only show unresolved, that is only what matters | |||
|
985 | <span class="sidebar-heading"> | |||
|
986 | <i class="icon-flag-filled"></i> | |||
|
987 | TODOs - ${len(c.unresolved_comments)} | |||
|
988 | ##/ ${(len(c.unresolved_comments) + len(c.resolved_comments))} | |||
|
989 | </span> | |||
|
990 | ||||
|
991 | % if not c.at_version: | |||
|
992 | % if c.resolved_comments: | |||
|
993 | <span class="block-right action_button last-item noselect" onclick="$('.unresolved-todo-text').toggle(); return versionController.toggleElement(this, '.unresolved-todo');" data-toggle-on="Show resolved" data-toggle-off="Hide resolved">Show resolved</span> | |||
|
994 | % else: | |||
|
995 | <span class="block-right last-item noselect">Show resolved</span> | |||
|
996 | % endif | |||
|
997 | % endif | |||
|
998 | </div> | |||
|
999 | ||||
|
1000 | <div class="right-sidebar-expanded-state pr-details-content"> | |||
|
1001 | ||||
|
1002 | <table class="todo-table"> | |||
|
1003 | <% | |||
|
1004 | def sorter(entry): | |||
|
1005 | user_id = entry.author.user_id | |||
|
1006 | resolved = '1' if entry.resolved else '0' | |||
|
1007 | if user_id == c.rhodecode_user.user_id: | |||
|
1008 | # own comments first | |||
|
1009 | user_id = 0 | |||
|
1010 | return '{}_{}_{}'.format(resolved, user_id, str(entry.comment_id).zfill(100)) | |||
|
1011 | %> | |||
|
1012 | ||||
|
1013 | % if c.at_version: | |||
|
1014 | <tr> | |||
|
1015 | <td class="unresolved-todo-text">${_('unresolved TODOs unavailable in this view')}.</td> | |||
|
1016 | </tr> | |||
|
1017 | % else: | |||
|
1018 | % for todo_comment in sorted(c.unresolved_comments + c.resolved_comments, key=sorter): | |||
|
1019 | <% resolved = todo_comment.resolved %> | |||
|
1020 | % if inline: | |||
|
1021 | <% outdated_at_ver = todo_comment.outdated_at_version(getattr(c, 'at_version_num', None)) %> | |||
|
1022 | % else: | |||
|
1023 | <% outdated_at_ver = todo_comment.older_than_version(getattr(c, 'at_version_num', None)) %> | |||
|
1024 | % endif | |||
|
1025 | ||||
|
1026 | <tr ${('class="unresolved-todo" style="display: none"' if resolved else '') |n}> | |||
|
1027 | ||||
|
1028 | <td class="td-todo-number"> | |||
|
1029 | % if resolved: | |||
|
1030 | <a class="permalink todo-resolved tooltip" title="${_('Resolved by comment #{}').format(todo_comment.resolved.comment_id)}" href="#comment-${todo_comment.comment_id}" onclick="return Rhodecode.comments.scrollToComment($('#comment-${todo_comment.comment_id}'), 0, ${h.json.dumps(outdated_at_ver)})"> | |||
|
1031 | <i class="icon-flag-filled"></i> ${todo_comment.comment_id}</a> | |||
|
1032 | % else: | |||
|
1033 | <a class="permalink" href="#comment-${todo_comment.comment_id}" onclick="return Rhodecode.comments.scrollToComment($('#comment-${todo_comment.comment_id}'), 0, ${h.json.dumps(outdated_at_ver)})"> | |||
|
1034 | <i class="icon-flag-filled"></i> ${todo_comment.comment_id}</a> | |||
|
1035 | % endif | |||
|
1036 | </td> | |||
|
1037 | <td class="td-todo-gravatar"> | |||
|
1038 | ${base.gravatar(todo_comment.author.email, 16, user=todo_comment.author, tooltip=True, extra_class=['no-margin'])} | |||
|
1039 | </td> | |||
|
1040 | <td class="todo-comment-text-wrapper"> | |||
|
1041 | <div class="todo-comment-text"> | |||
|
1042 | <code>${h.chop_at_smart(todo_comment.text, '\n', suffix_if_chopped='...')}</code> | |||
|
1043 | </div> | |||
|
1044 | </td> | |||
|
1045 | ||||
|
1046 | </tr> | |||
|
1047 | % endfor | |||
|
1048 | ||||
|
1049 | % if len(c.unresolved_comments) == 0: | |||
|
1050 | <tr> | |||
|
1051 | <td class="unresolved-todo-text">${_('No unresolved TODOs')}.</td> | |||
|
1052 | </tr> | |||
|
1053 | % endif | |||
|
1054 | ||||
|
1055 | % endif | |||
|
1056 | ||||
|
1057 | </table> | |||
|
1058 | ||||
|
1059 | </div> | |||
|
1060 | </div> | |||
|
1061 | ||||
|
1062 | ## COMMENTS | |||
|
1063 | <div class="sidebar-element clear-both"> | |||
|
1064 | <div class="tooltip right-sidebar-collapsed-state" style="display: none" onclick="toggleSidebar(); return false" title="${_('Comments')}"> | |||
|
1065 | <i class="icon-comment" style="color: #949494"></i> | |||
|
1066 | <br/> ${len(c.inline_comments_flat+c.comments)} | |||
|
1067 | </div> | |||
|
1068 | ||||
|
1069 | <div class="right-sidebar-expanded-state pr-details-title"> | |||
|
1070 | <span class="sidebar-heading"> | |||
|
1071 | <i class="icon-comment" style="color: #949494"></i> | |||
|
1072 | ${_('Comments')} - ${len(c.inline_comments_flat+c.comments)} | |||
|
1073 | ##${_ungettext("{} General", "{} General", len(c.comments)).format(len(c.comments))} / | |||
|
1074 | ##${_ungettext("{} Inline", "{} Inline", c.inline_cnt).format(len(c.inline_comments_flat))} | |||
|
1075 | ||||
|
1076 | ## TODO check why this ins't working | |||
|
1077 | % if pull_request_menu: | |||
|
1078 | <% | |||
|
1079 | outdated_comm_count_ver = pull_request_menu['outdated_comm_count_ver'] | |||
|
1080 | %> | |||
|
1081 | ||||
|
1082 | % if outdated_comm_count_ver: | |||
|
1083 | <a href="#" onclick="showOutdated(); Rhodecode.comments.nextOutdatedComment(); return false;"> | |||
|
1084 | (${_("{} Outdated").format(outdated_comm_count_ver)}) | |||
|
1085 | </a> | |||
|
1086 | <a href="#" class="showOutdatedComments" onclick="showOutdated(this); return false;"> | ${_('show outdated')}</a> | |||
|
1087 | <a href="#" class="hideOutdatedComments" style="display: none" onclick="hideOutdated(this); return false;"> | ${_('hide outdated')}</a> | |||
|
1088 | % else: | |||
|
1089 | (${_("{} Outdated").format(outdated_comm_count_ver)}) | |||
|
1090 | % endif | |||
|
1091 | ||||
|
1092 | % endif | |||
|
1093 | </span> | |||
|
1094 | <span class="block-right action_button last-item noselect" onclick="return versionController.toggleElement(this, '.hidden-comment');" data-toggle-on="Show all" data-toggle-off="Hide all">Show all</span> | |||
|
1095 | </div> | |||
|
1096 | ||||
|
1097 | <div class="right-sidebar-expanded-state pr-details-content"> | |||
|
1098 | <table class="todo-table"> | |||
|
1099 | <% | |||
|
1100 | def sorter(entry): | |||
|
1101 | user_id = entry.author.user_id | |||
|
1102 | return '{}'.format(str(entry.comment_id).zfill(100)) | |||
|
1103 | %> | |||
|
1104 | ||||
|
1105 | % for comment_obj in reversed(sorted(c.inline_comments_flat + c.comments, key=sorter)): | |||
|
1106 | <% | |||
|
1107 | display = '' | |||
|
1108 | _cls = '' | |||
|
1109 | %> | |||
|
1110 | ## SKIP TODOs we display them above | |||
|
1111 | % if comment_obj.is_todo: | |||
|
1112 | <% display = 'none' %> | |||
|
1113 | % endif | |||
|
1114 | ||||
|
1115 | ## Skip outdated comments | |||
|
1116 | % if comment_obj.outdated: | |||
|
1117 | <% display = 'none' %> | |||
|
1118 | <% _cls = 'hidden-comment' %> | |||
|
1119 | % endif | |||
|
1120 | ||||
|
1121 | <tr class="${_cls}" style="display: ${display}"> | |||
|
1122 | <td class="td-todo-number"> | |||
|
1123 | <a class="permalink" href="#comment-${comment_obj.comment_id}" onclick="return Rhodecode.comments.scrollToComment($('#comment-${comment_obj.comment_id}'), 0, ${comment_obj.outdated_js})"> | |||
|
1124 | % if comment_obj.outdated: | |||
|
1125 | <i class="tooltip icon-comment-toggle" title="Outdated"></i> | |||
|
1126 | % elif comment_obj.is_inline: | |||
|
1127 | <i class="tooltip icon-code" title="Inline"></i> | |||
|
1128 | % else: | |||
|
1129 | <i class="tooltip icon-comment" title="General"></i> | |||
|
1130 | % endif | |||
|
1131 | ${comment_obj.comment_id} | |||
|
1132 | </a> | |||
|
1133 | </td> | |||
|
1134 | <td class="td-todo-gravatar"> | |||
|
1135 | ${base.gravatar(comment_obj.author.email, 16, user=comment_obj.author, tooltip=True, extra_class=['no-margin'])} | |||
|
1136 | </td> | |||
|
1137 | <td class="todo-comment-text-wrapper"> | |||
|
1138 | <div class="todo-comment-text"> | |||
|
1139 | <code>${h.chop_at_smart(comment_obj.text, '\n', suffix_if_chopped='...')}</code> | |||
|
1140 | </div> | |||
|
1141 | </td> | |||
|
1142 | </tr> | |||
|
1143 | % endfor | |||
|
1144 | ||||
|
1145 | </table> | |||
|
1146 | </div> | |||
|
1147 | ||||
|
1148 | </div> | |||
|
1149 | </div> | |||
|
1150 | ||||
|
1151 | </div> | |||
|
1152 | </aside> | |||
|
1153 | ||||
|
1154 | ||||
|
1155 | <script> | |||
|
1156 | var $sideBar = $('.right-sidebar'); | |||
|
1157 | var marginExpanded = {'margin': '0 320px 0 0'}; | |||
|
1158 | var marginCollapsed = {'margin': '0 50px 0 0'}; | |||
|
1159 | ||||
|
1160 | if($sideBar.hasClass('right-sidebar-expanded')) { | |||
|
1161 | $('.outerwrapper').css(marginExpanded); | |||
|
1162 | $('.sidebar-toggle a').html('<i class="icon-right" style="margin-right: -10px"></i><i class="icon-right"></i>'); | |||
|
1163 | $('.right-sidebar-collapsed-state').hide(); | |||
|
1164 | $('.right-sidebar-expanded-state').show(); | |||
|
1165 | updateSticky() | |||
|
1166 | ||||
|
1167 | } else { | |||
|
1168 | $('.outerwrapper').css(marginCollapsed); | |||
|
1169 | $('.sidebar-toggle a').html('<i class="icon-left" style="margin-right: -10px"></i><i class="icon-left"></i>'); | |||
|
1170 | $('.right-sidebar-collapsed-state').hide(); | |||
|
1171 | $('.right-sidebar-expanded-state').show(); | |||
|
1172 | updateSticky() | |||
|
1173 | } | |||
|
1174 | ||||
|
1175 | var toggleSidebar = function(){ | |||
|
1176 | var $sideBar = $('.right-sidebar'); | |||
|
1177 | ||||
|
1178 | if($sideBar.hasClass('right-sidebar-expanded')) { | |||
|
1179 | // collapse now | |||
|
1180 | $sideBar.removeClass('right-sidebar-expanded') | |||
|
1181 | $sideBar.addClass('right-sidebar-collapsed') | |||
|
1182 | $('.outerwrapper').css(marginCollapsed); | |||
|
1183 | $('.sidebar-toggle a').html('<i class="icon-left" style="margin-right: -10px"></i><i class="icon-left"></i>'); | |||
|
1184 | $('.right-sidebar-collapsed-state').show(); | |||
|
1185 | $('.right-sidebar-expanded-state').hide(); | |||
|
1186 | ||||
|
1187 | } else { | |||
|
1188 | // expand now | |||
|
1189 | $('.outerwrapper').css(marginExpanded); | |||
|
1190 | $sideBar.addClass('right-sidebar-expanded') | |||
|
1191 | $sideBar.removeClass('right-sidebar-collapsed') | |||
|
1192 | $('.sidebar-toggle a').html('<i class="icon-right" style="margin-right: -10px"></i><i class="icon-right"></i>'); | |||
|
1193 | $('.right-sidebar-collapsed-state').hide(); | |||
|
1194 | $('.right-sidebar-expanded-state').show(); | |||
|
1195 | } | |||
|
1196 | ||||
|
1197 | // update our other sticky header in same context | |||
|
1198 | updateSticky() | |||
|
1199 | } | |||
|
1200 | ||||
|
1201 | var sidebarElement = document.getElementById('pr-nav-sticky'); | |||
|
1202 | ||||
|
1203 | ## sidebar = new StickySidebar(sidebarElement, { | |||
|
1204 | ## containerSelector: '.main', | |||
|
1205 | ## minWidth: 62, | |||
|
1206 | ## innerWrapperSelector: '.navbar__inner', | |||
|
1207 | ## stickyClass: 'is-sticky', | |||
|
1208 | ## }); | |||
|
1209 | ||||
|
1210 | </script> | |||
921 | </%def> |
|
1211 | </%def> |
@@ -948,8 +948,8 b' def assert_inline_comments(pull_request,' | |||||
948 | if visible is not None: |
|
948 | if visible is not None: | |
949 | inline_comments = CommentsModel().get_inline_comments( |
|
949 | inline_comments = CommentsModel().get_inline_comments( | |
950 | pull_request.target_repo.repo_id, pull_request=pull_request) |
|
950 | pull_request.target_repo.repo_id, pull_request=pull_request) | |
951 |
inline_cnt = CommentsModel().get_inline_comments_ |
|
951 | inline_cnt = len(CommentsModel().get_inline_comments_as_list( | |
952 | inline_comments) |
|
952 | inline_comments)) | |
953 | assert inline_cnt == visible |
|
953 | assert inline_cnt == visible | |
954 | if outdated is not None: |
|
954 | if outdated is not None: | |
955 | outdated_comments = CommentsModel().get_outdated_comments( |
|
955 | outdated_comments = CommentsModel().get_outdated_comments( |
General Comments 0
You need to be logged in to leave comments.
Login now