-
Notifications
You must be signed in to change notification settings - Fork 2
Atoms
CMS pages consist of atoms. Atoms can be added to any model using the Folio::HasAtoms
concern. Use Folio::HasAtoms::Basic
for single locale or Folio::HasAtoms::Localized
for localized atoms.
class ProjectNamespace::Model < ApplicationRecord
include Folio::HasAtoms::Basic
end
regular atom:
$ rails g folio:atom foo
create app/models/project_namespace/atom/foo.rb
create app/cells/project_namespace/atom/foo_cell.rb
create app/cells/project_namespace/atom/foo/show.slim
create test/cells/project_namespace/atom/foo_cell_test.rb
molecule-forming atom:
$ rails g folio:molecule person
create app/models/project_namespace/atom/person.rb
create app/cells/project_namespace/molecule/people_cell.rb
create app/cells/project_namespace/molecule/people/show.slim
create test/cells/project_namespace/molecule/people_cell_test.rb
Check other folio generators (rails g
), eg. : rails g folio:prepared_atom all
.
Atom models are subclasses of Folio::Atom::Base
. Each STI variant defines it's view cell and a set of constants that define its structure. Example:
class ProjectNamespace::Atom::Foo < Folio::Atom::Base
ATTACHMENTS = %i[cover]
STRUCTURE = {
title: :string,
content: :richtext,
orientation: %w[vertical horizontal]
}
ASSOCIATIONS = {
product: %w[ProjectNamespace::Product],
}
def self.cell_name
'project_namespace/atom/foo'
end
def self.console_icon
:eye
end
end
Data is stored-to and read-from a single JSON data
column using method_missing
.
Use STRUCTURE
constant to define atom fields. Valid options:
symbol | decsription |
---|---|
string | same as psql string |
text | same as psql text |
richtext | same as text, but using a richtext editor in console |
code | unescaped HTML used for embeds |
integer | same as psql integer |
float | same as psql float |
date | same as psql date |
datetime | same as psql datetime |
color | string field with a color picker in console |
boolean | same as psql boolean |
Instead of a symbol you can also pass an array of values. Such key would be stored as a string and displayed as a select in console.
Data is stored-to and read-from a single JSON associations
column using method_missing
. Each defined association is stored as a key with a hash of id and base class name { id: 'id', type: 'type' }
.
ProjectNamespace::Atom::MyAtom.last.associations
=> {"product"=>{"id"=>"10", "type"=>"ProjectNamespace::Product"}}
Which of the placements keys of Folio::HasAttachments
should be handled in console.
Atoms are rendered using Folio::AtomsHelper
via render_atoms_in_molecules
. Each atom has either a cell_name
or a molecule_cell_name
class method defining the name of the cell used for rendering.
Atoms can be grouped together into molecules for easier rendering of lists. When molecule_cell_name
is present, all neighbouring atoms (based on position
) get grouped into an array, which is served to the cell defined in molecule_cell_name
as model
. When cell_name
is present, atom is passed as model
to the cell.