formstrap 0.1.0
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 +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +33 -0
- data/CHANGELOG.md +1 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +28 -0
- data/LICENSE.txt +21 -0
- data/README.md +118 -0
- data/Rakefile +10 -0
- data/app/assets/config/headmin_manifest.js +2 -0
- data/app/assets/images/avatar.jpg +0 -0
- data/app/assets/images/document.docx +0 -0
- data/app/assets/images/document.pdf +0 -0
- data/app/assets/images/image.jpg +0 -0
- data/app/assets/images/spreadsheet.xls +0 -0
- data/app/assets/images/video.mp4 +0 -0
- data/app/assets/javascripts/formstrap/config/i18n.js +11 -0
- data/app/assets/javascripts/formstrap/controllers/autocomplete_controller.js +318 -0
- data/app/assets/javascripts/formstrap/controllers/date_range_controller.js +38 -0
- data/app/assets/javascripts/formstrap/controllers/dropzone_controller.js +31 -0
- data/app/assets/javascripts/formstrap/controllers/file_preview_controller.js +244 -0
- data/app/assets/javascripts/formstrap/controllers/flatpickr_controller.js +35 -0
- data/app/assets/javascripts/formstrap/controllers/infinite_scroller_controller.js +28 -0
- data/app/assets/javascripts/formstrap/controllers/media_controller.js +252 -0
- data/app/assets/javascripts/formstrap/controllers/media_modal_controller.js +147 -0
- data/app/assets/javascripts/formstrap/controllers/redactorx_controller.js +40 -0
- data/app/assets/javascripts/formstrap/controllers/repeater_controller.js +148 -0
- data/app/assets/javascripts/formstrap/controllers/select_controller.js +49 -0
- data/app/assets/javascripts/formstrap/controllers/textarea_controller.js +48 -0
- data/app/assets/javascripts/formstrap/index.js +32 -0
- data/app/assets/javascripts/formstrap.js +11515 -0
- data/app/assets/stylesheets/formstrap/forms/autocomplete.scss +27 -0
- data/app/assets/stylesheets/formstrap/forms/file.scss +83 -0
- data/app/assets/stylesheets/formstrap/forms/media.scss +10 -0
- data/app/assets/stylesheets/formstrap/forms/repeater.scss +62 -0
- data/app/assets/stylesheets/formstrap/forms/search.scss +12 -0
- data/app/assets/stylesheets/formstrap/forms.scss +12 -0
- data/app/assets/stylesheets/formstrap/general.scss +18 -0
- data/app/assets/stylesheets/formstrap/media/index.scss +9 -0
- data/app/assets/stylesheets/formstrap/media.scss +1 -0
- data/app/assets/stylesheets/formstrap/utilities/buttons.scss +27 -0
- data/app/assets/stylesheets/formstrap/utilities/dropzone.scss +72 -0
- data/app/assets/stylesheets/formstrap/utilities.scss +2 -0
- data/app/assets/stylesheets/formstrap/vendor/flatpickr.css +903 -0
- data/app/assets/stylesheets/formstrap/vendor/tom-select-bootstrap.scss +535 -0
- data/app/assets/stylesheets/formstrap.css +1559 -0
- data/app/assets/stylesheets/formstrap.scss +11 -0
- data/app/controllers/concerns/formstrap/pagination.rb +27 -0
- data/app/controllers/formstrap/media_controller.rb +68 -0
- data/app/controllers/formstrap_controller.rb +2 -0
- data/app/models/concerns/formstrap/autocompletable.rb +36 -0
- data/app/models/concerns/formstrap/hintable.rb +22 -0
- data/app/models/concerns/formstrap/input_groupable.rb +21 -0
- data/app/models/concerns/formstrap/labelable.rb +31 -0
- data/app/models/concerns/formstrap/listable.rb +26 -0
- data/app/models/concerns/formstrap/placeholderable.rb +11 -0
- data/app/models/concerns/formstrap/validatable.rb +38 -0
- data/app/models/concerns/formstrap/wrappable.rb +19 -0
- data/app/models/formstrap/.DS_Store +0 -0
- data/app/models/formstrap/association_view.rb +100 -0
- data/app/models/formstrap/blocks_view.rb +43 -0
- data/app/models/formstrap/checkbox_view.rb +50 -0
- data/app/models/formstrap/color_view.rb +45 -0
- data/app/models/formstrap/date_range_view.rb +23 -0
- data/app/models/formstrap/date_view.rb +43 -0
- data/app/models/formstrap/datetime_range_view.rb +23 -0
- data/app/models/formstrap/datetime_view.rb +43 -0
- data/app/models/formstrap/email_view.rb +46 -0
- data/app/models/formstrap/file_view.rb +106 -0
- data/app/models/formstrap/flatpickr_range_view.rb +89 -0
- data/app/models/formstrap/flatpickr_view.rb +27 -0
- data/app/models/formstrap/hidden_view.rb +8 -0
- data/app/models/formstrap/hint_view.rb +4 -0
- data/app/models/formstrap/input_group_view.rb +17 -0
- data/app/models/formstrap/label_view.rb +22 -0
- data/app/models/formstrap/media_item_view.rb +41 -0
- data/app/models/formstrap/media_view.rb +143 -0
- data/app/models/formstrap/number_view.rb +47 -0
- data/app/models/formstrap/password_view.rb +42 -0
- data/app/models/formstrap/redactorx_view.rb +57 -0
- data/app/models/formstrap/search_view.rb +46 -0
- data/app/models/formstrap/select_view.rb +61 -0
- data/app/models/formstrap/switch_view.rb +21 -0
- data/app/models/formstrap/text_view.rb +46 -0
- data/app/models/formstrap/textarea_view.rb +47 -0
- data/app/models/formstrap/url_view.rb +46 -0
- data/app/models/formstrap/wrapper_view.rb +17 -0
- data/app/models/formstrap/wysiwyg_view.rb +15 -0
- data/app/models/view_model.rb +62 -0
- data/app/views/formstrap/_association.html.erb +30 -0
- data/app/views/formstrap/_autocomplete.html.erb +11 -0
- data/app/views/formstrap/_blocks.html.erb +45 -0
- data/app/views/formstrap/_checkbox.html.erb +34 -0
- data/app/views/formstrap/_color.html.erb +32 -0
- data/app/views/formstrap/_datalist.html.erb +3 -0
- data/app/views/formstrap/_date.html.erb +41 -0
- data/app/views/formstrap/_date_range.html.erb +40 -0
- data/app/views/formstrap/_datetime.html.erb +41 -0
- data/app/views/formstrap/_datetime_range.html.erb +40 -0
- data/app/views/formstrap/_email.html.erb +43 -0
- data/app/views/formstrap/_errors.html.erb +19 -0
- data/app/views/formstrap/_file.html.erb +94 -0
- data/app/views/formstrap/_flatpickr.html.erb +33 -0
- data/app/views/formstrap/_flatpickr_range.html.erb +40 -0
- data/app/views/formstrap/_hidden.html.erb +23 -0
- data/app/views/formstrap/_hint.html.erb +21 -0
- data/app/views/formstrap/_input_group.html.erb +21 -0
- data/app/views/formstrap/_label.html.erb +22 -0
- data/app/views/formstrap/_media.html.erb +60 -0
- data/app/views/formstrap/_number.html.erb +41 -0
- data/app/views/formstrap/_password.html.erb +39 -0
- data/app/views/formstrap/_redactorx.html.erb +31 -0
- data/app/views/formstrap/_repeater.html.erb +128 -0
- data/app/views/formstrap/_search.html.erb +43 -0
- data/app/views/formstrap/_select.html.erb +43 -0
- data/app/views/formstrap/_switch.html.erb +29 -0
- data/app/views/formstrap/_text.html.erb +42 -0
- data/app/views/formstrap/_textarea.html.erb +39 -0
- data/app/views/formstrap/_to_ary.html.erb +0 -0
- data/app/views/formstrap/_url.html.erb +43 -0
- data/app/views/formstrap/_validation.html.erb +18 -0
- data/app/views/formstrap/_wrapper.html.erb +8 -0
- data/app/views/formstrap/_wysiwyg.html.erb +28 -0
- data/app/views/formstrap/autocomplete/_item.html.erb +3 -0
- data/app/views/formstrap/autocomplete/_list.html.erb +3 -0
- data/app/views/formstrap/blocks/_modal.html.erb +20 -0
- data/app/views/formstrap/fields/_base.html.erb +25 -0
- data/app/views/formstrap/fields/_file.html.erb +17 -0
- data/app/views/formstrap/fields/_files.html.erb +17 -0
- data/app/views/formstrap/fields/_group.html.erb +52 -0
- data/app/views/formstrap/fields/_list.html.erb +31 -0
- data/app/views/formstrap/fields/_text.html.erb +17 -0
- data/app/views/formstrap/media/_item.html.erb +38 -0
- data/app/views/formstrap/media/_media_item_modal.html.erb +77 -0
- data/app/views/formstrap/media/_modal.html.erb +40 -0
- data/app/views/formstrap/media/_thumbnail.html.erb +20 -0
- data/app/views/formstrap/media/_validation.html.erb +10 -0
- data/app/views/formstrap/media/create.turbo_stream.erb +5 -0
- data/app/views/formstrap/media/index.html.erb +3 -0
- data/app/views/formstrap/media/index.turbo_stream.erb +11 -0
- data/app/views/formstrap/media/show.html.erb +9 -0
- data/app/views/formstrap/media/thumbnail.html.erb +3 -0
- data/app/views/formstrap/media/update.turbo_stream.erb +3 -0
- data/app/views/formstrap/pagination/_infinite.html.erb +7 -0
- data/app/views/formstrap/repeater/_row.html.erb +53 -0
- data/app/views/formstrap/shared/_notifications.html.erb +20 -0
- data/app/views/formstrap/shared/_popup.html.erb +32 -0
- data/app/views/formstrap/shared/_thumbnail.html.erb +35 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/config/importmap.rb +2 -0
- data/config/locales/activerecord/en.yml +12 -0
- data/config/locales/activerecord/nl.yml +13 -0
- data/config/locales/defaults/en.yml +215 -0
- data/config/locales/defaults/nl.yml +213 -0
- data/config/locales/devise/en.yml +65 -0
- data/config/locales/devise/nl.yml +85 -0
- data/config/locales/en.yml +6 -0
- data/config/locales/formstrap/forms/en.yml +39 -0
- data/config/locales/formstrap/forms/nl.yml +39 -0
- data/config/locales/formstrap/media/en.yml +24 -0
- data/config/locales/formstrap/media/nl.yml +24 -0
- data/config/locales/formstrap/thumbnail/en.yml +4 -0
- data/config/locales/formstrap/thumbnail/nl.yml +4 -0
- data/config/locales/nl.yml +6 -0
- data/config/routes.rb +11 -0
- data/esbuild-css.js +25 -0
- data/esbuild-js.js +11 -0
- data/formstrap.gemspec +37 -0
- data/formstrap.iml +34 -0
- data/lib/formstrap/engine.rb +27 -0
- data/lib/formstrap/form_builder.rb +177 -0
- data/lib/formstrap/form_helper.rb +19 -0
- data/lib/formstrap/version.rb +3 -0
- data/lib/formstrap.rb +6 -0
- data/package.json +54 -0
- data/src/js/formstrap.js +1 -0
- data/src/scss/formstrap.scss +1 -0
- data/yarn.lock +1998 -0
- metadata +224 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
module Formstrap
|
2
|
+
class SearchView < ViewModel
|
3
|
+
include Formstrap::Autocompletable
|
4
|
+
include Formstrap::Hintable
|
5
|
+
include Formstrap::InputGroupable
|
6
|
+
include Formstrap::Labelable
|
7
|
+
include Formstrap::Listable
|
8
|
+
include Formstrap::Placeholderable
|
9
|
+
include Formstrap::Validatable
|
10
|
+
include Formstrap::Wrappable
|
11
|
+
|
12
|
+
def input_options
|
13
|
+
keys = attributes - %i[append attribute collection float form input_group label prepend validate wrapper]
|
14
|
+
options = to_h.slice(*keys)
|
15
|
+
options = default_input_options.deep_merge(options)
|
16
|
+
options.deep_merge(autocomplete_input_options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def input_group_options
|
20
|
+
default_input_group_options
|
21
|
+
.deep_merge(autocomplete_input_group_options)
|
22
|
+
.deep_merge(label_input_group_options)
|
23
|
+
.deep_merge(@input_group || {})
|
24
|
+
end
|
25
|
+
|
26
|
+
def wrapper_options
|
27
|
+
default_wrapper_options.deep_merge({
|
28
|
+
class: ["mb-3", ("form-floating" if float)]
|
29
|
+
}).deep_merge(@wrapper || {})
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def default_input_options
|
35
|
+
{
|
36
|
+
aria: {describedby: validation_id},
|
37
|
+
class: [form_control_class, validation_class],
|
38
|
+
placeholder: placeholder
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def form_control_class
|
43
|
+
plaintext ? "form-control-plaintext" : "form-control"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Formstrap
|
2
|
+
class SelectView < ViewModel
|
3
|
+
include Formstrap::Hintable
|
4
|
+
include Formstrap::InputGroupable
|
5
|
+
include Formstrap::Labelable
|
6
|
+
include Formstrap::Listable
|
7
|
+
include Formstrap::Placeholderable
|
8
|
+
include Formstrap::Validatable
|
9
|
+
include Formstrap::Wrappable
|
10
|
+
|
11
|
+
def input_options
|
12
|
+
keys = attributes - %i[append attribute collection float form input_group include_blank label prepend validate selected tags wrapper]
|
13
|
+
options = to_h.slice(*keys)
|
14
|
+
default_input_options.deep_merge(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def input_group_options
|
18
|
+
default_input_group_options
|
19
|
+
.deep_merge(label_input_group_options)
|
20
|
+
.deep_merge(@input_group || {})
|
21
|
+
end
|
22
|
+
|
23
|
+
def wrapper_options
|
24
|
+
default_wrapper_options.deep_merge({
|
25
|
+
class: ["mb-3", ("form-floating" if float)]
|
26
|
+
}).deep_merge(@wrapper || {})
|
27
|
+
end
|
28
|
+
|
29
|
+
def select_options
|
30
|
+
keys = %i[include_blank selected]
|
31
|
+
options = to_h.slice(*keys)
|
32
|
+
default_options.deep_merge(options)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def default_options
|
38
|
+
selected = attribute.nil? ? nil : form.object&.send(attribute)
|
39
|
+
{
|
40
|
+
selected: selected
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def default_input_options
|
45
|
+
{
|
46
|
+
aria: {describedby: validation_id},
|
47
|
+
class: [form_control_class, validation_class],
|
48
|
+
data: {
|
49
|
+
tags: tags,
|
50
|
+
controller: "select"
|
51
|
+
},
|
52
|
+
multiple: tags,
|
53
|
+
placeholder: placeholder
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def form_control_class
|
58
|
+
plaintext ? "form-control-plaintext" : "form-select"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Formstrap
|
2
|
+
class SwitchView < ViewModel
|
3
|
+
def options
|
4
|
+
default_options.deep_merge(to_h)
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def default_options
|
10
|
+
{
|
11
|
+
wrapper: default_wrapper_options
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def default_wrapper_options
|
16
|
+
{
|
17
|
+
class: %w[form-check form-switch mb-3]
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Formstrap
|
2
|
+
class TextView < ViewModel
|
3
|
+
include Formstrap::Autocompletable
|
4
|
+
include Formstrap::Hintable
|
5
|
+
include Formstrap::InputGroupable
|
6
|
+
include Formstrap::Labelable
|
7
|
+
include Formstrap::Listable
|
8
|
+
include Formstrap::Placeholderable
|
9
|
+
include Formstrap::Validatable
|
10
|
+
include Formstrap::Wrappable
|
11
|
+
|
12
|
+
def input_options
|
13
|
+
keys = attributes - %i[append attribute collection float form input_group label prepend validate wrapper]
|
14
|
+
options = to_h.slice(*keys)
|
15
|
+
options = default_input_options.deep_merge(options)
|
16
|
+
options.deep_merge(autocomplete_input_options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def input_group_options
|
20
|
+
default_input_group_options
|
21
|
+
.deep_merge(autocomplete_input_group_options)
|
22
|
+
.deep_merge(label_input_group_options)
|
23
|
+
.deep_merge(@input_group || {})
|
24
|
+
end
|
25
|
+
|
26
|
+
def wrapper_options
|
27
|
+
default_wrapper_options.deep_merge({
|
28
|
+
class: ["mb-3", ("form-floating" if float)]
|
29
|
+
}).deep_merge(@wrapper || {})
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def default_input_options
|
35
|
+
{
|
36
|
+
aria: {describedby: validation_id},
|
37
|
+
class: [form_control_class, validation_class],
|
38
|
+
placeholder: placeholder
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def form_control_class
|
43
|
+
plaintext ? "form-control-plaintext" : "form-control"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Formstrap
|
2
|
+
class TextareaView < ViewModel
|
3
|
+
include Formstrap::Hintable
|
4
|
+
include Formstrap::InputGroupable
|
5
|
+
include Formstrap::Labelable
|
6
|
+
include Formstrap::Placeholderable
|
7
|
+
include Formstrap::Validatable
|
8
|
+
include Formstrap::Wrappable
|
9
|
+
|
10
|
+
def input_options
|
11
|
+
keys = attributes - %i[attribute float form input_group label validate wrapper]
|
12
|
+
options = to_h.slice(*keys)
|
13
|
+
default_input_options.deep_merge(options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def input_group_options
|
17
|
+
default_input_group_options
|
18
|
+
.deep_merge(label_input_group_options)
|
19
|
+
.deep_merge(@input_group || {})
|
20
|
+
end
|
21
|
+
|
22
|
+
def wrapper_options
|
23
|
+
default_wrapper_options.deep_merge({
|
24
|
+
class: ["mb-3", ("form-floating" if float)],
|
25
|
+
data: {controller: :textarea}
|
26
|
+
}).deep_merge(@wrapper || {})
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def default_input_options
|
32
|
+
{
|
33
|
+
aria: {describedby: validation_id},
|
34
|
+
class: [form_control_class, validation_class],
|
35
|
+
data: {
|
36
|
+
textarea_target: :textarea,
|
37
|
+
action: "input->textarea#update"
|
38
|
+
},
|
39
|
+
placeholder: placeholder
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
def form_control_class
|
44
|
+
plaintext ? "form-control-plaintext" : "form-control"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Formstrap
|
2
|
+
class UrlView < ViewModel
|
3
|
+
include Formstrap::Autocompletable
|
4
|
+
include Formstrap::Hintable
|
5
|
+
include Formstrap::InputGroupable
|
6
|
+
include Formstrap::Labelable
|
7
|
+
include Formstrap::Listable
|
8
|
+
include Formstrap::Placeholderable
|
9
|
+
include Formstrap::Validatable
|
10
|
+
include Formstrap::Wrappable
|
11
|
+
|
12
|
+
def input_options
|
13
|
+
keys = attributes - %i[append attribute collection float form input_group label prepend validate wrapper]
|
14
|
+
options = to_h.slice(*keys)
|
15
|
+
options = default_input_options.deep_merge(options)
|
16
|
+
options.deep_merge(autocomplete_input_options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def input_group_options
|
20
|
+
default_input_group_options
|
21
|
+
.deep_merge(autocomplete_input_group_options)
|
22
|
+
.deep_merge(label_input_group_options)
|
23
|
+
.deep_merge(@input_group || {})
|
24
|
+
end
|
25
|
+
|
26
|
+
def wrapper_options
|
27
|
+
default_wrapper_options.deep_merge({
|
28
|
+
class: ["mb-3", ("form-floating" if float)]
|
29
|
+
}).deep_merge(@wrapper || {})
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def default_input_options
|
35
|
+
{
|
36
|
+
aria: {describedby: validation_id},
|
37
|
+
class: [form_control_class, validation_class],
|
38
|
+
placeholder: placeholder
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def form_control_class
|
43
|
+
plaintext ? "form-control-plaintext" : "form-control"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Formstrap
|
2
|
+
class WrapperView < ViewModel
|
3
|
+
def options
|
4
|
+
keys = attributes - %i[bypass]
|
5
|
+
options = to_h.slice(*keys)
|
6
|
+
default_options.deep_merge(options)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def default_options
|
12
|
+
{
|
13
|
+
class: ["mb-3"]
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class ViewModel
|
4
|
+
# = View Model
|
5
|
+
#
|
6
|
+
# A View Model is a class that allows you to set an arbitrary hash of attributes and access all values by calling
|
7
|
+
# attribute methods.
|
8
|
+
#
|
9
|
+
# ==== Examples
|
10
|
+
#
|
11
|
+
# model = ViewModel.new(a: 1, b: {b1: 1, b2: 2}, c: 3)
|
12
|
+
#
|
13
|
+
# model.a # => 1
|
14
|
+
# model.b # => {b1: 1, b2: 2}
|
15
|
+
# model.c # => 3
|
16
|
+
#
|
17
|
+
# Reserved methods or attributes are left untouched. If you want to access an attribute that collides with a reserved
|
18
|
+
# method, you can do it via the +to_hash+ method.
|
19
|
+
#
|
20
|
+
# model = ViewModel.new(class: "test")
|
21
|
+
#
|
22
|
+
# model.class # => ViewModel
|
23
|
+
# model.to_hash[:class] # => "test"
|
24
|
+
|
25
|
+
def initialize(hash = {})
|
26
|
+
hash.each do |key, value|
|
27
|
+
instance_variable_set("@#{key}", value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def attributes
|
32
|
+
instance_variables.map { |instance_variable| instance_variable.to_s.delete("@").to_sym }
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_hash
|
36
|
+
attributes.map { |attribute| {attribute => value_for(attribute)} }.inject(:merge) || {}
|
37
|
+
end
|
38
|
+
|
39
|
+
alias_method :to_h, :to_hash
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def is_defined?(attribute)
|
44
|
+
attributes.include?(attribute.to_sym)
|
45
|
+
end
|
46
|
+
|
47
|
+
def value_for(attribute)
|
48
|
+
reserved_methods.include?(attribute) ? instance_variable_get("@#{attribute}") : send(attribute)
|
49
|
+
end
|
50
|
+
|
51
|
+
def method_missing(m, *args, &block)
|
52
|
+
instance_variable_get("@#{m}")
|
53
|
+
end
|
54
|
+
|
55
|
+
def respond_to_missing?
|
56
|
+
true
|
57
|
+
end
|
58
|
+
|
59
|
+
def reserved_methods
|
60
|
+
Class.methods + Class.private_methods
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<%
|
2
|
+
# formstrap/association
|
3
|
+
#
|
4
|
+
# ==== Required parameters
|
5
|
+
# * +attribute+ - Name of the association
|
6
|
+
# * +form+ - Form object
|
7
|
+
#
|
8
|
+
# ==== Optional parameters
|
9
|
+
# * +collection+ - Values to create option tags for
|
10
|
+
#
|
11
|
+
#
|
12
|
+
# ==== Examples
|
13
|
+
# Basic version
|
14
|
+
# <%= form_with do |form| %#>
|
15
|
+
# <%= render "formstrap/association", form: form, attribute: :product %#>
|
16
|
+
# <% end %#>
|
17
|
+
|
18
|
+
association = Formstrap::AssociationView.new(local_assigns)
|
19
|
+
|
20
|
+
%>
|
21
|
+
|
22
|
+
<%= render "formstrap/wrapper", association.wrapper_options do %>
|
23
|
+
<%= render "formstrap/label", association.label_options if association.prepend_label? %>
|
24
|
+
<%= render "formstrap/input_group", association.input_group_options do %>
|
25
|
+
<%= form.select(association.attribute_with_id, formstrap: false, choices: association.collection, options: association.select_options, html_options: association.input_options) %>
|
26
|
+
<% end %>
|
27
|
+
<%= render "formstrap/validation", association.validation_options if association.validate? %>
|
28
|
+
<%= render "formstrap/hint", association.hint_options if association.hint? %>
|
29
|
+
<%= render "formstrap/label", association.label_options if association.append_label? %>
|
30
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<div class="h-autocomplete d-none" data-autocomplete-target="dropdown">
|
2
|
+
<% if collection.any? %>
|
3
|
+
<%= render "formstrap/autocomplete/list" do %>
|
4
|
+
<% collection.each do |value, name| %>
|
5
|
+
<%= render "formstrap/autocomplete/item", value: value do %>
|
6
|
+
<%= name %>
|
7
|
+
<% end %>
|
8
|
+
<% end %>
|
9
|
+
<% end %>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<%
|
2
|
+
# formstrap/blocks
|
3
|
+
#
|
4
|
+
# ==== Required parameters
|
5
|
+
# * +form</tt> - Form object
|
6
|
+
# * +names</tt> - Names of block templates that can be added
|
7
|
+
#
|
8
|
+
# ==== Optional parameters
|
9
|
+
# * +paths</tt> - Directories where to look for block templates
|
10
|
+
#
|
11
|
+
# ==== Examples
|
12
|
+
# Basic version. (looks in views/admin/blocks, views/blocks or views directory )
|
13
|
+
# <%= render "formstrap/blocks", form: form, names: %w(text image button) %#>
|
14
|
+
#
|
15
|
+
# Define one ore more path where the templates could be located:
|
16
|
+
# <%= render "formstrap/blocks", form: form, names: %w(text image button), paths: %w(admin/pages/blocks) %#>
|
17
|
+
#
|
18
|
+
# Limit the types of blocks
|
19
|
+
# <%= render "formstrap/blocks", form: form, names: %w(text text_image list) %#>
|
20
|
+
|
21
|
+
blocks = Formstrap::BlocksView.new(local_assigns)
|
22
|
+
@lookup_context.prefixes = @lookup_context.prefixes + blocks.prefixes
|
23
|
+
%>
|
24
|
+
|
25
|
+
<%= render "formstrap/repeater", blocks.repeater_options do |block_form, template| %>
|
26
|
+
<% name = template || block_form.object.name %>
|
27
|
+
<!-- Name input of the block -->
|
28
|
+
<%= block_form.hidden_field :name, value: name %>
|
29
|
+
|
30
|
+
<!-- Render block form fields -->
|
31
|
+
<div class="<%= block_form.object.visible ? "" : "opacity-50" %>">
|
32
|
+
<%= render name, form: block_form %>
|
33
|
+
</div>
|
34
|
+
<% badge_style = blocks.badge_style(block_form.object) %>
|
35
|
+
|
36
|
+
<!-- Label -->
|
37
|
+
<span class="position-absolute top-0 end-0 badge rounded-0 d-flex align-items-center gap-2 bg-danger <%= badge_style %>">
|
38
|
+
<%= t("blocks.#{name}", default: name).humanize %>
|
39
|
+
<button type="button" class="btn p-0 <%= badge_style %>" data-bs-toggle="modal" data-bs-target="#modal-block-<%= block_form.object.id %>">
|
40
|
+
<%= bootstrap_icon("gear") %>
|
41
|
+
</button>
|
42
|
+
</span>
|
43
|
+
|
44
|
+
<%= render "formstrap/blocks/modal", form: block_form, name: name %>
|
45
|
+
<% end %>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<%
|
2
|
+
# formstrap/checkbox
|
3
|
+
#
|
4
|
+
# ==== Required parameters
|
5
|
+
# * +attribute+ - Name of the attribute of the form model
|
6
|
+
# * +form+ - Form object
|
7
|
+
#
|
8
|
+
# ==== Optional parameters
|
9
|
+
# * +checked_value+ - Value for checked state
|
10
|
+
# * +hint+ - Informative text to assist with data input. HTML markup is allowed.
|
11
|
+
# * +label+ - Text to display inside label tag. Defaults to the attribute name. Set to false if you don"t want to show a label.
|
12
|
+
# * +unchecked_value+ - Value for unchecked state
|
13
|
+
# * +wrapper+ - Hash with all options for the surrounding html tag
|
14
|
+
#
|
15
|
+
# ==== References
|
16
|
+
# https://headmin.dev/docs/forms/checkbox
|
17
|
+
# https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox
|
18
|
+
# https://apidock.com/rails/ActionView/Helpers/FormHelper/check_box
|
19
|
+
#
|
20
|
+
# ==== Examples
|
21
|
+
# Basic version
|
22
|
+
# <%= form_with do |form| %#>
|
23
|
+
# <%= render "formstrap/checkbox", form: form, attribute: :active %#>
|
24
|
+
# <% end %#>
|
25
|
+
|
26
|
+
checkbox = Formstrap::CheckboxView.new(local_assigns)
|
27
|
+
%>
|
28
|
+
|
29
|
+
<%= render "formstrap/wrapper", checkbox.wrapper_options do %>
|
30
|
+
<%= form.check_box(checkbox.attribute, checkbox.input_options, checkbox.checked_value, checkbox.unchecked_value) %>
|
31
|
+
<%= render "formstrap/label", checkbox.label_options if checkbox.label? %>
|
32
|
+
<%= render "formstrap/validation", checkbox.validation_options if checkbox.validate? %>
|
33
|
+
<%= render "formstrap/hint", checkbox.hint_options if checkbox.hint? %>
|
34
|
+
<% end %>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<%
|
2
|
+
# formstrap/color
|
3
|
+
#
|
4
|
+
# ==== Required parameters
|
5
|
+
# * +attribute+ - Name of the attribute of the form model
|
6
|
+
# * +form+ - Form object
|
7
|
+
#
|
8
|
+
# ==== Optional parameters
|
9
|
+
# * +hint+ - Informative text to assist with data input. HTML markup is allowed.
|
10
|
+
# * +label+ - Text to display inside label tag. Defaults to the attribute name. Set to false if you don"t want to show a label.
|
11
|
+
# * +wrapper+ - Hash with all options for the surrounding html tag
|
12
|
+
#
|
13
|
+
# ==== References
|
14
|
+
# https://headmin.dev/docs/forms/color
|
15
|
+
# https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/color
|
16
|
+
# https://apidock.com/rails/v5.2.3/ActionView/Helpers/FormHelper/color_field
|
17
|
+
#
|
18
|
+
# ==== Examples
|
19
|
+
# Basic version
|
20
|
+
# <%= form_with do |form| %#>
|
21
|
+
# <%= render "formstrap/color", form: form, attribute: :active %#>
|
22
|
+
# <% end %#>
|
23
|
+
|
24
|
+
color = Formstrap::ColorView.new(local_assigns)
|
25
|
+
%>
|
26
|
+
|
27
|
+
<%= render "formstrap/wrapper", color.wrapper_options do %>
|
28
|
+
<%= render "formstrap/label", color.label_options if color.label? %>
|
29
|
+
<%= form.color_field(color.attribute, color.input_options) %>
|
30
|
+
<%= render "formstrap/validation", color.validation_options if color.validate? %>
|
31
|
+
<%= render "formstrap/hint", color.hint_options if color.hint? %>
|
32
|
+
<% end %>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<%
|
2
|
+
# formstrap/date
|
3
|
+
#
|
4
|
+
# ==== Required parameters
|
5
|
+
# * +attribute+ - Name of the attribute of the form model
|
6
|
+
# * +form+ - Form object
|
7
|
+
#
|
8
|
+
# ==== Optional parameters
|
9
|
+
# * +append+ - Display as input group with text on the right-hand side
|
10
|
+
# * +float+ - Use floating labels. Defaults to false
|
11
|
+
# * +hint+ - Informative text to assist with data input. HTML markup is allowed.
|
12
|
+
# * +label+ - Text to display inside label tag. Defaults to the attribute name. Set to false if you don"t want to show a label.
|
13
|
+
# * +list+ - Options are passed through options_for_select
|
14
|
+
# * +plaintext+ - Render input as plain text.
|
15
|
+
# * +prepend+ - Display as input group with text on the left-hand side
|
16
|
+
# * +wrapper+ - Hash with all options for the surrounding html tag
|
17
|
+
#
|
18
|
+
# ==== References
|
19
|
+
# https://headmin.dev/docs/forms/date
|
20
|
+
# https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date
|
21
|
+
# https://apidock.com/rails/ActionView/Helpers/FormHelper/date_field
|
22
|
+
#
|
23
|
+
# ==== Examples
|
24
|
+
# Basic version
|
25
|
+
# <%= form_with do |form| %#>
|
26
|
+
# <%= render "formstrap/date", form: form, attribute: :date_of_birth %#>
|
27
|
+
# <% end %#>
|
28
|
+
|
29
|
+
date = Formstrap::DateView.new(local_assigns)
|
30
|
+
%>
|
31
|
+
|
32
|
+
<%= render "formstrap/wrapper", date.wrapper_options do %>
|
33
|
+
<%= render "formstrap/label", date.label_options if date.prepend_label? %>
|
34
|
+
<%= render "formstrap/input_group", date.input_group_options do %>
|
35
|
+
<%= form.date_field(date.attribute, date.input_options) %>
|
36
|
+
<%= render "formstrap/datalist", date.datalist_options if date.datalist? %>
|
37
|
+
<% end %>
|
38
|
+
<%= render "formstrap/validation", date.validation_options if date.validate? %>
|
39
|
+
<%= render "formstrap/hint", date.hint_options if date.hint? %>
|
40
|
+
<%= render "formstrap/label", date.label_options if date.append_label? %>
|
41
|
+
<% end %>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<%
|
2
|
+
# formstrap/date_range
|
3
|
+
#
|
4
|
+
# ==== Required parameters
|
5
|
+
# * +form+ - Form object
|
6
|
+
# * +start+ - Hash with all options for the start date input (:attribute is required)
|
7
|
+
# * +end+ - Hash with all options for the end date input (:attribute is required)
|
8
|
+
#
|
9
|
+
# ==== Optional parameters
|
10
|
+
# * +append+ - Display as input group with text on the right-hand side
|
11
|
+
# * +float+ - Use floating labels. Defaults to false
|
12
|
+
# * +hint+ - Informative text to assist with data input. HTML markup is allowed.
|
13
|
+
# * +label+ - Text to display inside label tag. Defaults to the attribute name. Set to false if you don"t want to show a label.
|
14
|
+
# * +plaintext+ - Render input as plain text.
|
15
|
+
# * +prepend+ - Display as input group with text on the left-hand side
|
16
|
+
# * +wrapper+ - Hash with all options for the surrounding html tag
|
17
|
+
#
|
18
|
+
# ==== References
|
19
|
+
# https://headmin.dev/docs/forms/date_range
|
20
|
+
# https://developer.mozilla.org/en-US/docs/Web/HTML/Element/date
|
21
|
+
# https://apidock.com/rails/ActionView/Helpers/FormHelper/date_field
|
22
|
+
#
|
23
|
+
# ==== Examples
|
24
|
+
# Basic version
|
25
|
+
# <%= form_with do |form| %#>
|
26
|
+
# <%= render "formstrap/date_range", form: form, start: {attribute: :start_date}, end: {attribute: :end_date} %#>
|
27
|
+
# <% end %#>
|
28
|
+
|
29
|
+
date_range = Formstrap::DateRangeView.new(local_assigns)
|
30
|
+
%>
|
31
|
+
|
32
|
+
<div class="row">
|
33
|
+
<div class="col">
|
34
|
+
<%= render "formstrap/date", date_range.start_options %>
|
35
|
+
</div>
|
36
|
+
<div class="col">
|
37
|
+
<%= render "formstrap/date", date_range.end_options %>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<%
|
2
|
+
# formstrap/datetime
|
3
|
+
#
|
4
|
+
# ==== Required parameters
|
5
|
+
# * +attribute+ - Name of the attribute of the form model
|
6
|
+
# * +form+ - Form object
|
7
|
+
#
|
8
|
+
# ==== Optional parameters
|
9
|
+
# * +append+ - Display as input group with text on the right-hand side
|
10
|
+
# * +float+ - Use floating labels. Defaults to false
|
11
|
+
# * +hint+ - Informative text to assist with data input. HTML markup is allowed.
|
12
|
+
# * +label+ - Text to display inside label tag. Defaults to the attribute name. Set to false if you don"t want to show a label.
|
13
|
+
# * +list+ - Options are passed through options_for_select
|
14
|
+
# * +plaintext+ - Render input as plain text.
|
15
|
+
# * +prepend+ - Display as input group with text on the left-hand side
|
16
|
+
# * +wrapper+ - Hash with all options for the surrounding html tag
|
17
|
+
#
|
18
|
+
# ==== References
|
19
|
+
# https://headmin.dev/docs/forms/datetime
|
20
|
+
# https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local
|
21
|
+
# https://apidock.com/rails/ActionView/Helpers/FormHelper/datetime_field
|
22
|
+
#
|
23
|
+
# ==== Examples
|
24
|
+
# Basic version
|
25
|
+
# <%= form_with do |form| %#>
|
26
|
+
# <%= render "formstrap/datetime", form: form, attribute: :deadline %#>
|
27
|
+
# <% end %#>
|
28
|
+
|
29
|
+
datetime = Formstrap::DatetimeView.new(local_assigns)
|
30
|
+
%>
|
31
|
+
|
32
|
+
<%= render "formstrap/wrapper", datetime.wrapper_options do %>
|
33
|
+
<%= render "formstrap/label", datetime.label_options if datetime.prepend_label? %>
|
34
|
+
<%= render "formstrap/input_group", datetime.input_group_options do %>
|
35
|
+
<%= form.datetime_field(datetime.attribute, datetime.input_options) %>
|
36
|
+
<%= render "formstrap/datalist", datetime.datalist_options if datetime.datalist? %>
|
37
|
+
<% end %>
|
38
|
+
<%= render "formstrap/validation", datetime.validation_options if datetime.validate? %>
|
39
|
+
<%= render "formstrap/hint", datetime.hint_options if datetime.hint? %>
|
40
|
+
<%= render "formstrap/label", datetime.label_options if datetime.append_label? %>
|
41
|
+
<% end %>
|