Class: Decidim::Component

Inherits:
ApplicationRecord show all
Includes:
HasSettings, HasTaxonomySettings, Loggable, Publicable, ScopableComponent, ShareableWithToken, SoftDeletable, Traceable, TranslatableAttributes
Defined in:
app/models/decidim/component.rb

Overview

A Component represents a self-contained group of functionalities usually defined via a ComponentManifest. It is meant to be able to provide a single component that spans over several steps.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from TranslatableAttributes

#attachment?, #default_locale?

Methods included from Publicable

#previously_published?, #publish!, #published?, #unpublish!

Methods included from HasSettings

#current_settings, #default_step_settings, #default_step_settings=, #settings, #settings=, #step_settings, #step_settings=

Class Method Details

.log_presenter_class_for(_log) ⇒ Object



27
28
29
# File 'app/models/decidim/component.rb', line 27

def self.log_presenter_class_for(_log)
  Decidim::AdminLog::ComponentPresenter
end

Instance Method Details

#can_participate_in_space?(user) ⇒ Boolean Also known as: can_participate?

Returns:

  • (Boolean)


103
104
105
106
107
108
109
110
111
# File 'app/models/decidim/component.rb', line 103

def can_participate_in_space?(user)
  return false unless published?
  return false unless participatory_space.published?

  return true unless participatory_space.respond_to?(:restricted?) && participatory_space.restricted?
  return false unless user

  participatory_space.can_participate?(user)
end

#form_classObject

Public: The Form Class for this component.

Returns a ComponentForm.



75
76
77
# File 'app/models/decidim/component.rb', line 75

def form_class
  manifest.component_form_class
end

#hierarchy_titleObject



92
93
94
95
96
97
98
# File 'app/models/decidim/component.rb', line 92

def hierarchy_title
  [
    I18n.t("decidim.admin.menu.#{participatory_space.class.name.demodulize.underscore.pluralize}"),
    translated_attribute(participatory_space.title),
    translated_attribute(name)
  ].join(" / ")
end

#manifestObject

Public: Finds the manifest this component is associated to.

Returns a ComponentManifest.



39
40
41
# File 'app/models/decidim/component.rb', line 39

def manifest
  Decidim.find_component_manifest(manifest_name)
end

#manifest=(manifest) ⇒ Object

Public: Assigns a manifest to this component.

manifest - The ComponentManifest for this Component.

Returns nothing.



48
49
50
# File 'app/models/decidim/component.rb', line 48

def manifest=(manifest)
  self.manifest_name = manifest.name
end

#mounted_admin_engineObject

Public: The name of the admin engine the component is mounted to.



58
59
60
# File 'app/models/decidim/component.rb', line 58

def mounted_admin_engine
  "decidim_admin_#{participatory_space_name}_#{manifest_name}"
end

#mounted_engineObject

Public: The name of the engine the component is mounted to.



53
54
55
# File 'app/models/decidim/component.rb', line 53

def mounted_engine
  "decidim_#{participatory_space_name}_#{manifest_name}"
end

#mounted_paramsObject

Public: The hash of contextual params when the component is mounted.



63
64
65
66
67
68
69
70
# File 'app/models/decidim/component.rb', line 63

def mounted_params
  {
    :host => organization.host,
    :component_id => id,
    :locale => I18n.locale,
    :"#{participatory_space.underscored_name}_slug" => participatory_space.slug
  }
end

#primary_statObject

Public: Returns the value of the registered primary stat.



80
81
82
83
84
85
# File 'app/models/decidim/component.rb', line 80

def primary_stat
  @primary_stat ||= begin
    data = manifest.stats.filter(primary: true).with_context([self]).map { |name, value| [name, value] }.first&.first&.[](:data)
    data.respond_to?(:first) ? data.first : data
  end
end

#resource_descriptionObject

Public: Returns an empty description



101
# File 'app/models/decidim/component.rb', line 101

def resource_description; end

#resource_titleObject

Public: Returns the component’s name as resource title



88
89
90
# File 'app/models/decidim/component.rb', line 88

def resource_title
  name
end

#restricted_space?Boolean

Returns:

  • (Boolean)


114
115
116
117
118
# File 'app/models/decidim/component.rb', line 114

def restricted_space?
  return false unless participatory_space.respond_to?(:restricted?)

  participatory_space.restricted?
end

#shareable_url(share_token) ⇒ Object

Public: Public URL for component with given share token as query parameter



121
122
123
# File 'app/models/decidim/component.rb', line 121

def shareable_url(share_token)
  EngineRouter.main_proxy(self).root_url(self, share_token: share_token.token)
end

#siblingsObject

Other components with the same manifest and same participatory space as this one.



32
33
34
# File 'app/models/decidim/component.rb', line 32

def siblings
  @siblings ||= participatory_space.components.where.not(id:).where(manifest_name:)
end