Class: Alchemy::ElementDefinition

Inherits:
Object
  • Object
show all
Extended by:
ActiveModel::Translation
Includes:
ActiveModel::Attributes, ActiveModel::Model, Hints
Defined in:
app/models/alchemy/element_definition.rb

Constant Summary collapse

DEFAULT_ICON_NAME =
"layout-bottom-2-line"

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Hints

#has_hint?, #hint

Class Method Details

.add(definition) ⇒ Object

Add additional page definitions to collection.

Useful for extending the elements from an Alchemy module.

Usage Example

Call +Alchemy::ElementDefinition.add(your_definition)+ in your engine.rb file.

Parameters:

  • You (Array || Hash)

    can pass a single element definition as Hash, or a collection of elements as Array.



63
64
65
66
# File 'app/models/alchemy/element_definition.rb', line 63

def add(definition)
  all
  @definitions += Array.wrap(definition).map { new(**_1) }
end

.allObject

Returns the definitions from elements.yml file.

Place a elements.yml file inside your apps config/alchemy folder to define your own set of elements



48
49
50
# File 'app/models/alchemy/element_definition.rb', line 48

def all
  @definitions ||= read_definitions_file.map { new(**_1) }
end

.definitions_file_pathPathname

The absolute elements.yml file path

Returns:

  • (Pathname)


82
83
84
# File 'app/models/alchemy/element_definition.rb', line 82

def definitions_file_path
  Rails.root.join("config", "alchemy", "elements.yml")
end

.get(name) ⇒ Object

Returns one element definition by given name.



70
71
72
73
74
# File 'app/models/alchemy/element_definition.rb', line 70

def get(name)
  return new if name.blank?

  all.detect { _1.name.casecmp(name).zero? }
end

.reset!Object



76
77
78
# File 'app/models/alchemy/element_definition.rb', line 76

def reset!
  @definitions = nil
end

Instance Method Details

#attributesObject



112
113
114
# File 'app/models/alchemy/element_definition.rb', line 112

def attributes
  super.with_indifferent_access
end

#deprecation_noticeObject

Returns a deprecation notice for elements marked deprecated

You can either use localizations or pass a String as notice in the element definition.

Custom deprecation notices

Use general element deprecation notice

- name: old_element
  deprecated: true

Add a translation to your locale file for a per element notice.

en:
  alchemy:
    element_deprecation_notices:
      old_element: Foo baz widget is deprecated

or use the global translation that apply to all deprecated elements.

en:
  alchemy:
    element_deprecation_notice: Foo baz widget is deprecated

or pass string as deprecation notice.

- name: old_element
  deprecated: This element will be removed soon.


150
151
152
153
154
155
156
157
158
159
160
161
# File 'app/models/alchemy/element_definition.rb', line 150

def deprecation_notice
  case deprecated
  when String
    deprecated
  when TrueClass
    Alchemy.t(
      name,
      scope: :element_deprecation_notices,
      default: Alchemy.t(:element_deprecated)
    )
  end
end

#icon_fileObject



163
164
165
# File 'app/models/alchemy/element_definition.rb', line 163

def icon_file
  @_icon_file ||= File.read(icon_file_path).html_safe
end

#icon_file_nameObject



167
168
169
# File 'app/models/alchemy/element_definition.rb', line 167

def icon_file_name
  "#{icon_name}.svg"
end

#icon_nameObject



171
172
173
174
175
176
177
# File 'app/models/alchemy/element_definition.rb', line 171

def icon_name
  case icon
  when TrueClass then name
  when String then icon
  else DEFAULT_ICON_NAME
  end
end

#ingredientsObject



116
117
118
# File 'app/models/alchemy/element_definition.rb', line 116

def ingredients
  super.map { IngredientDefinition.new(**_1) }
end