module CommentsHelper def value_for_comment_form(commentable, comment) commentable.is_a?(Tag) ? comment : [commentable, comment] end def title_for_comment_page(commentable) if commentable.commentable_name.blank? title = "" elsif commentable.is_a?(Tag) title = link_to_tag(commentable) else title = link_to(commentable.commentable_name, commentable) end (ts('Reading Comments on ') + title).html_safe end def link_to_comment_ultimate_parent(comment) ultimate = comment.ultimate_parent case ultimate.class.to_s when 'Work' then link_to ultimate.title, ultimate when 'Pseud' then link_to ultimate.name, ultimate when 'AdminPost' then link_to ultimate.title, ultimate else if ultimate.is_a?(Tag) link_to_tag(ultimate) else link_to 'Something Interesting', ultimate end end end def comment_link_with_commentable_name(comment) ultimate_parent = comment.ultimate_parent commentable_name = ultimate_parent&.commentable_name text = case ultimate_parent.class.to_s when "Work" t("comments_helper.comment_link_with_commentable_name.on_work_html", title: commentable_name) when "AdminPost" t("comments_helper.comment_link_with_commentable_name.on_admin_post_html", title: commentable_name) else if ultimate_parent.is_a?(Tag) t("comments_helper.comment_link_with_commentable_name.on_tag_html", name: commentable_name) else t("comments_helper.comment_link_with_commentable_name.on_unknown") end end link_to(text, comment_path(comment)) end # return pseudname or name for comment def get_commenter_pseud_or_name(comment) if comment.pseud_id if comment.pseud.nil? ts("Account Deleted") elsif comment.pseud.user.official (link_to comment.pseud.byline, [comment.pseud.user, comment.pseud]) + content_tag(:span, " " + ts("(Official)"), class: "role") else link_to comment.pseud.byline, [comment.pseud.user, comment.pseud] end else content_tag(:span, comment.name) + content_tag(:span, " #{ts('(Guest)')}", class: "role") end end def chapter_description_link(comment) link_to t("comments_helper.chapter_link_html", position: comment.parent.position), work_chapter_path(comment.parent.work, comment.parent) end def image_safety_mode_cache_key(comment) "image-safety-mode" if comment.use_image_safety_mode? end #### ## Mar 4 2009 Enigel: the below shouldn't happen anymore, please test #### ## Note: there is a small but interesting bug here. If you first use javascript to open ## up the comments, the various url_for(:overwrite_params) arguments used below as the ## non-javascript fallbacks will end up with the wrong code, and so if you then turn ## off Javascript and try to use the links, you will get weirdo results. I think this ## is a bug we can live with for the moment; someone consistently browsing without ## javascript shouldn't have problems. ## -- Naomi, 9/2/2008 #### #### Helpers for _commentable.html.erb #### # return link to show or hide comments def show_hide_comments_link(commentable, options={}) options[:link_type] ||= "show" options[:show_count] ||= false commentable_id = commentable.is_a?(Tag) ? :tag_id : "#{commentable.class.to_s.underscore}_id".to_sym commentable_value = commentable.is_a?(Tag) ? commentable.name : commentable.id comment_count = commentable.count_visible_comments.to_s link_action = options[:link_type] == "hide" || params[:show_comments] ? :hide_comments : :show_comments link_text = ts("%{words} %{count}", words: options[:link_type] == "hide" || params[:show_comments] ? "Hide Comments" : "Comments", count: options[:show_count] ? "(" +comment_count+ ")" : "") link_to( link_text, url_for(controller: :comments, action: link_action, commentable_id => commentable_value, view_full_work: params[:view_full_work]), remote: true) end #### HELPERS FOR CHECKING WHICH BUTTONS/FORMS TO DISPLAY ##### def can_reply_to_comment?(comment) admin_settings = AdminSetting.current return false if comment.unreviewed? return false if comment.iced? return false if comment.hidden_by_admin? return false if parent_disallows_comments?(comment) return false if comment_parent_hidden?(comment) return false if blocked_by_comment?(comment) return false if blocked_by?(comment.ultimate_parent) return false if logged_in_as_admin? return true unless guest? !(admin_settings.guest_comments_off? || comment.guest_replies_disallowed?) end def can_edit_comment?(comment) is_author_of?(comment) && !comment.iced? && comment.count_all_comments.zero? && !comment_parent_hidden?(comment) && !blocked_by_comment?(comment.commentable) && !blocked_by?(comment.ultimate_parent) end # Only an admin with proper authorization can mark a spam comment ham. def can_mark_comment_ham?(comment) return unless comment.pseud.nil? && !comment.approved? policy(comment).can_mark_comment_spam? end # An admin with proper authorization or a creator of the comment's ultimate # parent (i.e. the work) can mark an approved comment as spam. def can_mark_comment_spam?(comment) return unless comment.pseud.nil? && comment.approved? policy(comment).can_mark_comment_spam? || is_author_of?(comment.ultimate_parent) end # Comments can be deleted by admins with proper authorization, their creator # (if the creator is a registered user), or the creator of the comment's # ultimate parent. def can_destroy_comment?(comment) policy(comment).can_destroy_comment? || is_author_of?(comment) || is_author_of?(comment.ultimate_parent) end # Comments on works can be frozen by admins with proper authorization or the # work creator. # Comments on tags can be frozen by admins with proper authorization. # Comments on admin posts can be frozen by any admin. def can_freeze_comment?(comment) policy(comment).can_freeze_comment? || comment.ultimate_parent.is_a?(Work) && is_author_of?(comment.ultimate_parent) end def can_hide_comment?(comment) policy(comment).can_hide_comment? end def can_see_hidden_comment?(comment) !comment.hidden_by_admin? || is_author_of?(comment) || can_hide_comment?(comment) end def comment_parent_hidden?(comment) parent = comment.ultimate_parent (parent.respond_to?(:hidden_by_admin) && parent.hidden_by_admin) || (parent.respond_to?(:in_unrevealed_collection) && parent.in_unrevealed_collection) end def parent_disallows_comments?(comment) parent = comment.ultimate_parent return false unless parent.is_a?(Work) || parent.is_a?(AdminPost) parent.disable_all_comments? || parent.disable_anon_comments? && !logged_in? end def can_review_comment?(comment) return false unless comment.unreviewed? is_author_of?(comment.ultimate_parent) || policy(comment).can_review_comment? end def can_review_all_comments?(commentable) commentable.is_a?(AdminPost) || is_author_of?(commentable) end #### HELPERS FOR REPLYING TO COMMENTS ##### # return link to add new reply to a comment def add_comment_reply_link(comment) commentable_id = comment.ultimate_parent.is_a?(Tag) ? :tag_id : comment.parent.class.name.foreign_key.to_sym # :chapter_id, :admin_post_id etc. commentable_value = comment.ultimate_parent.is_a?(Tag) ? comment.ultimate_parent.name : comment.parent.id link_to( ts("Reply"), url_for(controller: :comments, action: :add_comment_reply, id: comment.id, comment_id: params[:comment_id], commentable_id => commentable_value, view_full_work: params[:view_full_work], page: params[:page]), remote: true) end # return link to cancel new reply to a comment def cancel_comment_reply_link(comment) commentable_id = comment.ultimate_parent.is_a?(Tag) ? :tag_id : comment.parent.class.name.foreign_key.to_sym commentable_value = comment.ultimate_parent.is_a?(Tag) ? comment.ultimate_parent.name : comment.parent.id link_to( ts("Cancel"), url_for( controller: :comments, action: :cancel_comment_reply, id: comment.id, comment_id: params[:comment_id], commentable_id => commentable_value, view_full_work: params[:view_full_work], page: params[:page] ), remote: true ) end # canceling an edit def cancel_edit_comment_link(comment) link_to(ts("Cancel"), url_for(controller: :comments, action: :cancel_comment_edit, id: comment.id, comment_id: params[:comment_id]), remote: true) end # return html link to edit comment def edit_comment_link(comment) link_to(ts("Edit"), url_for(controller: :comments, action: :edit, id: comment, comment_id: params[:comment_id]), remote: true) end def do_cancel_delete_comment_link(comment) if params[:delete_comment_id] && params[:delete_comment_id] == comment.id.to_s cancel_delete_comment_link(comment) else delete_comment_link(comment) end end def freeze_comment_button(comment) if comment.iced? button_to ts("Unfreeze Thread"), unfreeze_comment_path(comment), method: :put else button_to ts("Freeze Thread"), freeze_comment_path(comment), method: :put end end def hide_comment_button(comment) if comment.hidden_by_admin? button_to ts("Make Comment Visible"), unhide_comment_path(comment), method: :put else button_to ts("Hide Comment"), hide_comment_path(comment), method: :put end end # Not a link or button, but included with them. def frozen_comment_indicator content_tag(:span, ts("Frozen"), class: "frozen current") end # return html link to delete comments def delete_comment_link(comment) link_to( ts("Delete"), url_for(controller: :comments, action: :delete_comment, id: comment, comment_id: params[:comment_id]), remote: true) end # return link to cancel new reply to a comment def cancel_delete_comment_link(comment) link_to( ts("Cancel"), url_for(controller: :comments, action: :cancel_comment_delete, id: comment, comment_id: params[:comment_id]), remote: true) end # return html link to mark/unmark comment as spam def tag_comment_as_spam_link(comment) if comment.approved link_to(ts("Spam"), reject_comment_path(comment), method: :put, data: { confirm: "Are you sure you want to mark this as spam?" }) else link_to(ts("Not Spam"), approve_comment_path(comment), method: :put) end end # gets the css user- class name for the comment def commenter_id_for_css_classes(comment) return if comment.pseud.nil? return if comment.by_anonymous_creator? return if comment.is_deleted return if comment.hidden_by_admin "user-#{comment.pseud.user_id}" end def css_classes_for_comment(comment) return if comment.nil? unavailable = "unavailable" if comment.hidden_by_admin unreviewed = "unreviewed" if comment.unreviewed? commenter = commenter_id_for_css_classes(comment) official = "official" if commenter && comment&.pseud&.user&.official guest = "guest" unless comment.pseud_id "#{unavailable} #{official} #{guest} #{unreviewed} comment group #{commenter}".squish end # find the parent of the commentable def find_parent(commentable) if commentable.respond_to?(:ultimate_parent) commentable.ultimate_parent elsif commentable.respond_to?(:work) commentable.work else commentable end end # if parent commentable is a work, determine if current user created it def current_user_is_work_creator(commentable) if logged_in? parent = find_parent(commentable) parent.is_a?(Work) && current_user.is_author_of?(parent) end end # if parent commentable is an anonymous work, determine if current user created it def current_user_is_anonymous_creator(commentable) if logged_in? parent = find_parent(commentable) parent.is_a?(Work) && parent.anonymous? && current_user.is_author_of?(parent) end end # determine if the parent has its comments set to moderated def comments_are_moderated(commentable) parent = find_parent(commentable) parent.respond_to?(:moderated_commenting_enabled) && parent.moderated_commenting_enabled? end def focused_on_comment(commentable) params[:add_comment_reply_id] && params[:add_comment_reply_id] == commentable.id.to_s end end