Module: DiscussionsHelper
- Included in:
- BreadcrumbsHelper
- Defined in:
- app/helpers/discussions_helper.rb
Instance Method Summary collapse
- #btn_type_for_discussion_statuses ⇒ Object
- #default_discussions_params ⇒ Object
- #discussion_delete_message_dropdown(discussion, message) ⇒ Object
- #discussion_delete_message_link(discussion, message) ⇒ Object
- #discussion_delete_message_option(discussion, message, motive, icon) ⇒ Object
- #discussion_dropdown_filter(label, filters, can_select_all = false, &block) ⇒ Object
- #discussion_filter_item(label, filter, link_class = nil, &block) ⇒ Object
- #discussion_filter_link(label, filter, clazz, &block) ⇒ Object
- #discussion_filter_list(label, filters, &block) ⇒ Object
- #discussion_filter_params_without_page ⇒ Object
- #discussion_filter_selected?(label, filter) ⇒ Boolean
- #discussion_filter_unselect_item(label, can_select_all) ⇒ Object
- #discussion_info(discussion) ⇒ Object
- #discussion_messages_count(discussion) ⇒ Object
- #discussion_status_counts(discussions) ⇒ Object
- #discussion_status_filter(status, discussions_count) ⇒ Object
- #discussion_status_filter_link(status, status_counts) ⇒ Object
- #discussion_status_filter_links(discussions) ⇒ Object
- #discussion_update_status_button(status) ⇒ Object
- #discussion_upvotes_icon(discussion) ⇒ Object
- #discussion_user_name(user) ⇒ Object
- #discussion_validated_messages_count(discussion) ⇒ Object
-
#discussions_languages(discussions) ⇒ Object
TODO: this one uses a long method chain in order to take advantage of eager load Delegate it once again when polymorphic association is removed.
- #discussions_link(item, path, html_options = nil) ⇒ Object
- #discussions_reset_query_link ⇒ Object
- #discussions_statuses ⇒ Object
- #forum_terms_link ⇒ Object
- #item_discussion_path(discussion, params = {}) ⇒ Object
- #item_discussions_path(item, params = {}) ⇒ Object
- #kids_read_discussions_link(item) ⇒ Object
- #linked_discussion_user_name(user) ⇒ Object
- #message_deleted_text(message) ⇒ Object
- #new_discussion_link(teaser_text, link_text) ⇒ Object
- #not_responsible_icon ⇒ Object
- #others_discussions_icon(text) ⇒ Object
- #read_discussions_link(item) ⇒ Object
- #responsible_icon ⇒ Object
- #responsible_moderator_text_for(discussion, user) ⇒ Object
- #should_show_approved_for?(user, message) ⇒ Boolean
- #solve_discussion_params_for(user) ⇒ Object
- #solve_discussions_link ⇒ Object
- #subscription_icon ⇒ Object
- #undo_upvote_icon ⇒ Object
- #unsubscription_icon ⇒ Object
- #upvote_icon ⇒ Object
- #user_avatar(user, image_class = '') ⇒ Object
- #user_discussions_icon(text) ⇒ Object
- #user_discussions_link ⇒ Object
Instance Method Details
#btn_type_for_discussion_statuses ⇒ Object
97 98 99 |
# File 'app/helpers/discussions_helper.rb', line 97 def btn_type_for_discussion_statuses { closed: 'danger', solved: 'success', opened: 'light' } end |
#default_discussions_params ⇒ Object
47 48 49 |
# File 'app/helpers/discussions_helper.rb', line 47 def default_discussions_params {status: :solved, sort: :created_at_desc, recent: true, limit: 15} end |
#discussion_delete_message_dropdown(discussion, message) ⇒ Object
261 262 263 264 265 266 267 268 269 270 271 272 273 |
# File 'app/helpers/discussions_helper.rb', line 261 def (discussion, ) <<~HTML.html_safe <span class="dropdown"> #{content_tag :span, fa_icon('trash-alt', type: :regular, class: 'fa-lg'), role: 'menu', 'data-bs-toggle': 'dropdown', class: 'discussion-delete-message', id: 'deleteDiscussionDropdown'} <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="deleteDiscussionDropdown"> #{ discussion, , :inappropriate_content, 'times-circle'} #{ discussion, , :shares_solution, :code} #{ discussion, , :discloses_personal_information, 'user-tag'} </ul> </span> HTML end |
#discussion_delete_message_link(discussion, message) ⇒ Object
256 257 258 259 |
# File 'app/helpers/discussions_helper.rb', line 256 def (discussion, ) link_to fa_icon('trash-alt', type: :regular, class: 'fa-lg'), (discussion, , motive: :self_deleted), method: :delete, data: { confirm: t(:are_you_sure, action: t(:destroy_message)) }, class: 'discussion-delete-message' end |
#discussion_delete_message_option(discussion, message, motive, icon) ⇒ Object
275 276 277 278 279 280 281 282 283 |
# File 'app/helpers/discussions_helper.rb', line 275 def (discussion, , motive, icon) <<~HTML.html_safe <li> #{link_to fa_icon(icon, text: t("deletion_motive.#{motive}.present"), class: 'fa-fw fixed-icon'), (discussion, , motive: motive), method: :delete, class: 'dropdown-item', role: 'menuitem', data: { confirm: t(:are_you_sure, action: t(:)) } } </li> HTML end |
#discussion_dropdown_filter(label, filters, can_select_all = false, &block) ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
# File 'app/helpers/discussions_helper.rb', line 161 def discussion_dropdown_filter(label, filters, can_select_all = false, &block) if filters.present? <<~HTML.html_safe <div class="dropdown discussions-toolbar-filter"> <a id="dropdown-#{label}" data-bs-toggle="dropdown" role="menu"> #{t label} #{fa_icon :'caret-down', class: 'fa-xs'} </a> <ul class="dropdown-menu" aria-labelledby="dropdown-#{label}"> #{discussion_filter_unselect_item(label, can_select_all)} #{discussion_filter_list(label, filters, &block)} </ul> </div> HTML end end |
#discussion_filter_item(label, filter, link_class = nil, &block) ⇒ Object
181 182 183 |
# File 'app/helpers/discussions_helper.rb', line 181 def discussion_filter_item(label, filter, link_class=nil, &block) content_tag(:li, discussion_filter_link(label, filter, link_class, &block), class: ('selected' if discussion_filter_selected?(label, filter))) end |
#discussion_filter_link(label, filter, clazz, &block) ⇒ Object
197 198 199 |
# File 'app/helpers/discussions_helper.rb', line 197 def discussion_filter_link(label, filter, clazz, &block) link_to capture(filter, &block), discussion_filter_params_without_page.merge(Hash[label, filter]), class: clazz end |
#discussion_filter_list(label, filters, &block) ⇒ Object
177 178 179 |
# File 'app/helpers/discussions_helper.rb', line 177 def discussion_filter_list(label, filters, &block) filters.map { |it| discussion_filter_item(label, it, 'dropdown-item', &block) }.join("\n") end |
#discussion_filter_params_without_page ⇒ Object
208 209 210 |
# File 'app/helpers/discussions_helper.rb', line 208 def discussion_filter_params_without_page discussion_filter_params.except(:page) end |
#discussion_filter_selected?(label, filter) ⇒ Boolean
193 194 195 |
# File 'app/helpers/discussions_helper.rb', line 193 def discussion_filter_selected?(label, filter) filter.to_s == discussion_filter_params[label] end |
#discussion_filter_unselect_item(label, can_select_all) ⇒ Object
185 186 187 188 189 190 191 |
# File 'app/helpers/discussions_helper.rb', line 185 def discussion_filter_unselect_item(label, can_select_all) if can_select_all content_tag(:li, link_to(t(:all), discussion_filter_params_without_page.except(label), class: 'dropdown-item'), class: ('selected' unless discussion_filter_params.include?(label))) end end |
#discussion_info(discussion) ⇒ Object
201 202 203 204 205 206 |
# File 'app/helpers/discussions_helper.rb', line 201 def discussion_info(discussion) <<~HTML.html_safe <span>#{friendly_time(discussion.created_at, :time_since)}</span> <span> ยท #{t(:reply_count, count: discussion..size)}</span> HTML end |
#discussion_messages_count(discussion) ⇒ Object
63 64 65 66 67 68 69 |
# File 'app/helpers/discussions_helper.rb', line 63 def (discussion) <<~HTML.html_safe <span class="discussion-messages-count"> #{fa_icon :comments, type: :regular, text: discussion.} </span> HTML end |
#discussion_status_counts(discussions) ⇒ Object
110 111 112 113 114 115 116 117 |
# File 'app/helpers/discussions_helper.rb', line 110 def discussion_status_counts(discussions) discussions.scoped_query_by(discussion_filter_params, excluded_params: [:status], excluded_methods: [:page]) .group(:status) .reorder('') .pluck(:status, 'count(*)') .to_h .transform_keys(&:to_sym) end |
#discussion_status_filter(status, discussions_count) ⇒ Object
152 153 154 155 156 157 158 159 |
# File 'app/helpers/discussions_helper.rb', line 152 def discussion_status_filter(status, discussions_count) <<~HTML.html_safe #{discussion_status_fa_icon(status)} <span> #{t("#{status}_count", count: discussions_count)} </span> HTML end |
#discussion_status_filter_link(status, status_counts) ⇒ Object
143 144 145 146 147 148 149 150 |
# File 'app/helpers/discussions_helper.rb', line 143 def discussion_status_filter_link(status, status_counts) discussions_count = status_counts[status.to_sym] || 0 if status.should_be_shown?(discussions_count, current_user) discussion_filter_item(:status, status) do discussion_status_filter(status, discussions_count) end end end |
#discussion_status_filter_links(discussions) ⇒ Object
135 136 137 138 139 140 141 |
# File 'app/helpers/discussions_helper.rb', line 135 def discussion_status_filter_links(discussions) status_counts = discussion_status_counts(discussions) discussions_statuses.map do |status| discussion_status_filter_link(status, status_counts) end.compact.join("\n").html_safe end |
#discussion_update_status_button(status) ⇒ Object
90 91 92 93 94 95 |
# File 'app/helpers/discussions_helper.rb', line 90 def (status) t("to_#{status}"), item_discussion_path(@discussion, {status: status}), class: "btn btn-#{btn_type_for_discussion_statuses[status.to_sym]}", method: :put end |
#discussion_upvotes_icon(discussion) ⇒ Object
79 80 81 82 83 84 85 86 87 88 |
# File 'app/helpers/discussions_helper.rb', line 79 def discussion_upvotes_icon(discussion) if discussion.upvotes_count > 0 <<~HTML.html_safe <span class="discussion-icon fa-stack fa-xs"> <i class="far fa-star fa-stack-2x"></i> <i class="fas fa-stack-1x">#{discussion.upvotes_count}</i> </span> HTML end end |
#discussion_user_name(user) ⇒ Object
216 217 218 |
# File 'app/helpers/discussions_helper.rb', line 216 def discussion_user_name(user) user.abbreviated_name end |
#discussion_validated_messages_count(discussion) ⇒ Object
71 72 73 74 75 76 77 |
# File 'app/helpers/discussions_helper.rb', line 71 def (discussion) <<~HTML.html_safe <span class="discussion-validated-messages-count"> #{fa_icon :comment, type: :regular}#{fa_icon :check, text: discussion.} </span> HTML end |
#discussions_languages(discussions) ⇒ Object
TODO: this one uses a long method chain in order to take advantage of eager load Delegate it once again when polymorphic association is removed
129 130 131 132 133 |
# File 'app/helpers/discussions_helper.rb', line 129 def discussions_languages(discussions) @languages ||= discussions.distinct .joins(:exercise) .pluck('languages.name') end |
#discussions_link(item, path, html_options = nil) ⇒ Object
26 27 28 29 |
# File 'app/helpers/discussions_helper.rb', line 26 def discussions_link(item, path, = nil) return unless current_user&.can_discuss_here? link_to item, path, end |
#discussions_reset_query_link ⇒ Object
119 120 121 |
# File 'app/helpers/discussions_helper.rb', line 119 def discussions_reset_query_link link_to fa_icon(:times, text: t(:reset_query)), {}, class: 'discussions-reset-query' unless discussion_filter_params.blank? end |
#discussions_statuses ⇒ Object
123 124 125 |
# File 'app/helpers/discussions_helper.rb', line 123 def discussions_statuses Mumuki::Domain::Status::Discussion::STATUSES end |
#forum_terms_link ⇒ Object
55 56 57 58 59 60 61 |
# File 'app/helpers/discussions_helper.rb', line 55 def forum_terms_link <<~HTML.html_safe <span> #{ t(:forum_terms_link, terms_link: link_to_forum_terms).html_safe } </span> HTML end |
#item_discussion_path(discussion, params = {}) ⇒ Object
31 32 33 |
# File 'app/helpers/discussions_helper.rb', line 31 def item_discussion_path(discussion, params = {}) polymorphic_path([discussion.item, discussion], params) end |
#item_discussions_path(item, params = {}) ⇒ Object
35 36 37 |
# File 'app/helpers/discussions_helper.rb', line 35 def item_discussions_path(item, params = {}) polymorphic_path([item, :discussions], params) end |
#kids_read_discussions_link(item) ⇒ Object
6 7 8 |
# File 'app/helpers/discussions_helper.rb', line 6 def kids_read_discussions_link(item) discussions_link fixed_fa_icon('question-circle'), item_discussions_path(item, default_discussions_params), title: t(:solve_your_doubts), class: 'mu-kids-discussion-link' end |
#linked_discussion_user_name(user) ⇒ Object
220 221 222 |
# File 'app/helpers/discussions_helper.rb', line 220 def linked_discussion_user_name(user) content_tag :a, discussion_user_name(user) end |
#message_deleted_text(message) ⇒ Object
285 286 287 |
# File 'app/helpers/discussions_helper.rb', line 285 def () t(:message_deleted, motive: t("deletion_motive.#{.deletion_motive}.past").downcase, forum_terms: link_to_forum_terms).html_safe end |
#new_discussion_link(teaser_text, link_text) ⇒ Object
101 102 103 104 105 106 107 108 |
# File 'app/helpers/discussions_helper.rb', line 101 def new_discussion_link(, link_text) <<~HTML.html_safe <h4> <span>#{t()}</span> #{link_to t(link_text), new_exercise_discussion_path(@debatable, anchor: 'new-discussion-description-container') } </h4> HTML end |
#not_responsible_icon ⇒ Object
236 237 238 |
# File 'app/helpers/discussions_helper.rb', line 236 def not_responsible_icon fa_icon 'hand-rock', type: :regular, text: t('moderator_take_care.i_wont') end |
#others_discussions_icon(text) ⇒ Object
18 19 20 |
# File 'app/helpers/discussions_helper.rb', line 18 def others_discussions_icon(text) fixed_fa_icon 'comments', text: text end |
#read_discussions_link(item) ⇒ Object
2 3 4 |
# File 'app/helpers/discussions_helper.rb', line 2 def read_discussions_link(item) discussions_link others_discussions_icon(t(:solve_your_doubts)), item_discussions_path(item, default_discussions_params), class: 'dropdown-item' end |
#responsible_icon ⇒ Object
232 233 234 |
# File 'app/helpers/discussions_helper.rb', line 232 def responsible_icon fa_icon 'hand-paper', text: t('moderator_take_care.i_will') end |
#responsible_moderator_text_for(discussion, user) ⇒ Object
224 225 226 227 228 229 230 |
# File 'app/helpers/discussions_helper.rb', line 224 def responsible_moderator_text_for(discussion, user) if discussion.responsible?(user) t('moderator_take_care.you_are') else t('moderator_take_care.moderator_is', moderator: discussion_user_name(discussion.responsible_moderator_by)) end end |
#should_show_approved_for?(user, message) ⇒ Boolean
212 213 214 |
# File 'app/helpers/discussions_helper.rb', line 212 def should_show_approved_for?(user, ) !user&.moderator_here? && .approved? && !.from_moderator? end |
#solve_discussion_params_for(user) ⇒ Object
39 40 41 42 43 44 45 |
# File 'app/helpers/discussions_helper.rb', line 39 def solve_discussion_params_for(user) if user&.moderator_here? {status: :pending_review, sort: :responses_count_asc, requires_attention: true} else {status: :opened, sort: :responses_count_desc} end end |
#solve_discussions_link ⇒ Object
10 11 12 |
# File 'app/helpers/discussions_helper.rb', line 10 def solve_discussions_link discussions_link others_discussions_icon(t(:solve_doubts)), discussions_path(solve_discussion_params_for(current_user)), class: 'dropdown-item' if current_access_mode.resolve_discussions_here? end |
#subscription_icon ⇒ Object
240 241 242 |
# File 'app/helpers/discussions_helper.rb', line 240 def subscription_icon fa_icon :bell, text: t(:subscribe) end |
#undo_upvote_icon ⇒ Object
252 253 254 |
# File 'app/helpers/discussions_helper.rb', line 252 def undo_upvote_icon fa_icon 'thumbs-up', type: :regular, text: t(:undo_upvote) end |
#unsubscription_icon ⇒ Object
244 245 246 |
# File 'app/helpers/discussions_helper.rb', line 244 def unsubscription_icon fa_icon :bell, type: :regular, text: t(:unsubscribe) end |
#upvote_icon ⇒ Object
248 249 250 |
# File 'app/helpers/discussions_helper.rb', line 248 def upvote_icon fa_icon 'thumbs-up', text: t(:upvote) end |
#user_avatar(user, image_class = '') ⇒ Object
51 52 53 |
# File 'app/helpers/discussions_helper.rb', line 51 def user_avatar(user, image_class='') profile_picture_for(user, class: image_class) end |
#user_discussions_icon(text) ⇒ Object
22 23 24 |
# File 'app/helpers/discussions_helper.rb', line 22 def user_discussions_icon(text) fixed_fa_icon 'comment', text: text end |
#user_discussions_link ⇒ Object
14 15 16 |
# File 'app/helpers/discussions_helper.rb', line 14 def user_discussions_link discussions_link(user_discussions_icon(t(:my_doubts)), discussions_user_path, class: 'dropdown-item') if current_user.watched_discussions.present? end |