Class: Decidim::ActivityCell

Inherits:
ViewModel
  • Object
show all
Includes:
Cell::ViewModel::Partial
Defined in:
app/cells/decidim/activity_cell.rb

Overview

This cell is used to render public activities performed by users.

Each model that we want to represent should inherit from this cell and tweak the necessary methods (usually ‘title` is enough).

Constant Summary

Constants included from AmendmentsHelper

Decidim::AmendmentsHelper::TOTAL_STEPS

Instance Method Summary collapse

Methods inherited from ViewModel

#call, #current_user, #view_context

Methods included from IconHelper

#component_icon, #manifest_icon, #resource_icon, #resource_type_icon, #resource_type_icon_key, #text_with_resource_icon

Methods included from LayoutHelper

#_icon_classes, #apple_favicon, #application_path, #current_url, #current_user_unread_data, #extended_navigation_bar, #external_icon, #favicon, #icon, #legacy_favicon, #role

Methods included from TooltipHelper

#with_tooltip

Methods included from ModalHelper

#decidim_modal

Methods included from OrganizationHelper

#current_organization_name, #organization_colors, #organization_description_label, #organization_name

Methods included from TranslatableAttributes

#default_locale?

Methods included from ApplicationHelper

#add_body_classes, #cell, #edit_link, #extra_admin_link, #html_truncate, #present, #prevent_timeout_seconds, #resolve_presenter_class, #text_initials

Methods included from CacheHelper

#cache

Methods included from AmendmentsHelper

#accept_and_reject_buttons_for, #action_button_card_for, #allowed_to_accept_and_reject?, #allowed_to_promote?, #amend_button_for, #amendments_enabled?, #amendments_form_field_for, #amendments_form_fields_label, #amendments_form_fields_value, #can_participate_in_private_space?, #can_react_to_emendation?, #current_step, #emendation_actions_for, #emendation_announcement_for, #promote_button_for, #render_emendation_body, #total_steps, #wizard_aside_back_url, #wizard_header_title

Methods included from RichTextEditorHelper

included, #text_editor_for

Methods included from ContextualHelpHelper

#floating_help

Methods included from ScopesHelper

#has_visible_scopes?, #scope_name_for_picker, #scopes_picker_field, #scopes_picker_filter, #scopes_select_field, #scopes_select_tag

Methods included from DecidimFormHelper

#areas_for_select, #base_error_messages, #decidim_form_for, #decidim_form_slug_url, #editor_field_tag, #form_field_has_error?, #form_required_explanation, #name_with_locale, #ordered_scopes_descendants, #ordered_scopes_descendants_for_select, #scopes_picker_field_tag, #tab_element_class_for, #translated_field_tag

Methods included from OmniauthHelper

#normalize_provider_name, #oauth_icon, #provider_name

Methods included from SanitizeHelper

#decidim_escape_translated, #decidim_html_escape, #decidim_sanitize, #decidim_sanitize_admin, #decidim_sanitize_editor, #decidim_sanitize_editor_admin, #decidim_sanitize_newsletter, #decidim_sanitize_translated, #decidim_url_escape, included

Methods included from ReplaceButtonsHelper

#button_to, #submit_tag

Methods included from ActionAuthorizationHelper

#action_authorized_button_to, #action_authorized_link_to, #logged_button_to, #logged_link_to

Methods included from ResourceHelper

#linked_classes_filter_values_for, #linked_classes_for, #resource_locator

Instance Method Details

#cache_hashObject



102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/cells/decidim/activity_cell.rb', line 102

def cache_hash
  hash = []
  hash << id_prefix
  hash << I18n.locale.to_s
  hash << model.class.name.underscore
  hash << model.cache_key_with_version if model.respond_to?(:cache_key_with_version)
  if (author_cell = author)
    hash.push(Digest::MD5.hexdigest(author_cell.send(:cache_hash)))
  end

  hash.join(Decidim.cache_key_separator)
end

#created_atObject



79
80
81
# File 'app/cells/decidim/activity_cell.rb', line 79

def created_at
  t("decidim.activity.time_ago", time: time_ago_in_words(model.created_at))
end

#descriptionObject

The description to show at the card.

The card will also be displayed OK if there is no description.



55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'app/cells/decidim/activity_cell.rb', line 55

def description
  resource_description = resource.try(:resource_description) || resource.try(:description)
  return if resource_description.blank?

  resource_description = case resource_description
                         when String
                           resource_description
                         when Hash
                           translated_attribute(resource_description)
                         end

  truncate(strip_tags(resource_description), length: 300)
end

#element_idObject



94
95
96
# File 'app/cells/decidim/activity_cell.rb', line 94

def element_id
  "#{id_prefix}-#{model.id}"
end

#id_prefixObject



98
99
100
# File 'app/cells/decidim/activity_cell.rb', line 98

def id_prefix
  @id_prefix ||= context[:id_prefix].presence || "action"
end

#renderable?Boolean

Since activity logs could be linked to resource no longer available this method is added in order to skip rendering a cell if there is not enough data.

Returns:

  • (Boolean)


20
21
22
# File 'app/cells/decidim/activity_cell.rb', line 20

def renderable?
  resource.present? && participatory_space.present? && published?
end

#resourceObject

The resource linked to the activity.



25
26
27
28
29
# File 'app/cells/decidim/activity_cell.rb', line 25

def resource
  return if model.blank?

  model.resource_lazy
end

The link to the resource linked to the activity.



70
71
72
# File 'app/cells/decidim/activity_cell.rb', line 70

def resource_link_path
  resource_locator(resource).path
end

The text to show as the link to the resource.



75
76
77
# File 'app/cells/decidim/activity_cell.rb', line 75

def resource_link_text
  decidim_escape_translated(resource.title)
end

#showObject



11
12
13
14
15
# File 'app/cells/decidim/activity_cell.rb', line 11

def show
  return unless renderable?

  render
end

#titleObject

The title to show at the card.

The card will also be displayed OK if there is no title.



34
35
36
37
38
39
40
41
42
43
44
# File 'app/cells/decidim/activity_cell.rb', line 34

def title
  resource_title = resource.try(:resource_title) || resource.try(:title)
  return if resource_title.blank?

  case resource_title
  when String
    decidim_html_escape(resource_title)
  when Hash
    decidim_escape_translated(resource_title)
  end
end

#title_iconObject



46
47
48
49
50
# File 'app/cells/decidim/activity_cell.rb', line 46

def title_icon
  return if resource.blank?

  resource_type_icon(resource.class)
end

#userObject



83
84
85
86
87
88
89
90
# File 'app/cells/decidim/activity_cell.rb', line 83

def user
  return resource.normalized_author if resource.respond_to?(:normalized_author)
  return resource.author if resource.respond_to?(:author)
  # As Proposals have Coauthorable concern instead of Authorable
  return resource.identities.first if resource.respond_to?(:identities)

  model.user_lazy if resource.respond_to?(:user)
end