diff --git a/package.json b/package.json index 1c15877c..95620903 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "moment": "^2.18.1", "mousetrap": "^1.6.1", "qrious": "^4.0.2", - "sticky-sidebar": "3.3.1", + "sticky-sidebar": "3.3.4", "waypoints": "4.0.1", "webpack": "4.23.1", "webpack-cli": "3.1.2", diff --git a/rhodecode/apps/repository/views/repo_commits.py b/rhodecode/apps/repository/views/repo_commits.py index c8d1bf7e..03b804db 100644 --- a/rhodecode/apps/repository/views/repo_commits.py +++ b/rhodecode/apps/repository/views/repo_commits.py @@ -128,6 +128,7 @@ class RepoCommitsView(RepoAppView): c.statuses = [] c.comments = [] c.unresolved_comments = [] + c.resolved_comments = [] if len(c.commit_ranges) == 1: commit = c.commit_ranges[0] c.comments = CommentsModel().get_comments( @@ -148,6 +149,8 @@ class RepoCommitsView(RepoAppView): c.unresolved_comments = CommentsModel()\ .get_commit_unresolved_todos(commit.raw_id) + c.resolved_comments = CommentsModel()\ + .get_commit_resolved_todos(commit.raw_id) diff = None # Iterate over ranges (default commit view is always one commit) diff --git a/rhodecode/model/comment.py b/rhodecode/model/comment.py index f682e224..cf909a6e 100644 --- a/rhodecode/model/comment.py +++ b/rhodecode/model/comment.py @@ -187,6 +187,23 @@ class CommentsModel(BaseModel): return todos + def get_commit_resolved_todos(self, commit_id, show_outdated=True): + + todos = Session().query(ChangesetComment) \ + .filter(ChangesetComment.revision == commit_id) \ + .filter(ChangesetComment.resolved_by != None) \ + .filter(ChangesetComment.comment_type + == ChangesetComment.COMMENT_TYPE_TODO) + + if not show_outdated: + todos = todos.filter( + coalesce(ChangesetComment.display_state, '') != + ChangesetComment.COMMENT_OUTDATED) + + todos = todos.all() + + return todos + def _log_audit_action(self, action, action_data, auth_user, comment): audit_logger.store( action=action, diff --git a/rhodecode/public/css/buttons.less b/rhodecode/public/css/buttons.less index 0c5a01eb..7cd76a81 100644 --- a/rhodecode/public/css/buttons.less +++ b/rhodecode/public/css/buttons.less @@ -71,6 +71,12 @@ input[type="button"] { margin: 0 0 0 0; } + &.btn-active { + color: @rcdarkblue; + background-color: @white; + .border ( @border-thickness, @rcdarkblue ); + } + } @@ -97,6 +103,11 @@ input[type="button"] { .border ( @border-thickness-buttons, @grey5 ); background-color: transparent; } + &.btn-active { + color: @rcdarkblue; + background-color: @white; + .border ( @border-thickness, @rcdarkblue ); + } } .btn-primary, @@ -214,8 +225,28 @@ input[type="button"] { display: inline-block; .btn { float: left; - margin: 0 0 0 -1px; + margin: 0 0 0 0; + // first item + &:first-of-type:not(:last-of-type) { + border-radius: @border-radius 0 0 @border-radius; + + } + // middle elements + &:not(:first-of-type):not(:last-of-type) { + border-radius: 0; + border-left-width: 0; + border-right-width: 0; + } + // last item + &:last-of-type:not(:first-of-type) { + border-radius: 0 @border-radius @border-radius 0; + } + + &:only-child { + border-radius: @border-radius; + } } + } .btn-link { diff --git a/rhodecode/public/css/code-block.less b/rhodecode/public/css/code-block.less index b6c099d5..53e4e4ec 100644 --- a/rhodecode/public/css/code-block.less +++ b/rhodecode/public/css/code-block.less @@ -682,13 +682,14 @@ input.filediff-collapse-state { display: none } .filediff-collapse-indicator { - width: 0; - height: 0; - border-style: solid; - border-width: 4.5px 0 4.5px 9.3px; - border-color: transparent transparent transparent #aaa; - margin: 6px 0px; + float: left; + cursor: pointer; + margin: 1px -5px; } + .filediff-collapse-indicator:before { + content: '\f105'; + } + .filediff-menu { display: none; } @@ -696,18 +697,20 @@ input.filediff-collapse-state { } &+ .filediff { /* file diff is expanded */ - .filediff-collapse-indicator { - width: 0; - height: 0; - border-style: solid; - border-width: 9.3px 4.5px 0 4.5px; - border-color: #aaa transparent transparent transparent; - margin: 6px 0px; + .filediff-collapse-indicator { + float: left; + cursor: pointer; + margin: 1px -5px; } + .filediff-collapse-indicator:before { + content: '\f107'; + } + .filediff-menu { display: block; } + margin: 10px 0; &:nth-child(2) { margin: 0; @@ -735,13 +738,14 @@ input.filediff-collapse-state { #diff-file-sticky{ will-change: min-height; + height: 80px; } .sidebar__inner{ transform: translate(0, 0); /* For browsers don't support translate3d. */ transform: translate3d(0, 0, 0); will-change: position, transform; - height: 70px; + height: 65px; z-index: 30; background-color: #fff; padding: 5px 0px; @@ -775,10 +779,17 @@ input.filediff-collapse-state { } .diffset-menu { - margin-bottom: 20px; + } + +#todo-box { + clear:both; + display: none; + text-align: right +} + .diffset { - margin: 20px auto; + margin: 0px auto; .diffset-heading { border: 1px solid @grey5; margin-bottom: -1px; @@ -826,6 +837,8 @@ input.filediff-collapse-state { margin-right: 3px; font-size: 12px; font-weight: normal; + min-width: 30px; + text-align: center; &:first-child { border-radius: @border-radius 0 0 @border-radius; @@ -877,18 +890,10 @@ input.filediff-collapse-state { } } - .filediff-collapse-indicator { - border-style: solid; - float: left; - margin: 4px 0px 0 0; - cursor: pointer; - } - .filediff-heading { - background: @grey7; cursor: pointer; display: block; - padding: 5px 10px; + padding: 10px 10px; } .filediff-heading:after { content: ""; @@ -900,9 +905,9 @@ input.filediff-collapse-state { } .filediff-menu { - float: right; text-align: right; padding: 5px 5px 5px 0px; + background: @grey7; &> a, &> span { @@ -958,8 +963,16 @@ input.filediff-collapse-state { } +.op-added { + color: @alert1; +} + +.op-deleted { + color: @alert2; +} .filediff, .filelist { + .pill { &[op="name"] { background: none; diff --git a/rhodecode/public/css/comments.less b/rhodecode/public/css/comments.less index 8e9a4fb9..d325675f 100644 --- a/rhodecode/public/css/comments.less +++ b/rhodecode/public/css/comments.less @@ -10,6 +10,14 @@ width: 100%; } +.comments-heading { + margin-bottom: -1px; + background: @grey6; + display: block; + padding: 10px 0px; + font-size: 18px +} + tr.inline-comments div { max-width: 100%; diff --git a/rhodecode/public/css/main.less b/rhodecode/public/css/main.less index 4018fe15..ac7e0eda 100644 --- a/rhodecode/public/css/main.less +++ b/rhodecode/public/css/main.less @@ -1107,6 +1107,52 @@ label { } } +.review-status { + &.under_review { + color: @alert3; + } + &.approved { + color: @alert1; + } + &.rejected, + &.forced_closed{ + color: @alert2; + } + &.not_reviewed { + color: @grey5; + } +} + +.review-status-under_review { + color: @alert3; +} +.status-tag-under_review { + border-color: @alert3; +} + +.review-status-approved { + color: @alert1; +} +.status-tag-approved { + border-color: @alert1; +} + +.review-status-rejected, +.review-status-forced_closed { + color: @alert2; +} +.status-tag-rejected, +.status-tag-forced_closed { + border-color: @alert2; +} + +.review-status-not_reviewed { + color: @grey5; +} +.status-tag-not_reviewed { + border-color: @grey5; +} + .flag_status_comment_box { margin: 5px 6px 0px 2px; } diff --git a/rhodecode/public/css/rcicons.less b/rhodecode/public/css/rcicons.less index 2d8a0fb8..772f6541 100644 --- a/rhodecode/public/css/rcicons.less +++ b/rhodecode/public/css/rcicons.less @@ -1,12 +1,12 @@ @font-face { font-family: 'rcicons'; - src: url('../fonts/RCIcons/rcicons.eot?92789106'); - src: url('../fonts/RCIcons/rcicons.eot?92789106#iefix') format('embedded-opentype'), - url('../fonts/RCIcons/rcicons.woff2?92789106') format('woff2'), - url('../fonts/RCIcons/rcicons.woff?92789106') format('woff'), - url('../fonts/RCIcons/rcicons.ttf?92789106') format('truetype'), - url('../fonts/RCIcons/rcicons.svg?92789106#rcicons') format('svg'); + src: url('../fonts/RCIcons/rcicons.eot?44705679'); + src: url('../fonts/RCIcons/rcicons.eot?44705679#iefix') format('embedded-opentype'), + url('../fonts/RCIcons/rcicons.woff2?44705679') format('woff2'), + url('../fonts/RCIcons/rcicons.woff?44705679') format('woff'), + url('../fonts/RCIcons/rcicons.ttf?44705679') format('truetype'), + url('../fonts/RCIcons/rcicons.svg?44705679#rcicons') format('svg'); font-weight: normal; font-style: normal; @@ -163,8 +163,6 @@ .icon-down:before { content: '\e80b'; } /* '' */ .icon-folder:before { content: '\e80c'; } /* '' */ .icon-folder-open:before { content: '\e80d'; } /* '' */ -.icon-folder-empty:before { content: '\f114'; } /* '' */ -.icon-folder-open-empty:before { content: '\f115'; } /* '' */ .icon-trash-empty:before { content: '\e80e'; } /* '' */ .icon-group:before { content: '\e80f'; } /* '' */ .icon-remove:before { content: '\e810'; } /* '' */ @@ -187,6 +185,7 @@ .icon-info-circled:before { content: '\e821'; } /* '' */ .icon-upload:before { content: '\e822'; } /* '' */ .icon-home:before { content: '\e823'; } /* '' */ +.icon-flag-filled:before { content: '\e824'; } /* '' */ .icon-git:before { content: '\e82a'; } /* '' */ .icon-hg:before { content: '\e82d'; } /* '' */ .icon-svn:before { content: '\e82e'; } /* '' */ @@ -195,11 +194,24 @@ .icon-rhodecode:before { content: '\e831'; } /* '' */ .icon-up:before { content: '\e832'; } /* '' */ .icon-merge:before { content: '\e833'; } /* '' */ +.icon-spin-alt:before { content: '\e834'; } /* '' */ +.icon-spin:before { content: '\e838'; } /* '' */ .icon-docs:before { content: '\f0c5'; } /* '' */ .icon-menu:before { content: '\f0c9'; } /* '' */ +.icon-sort:before { content: '\f0dc'; } /* '' */ .icon-paste:before { content: '\f0ea'; } /* '' */ .icon-doc-text:before { content: '\f0f6'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ +.icon-angle-left:before { content: '\f104'; } /* '' */ +.icon-angle-right:before { content: '\f105'; } /* '' */ +.icon-angle-up:before { content: '\f106'; } /* '' */ +.icon-angle-down:before { content: '\f107'; } /* '' */ +.icon-circle-empty:before { content: '\f10c'; } /* '' */ +.icon-circle:before { content: '\f111'; } /* '' */ +.icon-folder-empty:before { content: '\f114'; } /* '' */ +.icon-folder-open-empty:before { content: '\f115'; } /* '' */ +.icon-code:before { content: '\f121'; } /* '' */ +.icon-info:before { content: '\f129'; } /* '' */ .icon-minus-squared:before { content: '\f146'; } /* '' */ .icon-minus-squared-alt:before { content: '\f147'; } /* '' */ .icon-doc-inv:before { content: '\f15b'; } /* '' */ @@ -207,10 +219,9 @@ .icon-plus-squared-alt:before { content: '\f196'; } /* '' */ .icon-file-code:before { content: '\f1c9'; } /* '' */ .icon-history:before { content: '\f1da'; } /* '' */ +.icon-circle-thin:before { content: '\f1db'; } /* '' */ .icon-sliders:before { content: '\f1de'; } /* '' */ .icon-trash:before { content: '\f1f8'; } /* '' */ -.icon-spin-alt:before { content: '\e834'; } /* '' */ -.icon-spin:before { content: '\e838'; } /* '' */ // MERGED ICONS BASED ON CURRENT ONES @@ -233,10 +244,12 @@ .icon-false:before { &:extend(.icon-delete:before); } .icon-expand-linked:before { &:extend(.icon-down:before); } .icon-pr-merge-fail:before { &:extend(.icon-delete:before); } +.icon-wide-mode:before { &:extend(.icon-sort:before); } +.icon-flag-filled-red:before { &:extend(.icon-flag-filled:before); } // TRANSFORM - .icon-merge:before {transform: rotate(180deg);} +.icon-wide-mode:before {transform: rotate(90deg);} // -- END ICON CLASSES -- // @@ -254,6 +267,7 @@ .icon-false { color: @grey5 } .icon-expand-linked { cursor: pointer; color: @grey3; font-size: 14px } .icon-more-linked { cursor: pointer; color: @grey3 } +.icon-flag-filled-red { color: @color5 !important; } .repo-switcher-dropdown .select2-result-label { .icon-git:before { diff --git a/rhodecode/public/css/select2.less b/rhodecode/public/css/select2.less index 40b5dc48..88b8a42c 100644 --- a/rhodecode/public/css/select2.less +++ b/rhodecode/public/css/select2.less @@ -152,6 +152,8 @@ select.select2{height:28px;visibility:hidden} .drop-menu-no-width { .drop-menu-base; width: auto; + min-width: 0; + margin: 0; } .field-sm .drop-menu { diff --git a/rhodecode/public/css/summary.less b/rhodecode/public/css/summary.less index 77ad7274..54cb0df1 100644 --- a/rhodecode/public/css/summary.less +++ b/rhodecode/public/css/summary.less @@ -153,6 +153,7 @@ text-align: center; color: #949494; font-size: 11px; + line-height: 1.3em; &:hover { background: #f1f1f1; @@ -199,6 +200,10 @@ .fieldset { margin-bottom: 0; } + + .tags-main { + margin-bottom: 5px; + } } .fieldset { diff --git a/rhodecode/public/fonts/RCIcons/config.json b/rhodecode/public/fonts/RCIcons/config.json index dff70300..648ba7ee 100755 --- a/rhodecode/public/fonts/RCIcons/config.json +++ b/rhodecode/public/fonts/RCIcons/config.json @@ -563,6 +563,72 @@ "code": 61914, "src": "fontawesome" }, + { + "uid": "7034e4d22866af82bef811f52fb1ba46", + "css": "code", + "code": 61729, + "src": "fontawesome" + }, + { + "uid": "f3f90c8c89795da30f7444634476ea4f", + "css": "angle-left", + "code": 61700, + "src": "fontawesome" + }, + { + "uid": "7bf14281af5633a597f85b061ef1cfb9", + "css": "angle-right", + "code": 61701, + "src": "fontawesome" + }, + { + "uid": "5de9370846a26947e03f63142a3f1c07", + "css": "angle-up", + "code": 61702, + "src": "fontawesome" + }, + { + "uid": "e4dde1992f787163e2e2b534b8c8067d", + "css": "angle-down", + "code": 61703, + "src": "fontawesome" + }, + { + "uid": "4i0s2bklai5fywieqm4dqqngfz9ptfab", + "css": "flag-filled", + "code": 59428, + "src": "typicons" + }, + { + "uid": "3d4ea8a78dc34efe891f3a0f3d961274", + "css": "info", + "code": 61737, + "src": "fontawesome" + }, + { + "uid": "56a21935a5d4d79b2e91ec00f760b369", + "css": "sort", + "code": 61660, + "src": "fontawesome" + }, + { + "uid": "130380e481a7defc690dfb24123a1f0c", + "css": "circle", + "code": 61713, + "src": "fontawesome" + }, + { + "uid": "422e07e5afb80258a9c4ed1706498f8a", + "css": "circle-empty", + "code": 61708, + "src": "fontawesome" + }, + { + "uid": "5774d0a0e50f6eefc8be01bd761e5dd3", + "css": "circle-thin", + "code": 61915, + "src": "fontawesome" + }, { "uid": "c43db6645e7515889fc2193294f50767", "css": "plus", diff --git a/rhodecode/public/fonts/RCIcons/rcicons.eot b/rhodecode/public/fonts/RCIcons/rcicons.eot index 041a625c..a90776c9 100755 Binary files a/rhodecode/public/fonts/RCIcons/rcicons.eot and b/rhodecode/public/fonts/RCIcons/rcicons.eot differ diff --git a/rhodecode/public/fonts/RCIcons/rcicons.svg b/rhodecode/public/fonts/RCIcons/rcicons.svg index 798f0897..d227b617 100755 --- a/rhodecode/public/fonts/RCIcons/rcicons.svg +++ b/rhodecode/public/fonts/RCIcons/rcicons.svg @@ -78,6 +78,8 @@ + + @@ -102,16 +104,34 @@ + + + + + + + + + + + + + + + + + + @@ -126,6 +146,8 @@ + + diff --git a/rhodecode/public/fonts/RCIcons/rcicons.ttf b/rhodecode/public/fonts/RCIcons/rcicons.ttf index 567538e5..ff76b775 100755 Binary files a/rhodecode/public/fonts/RCIcons/rcicons.ttf and b/rhodecode/public/fonts/RCIcons/rcicons.ttf differ diff --git a/rhodecode/public/fonts/RCIcons/rcicons.woff b/rhodecode/public/fonts/RCIcons/rcicons.woff index ce1edfad..f2f74330 100755 Binary files a/rhodecode/public/fonts/RCIcons/rcicons.woff and b/rhodecode/public/fonts/RCIcons/rcicons.woff differ diff --git a/rhodecode/public/fonts/RCIcons/rcicons.woff2 b/rhodecode/public/fonts/RCIcons/rcicons.woff2 index 57e99161..593ab60a 100755 Binary files a/rhodecode/public/fonts/RCIcons/rcicons.woff2 and b/rhodecode/public/fonts/RCIcons/rcicons.woff2 differ diff --git a/rhodecode/templates/changeset/changeset.mako b/rhodecode/templates/changeset/changeset.mako index 9bcea9ee..3069dc40 100644 --- a/rhodecode/templates/changeset/changeset.mako +++ b/rhodecode/templates/changeset/changeset.mako @@ -1,10 +1,12 @@ ## -*- coding: utf-8 -*- <%inherit file="/base/base.mako"/> +<%namespace name="base" file="/base/base.mako"/> <%namespace name="diff_block" file="/changeset/diff_block.mako"/> +<%namespace name="file_base" file="/files/base.mako"/> <%def name="title()"> - ${_('%s Commit') % c.repo_name} - ${h.show_id(c.commit)} + ${_('{} Commit').format(c.repo_name)} - ${h.show_id(c.commit)} %if c.rhodecode_name: · ${h.branding(c.rhodecode_name)} %endif @@ -19,120 +21,111 @@ <%def name="main()"> - +
-
-
-
-
-

${_('Commit')}

-
- - ${h.show_id(c.commit)} - - - % if hasattr(c.commit, 'phase'): - ${c.commit.phase} - % endif +
- ## obsolete commits - % if hasattr(c.commit, 'obsolete'): - % if c.commit.obsolete: - ${_('obsolete')} +
+
+ +
+ ${base.gravatar(c.commit.author_email, 30)} +
+ +
+
+
${h.urlify_commit_message(h.chop_at_smart(c.commit.message, '\n', suffix_if_chopped='...'), c.repo_name)}
+
+ + + +
+
+ + + + + + + +
+ ${h.link_to_user(c.commit.author)} + - ${h.age_component(c.commit.date)} + + ## second cell for consistency with files +
+
+
+ +
+
+ +
+ +
+
+ ${h.show_id(c.commit)} + + ${file_base.refs(c.commit)} + + ## phase + % if hasattr(c.commit, 'phase') and getattr(c.commit, 'phase') != 'public': + + ${c.commit.phase} + % endif - % endif - ## hidden commits - % if hasattr(c.commit, 'hidden'): - % if c.commit.hidden: - ${_('hidden')} + ## obsolete commits + % if getattr(c.commit, 'obsolete', False): + + ${_('obsolete')} + % endif - % endif - -
- - ${_('parent')} - - | - - ${_('child')} - + ## hidden commits + % if getattr(c.commit, 'hidden', False): + + ${_('hidden')} + + % endif
-
-
+ %if c.statuses: +
+ +
${h.commit_status_lbl(c.statuses[0])}
+
+ %endif +
+
+
- -
+ - %if c.statuses: -
-
-

${_('Commit status')}:

-
-
-
-
-
[${h.commit_status_lbl(c.statuses[0])}]
-
-
-
- %endif - -
-
-

${_('References')}:

-
-
- %if c.commit.merge: - - ${_('merge')} - - %endif - - %if h.is_hg(c.rhodecode_repo): - %for book in c.commit.bookmarks: - - ${h.shorter(book)} - - %endfor - %endif - - %for tag in c.commit.tags: - - ${tag} - - %endfor - - %if c.commit.branch: - - ${h.shorter(c.commit.branch)} - - %endif -
-
-
-
- -
+ +
<%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/> ${cbdiffs.render_diffset_menu(c.changes[c.commit.raw_id])} @@ -212,6 +161,11 @@ c.changes[c.commit.raw_id], commit=c.commit, use_comments=True,inline_comments=c.inline_comments )}
+
+ + ${_('Comments')} ${len(c.comments)} +
+ ## template for inline comment form <%namespace name="comment" file="/changeset/changeset_file_comment.mako"/> @@ -350,6 +304,7 @@ // inject comments into their proper positions var file_comments = $('.inline-comment-placeholder'); + }) diff --git a/rhodecode/templates/changeset/changeset_range.mako b/rhodecode/templates/changeset/changeset_range.mako index 14c5b6ef..7c4bb4e6 100644 --- a/rhodecode/templates/changeset/changeset_range.mako +++ b/rhodecode/templates/changeset/changeset_range.mako @@ -23,6 +23,7 @@ <%def name="main()"> +
@@ -60,8 +61,7 @@
-
- <%namespace name="comment" file="/changeset/changeset_file_comment.mako"/> <%namespace name="diff_block" file="/changeset/diff_block.mako"/> - ${cbdiffs.render_diffset_menu()} + %for commit in c.commit_ranges: + ${cbdiffs.render_diffset_menu(c.changes[commit.raw_id])} ${cbdiffs.render_diffset( diffset=c.changes[commit.raw_id], collapse_when_files_over=5, diff --git a/rhodecode/templates/codeblocks/diffs.mako b/rhodecode/templates/codeblocks/diffs.mako index 09cb1990..601c2f64 100644 --- a/rhodecode/templates/codeblocks/diffs.mako +++ b/rhodecode/templates/codeblocks/diffs.mako @@ -50,6 +50,12 @@ return '%s_%s_%i' % (h.md5_safe(commit+filename), type, line) inline_comments=None, )"> + +<% + diffset_container_id = h.md5(diffset.target_ref) + collapse_all = len(diffset.files) > collapse_when_files_over +%> + %if use_comments:
${inline_comments_container([], inline_comments)} @@ -79,9 +85,6 @@ return '%s_%s_%i' % (h.md5_safe(commit+filename), type, line)
%endif -<% -collapse_all = len(diffset.files) > collapse_when_files_over -%> %if c.user_session_attrs["diffmode"] == 'sideside':