diff --git a/app/assets/javascripts/sitewide/assets.js b/app/assets/javascripts/sitewide/assets.js index 8c4e37425..a69b84ff9 100644 --- a/app/assets/javascripts/sitewide/assets.js +++ b/app/assets/javascripts/sitewide/assets.js @@ -56,12 +56,12 @@ $(document).on('click', '.asset .delete-asset', function(e) { $(document).on('turbolinks:before-visit', (e) => { if ($('.uploading-attachment-container:not(.error)').length) { if (confirm(I18n.t('protocols.steps.attachments.new.leaving_warning'))) { - return false; + return true; } e.preventDefault(); return false; } - return false; + return true; }); var InlineAttachments = (function() { diff --git a/app/assets/javascripts/sitewide/comments_sidebar.js b/app/assets/javascripts/sitewide/comments_sidebar.js index 29ecd3ab1..48ab74ab1 100644 --- a/app/assets/javascripts/sitewide/comments_sidebar.js +++ b/app/assets/javascripts/sitewide/comments_sidebar.js @@ -3,6 +3,7 @@ var CommentsSidebar = (function() { const SIDEBAR = '.comments-sidebar'; var commentsCounter; + var closeCallback; function loadCommentsList() { var commentsUrl = $(SIDEBAR).data('comments-url'); @@ -12,7 +13,9 @@ var CommentsSidebar = (function() { }, function(result) { $(SIDEBAR).removeClass('loading'); $(SIDEBAR).find('.comments-subject-title').text(result.object_name); + $(SIDEBAR).find('.comments-subject-url').html(result.object_url); $(SIDEBAR).find('.comments-list').html(result.comments); + if (result.comment_addable) { $(SIDEBAR).find('.comment-input-container').removeClass('hidden'); } else { @@ -30,15 +33,25 @@ var CommentsSidebar = (function() { } function initOpenButton() { - $(document).on('click', '.open-comments-sidebar', function() { + $(document).on('click', '.open-comments-sidebar', function(e) { commentsCounter = $(`#comment-count-${$(this).data('objectId')}`); + closeCallback = $(this).data('closeCallback'); CommentsSidebar.open($(this).data('objectType'), $(this).data('objectId')); + e.preventDefault(); }); } function initCloseButton() { $(document).on('click', `${SIDEBAR} .close-btn`, function() { CommentsSidebar.close(); + if (closeCallback) closeCallback(); + }); + } + + function initScrollButton() { + $(document).on('click', `${SIDEBAR} .scroll-page-with-anchor`, function(e) { + e.preventDefault(); + $($(this).attr('href'))[0].scrollIntoView(); }); } @@ -133,6 +146,7 @@ var CommentsSidebar = (function() { initDeleteButton(); initEditButton(); initCancelButton(); + initScrollButton(); }, open: function(objectType, objectId) { $(SIDEBAR).find('.comments-subject-title').empty(); diff --git a/app/assets/stylesheets/shared/comments_sidebar.scss b/app/assets/stylesheets/shared/comments_sidebar.scss index 287510325..00ac07bce 100644 --- a/app/assets/stylesheets/shared/comments_sidebar.scss +++ b/app/assets/stylesheets/shared/comments_sidebar.scss @@ -30,6 +30,7 @@ display: flex; flex-basis: 5em; flex-shrink: 0; + flex-wrap: wrap; padding: 1em; .comments-subject-title { @@ -42,6 +43,10 @@ white-space: nowrap; } + .comments-subject-url { + flex-basis: 100%; + } + .close-btn { flex-shrink: 0; } @@ -130,12 +135,13 @@ } .comment-container { - margin: 0 1em 2em 0; + margin: 0 1em .25em 0; .comment-header { align-items: center; display: flex; margin-bottom: .5em; + margin-top: 2em; min-height: 1.75em; .user-name { @@ -195,7 +201,7 @@ } &.current-user { - margin: 0 0 2em 1em; + margin: 0 0 .25em 1em; .comment-body { background: $color-alto; diff --git a/app/assets/stylesheets/steps/step.scss b/app/assets/stylesheets/steps/step.scss index 2b9998c27..31d0a72c8 100644 --- a/app/assets/stylesheets/steps/step.scss +++ b/app/assets/stylesheets/steps/step.scss @@ -4,6 +4,7 @@ @import "components/*"; .step-container { + border: $border-transparent; margin: 20px 0; padding: 8px 24px; @@ -86,6 +87,30 @@ } } } + + .comments-counter { + @include font-small; + align-items: center; + background-color: $color-concrete; + border: 2px solid $color-white; + border-radius: 8px; + display: flex; + height: 16px; + justify-content: center; + margin: 2px; + min-width: 16px; + position: absolute; + right: 0; + top: 0; + + &.unseen { + background-color: $brand-complementary; + } + } + + &.showing-comments { + border: 1px dotted $brand-primary; + } } .step-element-header { diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 4ca62d384..5451e6b74 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -14,9 +14,18 @@ class CommentsController < ApplicationController def index comments = @commentable.comments.order(created_at: :asc) + object_url = nil + case @commentable + when Step + object_name = "#{@commentable.position + 1} #{@commentable.name}" + object_url = link_to(t('comments.step_url'), "#stepContainer#{@commentable.id}", class: 'scroll-page-with-anchor') + else + object_name = @commentable.name + end render json: { - object_name: @commentable.name, + object_name: object_name, + object_url: object_url, comment_addable: comment_addable?(@commentable), comments: render_to_string(partial: 'shared/comments/comments_list.html.erb', locals: { comments: comments }) diff --git a/app/helpers/comment_helper.rb b/app/helpers/comment_helper.rb index 4c2247995..346747dae 100644 --- a/app/helpers/comment_helper.rb +++ b/app/helpers/comment_helper.rb @@ -47,7 +47,8 @@ module CommentHelper html: render_to_string( partial: "/shared/comments/#{partial}.html.erb", locals: { - comment: comment + comment: comment, + skip_header: false } ) } @@ -108,7 +109,8 @@ module CommentHelper html: render_to_string( partial: "/shared/comments/#{partial}.html.erb", locals: { - comment: comment + comment: comment, + skip_header: false } ) } diff --git a/app/javascript/vue/protocol/step.vue b/app/javascript/vue/protocol/step.vue index f4b3de94d..dc90a05f2 100644 --- a/app/javascript/vue/protocol/step.vue +++ b/app/javascript/vue/protocol/step.vue @@ -1,5 +1,8 @@