app/cells/decidim/comments/comment_cell.rb in decidim-comments-0.23.6 vs app/cells/decidim/comments/comment_cell.rb in decidim-comments-0.24.0.rc1

- old
+ new

@@ -1,22 +1,156 @@ # frozen_string_literal: true module Decidim module Comments - # This cell renders the comment card for an instance of a Comment - # the default size is the Medium Card (:m) + # A cell to display a single comment. class CommentCell < Decidim::ViewModel - include CommentCellsHelper - include Cell::ViewModel::Partial + include ActionView::Helpers::DateHelper + include Decidim::IconHelper + include Decidim::ResourceHelper - def show - cell card_size, model, options + delegate :current_user, :user_signed_in?, to: :controller + + property :root_commentable + property :created_at + property :alignment + property :translated_body + property :comment_threads + property :accepts_new_comments? + + def alignment_badge + return unless [-1, 1].include?(alignment) + + render :alignment_badge end + def votes + return unless root_commentable.comments_have_votes? + + render :votes + end + private - def card_size - "decidim/comments/comment_m" + def decidim_comments + Decidim::Comments::Engine.routes.url_helpers + end + + def comment_body + Decidim::ContentProcessor.render(translated_body) + end + + def replies + SortedComments.for(model, order_by: order) + end + + def order + options[:order] || "older" + end + + def reply_id + "comment#{model.id}-reply" + end + + def can_reply? + user_signed_in? && accepts_new_comments? && + root_commentable.user_allowed_to_comment?(current_user) + end + + def author_presenter + if model.author.respond_to?(:official?) && model.author.official? + Decidim::Core::OfficialAuthorPresenter.new + elsif model.user_group + model.user_group.presenter + else + model.author.presenter + end + end + + def comment_classes + classes = ["comment"] + if nested? + classes << "comment--nested" + classes << "comment--nested--alt" if nested_level_even? + end + classes.join(" ") + end + + def alignment_badge_classes + classes = %w(label alignment) + case alignment + when 1 + classes << "success" + when -1 + classes << "alert" + end + classes.join(" ") + end + + def alignment_badge_label + if alignment == 1 + I18n.t("decidim.components.comment.alignment.in_favor") + else + I18n.t("decidim.components.comment.alignment.against") + end + end + + def votes_up_classes + classes = ["comment__votes--up"] + classes << "is-vote-selected" if voted_up? + classes << "is-vote-notselected" if voted_down? + classes.join(" ") + end + + def votes_down_classes + classes = ["comment__votes--down"] + classes << "is-vote-selected" if voted_down? + classes << "is-vote-notselected" if voted_up? + classes.join(" ") + end + + def commentable_path(params = {}) + if root_commentable.is_a?(Decidim::Budgets::Project) + resource_locator([root_commentable.budget, root_commentable]).path(params) + else + resource_locator(root_commentable).path(params) + end + end + + def up_votes_count + model.up_votes.count + end + + def down_votes_count + model.down_votes.count + end + + def root_depth + options[:root_depth] || 0 + end + + def depth + model.depth - root_depth + end + + def voted_up? + model.up_voted_by?(current_user) + end + + def voted_down? + model.down_voted_by?(current_user) + end + + def nested? + depth.positive? + end + + def nested_level_even? + depth.even? + end + + def has_replies? + model.comment_threads.any? end end end end