binda 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -0
  3. data/app/assets/javascripts/binda/components/fileupload.js +19 -0
  4. data/app/assets/javascripts/binda/dist/binda.bundle.js +161 -139
  5. data/app/controllers/binda/svgs_controller.rb +71 -0
  6. data/app/controllers/concerns/binda/fieldable_helpers.rb +48 -20
  7. data/app/models/binda/binda.rb +7 -0
  8. data/app/models/binda/field_setting.rb +8 -6
  9. data/app/models/binda/image.rb +2 -2
  10. data/app/models/binda/svg.rb +7 -0
  11. data/app/models/concerns/binda/fieldable_association_helpers.rb +10 -454
  12. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_audio_helpers.rb +55 -0
  13. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_date_helpers.rb +30 -0
  14. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_image_helpers.rb +95 -0
  15. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_relation_helpers.rb +68 -0
  16. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_repeater_helpers.rb +32 -0
  17. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_selection_helpers.rb +60 -0
  18. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_string_helpers.rb +56 -0
  19. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_svg_helpers.rb +74 -0
  20. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_text_helpers.rb +59 -0
  21. data/app/models/concerns/binda/fieldable_association_helpers/fieldable_video_helpers.rb +56 -0
  22. data/app/models/concerns/binda/fieldable_associations.rb +4 -2
  23. data/app/uploaders/binda/svg_uploader.rb +62 -0
  24. data/app/views/binda/fieldable/_form_item_svg.html.erb +33 -0
  25. data/app/views/binda/fieldable/_form_item_video.html.erb +9 -8
  26. data/app/views/binda/fieldable/_form_section.html.erb +1 -1
  27. data/app/views/binda/structures/form_section/_form_section_header.html.erb +1 -1
  28. data/config/initializers/simple_form__fileupload.rb +14 -9
  29. data/config/initializers/simple_form_custom.rb +1 -1
  30. data/config/locales/en.yml +1 -0
  31. data/config/routes.rb +5 -0
  32. data/db/migrate/1_create_binda_tables.rb +1 -0
  33. data/lib/binda/version.rb +1 -1
  34. data/lib/generators/binda/setup/setup_generator.rb +5 -1
  35. data/lib/tasks/update_image_details_task.rake +1 -1
  36. metadata +17 -2
@@ -0,0 +1,59 @@
1
+ module Binda
2
+ module FieldableAssociationHelpers
3
+ module FieldableTextHelpers
4
+
5
+ extend ActiveSupport::Concern
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 = Text
14
+ .includes(:field_setting)
15
+ .where(fieldable_id: self.id, fieldable_type: self.class.name)
16
+ .where(binda_field_settings: { slug: field_slug })
17
+ .where.not(binda_field_settings: { field_type: "string" })
18
+ .first
19
+ unless obj.nil?
20
+ # to_s ensures the returned object is class String
21
+ obj.content.to_s
22
+ else
23
+ check_text_error field_slug
24
+ end
25
+ end
26
+
27
+ # Check why get_text doesn't return a value
28
+ # This method isn't supposed to be used by anything other than get_text method
29
+ def check_text_error(field_slug)
30
+ you_mean_string = !self.strings.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) && t.type == 'Binda::String' }.nil?
31
+ if you_mean_string
32
+ 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
33
+ else
34
+ raise ArgumentError, "There isn't any text associated to the current slug (#{field_slug}) on instance (#{self.class.name} ##{self.id}).", caller
35
+ end
36
+ end
37
+
38
+ # Get the object related to that field setting
39
+ #
40
+ # @param field_slug [string] The slug of the field setting
41
+ # @return [boolean]
42
+ def has_text(field_slug)
43
+ obj = Text
44
+ .includes(:field_setting)
45
+ .where(fieldable_id: self.id, fieldable_type: self.class.name)
46
+ .where(binda_field_settings: { slug: field_slug })
47
+ .where.not(binda_field_settings: { field_type: "string" })
48
+ .first
49
+ 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?
50
+ if obj.present?
51
+ return !obj.content.nil?
52
+ else
53
+ return false
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,56 @@
1
+ module Binda
2
+ module FieldableAssociationHelpers
3
+ module FieldableVideoHelpers
4
+
5
+ # Check if the field has an attached video
6
+ #
7
+ # @param field_slug [string] The slug of the field setting
8
+ # @return [boolean]
9
+ def has_video(field_slug)
10
+ obj = self.videos.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
11
+ # Alternative query
12
+ # obj = Image.where(field_setting_id: FieldSetting.get_id( field_slug ), fieldable_id: self.id, fieldable_type: self.class.to_s ).first
13
+ 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?
14
+ return obj.video.present?
15
+ end
16
+
17
+ # Get the video url based on the size provided,
18
+ # default is Carrierwave default (usually the real size)
19
+ #
20
+ # @param field_slug [string] The slug of the field setting
21
+ # @param size [string] The size. It can be 'thumb' 200x200 cropped,
22
+ # 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
23
+ # @return [string] The url of the video
24
+ def get_video_url(field_slug)
25
+ get_video_info( field_slug, 'url' )
26
+ end
27
+
28
+ # Get the video path based on the size provided,
29
+ # default is Carrierwave default (usually the real size)
30
+ #
31
+ # @param field_slug [string] The slug of the field setting
32
+ # @param size [string] The size. It can be 'thumb' 200x200 cropped,
33
+ # 'medium' 700x700 max size, 'large' 1400x1400 max size, or blank
34
+ # @return [string] The url of the video
35
+ def get_video_path(field_slug)
36
+ get_video_info( field_slug, 'path' )
37
+ end
38
+
39
+ # Get the object related to that field setting
40
+ #
41
+ # @param field_slug [string] The slug of the field setting
42
+ # @param info [string] String of the info to be retrieved
43
+ # @return [string] The info requested if present
44
+ # @return [boolean] Returns false if no info is found or if image isn't found
45
+ def get_video_info(field_slug, info)
46
+ obj = self.videos.find{ |t| t.field_setting_id == FieldSetting.get_id( field_slug ) }
47
+ # Alternative query
48
+ # obj = video.where(field_setting_id: FieldSetting.get_id( field_slug ), fieldable_id: self.id, fieldable_type: self.class.to_s ).first
49
+ 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?
50
+ if obj.video.present?
51
+ obj.video.send(info)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -29,9 +29,10 @@ module Binda
29
29
  has_many :radios, as: :fieldable, dependent: :delete_all
30
30
  has_many :selections, as: :fieldable, dependent: :delete_all
31
31
  has_many :checkboxes, as: :fieldable, dependent: :delete_all
32
+ has_many :svgs, as: :fieldable, dependent: :delete_all
32
33
  # Repeaters need destroy_all, not delete_all
33
34
  has_many :repeaters, as: :fieldable, dependent: :destroy
34
- has_many :relations, as: :fieldable, dependent: :destroy
35
+ has_many :relations, as: :fieldable, dependent: :destroy
35
36
 
36
37
 
37
38
  has_many :owner_relations, class_name: "RelationLink",
@@ -53,7 +54,7 @@ module Binda
53
54
  source: :owner
54
55
 
55
56
 
56
- accepts_nested_attributes_for :texts, :strings, :dates, :assets, :images, :videos, :audios, :galleries, :repeaters, :radios, :selections, :checkboxes, :relations, allow_destroy: true
57
+ accepts_nested_attributes_for :texts, :strings, :dates, :assets, :images, :videos, :audios, :galleries, :repeaters, :radios, :selections, :checkboxes, :relations, :svgs, allow_destroy: true
57
58
 
58
59
  validates_associated :texts
59
60
  validates_associated :strings
@@ -67,6 +68,7 @@ module Binda
67
68
  validates_associated :selections
68
69
  validates_associated :checkboxes
69
70
  validates_associated :relations
71
+ validates_associated :svgs
70
72
 
71
73
  after_save :generate_fields
72
74
 
@@ -0,0 +1,62 @@
1
+ module Binda
2
+ class SvgUploader < CarrierWave::Uploader::Base
3
+ # Include RMagick or MiniMagick support:
4
+ # include CarrierWave::RMagick
5
+ # include CarrierWave::MiniMagick
6
+
7
+ # Choose what kind of storage to use for this uploader:
8
+ # storage :file
9
+ # storage :fog
10
+
11
+ # Override the directory where uploaded files will be stored.
12
+ # This is a sensible default for uploaders that are meant to be mounted:
13
+ def store_dir
14
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
15
+ end
16
+
17
+ process :register_details
18
+
19
+ def register_details
20
+ if file && model
21
+ model.content_type = file.content_type if file.content_type
22
+ model.file_size = file.size
23
+ end
24
+ end
25
+
26
+ # Provide a default URL as a default if there hasn't been a file uploaded:
27
+ # def default_url(*args)
28
+ # # For Rails 3.1+ asset pipeline compatibility:
29
+ # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
30
+ #
31
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
32
+ # end
33
+
34
+ # Process files as they are uploaded:
35
+ # process scale: [200, 300]
36
+ #
37
+ # def scale(width, height)
38
+ # # do something
39
+ # end
40
+
41
+ # Create different versions of your uploaded files:
42
+ # version :thumb do
43
+ # process resize_to_fit: [50, 50]
44
+ # end
45
+
46
+
47
+ # Add a white list of extensions which are allowed to be uploaded.
48
+ # For images you might use something like this:
49
+ # def extension_whitelist
50
+ # %w(jpg jpeg gif png)
51
+ # end
52
+ def extension_whitelist
53
+ %w(svg)
54
+ end
55
+
56
+ # Override the filename of the uploaded files:
57
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
58
+ # def filename
59
+ # "something.jpg" if original_filename
60
+ # end
61
+ end
62
+ end
@@ -0,0 +1,33 @@
1
+ <div id="standard-form--image-<%= field_setting.id %>" class="standard-form--image form-item">
2
+ <div id="fileupload-<%= ff.object.id %>"
3
+ class="fileupload form-group"
4
+ data-message="<%= t('binda.upload_loading_message') %>"
5
+ data-error="<%= t('binda.upload_error_message')%>">
6
+ <p class="control-label">
7
+ <%= field_setting.name %>
8
+ </p>
9
+ <% image = ff.object.image.thumb.url if ff.object.image.present? %>
10
+ <div class="fileupload--field">
11
+ <%= ff.input :svg,
12
+ label: "<i class=\"fa fa-upload\" aria-hidden=\"true\"></i> #{t('binda.choose_file_button')}".html_safe,
13
+ hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
14
+ url: url_for([ff.object, action: :remove_svg]).html_safe,
15
+ object: ff.object,
16
+ wrapper: false,
17
+ input_html: {
18
+ 'data-url': url_for([
19
+ @instance.structure,
20
+ @instance,
21
+ action: :upload,
22
+ repeater: { id: "#{field_setting.parent_id}" }]),
23
+ 'data-id': ff.object.id
24
+ } %>
25
+ </div>
26
+ <%= ff.input :svg_cache, as: :hidden %>
27
+ <%= ff.input :field_setting_id, as: :hidden, input_html: { value: field_setting.id } %>
28
+ <%= ff.input :id, as: :hidden, input_html: { value: ff.object.id } %>
29
+ <%= ff.input :fieldable_id, as: :hidden %>
30
+ <%= ff.input :fieldable_type, as: :hidden %>
31
+ <div class="clearfix"></div>
32
+ </div>
33
+ </div>
@@ -7,19 +7,20 @@
7
7
  <p class="control-label"><%= field_setting.name %></p>
8
8
 
9
9
  <div class="fileupload--field">
10
-
11
- <%= ff.input :video,
10
+ <%= ff.input :video,
12
11
  label: "<i class=\"fa fa-upload\" aria-hidden=\"true\"></i> #{t('binda.choose_file_button')}".html_safe,
13
12
  hint: field_setting.description.nil? ? false : field_setting.description.html_safe,
14
13
  url: url_for([ff.object, action: :remove_video]).html_safe,
15
14
  object: ff.object,
16
15
  wrapper: false,
17
- input_html: {
18
- class: 'form-item--video--uploader',
19
- 'data-url': url_for([@instance.structure, @instance, action: :upload]),
20
- 'data-id': ff.object.id,
21
- } %>
22
-
16
+ input_html: {
17
+ class: 'form-item--video--uploader',
18
+ 'data-url': url_for([
19
+ @instance.structure,
20
+ @instance,
21
+ action: :upload]),
22
+ 'data-id': ff.object.id,
23
+ } %>
23
24
  </div>
24
25
 
25
26
  <%= ff.input :video_cache, as: :hidden %>
@@ -1,4 +1,4 @@
1
- <% if %w(text string date image video audio relation).include? field_setting.field_type %>
1
+ <% if %w(text string date image video audio relation svg).include? field_setting.field_type %>
2
2
  <% current = @instance.find_or_create_a_field_by( field_setting.id, field_setting.field_type) %>
3
3
  <%= f.simple_fields_for "#{field_setting.field_type}s_attributes[]", current do |ff| %>
4
4
  <%= render "binda/fieldable/form_item_#{field_setting.field_type}", f: f, ff: ff, field_setting: field_setting %>
@@ -18,7 +18,7 @@
18
18
  data-id="<%= f.object.id %>"
19
19
  data-params="id=<%= f.object.id %>">
20
20
  <i class="fa fa-plus" aria-hidden="true"></i>
21
- <%= t('binda.field_setting.new') %>
21
+ <%= t('binda.field_group.new') %>
22
22
  </a>
23
23
  <p class="control-label clearfix">
24
24
  <%= f.object.name %> <%= t('binda.field_group.plural') %>
@@ -17,6 +17,8 @@ module SimpleForm
17
17
  html << " fileupload--preview--uploaded"
18
18
  elsif options[:object].audio.present?
19
19
  html << " fileupload--preview--uploaded fileupload--preview--hidden"
20
+ elsif options[:object].svg.present?
21
+ html << " fileupload--preview--uploaded\" style=\"background-image: url(#{options[:object].svg.url})"
20
22
  end
21
23
 
22
24
  # Add no-preview text
@@ -54,7 +56,7 @@ module SimpleForm
54
56
  obj = options[:object]
55
57
  url = options[:url]
56
58
  html = '<a class="b-btn b-btn-outline-danger fileupload--remove-image-btn'
57
- html << ' fileupload--remove-image-btn--hidden' unless obj.image.present? || obj.video.present? || obj.audio.present?
59
+ html << ' fileupload--remove-image-btn--hidden' unless obj.image.present? || obj.video.present? || obj.audio.present? || obj.svg.present?
58
60
  html << '" href="'
59
61
  html << url
60
62
  html << '" data-method="delete" data-remote="true" data-confirm="'
@@ -81,32 +83,35 @@ module SimpleForm
81
83
  obj = options[:object]
82
84
 
83
85
  html = '<div class="fileupload--details'
84
- html << ' fileupload--details--hidden' unless obj.image.present? || obj.video.present? || obj.audio.present?
86
+ html << ' fileupload--details--hidden' unless obj.image.present? || obj.video.present? || obj.audio.present? || obj.svg.present?
85
87
  html << '"><p class="fileupload--name">'
86
88
  html << "<strong>#{t 'binda.filename'}:</strong> "
87
89
  html << '<span class="fileupload--filename">'
88
90
  html << File.basename(obj.image.path).to_s if obj.image.present?
89
91
  html << File.basename(obj.video.path).to_s if obj.video.present?
90
92
  html << File.basename(obj.audio.path).to_s if obj.audio.present?
93
+ html << File.basename(obj.svg.path).to_s if obj.svg.present?
91
94
  html << '</span></p>'
92
95
  html << '<p class="fileupload--size">'
93
96
  html << "<strong>#{t 'binda.filesize'}:</strong> "
94
97
  html << '<span class="fileupload--filesize">'
95
98
  html << bytes_to_megabytes(obj.file_size).to_s unless obj.file_size.blank?
96
99
  html << 'MB</span></p>'
97
- html << '<p class="fileupload--dimension">'
98
- html << "<strong>#{t 'binda.filedimension'}:</strong> "
99
- html << '<span class="fileupload--width">'
100
- html << obj.file_width.round.to_s unless obj.file_width.blank?
101
- html << '</span> x <span class="fileupload--height">'
102
- html << obj.file_height.round.to_s unless obj.file_height.blank?
103
- html << '</span> px</p>'
100
+ html << '<p class="fileupload--dimension">' unless obj.svg.present?
101
+ html << "<strong>#{t 'binda.filedimension'}:</strong> " unless obj.svg.present?
102
+ html << '<span class="fileupload--width">' unless obj.svg.present?
103
+ html << obj.file_width.round.to_s unless obj.file_width.blank? unless obj.svg.present?
104
+ html << '</span> x <span class="fileupload--height">' unless obj.svg.present?
105
+ html << obj.file_height.round.to_s unless obj.file_height.blank? || obj.svg.present?
106
+ html << '</span> px</p>' unless obj.svg.present?
104
107
  html << '<p class="fileupload--previewlink"><a href="'
105
108
  html << obj.video.url if obj.video.present?
106
109
  html << obj.audio.url if obj.audio.present?
110
+ html << obj.svg.url if obj.svg.present?
107
111
  html << '" target="_blank"><i class="fas fa-external-link-alt"></i> <strong>'
108
112
  html << t('binda.filevideolink') if obj.class.name.demodulize == 'Video'
109
113
  html << t('binda.fileaudiolink') if obj.class.name.demodulize == 'Audio'
114
+ html << t('binda.filesvglink') if obj.class.name.demodulize == 'Svg'
110
115
  html << '</strong></a></p>'
111
116
 
112
117
  html << '</div>'
@@ -119,7 +119,7 @@ SimpleForm.setup do |config|
119
119
  b.optional :maxlength
120
120
  b.optional :readonly
121
121
 
122
- b.use :preview
122
+ b.use :preview
123
123
  b.wrapper tag: 'div', class: 'fileupload--dashboard' do |bb|
124
124
  bb.use :label, class: 'control-label b-btn b-btn-primary', wrap_with: { tag: 'div', class: 'control-label-wrap' }
125
125
  bb.use :delete_button
@@ -59,6 +59,7 @@ en:
59
59
  filedimension: Dimension
60
60
  filevideolink: Preview video
61
61
  fileaudiolink: Preview audio
62
+ filesvglink: Preview svg
62
63
  select_placeholder: Select a option
63
64
  new_item_in_repeater: New %{arg1} item
64
65
  null_is_not_allowed: You need to select at least one choice
@@ -85,6 +85,11 @@ Binda::Engine.routes.draw do
85
85
  delete 'remove_image'
86
86
  end
87
87
  end
88
+ resources :svgs do
89
+ member do
90
+ delete 'remove_svg'
91
+ end
92
+ end
88
93
  resources :repeaters
89
94
 
90
95
  end
@@ -91,6 +91,7 @@ class CreateBindaTables < ActiveRecord::Migration[5.0]
91
91
  t.string :video
92
92
  t.string :image
93
93
  t.string :audio
94
+ t.string :svg
94
95
  t.belongs_to :field_setting
95
96
  t.references :fieldable, polymorphic: true, index: true
96
97
  t.string :content_type
@@ -1,3 +1,3 @@
1
1
  module Binda
2
- VERSION = '0.1.7'.freeze
2
+ VERSION = '0.1.8'.freeze
3
3
  end
@@ -15,7 +15,11 @@ module Binda
15
15
  puts "Implement Binda settings"
16
16
  puts
17
17
 
18
- dashboard_structure = Structure.find_or_create_by( name: 'dashboard', slug: 'dashboard', instance_type: 'board' )
18
+ if Structure.find_by(slug: 'dashboard').nil?
19
+ dashboard_structure = Structure.create!(name: 'dashboard', slug: 'dashboard', instance_type: 'board')
20
+ else
21
+ dashboard_structure = Structure.find_by(slug: 'dashboard')
22
+ end
19
23
  @dashboard = dashboard_structure.board
20
24
 
21
25
  # By default each structure has a field group which will be used to store the default field settings
@@ -2,7 +2,7 @@ namespace :binda do
2
2
  desc "Update all images with file details"
3
3
  task :update_image_details => :environment do
4
4
  Binda::Image.all.each do |image|
5
- image.register_deatils
5
+ image.register_details
6
6
  end
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alessandro Barbieri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-06 00:00:00.000000000 Z
11
+ date: 2018-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -680,6 +680,7 @@ files:
680
680
  - app/controllers/binda/manage/users_controller.rb
681
681
  - app/controllers/binda/repeaters_controller.rb
682
682
  - app/controllers/binda/structures_controller.rb
683
+ - app/controllers/binda/svgs_controller.rb
683
684
  - app/controllers/binda/users/audios_controller.rb
684
685
  - app/controllers/binda/users/confirmations_controller.rb
685
686
  - app/controllers/binda/users/omniauth_callbacks_controller.rb
@@ -708,6 +709,7 @@ files:
708
709
  - app/models/binda/asset.rb
709
710
  - app/models/binda/audio.rb
710
711
  - app/models/binda/b.rb
712
+ - app/models/binda/binda.rb
711
713
  - app/models/binda/board.rb
712
714
  - app/models/binda/category.rb
713
715
  - app/models/binda/checkbox.rb
@@ -726,6 +728,7 @@ files:
726
728
  - app/models/binda/selection.rb
727
729
  - app/models/binda/string.rb
728
730
  - app/models/binda/structure.rb
731
+ - app/models/binda/svg.rb
729
732
  - app/models/binda/text.rb
730
733
  - app/models/binda/user.rb
731
734
  - app/models/binda/video.rb
@@ -733,10 +736,21 @@ files:
733
736
  - app/models/concerns/binda/deprecations.rb
734
737
  - app/models/concerns/binda/field_uniqueness.rb
735
738
  - app/models/concerns/binda/fieldable_association_helpers.rb
739
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_audio_helpers.rb
740
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_date_helpers.rb
741
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_image_helpers.rb
742
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_relation_helpers.rb
743
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_repeater_helpers.rb
744
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_selection_helpers.rb
745
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_string_helpers.rb
746
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_svg_helpers.rb
747
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_text_helpers.rb
748
+ - app/models/concerns/binda/fieldable_association_helpers/fieldable_video_helpers.rb
736
749
  - app/models/concerns/binda/fieldable_associations.rb
737
750
  - app/models/concerns/binda/fields.rb
738
751
  - app/uploaders/binda/audio/audio_uploader.rb
739
752
  - app/uploaders/binda/image/image_uploader.rb
753
+ - app/uploaders/binda/svg_uploader.rb
740
754
  - app/uploaders/binda/video/video_uploader.rb
741
755
  - app/views/binda/assets/_form.html.erb
742
756
  - app/views/binda/assets/edit.html.erb
@@ -787,6 +801,7 @@ files:
787
801
  - app/views/binda/fieldable/_form_item_repeater.html.erb
788
802
  - app/views/binda/fieldable/_form_item_selections.html.erb
789
803
  - app/views/binda/fieldable/_form_item_string.html.erb
804
+ - app/views/binda/fieldable/_form_item_svg.html.erb
790
805
  - app/views/binda/fieldable/_form_item_text.html.erb
791
806
  - app/views/binda/fieldable/_form_item_video.html.erb
792
807
  - app/views/binda/fieldable/_form_section.html.erb