contents_core 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -3
- data/app/models/contents_core/block.rb +23 -27
- data/app/models/contents_core/item.rb +48 -4
- data/app/models/contents_core/item_array.rb +39 -9
- data/config/locales/active_record.en.yml +7 -0
- data/db/migrate/20170414173611_add_extra_items.rb +1 -1
- data/lib/contents_core.rb +2 -1
- data/lib/contents_core/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3635d8643c427f43b9fb5f929fc98c111bc84994
|
4
|
+
data.tar.gz: b5eb85c95998603fac03517e1221dfee6a409b59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d064f8cdf42dbb1eaed6060c019f2a3c213750bf7fb09a3a835af64b7f52dc1a98dbf9e2e15680a1fd2eeb247f8e53ade283f3e674033d685ca5470ca96e8cb
|
7
|
+
data.tar.gz: 1ce8483d568007a1e90b17a725408a1acac654b29b1d2ef0b1605d10ec161d1ef7a2c1cde9623b6e478b1e365f40e5db613949936b90f7dadb20e0a3b295cdf4
|
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
# ContentsCore [](https://badge.fury.io/rb/contents_core)
|
1
|
+
# ContentsCore [](https://badge.fury.io/rb/contents_core) [](https://travis-ci.org/blocknotes/contents_core)
|
2
2
|
|
3
3
|
A Rails gem which offer a simple structure to manage contents in a flexible way.
|
4
4
|
|
5
|
-
|
5
|
+
Disclaimer: this component is in ALPHA, major changes could happen
|
6
6
|
|
7
|
+
Goals:
|
7
8
|
- attach the contents structure to a model transparently
|
8
9
|
- improve block views management
|
9
10
|
- add fields to blocks without migrations
|
@@ -108,7 +109,7 @@ If you use ActiveAdmin as admin interface you can find a sample model configurat
|
|
108
109
|
|
109
110
|
### Notes
|
110
111
|
|
111
|
-
- Blocks
|
112
|
+
- Blocks enum: `ContentsCore::Block.block_enum`
|
112
113
|
- Blocks types: `ContentsCore::Block.block_types`
|
113
114
|
- Default blocks [here](config/initializers/contents_core.rb)
|
114
115
|
|
@@ -2,6 +2,8 @@ module ContentsCore
|
|
2
2
|
class Block < ApplicationRecord
|
3
3
|
EMPTY_DATA = OpenStruct.new( { data: '' } )
|
4
4
|
|
5
|
+
attr_accessor :create_children
|
6
|
+
|
5
7
|
# --- fields options ----------------------------------------------------- #
|
6
8
|
serialize :options, JSON
|
7
9
|
serialize :validations, JSON
|
@@ -51,29 +53,29 @@ module ContentsCore
|
|
51
53
|
#
|
52
54
|
# # scope :published, -> { where( published: true ) unless ApplicationController.edit_mode }
|
53
55
|
|
54
|
-
def initialize(
|
55
|
-
super
|
56
|
+
def initialize( attributes = {}, &block )
|
57
|
+
super( attributes, &block )
|
58
|
+
@create_children = 1
|
56
59
|
self.group = config[:group]
|
57
|
-
self.block_type = parent.config[:children_type] if
|
60
|
+
self.block_type = parent.config[:children_type] if attributes[:block_type].nil? && self.parent_type == 'ContentsCore::Block'
|
58
61
|
end
|
59
62
|
|
60
|
-
def as_json
|
61
|
-
|
62
|
-
super({ only: [:id, :block_type, :name, :group, :position, :published], methods: [:blocks_collection, :items_collection]}.merge(options || {}))
|
63
|
+
def as_json( options = nil )
|
64
|
+
super({ only: [:id, :block_type, :name, :group, :position, :published], include: [:cc_blocks, :items]}.merge(options || {}))
|
63
65
|
end
|
64
66
|
|
65
67
|
def attr_id
|
66
68
|
"#{self.class.to_s.split('::').last}-#{self.id}"
|
67
69
|
end
|
68
70
|
|
69
|
-
def blocks_collection
|
70
|
-
self.cc_blocks.map &:as_json
|
71
|
-
end
|
72
|
-
|
73
71
|
def children_type
|
74
72
|
config[:children_type]
|
75
73
|
end
|
76
74
|
|
75
|
+
def config
|
76
|
+
ContentsCore.config[:cc_blocks][block_type.to_sym] ? ContentsCore.config[:cc_blocks][block_type.to_sym] : {}
|
77
|
+
end
|
78
|
+
|
77
79
|
def create_item( item_type, item_name = nil )
|
78
80
|
new_item = ContentsCore::Item.new( type: item_type )
|
79
81
|
new_item.name = item_name if item_name
|
@@ -125,18 +127,14 @@ module ContentsCore
|
|
125
127
|
parent.present? && parent_type == 'ContentsCore::Block'
|
126
128
|
end
|
127
129
|
|
128
|
-
def items_collection
|
129
|
-
self.items.map &:as_json
|
130
|
-
end
|
131
|
-
|
132
130
|
def on_after_create
|
133
131
|
# TODO: validates type before creation!
|
134
|
-
Block::init_items( self, config[:items] ) if Block::block_types.include?( self.block_type.to_sym )
|
132
|
+
Block::init_items( self, config[:items] ) if Block::block_types( false ).include?( self.block_type.to_sym )
|
135
133
|
end
|
136
134
|
|
137
135
|
def on_before_create
|
138
136
|
if self.name.blank?
|
139
|
-
names = parent.cc_blocks.map &:name
|
137
|
+
names = parent.cc_blocks.map( &:name )
|
140
138
|
i = 0
|
141
139
|
while( ( i += 1 ) < 1000 ) # Search an empty group
|
142
140
|
unless names.include? "#{block_type}-#{i}"
|
@@ -184,15 +182,15 @@ module ContentsCore
|
|
184
182
|
end
|
185
183
|
end
|
186
184
|
|
187
|
-
def self.
|
188
|
-
|
185
|
+
def self.block_enum( include_children = true )
|
186
|
+
ContentsCore.config[:cc_blocks].map{|k, v| [v[:name], k.to_s] if !include_children || !v[:child_only]}.compact.sort_by{|b| b[0]}
|
189
187
|
end
|
190
188
|
|
191
|
-
def self.block_types
|
192
|
-
|
189
|
+
def self.block_types( include_children = true )
|
190
|
+
ContentsCore.config[:cc_blocks].select{|k, v| !include_children || !v[:child_only]}.keys
|
193
191
|
end
|
194
192
|
|
195
|
-
def self.init_items( block, items )
|
193
|
+
def self.init_items( block, items, options = {} )
|
196
194
|
items.each do |name, type|
|
197
195
|
t = type.to_sym
|
198
196
|
if type.to_s.start_with? 'item_'
|
@@ -204,8 +202,10 @@ module ContentsCore
|
|
204
202
|
model = false
|
205
203
|
end
|
206
204
|
block.items << model.new( name: name ).init if model
|
207
|
-
elsif Block::block_types.include? t.to_sym
|
208
|
-
block.
|
205
|
+
elsif Block::block_types( false ).include? t.to_sym
|
206
|
+
block.create_children.times do
|
207
|
+
block.cc_blocks << Block.new( block_type: t, name: name )
|
208
|
+
end
|
209
209
|
end
|
210
210
|
end if items
|
211
211
|
end
|
@@ -213,9 +213,5 @@ module ContentsCore
|
|
213
213
|
def self.permitted_attributes
|
214
214
|
[ :id, :name, :block_type, :position, :_destroy, items_attributes: [ :id ] + Item::permitted_attributes, cc_blocks_attributes: [ :id, :name, :block_type, items_attributes: [ :id ] + Item::permitted_attributes ] ]
|
215
215
|
end
|
216
|
-
|
217
|
-
def config
|
218
|
-
ContentsCore.config[:cc_blocks][block_type.to_sym] ? ContentsCore.config[:cc_blocks][block_type.to_sym] : {}
|
219
|
-
end
|
220
216
|
end
|
221
217
|
end
|
@@ -6,8 +6,8 @@ module ContentsCore
|
|
6
6
|
|
7
7
|
belongs_to :block
|
8
8
|
|
9
|
-
def as_json
|
10
|
-
super( {only: [:id, :name, :type], methods: [:data]} )
|
9
|
+
def as_json( options = nil )
|
10
|
+
super( {only: [:id, :name, :type], methods: [:data]}.merge(options || {}) )
|
11
11
|
end
|
12
12
|
|
13
13
|
def attr_id
|
@@ -32,6 +32,10 @@ module ContentsCore
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
def process_data( args = nil )
|
36
|
+
config[:process_data].call( self.data, args ) if config[:process_data]
|
37
|
+
end
|
38
|
+
|
35
39
|
def set( value )
|
36
40
|
self.data = value
|
37
41
|
self
|
@@ -47,7 +51,7 @@ module ContentsCore
|
|
47
51
|
end
|
48
52
|
|
49
53
|
def self.item_types
|
50
|
-
@@item_types ||= ContentsCore.config[:items].keys.map &:to_s
|
54
|
+
@@item_types ||= ContentsCore.config[:items].keys.map( &:to_s )
|
51
55
|
end
|
52
56
|
|
53
57
|
def self.permitted_attributes
|
@@ -57,7 +61,47 @@ module ContentsCore
|
|
57
61
|
protected
|
58
62
|
|
59
63
|
def config
|
60
|
-
@config ||= self.block.config[:options] && self.block.config[:options][self.name.to_sym] ? self.block.config[:options][self.name.to_sym] : ( ContentsCore.config[:items][self.class::type_name.to_sym] ? ContentsCore.config[:items][self.class::type_name.to_sym] : {} )
|
64
|
+
@config ||= self.block && self.block.config[:options] && self.block.config[:options][self.name.to_sym] ? self.block.config[:options][self.name.to_sym] : ( ContentsCore.config[:items][self.class::type_name.to_sym] ? ContentsCore.config[:items][self.class::type_name.to_sym] : {} )
|
65
|
+
end
|
66
|
+
|
67
|
+
def convert_data( value )
|
68
|
+
# return ( data = config[:convert_method].call( data ) ) if config[:convert_method]
|
69
|
+
if config[:data_type]
|
70
|
+
case config[:data_type].to_sym
|
71
|
+
when :boolean
|
72
|
+
self.data_boolean = ( value == 1 ) || ( value == '1' ) || ( value == 'true' ) || ( value == 'yes' )
|
73
|
+
when :float
|
74
|
+
self.data_float = value.to_f
|
75
|
+
when :integer
|
76
|
+
self.data_integer = value.to_i
|
77
|
+
when :string
|
78
|
+
self.data_string = value.to_s
|
79
|
+
when :text
|
80
|
+
self.data_text = value.to_s
|
81
|
+
else
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
true
|
85
|
+
else
|
86
|
+
false
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def converted_data
|
91
|
+
if config[:data_type]
|
92
|
+
case config[:data_type].to_sym
|
93
|
+
when :boolean
|
94
|
+
self.data_boolean
|
95
|
+
when :float
|
96
|
+
self.data_float
|
97
|
+
when :integer
|
98
|
+
self.data_integer
|
99
|
+
when :string
|
100
|
+
self.data_string
|
101
|
+
when :text
|
102
|
+
self.data_text
|
103
|
+
end
|
104
|
+
end
|
61
105
|
end
|
62
106
|
end
|
63
107
|
end
|
@@ -1,24 +1,54 @@
|
|
1
1
|
module ContentsCore
|
2
2
|
class ItemArray < Item
|
3
|
-
alias_attribute :data, :data_string
|
4
|
-
|
5
3
|
serialize :data_hash, Array
|
4
|
+
serialize :data_text, Array
|
5
|
+
|
6
|
+
# after_initialize do
|
7
|
+
# config[:data_type] ||= :integer # TODO: this overrides the config !
|
8
|
+
# end
|
9
|
+
|
10
|
+
def data
|
11
|
+
is_multiple? ? self.data_text : converted_data
|
12
|
+
end
|
13
|
+
|
14
|
+
def data=( value )
|
15
|
+
if is_multiple?
|
16
|
+
if config[:data_type]
|
17
|
+
self.data_text = case config[:data_type].to_sym
|
18
|
+
# when :boolean
|
19
|
+
# self.data_boolean = ( value == 1 ) || ( value == '1' ) || ( value == 'true' ) || ( value == 'yes' )
|
20
|
+
when :float
|
21
|
+
value.map( &:to_f )
|
22
|
+
when :integer
|
23
|
+
value.map( &:to_i )
|
24
|
+
when :string, :text
|
25
|
+
value.map( &:to_s )
|
26
|
+
else
|
27
|
+
value
|
28
|
+
end
|
29
|
+
else
|
30
|
+
self.data_text = value
|
31
|
+
end
|
32
|
+
else
|
33
|
+
convert_data( value )
|
34
|
+
end
|
35
|
+
end
|
6
36
|
|
7
|
-
def enum
|
8
|
-
config[:values] ? config[:values] : ( config[:values_method] ? config[:values_method].call : self.data_hash )
|
37
|
+
def enum( params = nil )
|
38
|
+
config[:values] ? config[:values] : ( config[:values_method] ? config[:values_method].call( params ) : self.data_hash )
|
9
39
|
end
|
10
40
|
|
11
41
|
def init
|
12
|
-
self.
|
42
|
+
self.data_string = []
|
13
43
|
self
|
14
44
|
end
|
15
45
|
|
16
|
-
def
|
17
|
-
|
46
|
+
def is_multiple?
|
47
|
+
config[:multiple] ? true : false
|
18
48
|
end
|
19
49
|
|
20
|
-
def
|
21
|
-
|
50
|
+
def to_s
|
51
|
+
self.data
|
22
52
|
end
|
23
53
|
|
24
54
|
def self.type_name
|
@@ -8,6 +8,13 @@ en:
|
|
8
8
|
one: Item
|
9
9
|
other: Items
|
10
10
|
attributes:
|
11
|
+
contents_core/block:
|
12
|
+
image: Image
|
13
|
+
multi_text: Text Only
|
14
|
+
slide: Slide
|
15
|
+
slider: Slider
|
16
|
+
text: Text Only
|
17
|
+
text_with_image: Text with Image
|
11
18
|
contents_core/item:
|
12
19
|
column: Column
|
13
20
|
content: Content
|
@@ -4,7 +4,7 @@ class AddExtraItems < ActiveRecord::Migration[5.0]
|
|
4
4
|
add_column :contents_core_items, :data_datetime, :datetime
|
5
5
|
add_column :contents_core_items, :data_file, :string # , null: false, default: ''
|
6
6
|
add_column :contents_core_items, :data_float, :float
|
7
|
-
add_column :contents_core_items, :data_hash, :text
|
7
|
+
add_column :contents_core_items, :data_hash, :text
|
8
8
|
add_column :contents_core_items, :data_integer, :integer
|
9
9
|
add_column :contents_core_items, :data_string, :string # , null: false, default: ''
|
10
10
|
add_column :contents_core_items, :data_text, :text
|
data/lib/contents_core.rb
CHANGED
@@ -12,8 +12,9 @@ module ContentsCore
|
|
12
12
|
block.name = params[:name] if params[:name]
|
13
13
|
block.options = params[:options] if params[:options]
|
14
14
|
block.validations = params[:validations] if params[:validations]
|
15
|
+
block.create_children = params[:create_children].to_i if params[:create_children]
|
15
16
|
parent.cc_blocks << block
|
16
|
-
Block::init_items block, params[:schema] if params[:schema]
|
17
|
+
Block::init_items block, params[:schema], {create_children: params[:create_children]} if params[:schema]
|
17
18
|
block
|
18
19
|
end
|
19
20
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: contents_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mat
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sqlite3
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
description: A Rails gem which offer a simple structure to manage contents in a flexible
|
28
56
|
way
|
29
57
|
email:
|