Module: DiscussionsHelper

Included in:
BreadcrumbsHelper
Defined in:
app/helpers/discussions_helper.rb

Instance Method Summary collapse

Instance Method Details

#btn_type_for_discussion_statusesObject



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_paramsObject



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_delete_message_dropdown(discussion, message)
  <<~HTML.html_safe
    <span class="dropdown">
      #{ :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_delete_message_option discussion, message, :inappropriate_content, 'times-circle'}
        #{discussion_delete_message_option discussion, message, :shares_solution, :code}
        #{discussion_delete_message_option discussion, message, :discloses_personal_information, 'user-tag'}
      </ul>
    </span>
  HTML
end


256
257
258
259
# File 'app/helpers/discussions_helper.rb', line 256

def discussion_delete_message_link(discussion, message)
  link_to fa_icon('trash-alt', type: :regular, class: 'fa-lg'), discussion_message_path(discussion, message, 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_delete_message_option(discussion, message, motive, icon)
  <<~HTML.html_safe
    <li>
      #{link_to fa_icon(icon, text: t("deletion_motive.#{motive}.present"), class: 'fa-fw fixed-icon'),
                discussion_message_path(discussion, message, motive: motive), method: :delete, class: 'dropdown-item',
                role: 'menuitem', data: { confirm: t(:are_you_sure, action: t(:destroy_message)) } }
    </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)
  (:li, discussion_filter_link(label, filter, link_class, &block), class: ('selected' if discussion_filter_selected?(label, filter)))
end


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_pageObject



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

Returns:

  • (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
    (: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.visible_messages.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_messages_count(discussion)
  <<~HTML.html_safe
    <span class="discussion-messages-count">
      #{fa_icon :comments, type: :regular, text: discussion.messages_count}
    </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


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


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 discussion_update_status_button(status)
  button_to 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_validated_messages_count(discussion)
  <<~HTML.html_safe
    <span class="discussion-validated-messages-count">
      #{fa_icon :comment, type: :regular}#{fa_icon :check, text: discussion.validated_messages_count}
    </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


26
27
28
29
# File 'app/helpers/discussions_helper.rb', line 26

def discussions_link(item, path, html_options = nil)
  return unless current_user&.can_discuss_here?
  link_to item, path, html_options
end


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_statusesObject



123
124
125
# File 'app/helpers/discussions_helper.rb', line 123

def discussions_statuses
  Mumuki::Domain::Status::Discussion::STATUSES
end


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


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)
   :a, discussion_user_name(user)
end

#message_deleted_text(message) ⇒ Object



285
286
287
# File 'app/helpers/discussions_helper.rb', line 285

def message_deleted_text(message)
  t(:message_deleted, motive: t("deletion_motive.#{message.deletion_motive}.past").downcase, forum_terms: link_to_forum_terms).html_safe
end


101
102
103
104
105
106
107
108
# File 'app/helpers/discussions_helper.rb', line 101

def new_discussion_link(teaser_text, link_text)
  <<~HTML.html_safe
    <h4>
      <span>#{t(teaser_text)}</span>
      #{link_to t(link_text), new_exercise_discussion_path(@debatable, anchor: 'new-discussion-description-container') }
    </h4>
  HTML
end

#not_responsible_iconObject



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


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_iconObject



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

Returns:

  • (Boolean)


212
213
214
# File 'app/helpers/discussions_helper.rb', line 212

def should_show_approved_for?(user, message)
  !user&.moderator_here? && message.approved? && !message.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


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_iconObject



240
241
242
# File 'app/helpers/discussions_helper.rb', line 240

def subscription_icon
  fa_icon :bell, text: t(:subscribe)
end

#undo_upvote_iconObject



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_iconObject



244
245
246
# File 'app/helpers/discussions_helper.rb', line 244

def unsubscription_icon
  fa_icon :bell, type: :regular, text: t(:unsubscribe)
end

#upvote_iconObject



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


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