binda 0.1.7 → 0.1.8

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 (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