effective_bootstrap 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6159bfe9bf5e58af814e2d446ee907d3a456a54b
4
- data.tar.gz: 2b232d59b9e6904c6b6358e07631294673a0fa78
3
+ metadata.gz: 0b2267dfe1d4e1eff1fb5aac89a0d5d20d78c621
4
+ data.tar.gz: b89a7d646b1b77b61a5733d4e5b8cc8738cf1565
5
5
  SHA512:
6
- metadata.gz: 9111638ac3d4eb19d1ed5b2abd43404300f88af4925460c6fca5980b66e2337d6cdf9c245a6378207fa6c3d809509134c9d264b58f3b40d3c5cec7f65ed16a53
7
- data.tar.gz: ade79312e2e0c17f9eabbeff7a2ce2f954b068e0cab86e2d63b9b478f6b97fda4ab96019f47504b17ea0814ba9476a52a732f74947ccab56a164b7c870f02e64
6
+ metadata.gz: 9377c256b2b8bc038b2a2d4cc5212e4e0cd788fbce62ecb5ac7f72fdcf7ea7d129890b3e4518a53c2ce48a61718c1fa6e391ce24b011bb9f269168626ce235a1
7
+ data.tar.gz: f781c96aecfd3666bb8885f32f832a9fc204a6d3d2e1f76ad3eaddae6e07d3d6bdcd4c4837e4b051381dbd36af4f3e3b86b7388930c562ae810158dd6c21008d
@@ -1,4 +1,5 @@
1
1
  this.EffectiveBootstrap ||= new class
2
+ current_submit: '' # The $(.form-actions) that clicked
2
3
  remote_form_payload: '' # A fresh form
3
4
  remote_form_flash: '' # Array of Arrays
4
5
 
@@ -17,41 +18,36 @@ this.EffectiveBootstrap ||= new class
17
18
  $element.addClass('initialized')
18
19
 
19
20
  validate: (form) ->
20
- $form = $(form)
21
-
22
- @reset($form)
23
-
24
21
  valid = form.checkValidity()
22
+ $form = $(form)
25
23
 
26
- if valid
27
- $form.addClass('form-is-valid')
28
- setTimeout((-> EffectiveBootstrap.disable($form)), 0)
29
- else
30
- $form.addClass('was-validated').addClass('form-is-invalid')
31
-
32
- $('.effective-radios:not(.no-feedback),.effective-checks:not(.no-feedback)').each -> # These controls need a little bit of help with client side validations
33
- $(@).addClass(if $(@).find('input:invalid').length > 0 then 'is-invalid' else 'is-valid')
34
-
35
- @flash($form, 'danger')
36
-
37
- if valid and $form.data('remote')
38
- $form.one 'ajax:success', (event) -> EffectiveBootstrap.loadRemoteForm($(event.target))
39
-
40
- $form.one 'ajax:error', (event, _, status, message) ->
41
- EffectiveBootstrap.reset($(event.target))
42
- EffectiveBootstrap.flash($(event.target), 'danger', "Ajax #{status}: #{message}")
24
+ @clearFlash()
25
+ @reset($form) if $form.hasClass('was-validated')
43
26
 
27
+ if valid then @submitting($form) else @invalidate($form)
44
28
  valid
45
29
 
46
30
  submitting: ($form) ->
47
31
  $form.addClass('form-is-valid').removeClass('form-is-invalid')
48
- @disable($form)
32
+ @spin()
33
+ setTimeout((-> EffectiveBootstrap.disable($form)), 0)
34
+
35
+ invalidate: ($form) ->
36
+ $form.addClass('was-validated').addClass('form-is-invalid')
37
+ $form.find('.form-current-submit').removeClass('form-current-submit')
38
+
39
+ # These controls need a little bit of help with client side validations
40
+ $form.find('.effective-radios:not(.no-feedback),.effective-checks:not(.no-feedback)').each ->
41
+ $(@).addClass(if $(@).find('input:invalid').length > 0 then 'is-invalid' else 'is-valid')
42
+
43
+ @flash($form, 'danger')
49
44
 
50
45
  disable: ($form) ->
51
46
  $form.find('[type=submit]').prop('disabled', true)
52
47
 
53
48
  reset: ($form) ->
54
49
  $form.removeClass('was-validated').removeClass('form-is-invalid').removeClass('form-is-valid')
50
+ $form.find('.form-current-submit').removeClass('form-current-submit')
55
51
 
56
52
  # Clear any server side validation on individual inputs
57
53
  $form.find('.alert.is-invalid').remove()
@@ -60,29 +56,48 @@ this.EffectiveBootstrap ||= new class
60
56
 
61
57
  $form.find('[type=submit]').removeAttr('disabled')
62
58
 
63
- flash: ($form, status, message, skip_success = false) ->
64
- $actions = $form.children('.form-actions')
59
+ spin: -> @current_submit.addClass('form-current-submit') if @current_submit.length > 0
65
60
 
66
- if status == 'danger' || status == 'error'
67
- $actions.find('.eb-icon-x').show().delay(1000).fadeOut('slow')
68
- else
69
- $actions.find('.eb-icon-check').show().delay(1000).fadeOut('slow')
61
+ beforeAjax: ($form) ->
62
+ return unless $form.data('remote')
70
63
 
71
- if message? && !(status == 'success' && skip_success)
72
- $actions.prepend(@buildFlash(status, message))
64
+ $form.one 'ajax:success', (event, thing, another) ->
65
+ EffectiveBootstrap.loadFromAjax($(event.target), $(event.target).data('method') == 'delete')
66
+
67
+ $form.one 'ajax:error', (event, _, status, message) ->
68
+ EffectiveBootstrap.reset($(event.target))
69
+ EffectiveBootstrap.flash($(event.target), 'danger', "Ajax #{status}: #{message}")
73
70
 
74
71
  # Loads remote for payload that was placed here by effective_resources create.js.erb and update.js.erb
75
- loadRemoteForm: ($target) ->
76
- if @remote_form_payload?
72
+ loadFromAjax: ($target, was_delete) ->
73
+ $target = $target.closest('form') unless $target.is('form')
74
+
75
+ if @remote_form_payload.length > 0
77
76
  $form = @remote_form_payload.find("form[data-remote-index='#{$target.data('remote-index')}']")
78
77
  $form = @remote_form_payload.find('form') if $form.length == 0
79
78
  $target.replaceWith($form)
80
79
 
81
- if @remote_form_flash?
82
- for flash in @remote_form_flash
83
- @flash($form, flash[0], flash[1], true)
80
+ # We update the current submit to point to the new one.
81
+ unless was_delete
82
+ if @current_submit.length > 0
83
+ @current_submit = $form.find("##{@current_submit.attr('id')}.form-actions")
84
+
85
+ if @remote_form_flash.length > 0 && was_delete == false
86
+ for flash in @remote_form_flash
87
+ @flash($form, flash[0], flash[1], true)
88
+
89
+ @remote_form_payload = ''; @remote_form_flash = ''; @current_submit = '';
90
+
91
+ flash: ($form, status, message, skip_success = false) ->
92
+ if status == 'danger' || status == 'error'
93
+ @current_submit.find('.eb-icon-x').show().delay(1000).fadeOut('slow')
94
+ else
95
+ @current_submit.find('.eb-icon-check').show().delay(1000).fadeOut('slow')
84
96
 
85
- @remote_form_payload = ''; @remote_form_flash = '';
97
+ if message? && !(status == 'success' && skip_success)
98
+ @current_submit.prepend(@buildFlash(status, message))
99
+
100
+ clearFlash: -> @current_submit.find('.alert').remove() if @current_submit.length > 0
86
101
 
87
102
  buildFlash: (status, message) ->
88
103
  $("
@@ -94,9 +109,20 @@ this.EffectiveBootstrap ||= new class
94
109
  </div>
95
110
  ")
96
111
 
112
+ setCurrentSubmit: ($submit) -> @current_submit = $submit if $submit.is('.form-actions')
113
+
97
114
  $ -> EffectiveBootstrap.initialize()
98
115
  $(document).on 'turbolinks:load', -> EffectiveBootstrap.initialize()
99
116
  $(document).on 'cocoon:after-insert', -> EffectiveBootstrap.initialize()
100
117
  $(document).on 'effective-bootstrap:initialize', (event) -> EffectiveBootstrap.initialize(event.currentTarget)
101
118
 
102
- $(document).on 'ajax:beforeSend', 'form[data-remote]', -> this.checkValidity()
119
+ # Sets EffectiveBootstrap. current_click.
120
+ # This displays the spinner here, and directs any flash messages before and after loadRemoteForm
121
+ $(document).on 'click', '.form-actions a[data-remote],.form-actions button[type=submit]', (event) ->
122
+ EffectiveBootstrap.setCurrentSubmit($(@).parent())
123
+ EffectiveBootstrap.spin()
124
+
125
+ # This actually attached the handlers to a remote ajax form when it or an action inside it triggers a remote thing.
126
+ $(document).on 'ajax:beforeSend', 'form[data-remote]', (event) ->
127
+ EffectiveBootstrap.beforeAjax($(@))
128
+ this.checkValidity()
@@ -6,32 +6,50 @@
6
6
 
7
7
  .alert {
8
8
  position: absolute;
9
- top: -4.0em;
9
+ top: 4.0em;
10
+ }
11
+ }
12
+
13
+ .form-actions-inline.justify-content-end {
14
+ margin-left: 0.5em;
15
+
16
+ svg {
17
+ position: absolute;
18
+ left: -1.6em;
19
+ }
20
+ }
21
+
22
+ .form-actions-inline.justify-content-start {
23
+ margin-right: 0.5em;
24
+
25
+ svg {
26
+ position: absolute;
27
+ right: -1.6em;
10
28
  }
11
29
  }
12
30
 
13
31
  .form-actions-bordered {
14
32
  border-top: solid 1px #eee;
15
- margin-top: 1rem;
33
+ margin-top: 1em;
16
34
 
17
- > * { margin-top: 1rem; }
35
+ > a,button { margin-top: 1em; }
18
36
  }
19
37
 
20
38
  .form-actions.justify-content-start {
21
- > * { margin-right: 0.5rem; }
39
+ > a,button { margin-right: 0.5em; }
22
40
  }
23
41
 
24
42
  .form-actions.justify-content-end {
25
- > * { margin-left: 0.5rem; }
43
+ > a,button { margin-left: 0.5em; }
26
44
  }
27
45
 
28
46
  .form-actions.justify-content-center {
29
- > * { margin-left: 0.5rem; }
47
+ > a,button { margin-left: 0.5em; }
30
48
  }
31
49
 
32
50
  // Spinner
33
51
  .form-actions .eb-icon-spinner { display: none; }
34
- .form-is-valid .form-actions .eb-icon-spinner { display: inline; }
52
+ .form-actions.form-current-submit .eb-icon-spinner { display: inline; }
35
53
 
36
54
  // Radio and Checkbox fieldsets
37
55
  fieldset.form-group > label {
@@ -36,6 +36,11 @@ module Effective
36
36
  Effective::FormInputs::DatetimeField.new(name, options, builder: self).to_html { super(name, options) }
37
37
  end
38
38
 
39
+ def delete(name = 'Remove', url = nil, options = {}, &block)
40
+ options[:href] ||= url
41
+ Effective::FormInputs::Delete.new(name, options, builder: self).to_html(&block)
42
+ end
43
+
39
44
  def email_field(name, options = {})
40
45
  Effective::FormInputs::EmailField.new(name, options, builder: self).to_html { super(name, options) }
41
46
  end
@@ -348,7 +348,7 @@ module Effective
348
348
  "#{sanitized_object_name}_#{index}_#{sanitized_method_name}"
349
349
  else
350
350
  "#{sanitized_object_name}_#{sanitized_method_name}"
351
- end
351
+ end.downcase.parameterize
352
352
  end
353
353
 
354
354
  def sanitized_object_name
@@ -0,0 +1,87 @@
1
+ module Effective
2
+ module FormInputs
3
+ class Delete < Effective::FormInput
4
+
5
+ def to_html(&block)
6
+ return super unless (form_readonly? || form_disabled?)
7
+ end
8
+
9
+ def build_input(&block)
10
+ tags = [
11
+ icon('check', style: 'display: none;'),
12
+ icon('x', style: 'display: none;'),
13
+ icon('spinner'),
14
+ (block_given? ? capture(&block) : content_tag(:a, name, options[:input]))
15
+ ]
16
+
17
+ (left? ? tags.reverse.join : tags.join).html_safe
18
+ end
19
+
20
+ def label_options
21
+ false
22
+ end
23
+
24
+ def wrapper_options
25
+ @right = true unless (left? || center? || right?)
26
+
27
+ classes = [
28
+ ('row' if layout == :horizontal),
29
+ 'form-group form-actions',
30
+ ('form-actions-inline' if inline?),
31
+ ('form-actions-bordered' if border?),
32
+ ('justify-content-start' if left? && layout == :vertical),
33
+ ('justify-content-center' if center? && layout == :vertical),
34
+ ('justify-content-end' if right? && layout == :vertical)
35
+ ].compact.join(' ')
36
+
37
+ { class: classes, id: tag_id }
38
+ end
39
+
40
+ def input_html_options
41
+ { class: 'btn btn-warning', data: { method: :delete, remote: true, confirm: "Delete #{object}?"} }
42
+ end
43
+
44
+ def border?
45
+ false
46
+ end
47
+
48
+ def inline?
49
+ return @form_actions_inline unless @form_actions_inline.nil?
50
+ @form_actions_inline = (options.delete(:inline) || false)
51
+ end
52
+
53
+ def left?
54
+ return @left unless @left.nil?
55
+ @left = (options.delete(:left) || false)
56
+ end
57
+
58
+ def center?
59
+ return @center unless @center.nil?
60
+ @center = (options.delete(:center) || false)
61
+ end
62
+
63
+ def right?
64
+ return @right unless @right.nil?
65
+ @right = (options.delete(:right) || false)
66
+ end
67
+
68
+ def feedback_options
69
+ # case layout
70
+ # when :inline
71
+ # false
72
+ # else
73
+ # {
74
+ # valid: { class: 'valid-feedback', text: 'Looks good! Submitting...' },
75
+ # invalid: {
76
+ # class: 'invalid-feedback',
77
+ # text: 'one or more errors are present. please fix the errors above and try again.'
78
+ # }
79
+ # }
80
+ # end
81
+ false
82
+ end
83
+
84
+
85
+ end
86
+ end
87
+ end
@@ -2,23 +2,12 @@ module Effective
2
2
  module FormInputs
3
3
  class FormGroup < Effective::FormInput
4
4
 
5
- def input_html_options
6
- if layout == :horizontal
7
- { class: 'form-group col-sm-10' }
8
- else
9
- { class: 'form-group' }
10
- end
5
+ def build_input(&block)
6
+ content_tag(:label, (name || '&nbsp;').html_safe) + capture(&block)
11
7
  end
12
8
 
13
- def to_html(&block)
14
- case layout
15
- when :horizontal
16
- build_wrapper do
17
- content_tag(:div, '', class: 'col-sm-2') + content_tag(:div, capture(&block), options[:input])
18
- end
19
- else
20
- content_tag(:div, capture(&block), options[:input])
21
- end
9
+ def feedback_options
10
+ false
22
11
  end
23
12
 
24
13
  end
@@ -23,13 +23,14 @@ module Effective
23
23
  classes = [
24
24
  ('row' if layout == :horizontal),
25
25
  'form-group form-actions',
26
+ ('form-actions-inline' if inline?),
26
27
  ('form-actions-bordered' if border?),
27
28
  ('justify-content-start' if left? && layout == :vertical),
28
29
  ('justify-content-center' if center? && layout == :vertical),
29
30
  ('justify-content-end' if right? && layout == :vertical)
30
31
  ].compact.join(' ')
31
32
 
32
- { class: classes }
33
+ { class: classes, id: tag_id }
33
34
  end
34
35
 
35
36
  def input_html_options
@@ -47,6 +48,12 @@ module Effective
47
48
  @border = options.key?(:border) ? options.delete(:border) : true
48
49
  end
49
50
 
51
+ # Changes the svg feedback to use position absolute.
52
+ def inline?
53
+ return @form_actions_inline unless @form_actions_inline.nil?
54
+ @form_actions_inline = (options.delete(:inline) || false)
55
+ end
56
+
50
57
  def left?
51
58
  return @left unless @left.nil?
52
59
  @left = (options.delete(:left) || false)
@@ -1,3 +1,3 @@
1
1
  module EffectiveBootstrap
2
- VERSION = '0.0.8'.freeze
2
+ VERSION = '0.0.9'.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.8
4
+ version: 0.0.9
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-04-19 00:00:00.000000000 Z
11
+ date: 2018-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -419,6 +419,7 @@ files:
419
419
  - app/models/effective/form_inputs/collection_input.rb
420
420
  - app/models/effective/form_inputs/date_field.rb
421
421
  - app/models/effective/form_inputs/datetime_field.rb
422
+ - app/models/effective/form_inputs/delete.rb
422
423
  - app/models/effective/form_inputs/email_field.rb
423
424
  - app/models/effective/form_inputs/error_field.rb
424
425
  - app/models/effective/form_inputs/file_field.rb