Module: DiscussionsHelper

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

Instance Method Summary collapse

Instance Method Details

#default_discussions_paramsObject



47
48
49
# File 'app/helpers/discussions_helper.rb', line 47

def default_discussions_params
  {status: :solved, sort: :upvotes_count_desc}
end

#discussion_count_for_status(status, discussions) ⇒ Object



103
104
105
# File 'app/helpers/discussions_helper.rb', line 103

def discussion_count_for_status(status, discussions)
  discussions.scoped_query_by(discussion_filter_params, excluded_params: [:status], excluded_methods: [:page]).by_status(status).count
end

#discussion_dropdown_filter(label, filters, can_select_all = false, &block) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'app/helpers/discussions_helper.rb', line 139

def discussion_dropdown_filter(label, filters, can_select_all = false, &block)
  if filters.present?
    %Q{
      <div class="dropdown discussions-toolbar-filter">
        <a id="dropdown-#{label}" data-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_safe
  end
end

#discussion_filter_item(label, filter, &block) ⇒ Object



159
160
161
# File 'app/helpers/discussions_helper.rb', line 159

def discussion_filter_item(label, filter, &block)
  (:li, discussion_filter_link(label, filter, &block), class: ('selected' if discussion_filter_selected?(label, filter)))
end


175
176
177
# File 'app/helpers/discussions_helper.rb', line 175

def discussion_filter_link(label, filter, &block)
  link_to capture(filter, &block), discussion_filter_params_without_page.merge(Hash[label, filter])
end

#discussion_filter_list(label, filters, &block) ⇒ Object



155
156
157
# File 'app/helpers/discussions_helper.rb', line 155

def discussion_filter_list(label, filters, &block)
  filters.map { |it| discussion_filter_item(label, it, &block) }.join("\n")
end

#discussion_filter_params_without_pageObject



183
184
185
# File 'app/helpers/discussions_helper.rb', line 183

def discussion_filter_params_without_page
  discussion_filter_params.except(:page)
end

#discussion_filter_selected?(label, filter) ⇒ Boolean

Returns:

  • (Boolean)


171
172
173
# File 'app/helpers/discussions_helper.rb', line 171

def discussion_filter_selected?(label, filter)
  filter.to_s == discussion_filter_params[label]
end

#discussion_filter_unselect_item(label, can_select_all) ⇒ Object



163
164
165
166
167
168
169
# File 'app/helpers/discussions_helper.rb', line 163

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: ('selected' unless discussion_filter_params.include?(label)))
  end
end

#discussion_info(discussion) ⇒ Object



179
180
181
# File 'app/helpers/discussions_helper.rb', line 179

def discussion_info(discussion)
  "#{t(:time_since, time: time_ago_in_words(discussion.created_at))} ยท #{t(:message_count, count: discussion.messages.size)}"
end

#discussion_messages_icon(discussion) ⇒ Object



67
68
69
70
71
72
73
74
# File 'app/helpers/discussions_helper.rb', line 67

def discussion_messages_icon(discussion)
  %Q{
    <span class="discussion-icon fa-stack fa-xs">
      <i class="fa fa-comment-o fa-stack-2x"></i>
      <i class="fa fa-stack-1x">#{discussion.validated_messages_count}</i>
    </span>
  }.html_safe
end

#discussion_status_filter(status, discussions_count) ⇒ Object



130
131
132
133
134
135
136
137
# File 'app/helpers/discussions_helper.rb', line 130

def discussion_status_filter(status, discussions_count)
  %Q{
  #{discussion_status_fa_icon(status)}
    <span>
      #{t("#{status}_count", count: discussions_count)}
    </span>
  }.html_safe
end


121
122
123
124
125
126
127
128
# File 'app/helpers/discussions_helper.rb', line 121

def discussion_status_filter_link(status, discussions)
  discussions_count = discussion_count_for_status(status, discussions)
  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_update_status_button(status) ⇒ Object



87
88
89
90
91
92
# File 'app/helpers/discussions_helper.rb', line 87

def discussion_update_status_button(status)
  button_to t("to_#{status}"),
            item_discussion_path(@discussion, {status: status}),
            class: "btn btn-discussion-#{status}",
            method: :put
end

#discussion_upvotes_icon(discussion) ⇒ Object



76
77
78
79
80
81
82
83
84
85
# File 'app/helpers/discussions_helper.rb', line 76

def discussion_upvotes_icon(discussion)
  if discussion.upvotes_count > 0
    %Q{
      <span class="discussion-icon fa-stack fa-xs">
        <i class="fa fa-star-o fa-stack-2x"></i>
        <i class="fa fa-stack-1x">#{discussion.upvotes_count}</i>
      </span>
    }.html_safe
  end
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



117
118
119
# File 'app/helpers/discussions_helper.rb', line 117

def discussions_languages(discussions)
  @languages ||= discussions.map { |it| it.exercise.language.name }.uniq
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


55
56
57
58
59
60
61
62
63
64
65
# File 'app/helpers/discussions_helper.rb', line 55

def discussions_link_with_teaser(item)
  %Q{
    <div>
      <h3>#{t(:discussions)}</h3>
      <p>
        #{t(:solve_your_doubts_teaser)}
        #{read_discussions_link(item)}
      </p>
    </div>
  }.html_safe
end


107
108
109
# File 'app/helpers/discussions_helper.rb', line 107

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



111
112
113
# File 'app/helpers/discussions_helper.rb', line 111

def discussions_statuses
  Mumuki::Domain::Status::Discussion::STATUSES
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


94
95
96
97
98
99
100
101
# File 'app/helpers/discussions_helper.rb', line 94

def new_discussion_link(teaser_text, link_text)
  %Q{
    <h4>
      <span>#{t(teaser_text)}</span>
      #{link_to t(link_text), new_exercise_discussion_path(@debatable, anchor: 'new-discussion-description-container') }
    </h4>
  }.html_safe
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)
end

#should_show_approved_for?(user, message) ⇒ Boolean

Returns:

  • (Boolean)


187
188
189
# File 'app/helpers/discussions_helper.rb', line 187

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_moderator_response: 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))
end

#user_avatar(user, image_class = '') ⇒ Object



51
52
53
# File 'app/helpers/discussions_helper.rb', line 51

def user_avatar(user, image_class = '')
  image_tag user.profile_picture, height: 40, class: "img-circle #{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)), user_path(anchor: 'discussions') if current_user.watched_discussions.present?
end