effective_bootstrap 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d7367fb7474dfca0f7165fcadcfc835d664755d3
4
- data.tar.gz: 8bcfa8b07527f1099faffd7c6b5b224e17a8e6b5
3
+ metadata.gz: 45cba1fb03f24d07e64c2d042661ff15fbd05b12
4
+ data.tar.gz: ce40e7151a4b92853b547d2e799dd4cc9f95a365
5
5
  SHA512:
6
- metadata.gz: 0549d3278a3c6da7f1cf42c84ec034982369bed739394be1757dce7e1e312c79330525ad5fb089a0c2cc63f396564827b337d7da9ec1f61c76782794e64ddaee
7
- data.tar.gz: cd8bfd58f6be013f6dd8fbb39ec6869d9f07c7147c25af2d1c8919f7a001d1ffd6b36deae4496f242c5c3139427e4f39f4bc2855f2a3bbbcc6c672846c071a12
6
+ metadata.gz: 06a31a9005d368b42d51185e8bf6fa66f5807fdeacfe7264eef6369dd9fb33111600d228f1f3ee0ee19c881936538572a6a8405b20e8f6aa1e785093da771f7c
7
+ data.tar.gz: e1571762f4706f6618c70e1e53a2c55b49da87d3b09092e86a96e1320d7e49876436b23e20bfd188c98b8af4172154d25f079db86e5a8f06020607a9e4dcf622
@@ -4,6 +4,8 @@
4
4
  //= require ./effective_date/input
5
5
  //= require ./effective_time/input
6
6
 
7
+ //= require ./effective_file/input
7
8
  //= require ./effective_phone/input
8
9
  //= require ./effective_price/input
9
10
  //= require ./effective_select/input
11
+
@@ -25,6 +25,7 @@ this.EffectiveBootstrap ||= new class
25
25
 
26
26
  if valid
27
27
  $form.addClass('form-is-valid').removeClass('form-is-invalid')
28
+ setTimeout((-> $('button[type=submit],input[type=submit]').prop('disabled', true)), 0)
28
29
  else
29
30
  $form.addClass('was-validated').addClass('form-is-invalid').removeClass('form-is-valid')
30
31
 
@@ -35,3 +36,4 @@ $(document).on 'turbolinks:load', -> EffectiveBootstrap.initialize()
35
36
  $(document).on 'cocoon:after-insert', -> EffectiveBootstrap.initialize()
36
37
  $(document).on 'effective-bootstrap:initialize', (event) -> EffectiveBootstrap.initialize(event.currentTarget)
37
38
 
39
+ $(document).on 'ajax:beforeSend', 'form[data-remote]', -> this.checkValidity()
@@ -0,0 +1,17 @@
1
+ $(document).on 'direct-upload:initialize', (event) ->
2
+ $target = $(event.target)
3
+ template = $target.data('progress-template').replace('$ID$', event.detail.id).replace('$FILENAME$', event.detail.file.name)
4
+ $target.siblings('.uploads').append(template)
5
+
6
+ $(document).on 'direct-upload:start', (event) ->
7
+ $("[data-direct-upload-id=#{event.detail.id}]").removeClass('direct-upload--pending')
8
+
9
+ $(document).on 'direct-upload:progress', (event) ->
10
+ $("[data-direct-upload-id=#{event.detail.id}]").children('.direct-upload__progress').css('width', "#{event.detail.progress}%")
11
+
12
+ $(document).on 'direct-upload:error', (event) ->
13
+ $("[data-direct-upload-id=#{event.detail.id}]").addClass('direct-upload--error').attr('title', event.detail.error)
14
+
15
+ $(document).on 'direct-upload:end', (event) ->
16
+ $("[data-direct-upload-id=#{event.detail.id}]").addClass('direct-upload--complete')
17
+
@@ -0,0 +1 @@
1
+ //= require ./initialize
@@ -1,8 +1,9 @@
1
1
  @import 'effective_bootstrap/base';
2
- @import 'effective_bootstrap/icons';
3
2
 
4
3
  @import 'effective_datetime/input';
5
4
  @import 'effective_date/input';
6
5
  @import 'effective_time/input';
7
6
 
7
+ @import 'effective_file/input';
8
8
  @import 'effective_select/input';
9
+ @import 'effective_radio/input';
@@ -1,11 +1,3 @@
1
- .was-validated.form-is-valid .form-actions {
2
- .valid-feedback { display: block; }
3
- }
1
+ @import './forms';
2
+ @import './icons';
4
3
 
5
- .was-validated.form-is-invalid .form-actions {
6
- .invalid-feedback { display: block; }
7
- }
8
-
9
- fieldset.form-group > label {
10
- display: block;
11
- }
@@ -0,0 +1,33 @@
1
+ // Submit buttons
2
+ .form-actions {
3
+ border-top: solid 1px #eee;
4
+ margin-top: 1rem;
5
+
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: flex-end;
9
+
10
+ > * { margin-top: 1rem; }
11
+ }
12
+
13
+ // Spinner
14
+ .form-actions .eb-icon-spinner { display: none; }
15
+ .form-is-valid .form-actions .eb-icon-spinner { display: inline; }
16
+
17
+ // Custom submit button feedback
18
+ .was-validated.form-is-valid .form-actions {
19
+ .valid-feedback { display: block; }
20
+ }
21
+
22
+ .was-validated.form-is-invalid .form-actions {
23
+ .invalid-feedback { display: block; }
24
+ }
25
+
26
+ // Radio and Checkbox fieldsets
27
+ fieldset.form-group > label {
28
+ display: block;
29
+ }
30
+
31
+ div.form-group > label + .btn-group {
32
+ display: block;
33
+ }
@@ -0,0 +1,40 @@
1
+ .direct-uploads {
2
+ }
3
+
4
+ .direct-upload {
5
+ display: inline-block;
6
+ position: relative;
7
+ padding: 2px 4px;
8
+ margin: 0 3px 3px 0;
9
+ border: 1px solid rgba(0, 0, 0, 0.3);
10
+ border-radius: 3px;
11
+ font-size: 11px;
12
+ line-height: 13px;
13
+ }
14
+
15
+ .direct-upload--pending {
16
+ opacity: 0.6;
17
+ }
18
+
19
+ .direct-upload__progress {
20
+ position: absolute;
21
+ top: 0;
22
+ left: 0;
23
+ bottom: 0;
24
+ opacity: 0.2;
25
+ background: #0076ff;
26
+ transition: width 120ms ease-out, opacity 60ms 60ms ease-in;
27
+ transform: translate3d(0, 0, 0);
28
+ }
29
+
30
+ .direct-upload--complete .direct-upload__progress {
31
+ opacity: 0.4;
32
+ }
33
+
34
+ .direct-upload--error {
35
+ border-color: red;
36
+ }
37
+
38
+ input[type=file][data-direct-upload-url][disabled] {
39
+ display: none;
40
+ }
@@ -0,0 +1,4 @@
1
+ div.btn-group > .btn.first-button {
2
+ border-top-left-radius: 0.25rem;
3
+ border-bottom-left-radius: 0.25rem;
4
+ }
@@ -1,7 +1,21 @@
1
1
  // These are overrides from the bootstrap-theme
2
2
 
3
+ .select2-container--bootstrap .select2-selection--single {
4
+ line-height: 1.5;
5
+ height: 38px;
6
+ }
7
+
8
+ .select2-container--bootstrap .select2-selection--multiple {
9
+ line-height: 1.5;
10
+ min-height: 38px;
11
+ }
12
+
13
+ .select2-container--bootstrap .select2-selection {
14
+ font-size: 1rem;
15
+ }
16
+
3
17
  .select2-container .select2-selection--single .select2-selection__rendered {
4
- margin: 0 0 0 5px;
18
+ margin: 0 0 0 0.5rem;
5
19
  }
6
20
 
7
21
  .select2-container--bootstrap .select2-selection--single .select2-selection__clear {
@@ -1,9 +1,18 @@
1
1
  module EffectiveFormBuilderHelper
2
2
  def effective_form_with(**options, &block)
3
3
  options[:class] = [options[:class], 'needs-validation', ('form-inline' if options[:layout] == :inline)].compact.join(' ')
4
+ options[:html] = (options[:html] || {}).merge(novalidate: true, onsubmit: 'return EffectiveBootstrap.validate(this);')
5
+
6
+ if options.delete(:remote) == true
7
+ if options[:html][:data].kind_of?(Hash)
8
+ options[:html][:data][:remote] = true
9
+ else
10
+ options[:html]['data-remote'] = true
11
+ end
12
+ end
4
13
 
5
14
  without_error_proc do
6
- form_with(**options.merge(builder: Effective::FormBuilder, html: { novalidate: true, onsubmit: 'return EffectiveBootstrap.validate(this);' }), &block)
15
+ form_with(**options.merge(builder: Effective::FormBuilder), &block)
7
16
  end
8
17
  end
9
18
 
@@ -14,7 +14,7 @@ module EffectiveIconsHelper
14
14
  end
15
15
 
16
16
  def show_icon_to(path, options = {})
17
- icon_to('eye-open', path, { title: 'Show' }.merge(options))
17
+ icon_to('eye', path, { title: 'Show' }.merge(options))
18
18
  end
19
19
 
20
20
  def edit_icon_to(path, options = {})
@@ -39,6 +39,10 @@ module Effective
39
39
  end
40
40
  alias_method :errors, :error
41
41
 
42
+ def file_field(name, options = {})
43
+ Effective::FormInputs::FileField.new(name, options, builder: self).to_html { super(name, options) }
44
+ end
45
+
42
46
  def form_group(name = nil, options = {}, &block)
43
47
  Effective::FormInputs::FormGroup.new(name, options, builder: self).to_html(&block)
44
48
  end
@@ -61,6 +65,10 @@ module Effective
61
65
  Effective::FormInputs::PriceField.new(name, options, builder: self).to_html { super(name, options) }
62
66
  end
63
67
 
68
+ def save(name = 'Save', options = {})
69
+ Effective::FormInputs::Save.new(name, options, builder: self).to_html { super(name, options) }
70
+ end
71
+
64
72
  def select(name, choices = nil, *args)
65
73
  options = args.extract_options!.merge!(collection: choices)
66
74
  Effective::FormInputs::Select.new(name, options, builder: self).to_html
@@ -197,6 +197,14 @@ module Effective
197
197
  object.public_send(name) if object.respond_to?(name)
198
198
  end
199
199
 
200
+ def unique_id(item = nil)
201
+ if item && item.respond_to?(value_method)
202
+ item_value = (item.send(value_method).to_s.parameterize.presence rescue nil)
203
+ end
204
+
205
+ [tag_id, item_value, object_id].compact.join('_')
206
+ end
207
+
200
208
  private
201
209
 
202
210
  # Here we split them into { wrapper: {}, label: {}, hint: {}, input: {} }
@@ -228,11 +236,7 @@ module Effective
228
236
  label = merge_defaults!(label, label_options)
229
237
  hint = merge_defaults!(hint, hint_options)
230
238
 
231
- # Merge input_html: {}, defaults, and add all class: keys together
232
- input.merge!(input_html.except(:class))
233
- merge_defaults!(input, input_html_options.except(:class))
234
- input[:class] = [input[:class], input_html[:class], input_html_options[:class]].compact.join(' ')
235
-
239
+ merge_defaults!(input.merge!(input_html), input_html_options)
236
240
  merge_defaults!(input_js, input_js_options)
237
241
 
238
242
  if input_js.present?
@@ -291,7 +295,6 @@ module Effective
291
295
  end
292
296
 
293
297
  # https://github.com/rails/rails/blob/master/actionview/lib/action_view/helpers/tags/base.rb#L120
294
- # Not 100% sure best way to generate this
295
298
  def tag_id(index = nil)
296
299
  case
297
300
  when @builder.object_name.empty?
@@ -6,9 +6,7 @@ module Effective
6
6
  case layout
7
7
  when :horizontal
8
8
  build_wrapper do
9
- content_tag(:div, '', class: 'col-sm-2') + content_tag(:div, class: 'col-sm-10') do
10
- build_content(&block)
11
- end
9
+ content_tag(:div, '', class: 'col-sm-2') + content_tag(:div, build_content(&block), class: 'col-sm-10')
12
10
  end
13
11
  else
14
12
  build_content(&block)
@@ -16,9 +14,7 @@ module Effective
16
14
  end
17
15
 
18
16
  def build_content(&block)
19
- build_check_box_wrap {
20
- build_input(&block) + build_label + build_feedback + build_hint
21
- }
17
+ build_check_box_wrap { build_input(&block) + build_label + build_feedback + build_hint }
22
18
  end
23
19
 
24
20
  def build_check_box_wrap(&block)
@@ -39,9 +35,9 @@ module Effective
39
35
 
40
36
  def input_html_options
41
37
  if custom?
42
- { class: 'custom-control-input' }
38
+ { class: 'custom-control-input', id: unique_id }
43
39
  else
44
- { class: 'form-check-input' }
40
+ { class: 'form-check-input', id: unique_id }
45
41
  end
46
42
  end
47
43
 
@@ -45,7 +45,8 @@ module Effective
45
45
  end
46
46
 
47
47
  def build_item(builder)
48
- build_item_wrap { builder.check_box + builder.label(item_label_options) }
48
+ item_id = unique_id(builder.object)
49
+ build_item_wrap { builder.check_box(id: item_id) + builder.label(item_label_options.merge(for: item_id)) }
49
50
  end
50
51
 
51
52
  def build_item_wrap(&block)
@@ -17,16 +17,16 @@ module Effective
17
17
  @grouped = (options.delete(:grouped) || false)
18
18
  end
19
19
 
20
- def inline? # default false
21
- return @inline unless @inline.nil?
22
- @inline = (options[:input].delete(:inline) == true)
23
- end
24
-
25
20
  def custom? # default true
26
21
  return @custom unless @custom.nil?
27
22
  @custom = (options.delete(:custom) != false)
28
23
  end
29
24
 
25
+ def inline? # default false
26
+ return @inline unless @inline.nil?
27
+ @inline = (options[:input].delete(:inline) == true)
28
+ end
29
+
30
30
  def collection_options
31
31
  return @collection_options unless @collection_options.nil?
32
32
 
@@ -127,7 +127,7 @@ module Effective
127
127
  name.to_s.sub('_id', '') + '_id'
128
128
  end
129
129
 
130
- def polymorphic_value(obj)
130
+ def polymorphic_value
131
131
  "#{object.class.model_name}_#{object.id}" if object
132
132
  end
133
133
 
@@ -0,0 +1,62 @@
1
+ module Effective
2
+ module FormInputs
3
+ class FileField < Effective::FormInput
4
+
5
+ def build_input(&block)
6
+ build_attachments + build_uploads + super
7
+ end
8
+
9
+ def input_html_options
10
+ { class: 'form-control-file', multiple: multiple?, direct_upload: true, 'data-progress-template': progress_template }
11
+ end
12
+
13
+ def multiple?
14
+ name.to_s.pluralize == name.to_s
15
+ end
16
+
17
+ def build_attachments
18
+ return ''.html_safe unless object.respond_to?(name) && object.send(name).respond_to?(:attached?) && object.send(name).attached?
19
+
20
+ attachments = object.send(name).respond_to?(:length) ? object.send(name) : [object.send(name)]
21
+
22
+ content_tag(:div, attachments.map { |attachment| build_attachment(attachment) }.join.html_safe, class: 'attachments row')
23
+ end
24
+
25
+ def build_attachment(attachment)
26
+ url = @template.url_for(attachment)
27
+
28
+ content_tag(:div, class: 'col-3') do
29
+ content_tag(:div, class: 'card mb-3') do
30
+ if attachment.image?
31
+ content_tag(:img, '', class: 'card-img-top', src: url, alt: attachment.filename.to_s) +
32
+ content_tag(:div, class: 'card-body') do
33
+ link_to(attachment.filename, url, class: 'card-link')
34
+ end
35
+ else
36
+ content_tag(:div, class: 'card-body') do
37
+ content_tag(:p, link_to(attachment.filename, url, class: 'card-link'), class: 'card-text') +
38
+ content_tag(:p, class: 'card-text') do
39
+ (attachment.content_type + '<br>' + @template.number_to_human_size(attachment.byte_size)).html_safe
40
+ end
41
+ end
42
+
43
+ end.html_safe
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ def build_uploads
50
+ content_tag(:div, '', class: 'uploads')
51
+ end
52
+
53
+ def progress_template
54
+ content_tag(:div, class: 'direct-upload direct-upload--pending', 'data-direct-upload-id': '$ID$') do
55
+ content_tag(:div, '', class: 'direct-upload__progress', style: 'width: 0%') +
56
+ content_tag(:span, '$FILENAME$', class: 'direct-upload__filename')
57
+ end
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -19,12 +19,12 @@ module Effective
19
19
 
20
20
  def price
21
21
  return (include_blank? ? 0 : nil) unless value
22
- value.kind_of?(Integer) ? value : ('%.2f' % (val / 100.0))
22
+ value.kind_of?(Integer) ? value : ('%.2f' % (value / 100.0))
23
23
  end
24
24
 
25
25
  def currency
26
26
  return (include_blank? ? 0.00 : nil) unless value
27
- value.kind_of?(Integer) ? ('%.2f' % (val / 100.0)) : value
27
+ value.kind_of?(Integer) ? ('%.2f' % (value / 100.0)) : value
28
28
  end
29
29
 
30
30
  def include_blank? # default false
@@ -3,15 +3,27 @@ module Effective
3
3
  module FormInputs
4
4
  class Radios < CollectionInput
5
5
 
6
+ def build_wrapper(&block)
7
+ tag = buttons? ? :div : :fieldset
8
+
9
+ if layout == :horizontal
10
+ content_tag(tag, content_tag(:div, yield, class: 'row'), options[:wrapper])
11
+ else
12
+ content_tag(tag, yield, options[:wrapper])
13
+ end
14
+ end
15
+
6
16
  def build_input(&block)
7
- @builder.collection_radio_buttons(name, options_collection, value_method, label_method, collection_options, item_input_options) { |builder| build_item(builder) }
17
+ build_button_group do
18
+ @builder.collection_radio_buttons(name, options_collection, value_method, label_method, collection_options, item_input_options) { |builder| build_item(builder) }
19
+ end
8
20
  end
9
21
 
10
- def build_wrapper(&block)
11
- if layout == :horizontal
12
- content_tag(:fieldset, content_tag(:div, yield, class: 'row'), options[:wrapper])
22
+ def build_button_group(&block)
23
+ if buttons?
24
+ content_tag(:div, yield, id: button_group_id, class: 'btn-group btn-group-toggle', 'data-toggle': 'buttons')
13
25
  else
14
- content_tag(:fieldset, yield, options[:wrapper])
26
+ yield
15
27
  end
16
28
  end
17
29
 
@@ -29,7 +41,9 @@ module Effective
29
41
  end
30
42
 
31
43
  def input_html_options
32
- if custom?
44
+ if buttons?
45
+ { autocomplete: 'off' }
46
+ elsif custom?
33
47
  { class: 'custom-control-input' }
34
48
  else
35
49
  { class: 'form-check-input' }
@@ -40,13 +54,29 @@ module Effective
40
54
  return BLANK if options[:label] == false
41
55
  return BLANK if name.kind_of?(NilClass)
42
56
 
57
+ tag = (buttons? || inline?) ? :label : :legend
43
58
  text = (options[:label].delete(:text) || (object.class.human_attribute_name(name) if object) || BLANK).html_safe
44
59
 
45
- content_tag((inline? ? :label : :legend), text, options[:label])
60
+ if buttons?
61
+ content_tag(:label, text, options[:label].merge(for: button_group_id))
62
+ elsif inline?
63
+ content_tag(:label, text, options[:label])
64
+ else
65
+ content_tag(:legend, text, options[:label])
66
+ end
46
67
  end
47
68
 
48
69
  def build_item(builder)
49
- build_item_wrap { builder.radio_button + builder.label(item_label_options) }
70
+ item_id = unique_id(builder.object)
71
+
72
+ if buttons?
73
+ opts = item_label_options.merge(for: item_id)
74
+ opts[:class] = [opts[:class], ('active' if active_item?(builder)), ('first-button' if first_item?) ].compact.join(' ')
75
+
76
+ builder.label(opts) { builder.radio_button(id: item_id) + builder.text }
77
+ else
78
+ build_item_wrap { builder.radio_button(id: item_id) + builder.label(item_label_options.merge(for: item_id)) }
79
+ end
50
80
  end
51
81
 
52
82
  def build_item_wrap(&block)
@@ -58,17 +88,38 @@ module Effective
58
88
  end
59
89
 
60
90
  def item_input_options
61
- options[:input].except(:inline, :custom)
91
+ options[:input].except(:inline, :custom, :buttons)
62
92
  end
63
93
 
64
94
  def item_label_options
65
- if custom?
95
+ if buttons?
96
+ { class: 'btn btn-secondary' }
97
+ elsif custom?
66
98
  { class: 'custom-control-label' }
67
99
  else
68
100
  { class: 'form-check-label' }
69
101
  end
70
102
  end
71
103
 
104
+ def buttons? # default false
105
+ return @buttons unless @buttons.nil?
106
+ @buttons = (options.delete(:buttons) || false)
107
+ end
108
+
109
+ def button_group_id
110
+ "#{tag_id}_btn_group"
111
+ end
112
+
113
+ def first_item?
114
+ return false unless @first_item.nil?
115
+ @first_item = true
116
+ end
117
+
118
+ def active_item?(builder)
119
+ value = self.value || collection_options[:checked]
120
+ value == builder.value || Array(value).map(&:to_s) == Array(builder.value).map(&:to_s)
121
+ end
122
+
72
123
  end
73
124
  end
74
125
  end
@@ -0,0 +1,15 @@
1
+ module Effective
2
+ module FormInputs
3
+ class Save < Effective::FormInput
4
+
5
+ def to_html(&block)
6
+ content_tag(:button, name, options[:input])
7
+ end
8
+
9
+ def input_html_options
10
+ { class: 'btn btn-primary', type: 'submit', name: 'commit', value: name }
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -1,15 +1,15 @@
1
1
  = f.text_field :title, hint: 'This is a text_field'
2
2
  = f.email_field :email, hint: 'This is an email_field'
3
- = f.check_box :archived, hint: 'This is a check_box', id: "archived_#{uid}"
3
+ = f.check_box :archived, hint: 'This is a check_box'
4
4
 
5
5
  = f.datetime_field :start_at, hint: 'This is a linked datetime_field'
6
6
  = f.datetime_field :end_at, hint: 'This is a linked datetime_field'
7
7
  = f.date_field :date, hint: 'This is a date_field'
8
8
  = f.time_field :time, hint: 'This is a time_field'
9
9
 
10
- = f.check_box :option1, inline: true, id: "option1_#{uid}"
11
- = f.check_box :option2, inline: true, id: "option2_#{uid}"
12
- = f.check_box :option3, inline: true, id: "option3_#{uid}"
10
+ = f.check_box :option1, inline: true
11
+ = f.check_box :option2, inline: true
12
+ = f.check_box :option3, inline: true
13
13
 
14
14
  = f.number_field :number, hint: 'This is a number_field'
15
15
  = f.password_field :password, hint: 'This is a password_field'
@@ -35,8 +35,9 @@
35
35
  = f.checks :drink, EffectiveStyleGuide.drinks, custom: false, hint: 'This is a checks with custom: false'
36
36
  = f.checks :color, EffectiveStyleGuide.colors, inline: true, hint: 'This is a checks with inline: true'
37
37
 
38
- = f.radios "food_#{uid}", EffectiveStyleGuide.foods, hint: 'This is a radios'
39
- = f.radios "drink_#{uid}", EffectiveStyleGuide.drinks, custom: false, hint: 'This is a radios with custom: false'
40
- = f.radios "color_#{uid}", EffectiveStyleGuide.colors, inline: true, hint: 'This is a radios with inline: true'
38
+ = f.radios :food, EffectiveStyleGuide.foods, hint: 'This is a radios'
39
+ = f.radios :drink, EffectiveStyleGuide.drinks, custom: false, hint: 'This is a radios with custom: false'
40
+ = f.radios :color, EffectiveStyleGuide.colors, inline: true, hint: 'This is a radios with inline: true'
41
+ = f.radios :food, EffectiveStyleGuide.foods, buttons: true, hint: 'This is a radios with buttons: true'
41
42
 
42
43
  = f.submit
@@ -1,3 +1,3 @@
1
1
  module EffectiveBootstrap
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '0.0.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_bootstrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-23 00:00:00.000000000 Z
11
+ date: 2018-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: coffee-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Everything you need to get set up with bootstrap 4.
56
70
  email:
57
71
  - info@codeandeffect.com
@@ -335,6 +349,8 @@ files:
335
349
  - app/assets/javascripts/effective_datetime/moment.js
336
350
  - app/assets/javascripts/effective_datetime/overrides.js.coffee
337
351
  - app/assets/javascripts/effective_datetime/turbolinks.js.coffee
352
+ - app/assets/javascripts/effective_file/initialize.js.coffee
353
+ - app/assets/javascripts/effective_file/input.js
338
354
  - app/assets/javascripts/effective_phone/initialize.js.coffee
339
355
  - app/assets/javascripts/effective_phone/input.js
340
356
  - app/assets/javascripts/effective_phone/jquery.maskedInput.js
@@ -347,11 +363,14 @@ files:
347
363
  - app/assets/javascripts/effective_time/input.js
348
364
  - app/assets/stylesheets/effective_bootstrap.scss
349
365
  - app/assets/stylesheets/effective_bootstrap/base.scss
366
+ - app/assets/stylesheets/effective_bootstrap/forms.scss
350
367
  - app/assets/stylesheets/effective_bootstrap/icons.scss
351
368
  - app/assets/stylesheets/effective_date/input.scss
352
369
  - app/assets/stylesheets/effective_datetime/bootstrap-datetimepicker.scss
353
370
  - app/assets/stylesheets/effective_datetime/input.scss
354
371
  - app/assets/stylesheets/effective_datetime/overrides.scss
372
+ - app/assets/stylesheets/effective_file/input.scss
373
+ - app/assets/stylesheets/effective_radio/input.scss
355
374
  - app/assets/stylesheets/effective_select/bootstrap-theme.css
356
375
  - app/assets/stylesheets/effective_select/input.scss
357
376
  - app/assets/stylesheets/effective_select/overrides.scss
@@ -370,12 +389,14 @@ files:
370
389
  - app/models/effective/form_inputs/datetime_field.rb
371
390
  - app/models/effective/form_inputs/email_field.rb
372
391
  - app/models/effective/form_inputs/error_field.rb
392
+ - app/models/effective/form_inputs/file_field.rb
373
393
  - app/models/effective/form_inputs/form_group.rb
374
394
  - app/models/effective/form_inputs/number_field.rb
375
395
  - app/models/effective/form_inputs/password_field.rb
376
396
  - app/models/effective/form_inputs/phone_field.rb
377
397
  - app/models/effective/form_inputs/price_field.rb
378
398
  - app/models/effective/form_inputs/radios.rb
399
+ - app/models/effective/form_inputs/save.rb
379
400
  - app/models/effective/form_inputs/select.rb
380
401
  - app/models/effective/form_inputs/static_field.rb
381
402
  - app/models/effective/form_inputs/submit.rb