Class: Alchemy::Element
- Inherits:
-
BaseRecord
- Object
- ActiveRecord::Base
- BaseRecord
- Alchemy::Element
- Includes:
- Definitions, ElementIngredients, Presenters, Logger, Taggable
- Defined in:
- app/models/alchemy/element.rb,
app/models/alchemy/element/presenters.rb,
app/models/alchemy/element/definitions.rb,
app/models/alchemy/element/element_ingredients.rb
Defined Under Namespace
Modules: Definitions, ElementIngredients, Presenters
Constant Summary collapse
- NAME_REGEXP =
/\A[a-z0-9_-]+\z/
- FORBIDDEN_DEFINITION_ATTRIBUTES =
[ "amount", "autogenerate", "compact", "deprecated", "hint", "icon", "ingredients", "message", "nestable_elements", "taggable", "warning" ].freeze
Constants included from SearchableResource
SearchableResource::SEARCHABLE_COLUMN_TYPES
Instance Attribute Summary collapse
-
#autogenerate_nested_elements ⇒ Object
Returns the value of attribute autogenerate_nested_elements.
Class Method Summary collapse
- .all_from_clipboard(clipboard) ⇒ Object
-
.all_from_clipboard_for_page(clipboard, page) ⇒ Object
All elements in clipboard that could be placed on page.
-
.all_from_clipboard_for_parent_element(clipboard, parent_element) ⇒ Object
All elements in clipboard that could be placed as a child of ‘parent_element`.
-
.copy(source_element, differences = {}) ⇒ Object
This methods does a copy of source and all its ingredients.
-
.new(attributes = {}) ⇒ Object
Builds a new element as described in
/config/alchemy/elements.yml
.
Instance Method Summary collapse
-
#compact? ⇒ Boolean
Defined as compact element?.
-
#deprecated? ⇒ Boolean
Defined as deprecated element?.
-
#expanded? ⇒ Boolean
The opposite of folded?.
-
#nestable_elements ⇒ Object
A collection of element names that can be nested inside this element.
-
#next(name = nil) ⇒ Object
Returns next public element from same page.
-
#parent_element_ids ⇒ Object
Heavily unoptimized naive way to get all parent ids.
-
#prev(name = nil) ⇒ Object
Returns previous public element from same page.
-
#store_page(page) ⇒ Object
Stores the page into
touchable_pages
(Pages that have to be touched after updating the element). -
#taggable? ⇒ Boolean
Returns true if the definition of this element has a taggable true value.
-
#to_partial_path ⇒ Object
The element’s view partial is dependent from its name.
Methods included from Presenters
#display_name, #display_name_with_preview_text, #preview_ingredient, #preview_text
Methods included from ElementIngredients
#copy_ingredients_to, #has_validations?, #has_value_for?, #ingredient_by_role, #ingredient_by_type, #ingredient_definition_for, #ingredient_definitions, #ingredients_by_type, #ingredients_with_errors, #richtext_ingredients_ids, #value_for
Methods included from Definitions
Methods included from Taggable
Methods included from Logger
Methods included from ConfigMissing
Methods included from SearchableResource
#ransackable_associations, #ransackable_attributes, #ransackable_scopes, #ransortable_attributes
Instance Attribute Details
#autogenerate_nested_elements ⇒ Object
Returns the value of attribute autogenerate_nested_elements.
92 93 94 |
# File 'app/models/alchemy/element.rb', line 92 def autogenerate_nested_elements @autogenerate_nested_elements end |
Class Method Details
.all_from_clipboard(clipboard) ⇒ Object
153 154 155 156 157 |
# File 'app/models/alchemy/element.rb', line 153 def all_from_clipboard(clipboard) return none if clipboard.nil? where(id: clipboard.collect { |e| e["id"] }) end |
.all_from_clipboard_for_page(clipboard, page) ⇒ Object
All elements in clipboard that could be placed on page
161 162 163 164 165 |
# File 'app/models/alchemy/element.rb', line 161 def all_from_clipboard_for_page(clipboard, page) return none if clipboard.nil? || page.nil? all_from_clipboard(clipboard).where(name: page.available_element_names) end |
.all_from_clipboard_for_parent_element(clipboard, parent_element) ⇒ Object
All elements in clipboard that could be placed as a child of ‘parent_element`
168 169 170 171 172 |
# File 'app/models/alchemy/element.rb', line 168 def all_from_clipboard_for_parent_element(clipboard, parent_element) return none if clipboard.nil? || parent_element.nil? all_from_clipboard(clipboard).where(name: parent_element.definition.nestable_elements) end |
.copy(source_element, differences = {}) ⇒ Object
This methods does a copy of source and all its ingredients.
Options
You can pass a differences Hash as second option to update attributes for the copy.
Example
@copy = Alchemy::Element.copy(@element, {public: false})
@copy.public? # => false
149 150 151 |
# File 'app/models/alchemy/element.rb', line 149 def copy(source_element, differences = {}) Alchemy::DuplicateElement.new(source_element).call(differences) end |
.new(attributes = {}) ⇒ Object
Builds a new element as described in /config/alchemy/elements.yml
-
Returns a new Alchemy::Element object if no name is given in attributes, because the definition can not be found w/o name
-
Raises Alchemy::ElementDefinitionError if no definition for given attributes could be found
126 127 128 129 130 131 132 133 134 135 136 |
# File 'app/models/alchemy/element.rb', line 126 def new(attributes = {}) return super if attributes[:name].blank? element_attributes = attributes.to_h.merge(name: attributes[:name].split("#").first) element_definition = Element.definition_by_name(element_attributes[:name]) if element_definition.nil? raise(ElementDefinitionError, attributes) end super(element_definition.attributes.merge(element_attributes).except(*FORBIDDEN_DEFINITION_ATTRIBUTES)) end |
Instance Method Details
#compact? ⇒ Boolean
Defined as compact element?
224 225 226 |
# File 'app/models/alchemy/element.rb', line 224 def compact? definition.compact end |
#deprecated? ⇒ Boolean
Defined as deprecated element?
You can either set true or a String on your elements definition.
Passing true
- name: old_element
deprecated: true
The deprecation notice can be translated. Either as global notice for all deprecated elements.
en:
alchemy:
element_deprecation_notice: Foo baz is deprecated
Or add a translation to your locale file for a per element notice.
en:
alchemy:
element_deprecation_notices:
old_element: Foo baz is deprecated
Pass a String
- name: old_element
deprecated: This element will be removed soon.
256 257 258 |
# File 'app/models/alchemy/element.rb', line 256 def deprecated? !!definition.deprecated end |
#expanded? ⇒ Boolean
The opposite of folded?
219 220 221 |
# File 'app/models/alchemy/element.rb', line 219 def !folded? end |
#nestable_elements ⇒ Object
A collection of element names that can be nested inside this element.
279 280 281 |
# File 'app/models/alchemy/element.rb', line 279 def nestable_elements definition.nestable_elements end |
#next(name = nil) ⇒ Object
Returns next public element from same page.
Pass an element name to get next of this kind.
190 191 192 193 |
# File 'app/models/alchemy/element.rb', line 190 def next(name = nil) elements = page.elements.published.where("position > ?", position) select_element(elements, name, :asc) end |
#parent_element_ids ⇒ Object
Heavily unoptimized naive way to get all parent ids
176 177 178 179 180 181 182 183 184 |
# File 'app/models/alchemy/element.rb', line 176 def parent_element_ids ids ||= [] parent = parent_element while parent ids.push parent.id parent = parent.parent_element end ids end |
#prev(name = nil) ⇒ Object
Returns previous public element from same page.
Pass an element name to get previous of this kind.
199 200 201 202 |
# File 'app/models/alchemy/element.rb', line 199 def prev(name = nil) elements = page.elements.published.where("position < ?", position) select_element(elements, name, :desc) end |
#store_page(page) ⇒ Object
Stores the page into touchable_pages
(Pages that have to be touched after updating the element).
205 206 207 208 209 210 211 |
# File 'app/models/alchemy/element.rb', line 205 def store_page(page) return true if page.nil? unless touchable_pages.include? page touchable_pages << page end end |
#taggable? ⇒ Boolean
Returns true if the definition of this element has a taggable true value.
214 215 216 |
# File 'app/models/alchemy/element.rb', line 214 def taggable? definition.taggable == true end |
#to_partial_path ⇒ Object
The element’s view partial is dependent from its name
Define elements
Elements are defined in the config/alchemy/elements.yml
file
- name: article
ingredients:
...
Override the view
Element partials live in app/views/alchemy/elements
274 275 276 |
# File 'app/models/alchemy/element.rb', line 274 def to_partial_path "alchemy/elements/#{name}" end |