binda 0.0.3 → 0.0.5

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -29
  3. data/Rakefile +16 -10
  4. data/app/assets/javascripts/binda/components/form_item.js +12 -1
  5. data/app/assets/javascripts/binda/components/form_item_asset.js +1 -0
  6. data/app/assets/javascripts/binda/components/form_item_choice.js +58 -0
  7. data/app/assets/javascripts/binda/components/form_item_editor.js +39 -0
  8. data/app/assets/javascripts/binda/components/form_item_repeater.js +7 -0
  9. data/app/assets/javascripts/binda/components/sortable.js +0 -1
  10. data/app/assets/javascripts/binda/dist/binda.bundle.js +175 -8
  11. data/app/assets/javascripts/binda/index.js +4 -0
  12. data/app/assets/stylesheets/binda/components/form_item.scss +64 -2
  13. data/app/controllers/binda/application_controller.rb +2 -10
  14. data/app/controllers/binda/choices_controller.rb +19 -0
  15. data/app/controllers/binda/components_controller.rb +38 -134
  16. data/app/controllers/binda/field_groups_controller.rb +18 -30
  17. data/app/controllers/binda/structures_controller.rb +6 -6
  18. data/app/controllers/concerns/binda/component_controller_helper.rb +16 -0
  19. data/app/models/binda/checkbox.rb +7 -0
  20. data/app/models/binda/choice.rb +11 -0
  21. data/app/models/binda/component.rb +12 -136
  22. data/app/models/binda/field_group.rb +1 -1
  23. data/app/models/binda/field_setting.rb +40 -8
  24. data/app/models/binda/radio.rb +5 -0
  25. data/app/models/binda/repeater.rb +11 -79
  26. data/app/models/binda/select.rb +7 -0
  27. data/app/models/binda/structure.rb +13 -13
  28. data/app/models/concerns/binda/component_model_helper.rb +170 -0
  29. data/app/views/binda/components/_form_item_new_repeater.html.erb +3 -5
  30. data/app/views/binda/components/_form_item_selectable.html.erb +72 -0
  31. data/app/views/binda/components/_form_section.html.erb +7 -2
  32. data/app/views/binda/components/_form_section_repeater.html.erb +10 -0
  33. data/app/views/binda/field_groups/_form_item.html.erb +54 -26
  34. data/app/views/binda/field_groups/_form_item_choice.erb +96 -0
  35. data/app/views/binda/field_groups/_form_section.html.erb +2 -2
  36. data/app/views/binda/field_groups/_form_section_repeater.html.erb +2 -2
  37. data/config/locales/en.yml +7 -0
  38. data/config/routes.rb +2 -1
  39. data/db/migrate/1_create_binda_tables.rb +17 -0
  40. data/lib/binda/engine.rb +6 -0
  41. data/lib/binda/version.rb +1 -1
  42. data/lib/generators/binda/install/install_generator.rb +6 -8
  43. data/lib/generators/binda/setup/setup_generator.rb +8 -4
  44. metadata +66 -42
  45. data/app/controllers/binda/dates_controller.rb +0 -62
  46. data/app/controllers/binda/texts_controller.rb +0 -62
  47. data/app/views/binda/dates/_form.html.erb +0 -22
  48. data/app/views/binda/dates/edit.html.erb +0 -6
  49. data/app/views/binda/dates/index.html.erb +0 -27
  50. data/app/views/binda/dates/new.html.erb +0 -5
  51. data/app/views/binda/dates/show.html.erb +0 -9
  52. data/app/views/binda/repeaters/_form.html.erb +0 -27
  53. data/app/views/binda/repeaters/edit.html.erb +0 -6
  54. data/app/views/binda/repeaters/index.html.erb +0 -29
  55. data/app/views/binda/repeaters/new.html.erb +0 -5
  56. data/app/views/binda/repeaters/show.html.erb +0 -14
  57. data/app/views/binda/structures/add_child.html.erb +0 -0
  58. data/app/views/binda/texts/_form.html.erb +0 -22
  59. data/app/views/binda/texts/edit.html.erb +0 -6
  60. data/app/views/binda/texts/index.html.erb +0 -27
  61. data/app/views/binda/texts/new.html.erb +0 -5
  62. data/app/views/binda/texts/show.html.erb +0 -9
@@ -1,31 +1,31 @@
1
1
  module Binda
2
- class Structure < ApplicationRecord
2
+ class Structure < ApplicationRecord
3
3
 
4
- # Associations
5
- has_many :components
6
- has_many :categories
7
- has_many :field_groups
4
+ # Associations
5
+ has_many :components
6
+ has_many :categories
7
+ has_many :field_groups
8
8
 
9
9
  # Validations
10
10
  validates :name, presence: true
11
11
  validates :slug, uniqueness: true
12
12
  accepts_nested_attributes_for :field_groups, allow_destroy: true, reject_if: :is_rejected
13
13
 
14
- # Slug
14
+ # Slug
15
15
  extend FriendlyId
16
16
  friendly_id :name, use: [:slugged, :finders]
17
17
 
18
18
 
19
19
  # CUSTOM METHODS
20
20
  # --------------
21
- # https://github.com/norman/friendly_id/issues/436
22
- def should_generate_new_friendly_id?
23
- slug.blank?
24
- end
21
+ # https://github.com/norman/friendly_id/issues/436
22
+ def should_generate_new_friendly_id?
23
+ slug.blank?
24
+ end
25
25
 
26
26
  def is_rejected( attributes )
27
- attributes['name'].blank?
28
- end
27
+ attributes['name'].blank?
28
+ end
29
29
 
30
- end
30
+ end
31
31
  end
@@ -0,0 +1,170 @@
1
+ module Binda
2
+ module ComponentModelHelper
3
+ #
4
+ # Component helpers are supposed to simplify common operation like
5
+ # retrieving data belonging to the component instance (texts, assets, dates and so on)
6
+
7
+ extend ActiveSupport::Concern
8
+
9
+ # Get the object related to that field setting
10
+ # If the object doesn't exists yet it will return nil
11
+ #
12
+ # @param field_slug [string] The slug of the field setting
13
+ # @return [string] Returns the content of the string/text
14
+ # @return [nil] Returns null if it's empty or it doesn't exists
15
+ def get_text field_slug
16
+ obj = self.texts.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
17
+ obj.content unless obj.nil?
18
+ end
19
+
20
+ # Get the object related to that field setting
21
+ #
22
+ # @param field_slug [string] The slug of the field setting
23
+ # @return [boolean]
24
+ def has_text field_slug
25
+ obj = self.texts.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
26
+ if obj.present?
27
+ return !obj.content.blank?
28
+ else
29
+ return false
30
+ end
31
+ end
32
+
33
+ # Check if the field has an attached image
34
+ #
35
+ # @param field_slug [string] The slug of the field setting
36
+ # @return [boolean]
37
+ def has_image field_slug
38
+ obj = self.assets.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }.image
39
+ return obj.present?
40
+ end
41
+
42
+ # Get the image url based on the size provided,
43
+ # default is Carrierwave default (usually the real size)
44
+ #
45
+ # @param field_slug [string] The slug of the field setting
46
+ # @param size [string] The size. It can be 'thumb' 200x200 cropped,
47
+ # 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
48
+ # @return [string] The url of the image
49
+ def get_image_url field_slug, size = ''
50
+ get_image_info( field_slug, size, 'url' )
51
+ end
52
+
53
+ # Get the image path based on the size provided,
54
+ # default is Carrierwave default (usually the real size)
55
+ #
56
+ # @param field_slug [string] The slug of the field setting
57
+ # @param size [string] The size. It can be 'thumb' 200x200 cropped,
58
+ # 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
59
+ # @return [string] The url of the image
60
+ def get_image_path field_slug, size = ''
61
+ get_image_info( field_slug, size, 'path' )
62
+ end
63
+
64
+ # Get the object related to that field setting
65
+ #
66
+ # @param field_slug [string] The slug of the field setting
67
+ # @param size [string] The size. It can be 'thumb' 200x200 cropped,
68
+ # 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
69
+ # @param info [string] String of the info to be retrieved
70
+ # @return [string] The info requested if present
71
+ # @return [boolean] Returns false if no info is found or if image isn't found
72
+ def get_image_info field_slug, size, info
73
+ obj = self.assets.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
74
+ if obj.image.present?
75
+ if obj.image.respond_to?(size) && %w[thumb medium large].include?(size)
76
+ obj.image.send(size).send(info)
77
+ else
78
+ obj.image.send(info)
79
+ end
80
+ end
81
+ end
82
+
83
+ # Check if the field has an attached date
84
+ #
85
+ # @param field_slug [string] The slug of the field setting
86
+ # @return [datetime] The date
87
+ # @return [boolean] Reutrn false if nothing is found
88
+ def has_date field_slug
89
+ obj = self.dates.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
90
+ if obj.present?
91
+ return !obj.date.nil?
92
+ else
93
+ return false
94
+ end
95
+ end
96
+
97
+ # Get the object related to that field setting
98
+ #
99
+ # @param field_slug [string] The slug of the field setting
100
+ # @return [boolean]
101
+ def get_date field_slug
102
+ obj = self.dates.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
103
+ obj.date unless obj.nil?
104
+ end
105
+
106
+ # Check if exists any repeater with that slug
107
+ #
108
+ # @param field_slug [string] The slug of the field setting
109
+ # @return [boolean]
110
+ def has_repeater field_slug
111
+ obj = self.repeaters.find_all{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
112
+ return obj.present?
113
+ end
114
+
115
+ # Get the all repeater instances
116
+ #
117
+ # @param field_slug [string] The slug of the field setting
118
+ # @return [hash]
119
+ def get_repeater field_slug
120
+ obj = self.repeaters.find_all{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
121
+ obj.sort_by(&:position) unless obj.nil?
122
+ end
123
+
124
+ # Find or create a field by field setting and field type
125
+ # This is used in Binda's form
126
+ #
127
+ # @param field_setting_id [string] The field setting id
128
+ # @param field_type [string] THe field type
129
+ def find_or_create_a_field_by field_setting_id, field_type
130
+ if FieldSetting.get_fieldables.include?( field_type.capitalize ) && field_setting_id.is_a?( Integer )
131
+ self.send( field_type.pluralize ).find_or_create_by( field_setting_id: field_setting_id )
132
+ else
133
+ raise ArgumentError, "One parameter of find_or_create_a_field_by() is not correct.", caller
134
+ end
135
+ end
136
+
137
+ # Get the radio choice
138
+ #
139
+ # If by mistake the Radio instance has many choices associated,
140
+ # only the first one will be retrieved.
141
+ #
142
+ # @param field_slug [string] The slug of the field setting
143
+ # @return [object] The active record object of the selected choice
144
+ def get_radio_choice field_slug
145
+ obj = self.radios.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
146
+ obj.choices.first
147
+ end
148
+
149
+ # Get the select choices
150
+ #
151
+ # @param field_slug [string] The slug of the field setting
152
+ # @return [array] An array containing the selected choices objects
153
+ def get_select_choices field_slug
154
+ # select cannot be chosen has variable name, therefore is prefixed with 's'
155
+ obj = self.selects.find{ |t| t.field_setting_id = FieldSetting.get_id( field_slug ) }
156
+ obj.choices
157
+ end
158
+
159
+ # Get the checkbox choice
160
+ #
161
+ # @param field_slug [string] The slug of the field setting
162
+ # @return [array] The active record object of the selected choice
163
+ def get_checkbox_choices field_slug
164
+ # select cannot be chosen has variable name, therefore is prefixed with '_'
165
+ obj = self.checkboxes.find{ |t| t.field_setting_id = FieldSetting.get_id( field_slug ) }
166
+ obj.choices
167
+ end
168
+
169
+ end
170
+ end
@@ -3,14 +3,12 @@
3
3
  <%# - - - - - - - - - - - - - - %>
4
4
  <%= simple_form_for @component, url: structure_component_path( structure_id: @component.structure.id, id: @component.id ), defaults: { label: false } do |f| %>
5
5
  <!-- SPLIT -->
6
- <% repeater = @component.repeaters.create( field_setting: @repeater_setting ) %>
7
-
8
- <li id="repeater_<%= repeater.id %>">
6
+ <li id="repeater_<%= @repeater.id %>">
9
7
 
10
8
  <%# - - - - - - - - - - - - %>
11
9
  <%# REMOVE BUTTON %>
12
10
  <%# - - - - - - - - - - - - %>
13
- <a class="form-item--delete-repeater-item" href="<%= repeater_path( id: repeater.id ) %>" data-id="<%= repeater.id %>""><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></a>
11
+ <a class="form-item--delete-repeater-item" href="<%= repeater_path( id: @repeater.id ) %>" data-id="<%= @repeater.id %>""><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></a>
14
12
 
15
13
  <%# - - - - - - - - - - - - - - %>
16
14
  <%# FIRST REPEATER %>
@@ -22,7 +20,7 @@
22
20
  <%= ff.input :field_setting_id, as: :hidden, input_html: { value: @repeater_setting.id } %>
23
21
  <%= ff.input :id, as: :hidden, input_html: { value: ff.object.id } %>
24
22
  <% @repeater_setting.children.order( :position ).each do |repeater_setting_child| %>
25
- <%= render "form_section_repeater", f: ff, repeater_setting_child: repeater_setting_child, repeater: repeater %>
23
+ <%= render "form_section_repeater", f: ff, repeater_setting_child: repeater_setting_child, repeater: @repeater %>
26
24
  <% end %>
27
25
  <% end %>
28
26
  </div>
@@ -0,0 +1,72 @@
1
+ <%# HEADING %>
2
+ <h5 class="form-item--<%= field_setting.field_type.underscore %>-caption"><%= field_setting.name.capitalize %></h5>
3
+
4
+ <% unless field_setting.description.blank? %>
5
+ <small class="text-muted"><%= field_setting.description %></small>
6
+ <% end %>
7
+
8
+ <% if field_setting.choices.any? %>
9
+
10
+ <%# - - - - - - - - - - - - %>
11
+ <%# RADIO %>
12
+ <%# - - - - - - - - - - - - %>
13
+ <% if field_setting.field_type === 'radio' %>
14
+ <% current = @component.find_or_create_a_field_by( field_setting.id, 'radio' ) %>
15
+ <%= f.simple_fields_for "radios_attributes[]", current do |ff| %>
16
+ <% if ff.object.choices.any? %>
17
+ <%= ff.input :choice_ids, as: :radio_buttons, collection: field_setting.choices.order(:label), label_method: :label, value_method: :id, checked: ff.object.choices.first.id, include_blank: false %>
18
+ <% else %>
19
+ <%= ff.input :choice_ids, as: :radio_buttons, collection: field_setting.choices.order(:label), label_method: :label, value_method: :id, checked: field_setting.default_choice.id, include_blank: false %>
20
+ <% end %>
21
+ <%= ff.input :field_setting_id, as: :hidden, input_html: { value: field_setting.id } %>
22
+ <%= ff.input :id, as: :hidden, input_html: { value: ff.object.id } %>
23
+ <%= ff.input :fieldable_id, as: :hidden %>
24
+ <%= ff.input :fieldable_type, as: :hidden %>
25
+ <% end %>
26
+
27
+
28
+ <%# - - - - - - - - - - - - %>
29
+ <%# SELECT %>
30
+ <%# - - - - - - - - - - - - %>
31
+ <% elsif field_setting.field_type === 'select' %>
32
+ <% current = @component.find_or_create_a_field_by( field_setting.id, 'select' ) %>
33
+ <%= f.simple_fields_for "selects_attributes[]", current do |ff| %>
34
+ <% if ff.object.choices.any? %>
35
+ <%= ff.input :choice_ids, as: :select, collection: field_setting.choices.order(:label), label_method: :label, value_method: :id, selected: ff.object.choice_ids, include_blank: false %>
36
+ <% else %>
37
+ <%= ff.input :choice_ids, as: :select, collection: field_setting.choices.order(:label), label_method: :label, value_method: :id, selected: field_setting.default_choice.id, include_blank: false %>
38
+ <% end %>
39
+ <%= ff.input :field_setting_id, as: :hidden, input_html: { value: field_setting.id } %>
40
+ <%= ff.input :id, as: :hidden, input_html: { value: ff.object.id } %>
41
+ <%= ff.input :fieldable_id, as: :hidden %>
42
+ <%= ff.input :fieldable_type, as: :hidden %>
43
+ <% end %>
44
+
45
+
46
+ <%# - - - - - - - - - - - - %>
47
+ <%# CHECKBOX %>
48
+ <%# - - - - - - - - - - - - %>
49
+ <% elsif field_setting.field_type === 'checkbox' %>
50
+ <% current = @component.find_or_create_a_field_by( field_setting.id, 'checkbox' ) %>
51
+ <%= f.simple_fields_for "checkboxes_attributes[]", current do |ff| %>
52
+ <% if ff.object.choices.any? %>
53
+ <%= ff.input :choice_ids, as: :check_boxes, collection: field_setting.choices.order(:label), label_method: :label, value_method: :id, checked: ff.object.choice_ids, include_blank: false %>
54
+ <% else %>
55
+ <%= ff.input :choice_ids, as: :check_boxes, collection: field_setting.choices.order(:label), label_method: :label, value_method: :id, checked: field_setting.default_choice.id, include_blank: false %>
56
+ <% end %>
57
+ <%= ff.input :field_setting_id, as: :hidden, input_html: { value: field_setting.id } %>
58
+ <%= ff.input :id, as: :hidden, input_html: { value: ff.object.id } %>
59
+ <%= ff.input :fieldable_id, as: :hidden %>
60
+ <%= ff.input :fieldable_type, as: :hidden %>
61
+ <% end %>
62
+ <% end %>
63
+
64
+ <% else %>
65
+ <p>Sorry, no choice is available.
66
+ <% if current_user.is_superadmin %>
67
+ Please ensure you setup at least two possible choices in the <a href="<%= edit_structure_field_group_path( structure_id: @structure.id, id: field_setting.field_group.id )%>">field group setup</a>.
68
+ <% else %>
69
+ Please contact the administrator.
70
+ <% end %>
71
+ </p>
72
+ <% end %>
@@ -32,6 +32,11 @@
32
32
  <%# REPEATER %>
33
33
  <%# - - - - - - - - - - - - %>
34
34
  <% elsif field_setting.field_type == 'repeater' %>
35
- <% repeaters = @component.repeaters.where( field_setting: field_setting ) %>
35
+ <% repeaters = @component.repeaters.where( field_setting: field_setting ).order('position') %>
36
36
  <%= render 'form_item_repeater', f: f, repeater_setting: field_setting, repeaters: repeaters %>
37
- <% end %>
37
+
38
+
39
+ <% elsif ['radio', 'select', 'checkbox'].include? field_setting.field_type %>
40
+ <%= render 'form_item_selectable', f: f, field_setting: field_setting %>
41
+
42
+ <% end %>
@@ -28,4 +28,14 @@
28
28
  <% end %>
29
29
 
30
30
 
31
+ <%# - - - - - - - - - - - - %>
32
+ <%# RADIO %>
33
+ <%# - - - - - - - - - - - - %>
34
+ <% elsif repeater_setting_child.field_type == 'radio' %>
35
+ <% current = repeater.find_or_create_a_field_by( repeater_setting_child.id, 'radio' ) %>
36
+ <%= f.simple_fields_for "radios_attributes[]", current do |ff| %>
37
+ <%= render 'form_item_radio', ff: ff, field_setting: repeater_setting_child %>
38
+ <% end %>
39
+
40
+
31
41
  <% end %>
@@ -21,42 +21,70 @@
21
21
  <%# - - - - - - - - - - - - %>
22
22
  <%# NAME %>
23
23
  <%# - - - - - - - - - - - - %>
24
- <h5><%= "#{ t :name }".capitalize %></h5>
25
- <%= ff.input :name, as: :string, input_html: { class: "form-item--input" } %>
24
+ <div class="form-item--half-size">
25
+ <h5><%= t(:name).capitalize %></h5>
26
+ <%= ff.input :name, as: :string, input_html: { class: "form-item--input" } %>
27
+ </div>
26
28
 
27
29
 
28
30
  <%# - - - - - - - - - - - - %>
29
- <%# SLUG %>
31
+ <%# FIELD TYPE %>
30
32
  <%# - - - - - - - - - - - - %>
31
- <h5><%= "#{ t :slug }".capitalize %></h5>
32
- <%= ff.input :slug, as: :string, input_html: { class: "form-item--input" } %>
33
+ <div class="form-item--half-size">
34
+ <h5><%= t(:field_type).capitalize %></h5>
35
+ <% if ff.object.field_type.nil? %>
36
+ <%= ff.input :field_type, as: :select, collection: get_field_types, include_blank: false, prompt: t(:select_field_type), input_html: { class: 'form-item--select-input' } %>
37
+ <% else %>
38
+ <%= ff.input :field_type, as: :string, disabled: true, input_html: { class: "form-item--input" } %>
39
+ <% end %>
40
+ </div>
33
41
 
42
+ <% if ff.object.new_record? %>
34
43
 
35
- <%# - - - - - - - - - - - - %>
36
- <%# DESCRIPTION %>
37
- <%# - - - - - - - - - - - - %>
38
- <h5><%= "#{ t :description }".capitalize %></h5>
39
- <%= ff.input :description, input_html: { class: "form-item--input" } %>
40
- <div class="clearfix"></div>
44
+ <%# - - - - - - - - - - - - %>
45
+ <%# SLUG %>
46
+ <%# - - - - - - - - - - - - %>
47
+ <div class="form-item--half-size">
48
+ <%= ff.input :slug, as: :hidden, input_html: { class: "form-item--input" } %>
49
+ </div>
41
50
 
51
+ <% else %>
42
52
 
43
- <%# - - - - - - - - - - - - %>
44
- <%# POSITION %>
45
- <%# - - - - - - - - - - - - %>
46
- <h5><%= "#{ t :position }".capitalize %></h5>
47
- <%= ff.input :position, as: :integer, input_html: { class: "form-item--input" } %>
53
+ <%# - - - - - - - - - - - - %>
54
+ <%# SLUG %>
55
+ <%# - - - - - - - - - - - - %>
56
+ <div class="form-item--half-size">
57
+ <h5><%= t(:slug).capitalize %></h5>
58
+ <%= ff.input :slug, as: :string, input_html: { class: "form-item--input" } %>
59
+ </div>
48
60
 
61
+ <%# - - - - - - - - - - - - %>
62
+ <%# DESCRIPTION %>
63
+ <%# - - - - - - - - - - - - %>
64
+ <div class="form-item--full-size">
65
+ <h5><%= t(:description).capitalize %></h5>
66
+ <%= ff.input :description, input_html: { class: "form-item--input" } %>
67
+ </div>
68
+
69
+ <%# - - - - - - - - - - - - %>
70
+ <%# POSITION %>
71
+ <%# - - - - - - - - - - - - %>
72
+ <div class="form-item--full-size">
73
+ <h5><%= t(:position).capitalize %></h5>
74
+ <%= ff.input :position, as: :integer, input_html: { class: "form-item--input" } %>
75
+ </div>
76
+
77
+ <% choiceables = ['radio', 'select', 'checkbox'] %>
78
+ <% if choiceables.include? ff.object.field_type %>
79
+
80
+ <%# - - - - - - - - - - - - %>
81
+ <%# CHOICES %>
82
+ <%# - - - - - - - - - - - - %>
83
+ <%= render 'form_item_choice', f: f, ff: ff, section: section %>
84
+
85
+ <% end %>
49
86
 
50
- <%# - - - - - - - - - - - - %>
51
- <%# FIELD TYPE %>
52
- <%# - - - - - - - - - - - - %>
53
- <h5><%= "#{ t :field_type }".capitalize %></h5>
54
- <% if ff.object.field_type.nil? %>
55
- <%= ff.input :field_type, as: :select, collection: get_field_types, include_blank: false, prompt: "#{ t :select_field_type}", input_html: { class: 'form-item--select-input' } %>
56
- <% else %>
57
- <%= ff.input :field_type, as: :string, disabled: true, input_html: { class: "form-item--input" } %>
58
87
  <% end %>
88
+ <div class="clearfix"></div>
59
89
 
60
90
  </div>
61
-
62
- <div class="clearfix"></div>
@@ -0,0 +1,96 @@
1
+ <%# - - - - - - - - - - - - %>
2
+ <%# CHOICES %>
3
+ <%# - - - - - - - - - - - - %>
4
+ <h5><%= t(:choices).capitalize %></h5>
5
+ <div class="form-item--choices">
6
+
7
+ <%= ff.simple_fields_for :choices, ff.object.choices.order( :label ) do |fff| %>
8
+ <div class="form-item--choice">
9
+ <%= fff.input :id, as: :hidden %>
10
+ <%= fff.association :field_setting, as: :hidden %>
11
+ <div class="form-item--choice-label">
12
+ <small class="text-muted"><%= t(:choice_label).capitalize %></small>
13
+ <%= fff.input :label %>
14
+ </div>
15
+ <div class="form-item--choice-content">
16
+ <small class="text-muted"><%= t(:choice_value).capitalize %></small>
17
+ <%= fff.input :value %>
18
+ </div>
19
+ <a href="<%= choice_path( fff.object ) %>" class="form-item--delete-choice">
20
+ <span><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></span>
21
+ </a>
22
+ <div class="clearfix"></div>
23
+ </div>
24
+ <% end %>
25
+
26
+ <%# - - - - - - - - - - - - %>
27
+ <%# DEFAULT INITIAL CHOICE %>
28
+ <%# - - - - - - - - - - - - %>
29
+ <% unless ff.object.choices.find_all{|c| c.persisted? }.any? %>
30
+ <%= f.simple_fields_for "new_choices[]", ff.object.choices.build() do |fff| %>
31
+ <div class="form-item--choice">
32
+ <%= fff.association :field_setting, as: :hidden %>
33
+ <div class="form-item--choice-label">
34
+ <small class="text-muted"><%= t(:choice_label).capitalize %></small>
35
+ <%= fff.input :label %>
36
+ </div>
37
+ <div class="form-item--choice-content">
38
+ <small class="text-muted"><%= t(:choice_value).capitalize %></small>
39
+ <%= fff.input :value %>
40
+ </div>
41
+ <a href="#" class="form-item--toggle-choice form-item--js-delete-choice">
42
+ <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
43
+ </a>
44
+ <div class="clearfix"></div>
45
+ </div>
46
+ <% end %>
47
+ <% end %>
48
+
49
+ <%# - - - - - - - - - - - - %>
50
+ <%# NEW CHOICE %>
51
+ <%# - - - - - - - - - - - - %>
52
+ <%= f.simple_fields_for "new_choices[]", ff.object.choices.build() do |fff| %>
53
+ <div class="form-item--choice form-item--new-choice">
54
+ <%= fff.association :field_setting, as: :hidden %>
55
+ <div class="form-item--choice-label">
56
+ <small class="text-muted"><%= t(:choice_label).capitalize %></small>
57
+ <%= fff.input :label %>
58
+ </div>
59
+ <div class="form-item--choice-content">
60
+ <small class="text-muted"><%= t(:choice_value).capitalize %></small>
61
+ <%= fff.input :value %>
62
+ </div>
63
+ <a href="#" class="form-item--toggle-choice form-item--js-delete-choice">
64
+ <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
65
+ </a>
66
+ <div class="clearfix"></div>
67
+ </div>
68
+ <% end %>
69
+
70
+ <a href="#" class="form-item--toggle-choice form-item--add-choice">
71
+ <%= t(:add_choice).capitalize %>&nbsp;&nbsp;<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
72
+ </a>
73
+
74
+ </div>
75
+
76
+ <div class="clearfix"></div>
77
+
78
+
79
+ <%# - - - - - - - - - - - - %>
80
+ <%# DEFAULT CHOICE %>
81
+ <%# - - - - - - - - - - - - %>
82
+ <% if ff.object.choices.find_all{|c| c.persisted? }.any? %>
83
+ <div class="form-item--half-size">
84
+ <h5><%= t(:default_choice).capitalize %></h5>
85
+ <%= ff.input :default_choice_id, as: :select, collection: ff.object.choices.find_all{|c| c.persisted? }, label_method: :label, include_blank: false, selected: ff.object.default_choice.id, hint: t(:default_choice_description).capitalize %>
86
+ </div>
87
+ <% end %>
88
+
89
+
90
+ <%# - - - - - - - - - - - - %>
91
+ <%# ALLOW NULL %>
92
+ <%# - - - - - - - - - - - - %>
93
+ <div class="form-item--half-size">
94
+ <h5><%= t(:allow_null).capitalize %></h5>
95
+ <%= ff.input :allow_null, as: :boolean, boolean_style: :inline, input_html: { class: "form-item--input" }, checked_value: true, unchecked_value: false, selected: ff.object.allow_null, default: false %>
96
+ </div>