effective_bootstrap 0.3.3 → 0.3.4
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 +4 -4
- data/README.md +31 -0
- data/app/assets/javascripts/effective_bootstrap.js +1 -0
- data/app/assets/javascripts/effective_select_or_text/initialize.js.coffee +15 -0
- data/app/assets/javascripts/effective_select_or_text/input.js +1 -0
- data/app/assets/stylesheets/effective_bootstrap.scss +1 -0
- data/app/assets/stylesheets/effective_select_or_text/input.scss +6 -0
- data/app/models/effective/form_builder.rb +5 -0
- data/app/models/effective/form_inputs/select_or_text.rb +56 -0
- data/lib/effective_bootstrap/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 814a553c811fcf629ccae64c8b7600b3c17bd434
|
4
|
+
data.tar.gz: 7582182315089cd457742ec96afec30659ace1f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a27f9df29e5f7e9912c276a139dd43900a73ad374193d3d47de6e7cf3c16be78f94c60eb169c903b7c9351e7e09ad31c231b848ba842b118ed91abfbd1aeba70
|
7
|
+
data.tar.gz: 68aa49cbba726414afba0c9465fa29f333ae1c88420ca5570bdd950b417515297275848d731ad5c2fc26c1cf38c2d1836c7cbb1889d6859acddaabcf587d3823
|
data/README.md
CHANGED
@@ -437,6 +437,37 @@ $(document).on 'change', '.something', (event) ->
|
|
437
437
|
|
438
438
|
There is currently no support for using AJAX to load remote data. This feature is supported by the underlying select2 library and will be implemented here at a future point.
|
439
439
|
|
440
|
+
## Custom select_or_text_field
|
441
|
+
|
442
|
+
This custom form input is unique. It takes in two different field names, one of them a select, the other a text field.
|
443
|
+
|
444
|
+
It enforces an `XOR` between the two fields.
|
445
|
+
|
446
|
+
It's intended for selecting a `belongs_to` or using a freeform text field pattern.
|
447
|
+
|
448
|
+
This custom form input uses no 3rd party jQuery plugins.
|
449
|
+
|
450
|
+
```haml
|
451
|
+
= f.select_or_text_field :post_id, :post_text, Post.all
|
452
|
+
= f.select_or_text_field :post_id, :post_text, Post.all, hint: 'Both select and text field will see this hint'
|
453
|
+
= f.select_or_text_field :post_id, :post_text, Post.all, select: { hint: 'select only options' }, text: { hint: 'text field only options'}
|
454
|
+
```
|
455
|
+
|
456
|
+
The `f.object` should have two separate attributes, `post_id` and `post_text`.
|
457
|
+
|
458
|
+
The javascript form input will enforce XOR, but you can also apply your own validation to also have the same effect as `required: true`
|
459
|
+
|
460
|
+
```
|
461
|
+
class PostSummary < ApplicationRecord
|
462
|
+
validate do
|
463
|
+
unless (post_id.present? ^ post_text.present?) # xor
|
464
|
+
self.errors.add(:post_id, 'please choose either post or post text')
|
465
|
+
self.errors.add(:post_text, 'please choose either post or post text')
|
466
|
+
end
|
467
|
+
end
|
468
|
+
end
|
469
|
+
```
|
470
|
+
|
440
471
|
## Custom submit and save
|
441
472
|
|
442
473
|
The `f.submit` puts in a wrapper and a default save button, and does the whole icon spin when submit thing.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
$(document).on 'click', '[data-effective-select-or-text]', (event) ->
|
2
|
+
$obj = $(event.currentTarget).closest('.effective-select-or-text')
|
3
|
+
|
4
|
+
$visible = $obj.children('.form-group:visible').first()
|
5
|
+
$hidden = $obj.children('.form-group:not(:visible)').first()
|
6
|
+
|
7
|
+
$visible.fadeOut('fast', ->
|
8
|
+
$visible.find('select').val('').trigger('change.select2')
|
9
|
+
$visible.find('input').val('')
|
10
|
+
|
11
|
+
$hidden.slideDown('fast')
|
12
|
+
)
|
13
|
+
|
14
|
+
false
|
15
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require ./initialize
|
@@ -106,6 +106,11 @@ module Effective
|
|
106
106
|
Effective::FormInputs::Select.new(name, options, builder: self).to_html
|
107
107
|
end
|
108
108
|
|
109
|
+
def select_or_text(name, name_text, choices = nil, *args)
|
110
|
+
options = args.extract_options!.merge!(name_text: name_text, collection: choices)
|
111
|
+
Effective::FormInputs::SelectOrText.new(name, options, builder: self).to_html
|
112
|
+
end
|
113
|
+
|
109
114
|
def submit(name = 'Save', options = {}, &block)
|
110
115
|
(options = name; name = 'Save') if name.kind_of?(Hash)
|
111
116
|
Effective::FormInputs::Submit.new(name, options, builder: self).to_html(&block)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Effective
|
2
|
+
module FormInputs
|
3
|
+
class SelectOrText < Effective::FormInput
|
4
|
+
attr_accessor :name_text
|
5
|
+
attr_accessor :select_collection
|
6
|
+
attr_accessor :select_options
|
7
|
+
attr_accessor :text_options
|
8
|
+
|
9
|
+
VISIBLE = {}
|
10
|
+
HIDDEN = { wrapper: { style: 'display: none;' } }
|
11
|
+
|
12
|
+
def initialize(name, options, builder:)
|
13
|
+
@name_text = options.delete(:name_text) || raise('Please include a text method name')
|
14
|
+
@select_collection = options.delete(:collection) || raise('Please include a collection')
|
15
|
+
|
16
|
+
@select_options = { placeholder: 'Please choose, or...', required: false }
|
17
|
+
.merge(options[:select] || options.presence || {})
|
18
|
+
|
19
|
+
@text_options = { placeholder: 'Enter freeform', required: false }
|
20
|
+
.merge(options[:text] || options[:text_field] || options.presence || {})
|
21
|
+
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_html(&block)
|
26
|
+
content_tag(:div, class: 'effective-select-or-text') do
|
27
|
+
@builder.select(name, select_collection, select_options) +
|
28
|
+
@builder.text_field(name_text, text_options) +
|
29
|
+
link_to(icon('rotate-ccw'), '#', class: 'effective-select-or-text-switch', title: 'Switch between choice and freeform', 'data-effective-select-or-text': true)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def select?
|
34
|
+
return true if object.errors[name].present?
|
35
|
+
return false if object.errors[name_text].present?
|
36
|
+
|
37
|
+
object.send(name).present? || (object.send(name).blank? && object.send(name_text).blank?)
|
38
|
+
end
|
39
|
+
|
40
|
+
def text?
|
41
|
+
return false if object.errors[name].present?
|
42
|
+
|
43
|
+
object.send(name_text).present? || object.errors[name_text].present?
|
44
|
+
end
|
45
|
+
|
46
|
+
def select_options
|
47
|
+
@select_options.merge(select? ? VISIBLE : HIDDEN)
|
48
|
+
end
|
49
|
+
|
50
|
+
def text_options
|
51
|
+
@text_options.merge(text? ? VISIBLE : HIDDEN)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
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.3.
|
4
|
+
version: 0.3.4
|
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-12-
|
11
|
+
date: 2018-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -401,6 +401,8 @@ files:
|
|
401
401
|
- app/assets/javascripts/effective_select/input.js
|
402
402
|
- app/assets/javascripts/effective_select/overrides.js.coffee
|
403
403
|
- app/assets/javascripts/effective_select/select2.js
|
404
|
+
- app/assets/javascripts/effective_select_or_text/initialize.js.coffee
|
405
|
+
- app/assets/javascripts/effective_select_or_text/input.js
|
404
406
|
- app/assets/javascripts/effective_time/initialize.js.coffee
|
405
407
|
- app/assets/javascripts/effective_time/input.js
|
406
408
|
- app/assets/stylesheets/effective_bootstrap.scss
|
@@ -422,6 +424,7 @@ files:
|
|
422
424
|
- app/assets/stylesheets/effective_select/input.scss
|
423
425
|
- app/assets/stylesheets/effective_select/overrides.scss
|
424
426
|
- app/assets/stylesheets/effective_select/select2.css
|
427
|
+
- app/assets/stylesheets/effective_select_or_text/input.scss
|
425
428
|
- app/assets/stylesheets/effective_time/input.scss
|
426
429
|
- app/helpers/effective_bootstrap_helper.rb
|
427
430
|
- app/helpers/effective_editor_helper.rb
|
@@ -451,6 +454,7 @@ files:
|
|
451
454
|
- app/models/effective/form_inputs/remote_link_to.rb
|
452
455
|
- app/models/effective/form_inputs/save.rb
|
453
456
|
- app/models/effective/form_inputs/select.rb
|
457
|
+
- app/models/effective/form_inputs/select_or_text.rb
|
454
458
|
- app/models/effective/form_inputs/static_field.rb
|
455
459
|
- app/models/effective/form_inputs/submit.rb
|
456
460
|
- app/models/effective/form_inputs/text_area.rb
|