binda 0.1.3 → 0.1.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 +83 -25
- data/app/assets/javascripts/binda/application.js +3 -3
- data/app/assets/javascripts/binda/components/bootstrap.js +3 -4
- data/app/assets/javascripts/binda/components/field_group_editor.js +10 -10
- data/app/assets/javascripts/binda/components/field_setting_choices.js +61 -49
- data/app/assets/javascripts/binda/components/fileupload.js +135 -118
- data/app/assets/javascripts/binda/components/form_item.js +65 -65
- data/app/assets/javascripts/binda/components/form_item_editor.js +19 -19
- data/app/assets/javascripts/binda/components/form_item_image.js +11 -13
- data/app/assets/javascripts/binda/components/form_item_repeater.js +77 -71
- data/app/assets/javascripts/binda/components/login-shader.js +171 -164
- data/app/assets/javascripts/binda/components/login_form.js +65 -73
- data/app/assets/javascripts/binda/components/radio-toggle.js +8 -12
- data/app/assets/javascripts/binda/components/select2.js +19 -14
- data/app/assets/javascripts/binda/components/sortable.js +76 -71
- data/app/assets/javascripts/binda/dist/binda.bundle.js +735 -727
- data/app/assets/javascripts/binda/index.js +49 -35
- data/app/assets/stylesheets/binda/components/assets_manager.scss +13 -22
- data/app/assets/stylesheets/binda/components/b-alert.scss +18 -14
- data/app/assets/stylesheets/binda/components/b-btn.scss +24 -43
- data/app/assets/stylesheets/binda/components/field_setting_choices.scss +16 -31
- data/app/assets/stylesheets/binda/components/fileupload.scss +25 -42
- data/app/assets/stylesheets/binda/components/form_item.scss +51 -93
- data/app/assets/stylesheets/binda/components/form_item_choices.scss +7 -10
- data/app/assets/stylesheets/binda/components/login.scss +2 -2
- data/app/assets/stylesheets/binda/components/main_header.scss +5 -10
- data/app/assets/stylesheets/binda/components/main_sidebar.scss +42 -46
- data/app/assets/stylesheets/binda/components/main_sortable_table.scss +12 -21
- data/app/assets/stylesheets/binda/components/main_table.scss +18 -35
- data/app/assets/stylesheets/binda/components/popup_warning.scss +14 -27
- data/app/assets/stylesheets/binda/components/select2.scss +46 -48
- data/app/assets/stylesheets/binda/components/sortable.scss +25 -45
- data/app/assets/stylesheets/binda/components/standard-form.scss +43 -73
- data/app/assets/stylesheets/binda/controllers/users_sessions_new.scss +52 -89
- data/app/assets/stylesheets/binda/index.scss +0 -1
- data/app/assets/stylesheets/binda/settings/buttons.scss +9 -10
- data/app/assets/stylesheets/binda/settings/common.scss +17 -22
- data/app/assets/stylesheets/binda/settings/fonts.scss +112 -67
- data/app/assets/stylesheets/binda/settings/tiny_mce_overrides.scss +20 -36
- data/app/assets/stylesheets/binda/settings/variables.scss +38 -43
- data/app/controllers/binda/choices_controller.rb +14 -11
- data/app/controllers/binda/components_controller.rb +6 -4
- data/app/controllers/binda/structures_controller.rb +7 -3
- data/app/helpers/binda/components_helper.rb +69 -3
- data/app/helpers/binda/field_groups_helper.rb +16 -6
- data/app/helpers/binda/structures_helper.rb +1 -4
- data/app/models/binda/application_record.rb +4 -1
- data/app/models/binda/asset.rb +3 -1
- data/app/models/binda/b.rb +1 -0
- data/app/models/binda/category.rb +1 -0
- data/app/models/binda/checkbox.rb +2 -0
- data/app/models/binda/choice.rb +74 -41
- data/app/models/binda/component.rb +1 -1
- data/app/models/binda/date.rb +4 -0
- data/app/models/binda/deprecation.rb +7 -0
- data/app/models/binda/field_group.rb +16 -3
- data/app/models/binda/field_setting.rb +168 -41
- data/app/models/binda/image.rb +1 -0
- data/app/models/binda/radio.rb +2 -0
- data/app/models/binda/relation.rb +3 -0
- data/app/models/binda/repeater.rb +3 -0
- data/app/models/binda/selection.rb +237 -0
- data/app/models/binda/string.rb +4 -0
- data/app/models/binda/structure.rb +25 -14
- data/app/models/binda/text.rb +9 -0
- data/app/models/binda/video.rb +1 -0
- data/app/models/concerns/binda/default_helpers.rb +40 -31
- data/app/models/concerns/binda/deprecations.rb +6 -0
- data/app/models/concerns/binda/fieldable_association_helpers.rb +366 -0
- data/app/models/concerns/binda/fieldable_associations.rb +32 -369
- data/app/views/binda/boards/edit.html.erb +15 -2
- data/app/views/binda/categories/_form.html.erb +24 -51
- data/app/views/binda/categories/edit.html.erb +23 -3
- data/app/views/binda/categories/index.html.erb +49 -25
- data/app/views/binda/categories/new.html.erb +21 -2
- data/app/views/binda/components/edit.html.erb +27 -4
- data/app/views/binda/components/index.html.erb +47 -50
- data/app/views/binda/components/new.html.erb +12 -2
- data/app/views/binda/components/sort_index.html.erb +28 -13
- data/app/views/binda/field_groups/_form_body.html.erb +43 -82
- data/app/views/binda/field_groups/_form_item.html.erb +3 -120
- data/app/views/binda/field_groups/_form_section.html.erb +11 -16
- data/app/views/binda/field_groups/_form_section_repeater.html.erb +7 -15
- data/app/views/binda/field_groups/edit.html.erb +14 -2
- data/app/views/binda/field_groups/form_item/_form_item_choice_editor.html.erb +11 -0
- data/app/views/binda/field_groups/form_item/_form_item_editor.html.erb +14 -0
- data/app/views/binda/field_groups/form_item/_form_item_header.html.erb +25 -0
- data/app/views/binda/field_groups/form_item/_form_item_new_editor.html.erb +8 -0
- data/app/views/binda/field_groups/form_item/_form_item_persisted_editor.html.erb +27 -0
- data/app/views/binda/field_groups/form_item/form_item_choice/_form_item_allow_null_choice.html.erb +11 -0
- data/app/views/binda/field_groups/form_item/form_item_choice/_form_item_choice_header.html.erb +11 -0
- data/app/views/binda/field_groups/form_item/form_item_choice/_form_item_default_choice.html.erb +11 -0
- data/app/views/binda/field_groups/form_item/form_item_choice/_form_item_new_choice.html.erb +16 -0
- data/app/views/binda/field_groups/form_item/form_item_choice/_form_item_persisted_choices.html.erb +16 -0
- data/app/views/binda/field_groups/new.html.erb +14 -2
- data/app/views/binda/field_settings/_form_body.html.erb +1 -3
- data/app/views/binda/field_settings/edit.html.erb +1 -1
- data/app/views/binda/field_settings/new.html.erb +1 -1
- data/app/views/binda/fieldable/_form_body.html.erb +24 -72
- data/app/views/binda/fieldable/_form_item_date.html.erb +1 -4
- data/app/views/binda/fieldable/_form_item_image.html.erb +3 -7
- data/app/views/binda/fieldable/_form_item_new_repeater.html.erb +0 -13
- data/app/views/binda/fieldable/_form_item_selections.html.erb +20 -112
- data/app/views/binda/fieldable/form_item_selections/_form_item_checkbox.html.erb +34 -0
- data/app/views/binda/fieldable/form_item_selections/_form_item_radio.html.erb +28 -0
- data/app/views/binda/fieldable/form_item_selections/_form_item_selection.html.erb +30 -0
- data/app/views/binda/manage/users/_form_body.html.erb +1 -31
- data/app/views/binda/manage/users/edit.html.erb +12 -2
- data/app/views/binda/manage/users/index.html.erb +36 -19
- data/app/views/binda/manage/users/new.html.erb +14 -3
- data/app/views/binda/structures/_form_body.html.erb +2 -25
- data/app/views/binda/structures/_form_section.html.erb +43 -65
- data/app/views/binda/structures/_form_sidebar.html.erb +19 -12
- data/app/views/binda/structures/edit.html.erb +20 -3
- data/app/views/binda/structures/index.html.erb +46 -26
- data/app/views/binda/structures/new.html.erb +13 -2
- data/app/views/binda/structures/sort_index.html.erb +37 -17
- data/app/views/binda/users/sessions/new.html.erb +25 -20
- data/app/views/layouts/binda/_form_errors.html.erb +10 -0
- data/app/views/layouts/binda/_sidebar.html.erb +6 -6
- data/app/views/layouts/binda/application.html.erb +1 -1
- data/config/initializers/carrierwave.rb +3 -2
- data/config/locales/en.yml +56 -12
- data/config/tinymce.yml +2 -2
- data/db/migrate/1_create_binda_tables.rb +1 -1
- data/lib/binda/version.rb +1 -1
- data/lib/generators/binda/setup/setup_generator.rb +2 -2
- data/lib/tasks/add_default_choice_to_all_selections_with_no_choices_task.rake +6 -0
- metadata +58 -8
- data/app/assets/stylesheets/binda/components/form_item_image.scss +0 -0
- data/app/views/binda/field_groups/_form_item_choice.erb +0 -104
data/app/models/binda/string.rb
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
module Binda
|
|
2
|
+
# This class depends on `Binda::Text` and it's use mainly to differentiate the type of text
|
|
3
|
+
# this class is responsible for.
|
|
4
|
+
#
|
|
5
|
+
# Binda uses this class to store plain text. The field responsible to store `Binda::String` instances is `type="string"`.
|
|
2
6
|
class String < Text
|
|
3
7
|
end
|
|
4
8
|
end
|
|
@@ -12,7 +12,11 @@ module Binda
|
|
|
12
12
|
# Validations
|
|
13
13
|
validates :name, presence: true
|
|
14
14
|
validates :slug, uniqueness: true
|
|
15
|
-
|
|
15
|
+
validates_associated :field_groups
|
|
16
|
+
validates :instance_type, presence: true, inclusion: {
|
|
17
|
+
in: %w(component board),
|
|
18
|
+
message: I18n.t('binda.structure.validation_message.instance_type', { arg1: "%{value}" })
|
|
19
|
+
}
|
|
16
20
|
accepts_nested_attributes_for :field_groups, allow_destroy: true, reject_if: :is_rejected
|
|
17
21
|
|
|
18
22
|
# Slug
|
|
@@ -20,7 +24,7 @@ module Binda
|
|
|
20
24
|
friendly_id :default_slug, use: [:slugged, :finders]
|
|
21
25
|
|
|
22
26
|
after_create :add_default_field_group
|
|
23
|
-
|
|
27
|
+
after_save :add_instance_details
|
|
24
28
|
after_create :set_default_position
|
|
25
29
|
|
|
26
30
|
# Friendly id preference on slug generation
|
|
@@ -28,12 +32,12 @@ module Binda
|
|
|
28
32
|
# Method inherited from friendly id
|
|
29
33
|
# @see https://github.com/norman/friendly_id/issues/436
|
|
30
34
|
def should_generate_new_friendly_id?
|
|
31
|
-
slug.blank?
|
|
35
|
+
slug.blank?
|
|
32
36
|
end
|
|
33
37
|
|
|
34
38
|
#
|
|
35
39
|
# Sets the validation rules to accept and save an attribute
|
|
36
|
-
def is_rejected(
|
|
40
|
+
def is_rejected(attributes)
|
|
37
41
|
attributes['name'].blank?
|
|
38
42
|
end
|
|
39
43
|
|
|
@@ -41,10 +45,10 @@ module Binda
|
|
|
41
45
|
#
|
|
42
46
|
# It generates 4 possible slugs before falling back to FriendlyId default behaviour
|
|
43
47
|
def default_slug
|
|
44
|
-
[ "#{ self.name }",
|
|
45
|
-
"#{ self.name }-1",
|
|
46
|
-
"#{ self.name }-2",
|
|
47
|
-
"#{ self.name }-3" ]
|
|
48
|
+
[ "#{ self.name.parameterize }",
|
|
49
|
+
"#{ self.name.parameterize }-1",
|
|
50
|
+
"#{ self.name.parameterize }-2",
|
|
51
|
+
"#{ self.name.parameterize }-3" ]
|
|
48
52
|
end
|
|
49
53
|
|
|
50
54
|
# Add a field group as a default
|
|
@@ -54,10 +58,10 @@ module Binda
|
|
|
54
58
|
# @return [redirect]
|
|
55
59
|
def add_default_field_group
|
|
56
60
|
# Creates a default empty field group
|
|
57
|
-
field_group = self.field_groups.build(
|
|
61
|
+
field_group = self.field_groups.build(name: I18n.t('binda.default_field_group.name'), position: 1)
|
|
58
62
|
# Unless there is a problem...
|
|
59
63
|
unless field_group.save
|
|
60
|
-
return redirect_to structure_path(
|
|
64
|
+
return redirect_to structure_path(self.slug), flash: { error: I18n.t('binda.default_field_group.error_on_create') }
|
|
61
65
|
end
|
|
62
66
|
end
|
|
63
67
|
|
|
@@ -68,10 +72,17 @@ module Binda
|
|
|
68
72
|
# It also disable categories (this could be a different method, or method could be more explicit)
|
|
69
73
|
def add_instance_details
|
|
70
74
|
if self.instance_type == 'board'
|
|
71
|
-
self.update_attribute
|
|
75
|
+
self.update_attribute('has_categories', false)
|
|
76
|
+
add_default_board
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Add default board to a structure if needed
|
|
81
|
+
def add_default_board
|
|
82
|
+
if Board.where(structure_id: self.id).empty?
|
|
72
83
|
board = self.build_board( name: self.name )
|
|
73
84
|
unless board.save
|
|
74
|
-
return redirect_to structure_path(
|
|
85
|
+
return redirect_to structure_path(self.slug), flash: { error: I18n.t('binda.default_field_group.error_on_create') }
|
|
75
86
|
end
|
|
76
87
|
end
|
|
77
88
|
end
|
|
@@ -83,8 +94,8 @@ module Binda
|
|
|
83
94
|
#
|
|
84
95
|
# @return [object] Repeater instance
|
|
85
96
|
def set_default_position
|
|
86
|
-
|
|
87
|
-
|
|
97
|
+
position = Structure.all.length
|
|
98
|
+
self.update_attribute('position', position)
|
|
88
99
|
end
|
|
89
100
|
|
|
90
101
|
end
|
data/app/models/binda/text.rb
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
module Binda
|
|
2
|
+
# This class provides support for storing text. It can be called directly to get texts,
|
|
3
|
+
# or referenced to call other classes depending on it that deal differently with text.
|
|
4
|
+
#
|
|
5
|
+
# Binda uses this class to store complex texts usually with rich HTML features. On the admin panel infact
|
|
6
|
+
# this field is represented by a WYSIWYG. But this is just a admin panel convention: the class can infact store
|
|
7
|
+
# a simple string of text as well.
|
|
2
8
|
class Text < ApplicationRecord
|
|
3
9
|
|
|
4
10
|
# Associations
|
|
5
11
|
belongs_to :fieldable, polymorphic: true
|
|
6
12
|
belongs_to :field_setting
|
|
7
13
|
|
|
14
|
+
validates :fieldable_id, presence: true
|
|
15
|
+
validates :fieldable_type, presence: true
|
|
16
|
+
|
|
8
17
|
end
|
|
9
18
|
end
|
data/app/models/binda/video.rb
CHANGED
|
@@ -3,9 +3,6 @@ module Binda
|
|
|
3
3
|
module DefaultHelpers
|
|
4
4
|
extend ActiveSupport::Concern
|
|
5
5
|
|
|
6
|
-
included do
|
|
7
|
-
end
|
|
8
|
-
|
|
9
6
|
class_methods do
|
|
10
7
|
|
|
11
8
|
# Get components
|
|
@@ -35,14 +32,14 @@ module Binda
|
|
|
35
32
|
# @param slug [string] The slug of the structure to which the components belong
|
|
36
33
|
# @param slug [array] The slugs of the structures to which the components belongs
|
|
37
34
|
#
|
|
38
|
-
# @return [
|
|
35
|
+
# @return [ActiveRecord::Relation Object] if slug is nil or is an array
|
|
39
36
|
#
|
|
40
|
-
def get_components
|
|
37
|
+
def get_components(slug = nil)
|
|
41
38
|
if slug.nil?
|
|
42
39
|
Component.all
|
|
43
40
|
else
|
|
44
41
|
# Generate query
|
|
45
|
-
Component.where(
|
|
42
|
+
Component.where(structure_id: Structure.where(slug: slug))
|
|
46
43
|
end
|
|
47
44
|
end
|
|
48
45
|
|
|
@@ -64,13 +61,13 @@ module Binda
|
|
|
64
61
|
# @param slug [string] The slug of the structure on which the board is based
|
|
65
62
|
# @param slug [array] The slugs of the structures to which the board belongs
|
|
66
63
|
#
|
|
67
|
-
# @return [
|
|
64
|
+
# @return [ActiveRecord::Relation Object] if slug is nil or is an array
|
|
68
65
|
#
|
|
69
|
-
def get_boards
|
|
66
|
+
def get_boards(slug = nil)
|
|
70
67
|
if slug.nil?
|
|
71
68
|
Board.all
|
|
72
69
|
else
|
|
73
|
-
Board.where(
|
|
70
|
+
Board.where(structure_id: Structure.where(slug: slug))
|
|
74
71
|
end
|
|
75
72
|
end
|
|
76
73
|
|
|
@@ -92,13 +89,13 @@ module Binda
|
|
|
92
89
|
# @param slug [string] The slug of the structure to which categories belong
|
|
93
90
|
# @param slug [array] The slugs of the structures to which categories belong
|
|
94
91
|
#
|
|
95
|
-
# @return [
|
|
92
|
+
# @return [ActiveRecord::Relation Object]
|
|
96
93
|
#
|
|
97
|
-
def get_categories
|
|
94
|
+
def get_categories(slug = nil)
|
|
98
95
|
if slug.nil?
|
|
99
96
|
Category.all
|
|
100
97
|
else
|
|
101
|
-
Category.where(
|
|
98
|
+
Category.where(structure_id: Structure.where(slug: slug))
|
|
102
99
|
end
|
|
103
100
|
end
|
|
104
101
|
|
|
@@ -112,14 +109,14 @@ module Binda
|
|
|
112
109
|
# # returns all field settings
|
|
113
110
|
#
|
|
114
111
|
# B.get_field_settings('subtitle')
|
|
115
|
-
# # returns an
|
|
112
|
+
# # returns an ActiveRecord::Relation (a sort of Array) containing the 'subtitle' field setting
|
|
116
113
|
#
|
|
117
114
|
# @param slug [string] The slug of a specific field setting
|
|
118
115
|
# @param slug [array] The slugs of the selected field settings
|
|
119
116
|
#
|
|
120
|
-
# @return [
|
|
117
|
+
# @return [ActiveRecord::Relation]
|
|
121
118
|
#
|
|
122
|
-
def get_field_settings
|
|
119
|
+
def get_field_settings(slug = nil)
|
|
123
120
|
if slug.nil?
|
|
124
121
|
FieldSetting.all
|
|
125
122
|
else
|
|
@@ -134,14 +131,14 @@ module Binda
|
|
|
134
131
|
#
|
|
135
132
|
# @return [Array]
|
|
136
133
|
#
|
|
137
|
-
def get_relation_owners
|
|
134
|
+
def get_relation_owners(field_slug)
|
|
138
135
|
owner_class = Structure.includes(field_groups: :field_settings)
|
|
139
|
-
.where(binda_field_settings: {id: FieldSetting.where(slug: field_slug)})
|
|
136
|
+
.where(binda_field_settings: { id: FieldSetting.where(slug: field_slug) })
|
|
140
137
|
.first
|
|
141
138
|
obj = "Binda::#{owner_class.instance_type.classify}".constantize
|
|
142
139
|
.distinct
|
|
143
140
|
.includes(relations: :dependent_components)
|
|
144
|
-
.where(binda_relations: {field_setting_id: FieldSetting.where(slug: field_slug)})
|
|
141
|
+
.where(binda_relations: { field_setting_id: FieldSetting.where(slug: field_slug) })
|
|
145
142
|
raise ArgumentError, "There isn't any instance with a relation associated to the current slug (#{field_slug}).", caller if obj.nil?
|
|
146
143
|
return obj
|
|
147
144
|
end
|
|
@@ -162,25 +159,37 @@ module Binda
|
|
|
162
159
|
#
|
|
163
160
|
# @return [Array]
|
|
164
161
|
#
|
|
165
|
-
def get_relation_dependents
|
|
162
|
+
def get_relation_dependents(field_slug, instance_type = nil)
|
|
166
163
|
raise ArgumentError, "There isn't any instance named: #{instance_type}. Make sure is either 'component' or 'board'", caller if !instance_type.nil? && ['board','component'].include?(instance_type)
|
|
167
164
|
|
|
168
|
-
dependents =
|
|
169
|
-
if instance_type != 'board'
|
|
170
|
-
dependent_components = Component.distinct
|
|
171
|
-
.includes(:owner_components)
|
|
172
|
-
.where(binda_relations: {field_setting_id: FieldSetting.where(slug: field_slug)})
|
|
173
|
-
dependents = [ *dependents, *dependent_components ]
|
|
174
|
-
elsif instance_type != 'component'
|
|
175
|
-
dependent_boards = Board.distinct
|
|
176
|
-
.includes(:owner_components)
|
|
177
|
-
.where(binda_relations: {field_setting_id: FieldSetting.where(slug: field_slug)})
|
|
178
|
-
dependents = [ *dependents, *dependent_boards ]
|
|
179
|
-
end
|
|
165
|
+
dependents = get_dependents(instance_type, field_slug)
|
|
180
166
|
|
|
181
167
|
raise ArgumentError, "There isn't any instance with a relation associated to the current slug (#{field_slug}).", caller unless dependents.any?
|
|
182
168
|
return dependents
|
|
183
169
|
end
|
|
170
|
+
|
|
171
|
+
private
|
|
172
|
+
|
|
173
|
+
# Get dependents based on slug and instance type
|
|
174
|
+
#
|
|
175
|
+
# @param instance_type [string] The instance type of the record (either board or component)
|
|
176
|
+
# @param field_slug [string] The record slug
|
|
177
|
+
# @return [array] Array of ActiveRecord dependents
|
|
178
|
+
def get_dependents(instance_type, field_slug)
|
|
179
|
+
dependents = []
|
|
180
|
+
if instance_type != 'board'
|
|
181
|
+
dependent_components = Component.distinct
|
|
182
|
+
.includes(:owner_components)
|
|
183
|
+
.where(binda_relations: { field_setting_id: FieldSetting.where(slug: field_slug) })
|
|
184
|
+
dependents = [ *dependents, *dependent_components ]
|
|
185
|
+
elsif instance_type != 'component'
|
|
186
|
+
dependent_boards = Board.distinct
|
|
187
|
+
.includes(:owner_components)
|
|
188
|
+
.where(binda_relations: { field_setting_id: FieldSetting.where(slug: field_slug) })
|
|
189
|
+
dependents = [ *dependents, *dependent_boards ]
|
|
190
|
+
end
|
|
191
|
+
return dependents
|
|
192
|
+
end
|
|
184
193
|
end
|
|
185
194
|
end
|
|
186
195
|
end
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
module Binda
|
|
2
|
+
module FieldableAssociationHelpers
|
|
3
|
+
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
# Get the object related to that field setting
|
|
7
|
+
# If the object doesn't exists yet it will return nil
|
|
8
|
+
#
|
|
9
|
+
# @param field_slug [string] The slug of the field setting
|
|
10
|
+
# @return [string] Returns the content of the text
|
|
11
|
+
# @return [error] Raise an error if no record is found
|
|
12
|
+
def get_text(field_slug)
|
|
13
|
+
obj = self.texts.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type != 'Binda::String' }
|
|
14
|
+
unless obj.nil?
|
|
15
|
+
obj.content
|
|
16
|
+
else
|
|
17
|
+
check_text_error field_slug
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Check why get_text doesn't return a value
|
|
22
|
+
# This method isn't supposed to be used by anything other than get_text method
|
|
23
|
+
def check_text_error(field_slug)
|
|
24
|
+
you_mean_string = !self.strings.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type = 'Binda::String' }.nil?
|
|
25
|
+
if you_mean_string
|
|
26
|
+
raise ArgumentError, "This slug (#{field_slug}) is associated to a string not a text. Use get_string() instead on instance (#{self.class.name} ##{self.id}).", caller
|
|
27
|
+
else
|
|
28
|
+
raise ArgumentError, "There isn't any text associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Get the object related to that field setting
|
|
33
|
+
#
|
|
34
|
+
# @param field_slug [string] The slug of the field setting
|
|
35
|
+
# @return [boolean]
|
|
36
|
+
def has_text(field_slug)
|
|
37
|
+
obj = self.texts.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type != 'Binda::String' }
|
|
38
|
+
raise ArgumentError, "There isn't any text associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
39
|
+
if obj.present?
|
|
40
|
+
return !obj.content.nil?
|
|
41
|
+
else
|
|
42
|
+
return false
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Get the object related to that field setting
|
|
47
|
+
# If the object doesn't exists yet it will return nil
|
|
48
|
+
#
|
|
49
|
+
# @param field_slug [string] The slug of the field setting
|
|
50
|
+
# @return [string] Returns the content of the string
|
|
51
|
+
# @return [error] Raise an error if no record is found
|
|
52
|
+
def get_string(field_slug)
|
|
53
|
+
obj = self.strings.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type == 'Binda::String' }
|
|
54
|
+
unless obj.nil?
|
|
55
|
+
obj.content
|
|
56
|
+
else
|
|
57
|
+
check_string_error field_slug
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Check why get_string doesn't return a value
|
|
62
|
+
# This method isn't supposed to be used by anything other than get_string method
|
|
63
|
+
def check_string_error(field_slug)
|
|
64
|
+
you_mean_text = !self.strings.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type = 'Binda::Text' }.nil?
|
|
65
|
+
if you_mean_text
|
|
66
|
+
raise ArgumentError, "This slug (#{field_slug}) is associated to a text not a string. Use get_text() instead on instance (#{self.class.name} ##{self.id}).", caller
|
|
67
|
+
else
|
|
68
|
+
raise ArgumentError, "There isn't any string associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Get the object related to that field setting
|
|
73
|
+
#
|
|
74
|
+
# @param field_slug [string] The slug of the field setting
|
|
75
|
+
# @return [boolean]
|
|
76
|
+
def has_string(field_slug)
|
|
77
|
+
obj = self.strings.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type == 'Binda::String' }
|
|
78
|
+
raise ArgumentError, "There isn't any string associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
79
|
+
if obj.present?
|
|
80
|
+
return !obj.content.nil?
|
|
81
|
+
else
|
|
82
|
+
return false
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Check if the field has an attached image
|
|
87
|
+
#
|
|
88
|
+
# @param field_slug [string] The slug of the field setting
|
|
89
|
+
# @return [boolean]
|
|
90
|
+
def has_image(field_slug)
|
|
91
|
+
obj = self.images.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
92
|
+
# Alternative query
|
|
93
|
+
# obj = Image.where(field_setting_id: FieldSetting.get_id( field_slug ), fieldable_id: self.id, fieldable_type: self.class.to_s ).first
|
|
94
|
+
raise ArgumentError, "There isn't any image associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
95
|
+
return obj.image.present?
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Get the image url based on the size provided,
|
|
99
|
+
# default is Carrierwave default (usually the real size)
|
|
100
|
+
#
|
|
101
|
+
# @param field_slug [string] The slug of the field setting
|
|
102
|
+
# @param size [string] The size. It can be 'thumb' 200x200 cropped,
|
|
103
|
+
# 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
|
|
104
|
+
# @return [string] The url of the image
|
|
105
|
+
def get_image_url(field_slug, size = '')
|
|
106
|
+
get_image_info( field_slug, size, 'url' )
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Get the image path based on the size provided,
|
|
110
|
+
# default is Carrierwave default (usually the real size)
|
|
111
|
+
#
|
|
112
|
+
# @param field_slug [string] The slug of the field setting
|
|
113
|
+
# @param size [string] The size. It can be 'thumb' 200x200 cropped,
|
|
114
|
+
# 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
|
|
115
|
+
# @return [string] The url of the image
|
|
116
|
+
def get_image_path(field_slug, size = '')
|
|
117
|
+
get_image_info( field_slug, size, 'path' )
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Get the object related to that field setting
|
|
121
|
+
#
|
|
122
|
+
# @param field_slug [string] The slug of the field setting
|
|
123
|
+
# @param size [string] The size. It can be 'thumb' 200x200 cropped,
|
|
124
|
+
# 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
|
|
125
|
+
# @param info [string] String of the info to be retrieved
|
|
126
|
+
# @return [string] The info requested if present
|
|
127
|
+
# @return [boolean] Returns false if no info is found or if image isn't found
|
|
128
|
+
def get_image_info(field_slug, size, info)
|
|
129
|
+
obj = self.images.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
130
|
+
# Alternative query
|
|
131
|
+
# obj = Image.where(field_setting_id: FieldSetting.get_id( field_slug ), fieldable_id: self.id, fieldable_type: self.class.to_s ).first
|
|
132
|
+
raise ArgumentError, "There isn't any image associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
133
|
+
if obj.image.present? && obj.image.respond_to?(size) && %w[thumb medium large].include?(size)
|
|
134
|
+
obj.image.send(size).send(info)
|
|
135
|
+
elsif obj.image.present?
|
|
136
|
+
obj.image.send(info)
|
|
137
|
+
else
|
|
138
|
+
raise "Looks like the image you are looking for isn't present. See field setting with slug=\"#{field_slug}\" on component with id=\"self.id\""
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def get_image_dimension(field_slug)
|
|
143
|
+
obj = self.images.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
144
|
+
|
|
145
|
+
raise ArgumentError, "There isn't any image associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
146
|
+
if obj.image.present? && obj.image.respond_to?(size) && %w[thumb medium large].include?(size)
|
|
147
|
+
obj.image.send(size).send(info)
|
|
148
|
+
elsif obj.image.present?
|
|
149
|
+
obj.image.send(info)
|
|
150
|
+
else
|
|
151
|
+
raise "Looks like the image you are looking for isn't present. See field setting with slug=\"#{field_slug}\" on component with id=\"self.id\""
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Check if the field has an attached video
|
|
156
|
+
#
|
|
157
|
+
# @param field_slug [string] The slug of the field setting
|
|
158
|
+
# @return [boolean]
|
|
159
|
+
def has_video(field_slug)
|
|
160
|
+
obj = self.videos.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
161
|
+
# Alternative query
|
|
162
|
+
# obj = Image.where(field_setting_id: FieldSetting.get_id( field_slug ), fieldable_id: self.id, fieldable_type: self.class.to_s ).first
|
|
163
|
+
raise ArgumentError, "There isn't any video associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
164
|
+
return obj.video.present?
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Get the video url based on the size provided,
|
|
168
|
+
# default is Carrierwave default (usually the real size)
|
|
169
|
+
#
|
|
170
|
+
# @param field_slug [string] The slug of the field setting
|
|
171
|
+
# @param size [string] The size. It can be 'thumb' 200x200 cropped,
|
|
172
|
+
# 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
|
|
173
|
+
# @return [string] The url of the video
|
|
174
|
+
def get_video_url(field_slug)
|
|
175
|
+
get_video_info( field_slug, 'url' )
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Get the video path based on the size provided,
|
|
179
|
+
# default is Carrierwave default (usually the real size)
|
|
180
|
+
#
|
|
181
|
+
# @param field_slug [string] The slug of the field setting
|
|
182
|
+
# @param size [string] The size. It can be 'thumb' 200x200 cropped,
|
|
183
|
+
# 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
|
|
184
|
+
# @return [string] The url of the video
|
|
185
|
+
def get_video_path(field_slug)
|
|
186
|
+
get_video_info( field_slug, 'path' )
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Get the object related to that field setting
|
|
190
|
+
#
|
|
191
|
+
# @param field_slug [string] The slug of the field setting
|
|
192
|
+
# @param info [string] String of the info to be retrieved
|
|
193
|
+
# @return [string] The info requested if present
|
|
194
|
+
# @return [boolean] Returns false if no info is found or if image isn't found
|
|
195
|
+
def get_video_info(field_slug, info)
|
|
196
|
+
obj = self.videos.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
197
|
+
# Alternative query
|
|
198
|
+
# obj = video.where(field_setting_id: FieldSetting.get_id( field_slug ), fieldable_id: self.id, fieldable_type: self.class.to_s ).first
|
|
199
|
+
raise ArgumentError, "There isn't any video associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
200
|
+
if obj.video.present?
|
|
201
|
+
obj.video.send(info)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Check if the field has an attached date
|
|
206
|
+
#
|
|
207
|
+
# @param field_slug [string] The slug of the field setting
|
|
208
|
+
# @return [datetime] The date
|
|
209
|
+
# @return [boolean] Reutrn false if nothing is found
|
|
210
|
+
def has_date(field_slug)
|
|
211
|
+
obj = self.dates.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
212
|
+
raise ArgumentError, "There isn't any date associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
213
|
+
if obj.present?
|
|
214
|
+
return !obj.date.nil?
|
|
215
|
+
else
|
|
216
|
+
return false
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Get the object related to that field setting
|
|
221
|
+
#
|
|
222
|
+
# @param field_slug [string] The slug of the field setting
|
|
223
|
+
# @return [boolean]
|
|
224
|
+
def get_date(field_slug)
|
|
225
|
+
obj = self.dates.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
226
|
+
raise ArgumentError, "There isn't any date associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
227
|
+
obj.date
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Check if exists any repeater with that slug
|
|
231
|
+
#
|
|
232
|
+
# @param field_slug [string] The slug of the field setting
|
|
233
|
+
# @return [boolean]
|
|
234
|
+
def has_repeater(field_slug)
|
|
235
|
+
obj = self.repeaters.find_all{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
236
|
+
raise ArgumentError, "There isn't any repeater associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
237
|
+
return obj.present?
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
# Get the all repeater instances sorted by position
|
|
241
|
+
#
|
|
242
|
+
# @param field_slug [string] The slug of the field setting
|
|
243
|
+
# @return [array] An array of repeater items which have all sorts of fields attached
|
|
244
|
+
def get_repeater(field_slug)
|
|
245
|
+
obj = self.repeaters.find_all{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
246
|
+
raise ArgumentError, "There isn't any repeater associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
247
|
+
obj.sort_by(&:position)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# Get the radio choice
|
|
251
|
+
#
|
|
252
|
+
# If by mistake the Radio instance has many choices associated,
|
|
253
|
+
# only the first one will be retrieved.
|
|
254
|
+
#
|
|
255
|
+
# @param field_slug [string] The slug of the field setting
|
|
256
|
+
# @return [hash] A hash of containing the label and value of the selected choice. `{ label: 'the label', value: 'the value'}`
|
|
257
|
+
def get_radio_choice(field_slug)
|
|
258
|
+
field_setting = FieldSetting.find_by(slug:field_slug)
|
|
259
|
+
obj = self.radios.find{ |t| t.field_setting_id == field_setting.id }
|
|
260
|
+
raise ArgumentError, "There isn't any radio associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
261
|
+
raise "There isn't any choice available for the current radio (#{field_slug}) on instance (#{self.class.name} ##{self.id})." unless obj.choices.any?
|
|
262
|
+
return { label: obj.choices.first.label, value: obj.choices.first.value }
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
# Get the select choices
|
|
266
|
+
#
|
|
267
|
+
# @param field_slug [string] The slug of the field setting
|
|
268
|
+
# @return [hash] A hash of containing the label and value of the selected choice. `{ label: 'the label', 'value': 'the value'}`
|
|
269
|
+
def get_selection_choice(field_slug)
|
|
270
|
+
field_setting = FieldSetting.find_by(slug:field_slug)
|
|
271
|
+
obj = self.selections.find{ |t| t.field_setting_id == field_setting.id }
|
|
272
|
+
raise ArgumentError, "There isn't any selection associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
273
|
+
raise "There isn't any choice available for the current selection (#{field_slug}) on instance (#{self.class.name} ##{self.id})." unless field_setting.choices.any?
|
|
274
|
+
return { label: obj.choices.first.label, value: obj.choices.first.value }
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Get the select choices
|
|
278
|
+
#
|
|
279
|
+
# @param field_slug [string] The slug of the field setting
|
|
280
|
+
# @return [array] An array of hashes of containing label and value of the selected choices. `{ label: 'the label', 'value': 'the value'}`
|
|
281
|
+
def get_selection_choices(field_slug)
|
|
282
|
+
field_setting = FieldSetting.find_by(slug:field_slug)
|
|
283
|
+
obj = self.selections.find{ |t| t.field_setting_id == field_setting.id }
|
|
284
|
+
raise ArgumentError, "There isn't any selection associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
285
|
+
raise "There isn't any choice available for the current selection (#{field_slug}) on instance (#{self.class.name} ##{self.id})." unless field_setting.choices.any?
|
|
286
|
+
return obj.choices.map{|choice| { label: choice.label, value: choice.value }}
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Get the checkbox choice
|
|
290
|
+
#
|
|
291
|
+
# @param field_slug [string] The slug of the field setting
|
|
292
|
+
# @return [array] An array of labels and values of the selected choices. `[{ label: '1st label', value: '1st-value'}, { label: '2nd label', value: '2nd-value'}]`
|
|
293
|
+
def get_checkbox_choices(field_slug)
|
|
294
|
+
field_setting = FieldSetting.find_by(slug:field_slug)
|
|
295
|
+
obj = self.checkboxes.find{ |t| t.field_setting_id == field_setting.id }
|
|
296
|
+
raise ArgumentError, "There isn't any checkbox associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
297
|
+
raise "There isn't any choice available for the current checkbox (#{field_slug}) on instance (#{self.class.name} ##{self.id})." unless field_setting.choices.any?
|
|
298
|
+
obj_array = []
|
|
299
|
+
obj.choices.order('label').each do |o|
|
|
300
|
+
obj_array << { label: o.label, value: o.value }
|
|
301
|
+
end
|
|
302
|
+
return obj_array
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# Check if has related components
|
|
306
|
+
#
|
|
307
|
+
# @param field_slug [string] The slug of the field setting
|
|
308
|
+
# @return [boolean]
|
|
309
|
+
def has_related_components(field_slug)
|
|
310
|
+
obj = self.relations.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
311
|
+
raise ArgumentError, "There isn't any related field associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
312
|
+
return obj.dependent_relations.any?
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# Alias for has_related_components
|
|
316
|
+
def has_dependent_components(field_slug)
|
|
317
|
+
has_related_components(field_slug)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# Get related components
|
|
321
|
+
#
|
|
322
|
+
# @param field_slug [string] The slug of the field setting
|
|
323
|
+
# @return [array] An array of components
|
|
324
|
+
def get_related_components(field_slug)
|
|
325
|
+
obj = self.relations.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
326
|
+
raise ArgumentError, "There isn't any related field associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
327
|
+
return obj.dependent_relations.map{|relation| relation.dependent}
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
# Alias for get_related_components
|
|
331
|
+
def get_dependent_components(field_slug)
|
|
332
|
+
get_related_components(field_slug)
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
# Get all components which owns a relation where the current instance is a dependent
|
|
336
|
+
#
|
|
337
|
+
# @param field_slug [string] The slug of the field setting of the relation
|
|
338
|
+
# @return [array] An array of components and/or boards
|
|
339
|
+
def get_owner_components(field_slug)
|
|
340
|
+
# obj = self.owner_relations.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
341
|
+
obj = Relation.where(field_setting_id: B.get_field_settings(field_slug)).includes(dependent_relations: :dependent).where(binda_relation_links: {dependent_type: self.class.name})
|
|
342
|
+
raise ArgumentError, "There isn't any relation associated to the current slug (#{field_slug}) where the current instance (#{self.class.name} ##{self.id}) is a dependent.", caller if obj.nil?
|
|
343
|
+
return obj
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
# Check if has related boards
|
|
347
|
+
#
|
|
348
|
+
# @param field_slug [string] The slug of the field setting
|
|
349
|
+
# @return [boolean]
|
|
350
|
+
def has_related_boards(field_slug)
|
|
351
|
+
obj = self.relations.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
|
|
352
|
+
raise ArgumentError, "There isn't any related field associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
353
|
+
return obj.dependent_relations.any?
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
# Get related boards
|
|
357
|
+
#
|
|
358
|
+
# @param field_slug [string] The slug of the field setting
|
|
359
|
+
# @return [array] An array of boards
|
|
360
|
+
def get_related_boards(field_slug)
|
|
361
|
+
obj = self.relations.find{ |t| t.field_setting_idid == FieldSetting.get_id( field_slug ) }
|
|
362
|
+
raise ArgumentError, "There isn't any related field associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller if obj.nil?
|
|
363
|
+
return obj.dependent_relations.map{|relation| relation.dependent}
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
end
|