bulma_form_rails 0.9.1

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 (94) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/.gitignore +8 -0
  3. data/.idea/bulma_form_rails.iml +82 -0
  4. data/.idea/inspectionProfiles/Project_Default.xml +6 -0
  5. data/.idea/misc.xml +7 -0
  6. data/.idea/modules.xml +8 -0
  7. data/.idea/vcs.xml +6 -0
  8. data/.rbenv-gemsets +3 -0
  9. data/.ruby-version +1 -0
  10. data/Gemfile +14 -0
  11. data/Gemfile.lock +203 -0
  12. data/LICENSE +29 -0
  13. data/README.md +163 -0
  14. data/Rakefile +11 -0
  15. data/doc/BulmaFormRails/Helpers.html +698 -0
  16. data/doc/BulmaFormRails.html +93 -0
  17. data/doc/created.rid +2 -0
  18. data/doc/css/fonts.css +167 -0
  19. data/doc/css/rdoc.css +639 -0
  20. data/doc/fonts/Lato-Light.ttf +0 -0
  21. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  22. data/doc/fonts/Lato-Regular.ttf +0 -0
  23. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  24. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  25. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  26. data/doc/images/add.png +0 -0
  27. data/doc/images/arrow_up.png +0 -0
  28. data/doc/images/brick.png +0 -0
  29. data/doc/images/brick_link.png +0 -0
  30. data/doc/images/bug.png +0 -0
  31. data/doc/images/bullet_black.png +0 -0
  32. data/doc/images/bullet_toggle_minus.png +0 -0
  33. data/doc/images/bullet_toggle_plus.png +0 -0
  34. data/doc/images/date.png +0 -0
  35. data/doc/images/delete.png +0 -0
  36. data/doc/images/find.png +0 -0
  37. data/doc/images/loadingAnimation.gif +0 -0
  38. data/doc/images/macFFBgHack.png +0 -0
  39. data/doc/images/moderngeosystems_logo.png +0 -0
  40. data/doc/images/package.png +0 -0
  41. data/doc/images/page_green.png +0 -0
  42. data/doc/images/page_white_text.png +0 -0
  43. data/doc/images/page_white_width.png +0 -0
  44. data/doc/images/plugin.png +0 -0
  45. data/doc/images/ruby.png +0 -0
  46. data/doc/images/tag_blue.png +0 -0
  47. data/doc/images/tag_green.png +0 -0
  48. data/doc/images/transparent.png +0 -0
  49. data/doc/images/wrench.png +0 -0
  50. data/doc/images/wrench_orange.png +0 -0
  51. data/doc/images/zoom.png +0 -0
  52. data/doc/index.html +82 -0
  53. data/doc/js/darkfish.js +84 -0
  54. data/doc/js/navigation.js +105 -0
  55. data/doc/js/navigation.js.gz +0 -0
  56. data/doc/js/search.js +110 -0
  57. data/doc/js/search_index.js +1 -0
  58. data/doc/js/search_index.js.gz +0 -0
  59. data/doc/js/searcher.js +229 -0
  60. data/doc/js/searcher.js.gz +0 -0
  61. data/doc/table_of_contents.html +125 -0
  62. data/lib/bulma_form_rails/field_helpers.rb +239 -0
  63. data/lib/bulma_form_rails/form_page_helpers.rb +36 -0
  64. data/lib/bulma_form_rails/header_and_footer_helpers.rb +36 -0
  65. data/lib/bulma_form_rails/javascript/controllers/child_objects_controller.js +66 -0
  66. data/lib/bulma_form_rails/message_box_helpers.rb +25 -0
  67. data/lib/bulma_form_rails/railtie.rb +62 -0
  68. data/lib/bulma_form_rails/subform_helpers.rb +33 -0
  69. data/lib/bulma_form_rails/version.rb +3 -0
  70. data/lib/bulma_form_rails.rb +3 -0
  71. data/lib/generators/bulma_form_rails/pagy_config_generator.rb +15 -0
  72. data/lib/generators/bulma_form_rails/views_generator.rb +19 -0
  73. data/lib/install/bulma_form_rails.rb +13 -0
  74. data/lib/tasks/bulma_form_rails_tasks.rake +30 -0
  75. data/lib/templates/app/views/_form.html.erb +0 -0
  76. data/lib/templates/app/views/bulma_form_rails/_child.html.erb +61 -0
  77. data/lib/templates/app/views/bulma_form_rails/_children.html.erb +61 -0
  78. data/lib/templates/app/views/bulma_form_rails/_datetime_select.html.erb +10 -0
  79. data/lib/templates/app/views/bulma_form_rails/_edit_form_page.html.erb +15 -0
  80. data/lib/templates/app/views/bulma_form_rails/_field.html.erb +10 -0
  81. data/lib/templates/app/views/bulma_form_rails/_form_footer.html.erb +17 -0
  82. data/lib/templates/app/views/bulma_form_rails/_index_header.html.erb +16 -0
  83. data/lib/templates/app/views/bulma_form_rails/_message_box.html.erb +35 -0
  84. data/lib/templates/app/views/bulma_form_rails/_new_form_page.html.erb +15 -0
  85. data/lib/templates/app/views/bulma_form_rails/_radio_group.html.erb +6 -0
  86. data/lib/templates/app/views/bulma_form_rails/_select.html.erb +7 -0
  87. data/lib/templates/app/views/bulma_form_rails/_time_select.html.erb +10 -0
  88. data/lib/templates/app/views/bulma_form_rails/_validation_box.html.erb +15 -0
  89. data/lib/templates/app/views/bulma_form_rails/_value.html.erb +6 -0
  90. data/lib/templates/config/initializers/pagy.rb +211 -0
  91. data/package.json +45 -0
  92. data/sig/bulma_form_helper.rbs +68 -0
  93. data/yarn.lock +53 -0
  94. metadata +291 -0
@@ -0,0 +1,125 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta charset="UTF-8">
6
+
7
+ <title>Table of Contents - RDoc Documentation</title>
8
+
9
+ <script type="text/javascript">
10
+ var rdoc_rel_prefix = "./";
11
+ var index_rel_prefix = "./";
12
+ </script>
13
+
14
+ <script src="./js/navigation.js" defer></script>
15
+ <script src="./js/search.js" defer></script>
16
+ <script src="./js/search_index.js" defer></script>
17
+ <script src="./js/searcher.js" defer></script>
18
+ <script src="./js/darkfish.js" defer></script>
19
+
20
+ <link href="./css/fonts.css" rel="stylesheet">
21
+ <link href="./css/rdoc.css" rel="stylesheet">
22
+
23
+
24
+ <body id="top" class="table-of-contents">
25
+ <main role="main">
26
+ <h1 class="class">Table of Contents - RDoc Documentation</h1>
27
+
28
+
29
+ <h2 id="classes">Classes and Modules</h2>
30
+ <ul>
31
+ <li class="module">
32
+ <a href="BulmaFormRails.html">BulmaFormRails</a>
33
+ </li>
34
+ <li class="module">
35
+ <a href="BulmaFormRails/Helpers.html">BulmaFormRails::Helpers</a>
36
+ </li>
37
+ </ul>
38
+
39
+ <h2 id="methods">Methods</h2>
40
+ <ul>
41
+
42
+ <li class="method">
43
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_check_box">#bulma_check_box</a>
44
+ &mdash;
45
+ <span class="container">BulmaFormRails::Helpers</span>
46
+
47
+ <li class="method">
48
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_child_objects">#bulma_child_objects</a>
49
+ &mdash;
50
+ <span class="container">BulmaFormRails::Helpers</span>
51
+
52
+ <li class="method">
53
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_custom_field">#bulma_custom_field</a>
54
+ &mdash;
55
+ <span class="container">BulmaFormRails::Helpers</span>
56
+
57
+ <li class="method">
58
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_datetime_select">#bulma_datetime_select</a>
59
+ &mdash;
60
+ <span class="container">BulmaFormRails::Helpers</span>
61
+
62
+ <li class="method">
63
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_edit_form_page">#bulma_edit_form_page</a>
64
+ &mdash;
65
+ <span class="container">BulmaFormRails::Helpers</span>
66
+
67
+ <li class="method">
68
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_form_footer">#bulma_form_footer</a>
69
+ &mdash;
70
+ <span class="container">BulmaFormRails::Helpers</span>
71
+
72
+ <li class="method">
73
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_index_header">#bulma_index_header</a>
74
+ &mdash;
75
+ <span class="container">BulmaFormRails::Helpers</span>
76
+
77
+ <li class="method">
78
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_input">#bulma_input</a>
79
+ &mdash;
80
+ <span class="container">BulmaFormRails::Helpers</span>
81
+
82
+ <li class="method">
83
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_message_box">#bulma_message_box</a>
84
+ &mdash;
85
+ <span class="container">BulmaFormRails::Helpers</span>
86
+
87
+ <li class="method">
88
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_new_form_page">#bulma_new_form_page</a>
89
+ &mdash;
90
+ <span class="container">BulmaFormRails::Helpers</span>
91
+
92
+ <li class="method">
93
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_radio_group">#bulma_radio_group</a>
94
+ &mdash;
95
+ <span class="container">BulmaFormRails::Helpers</span>
96
+
97
+ <li class="method">
98
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_select">#bulma_select</a>
99
+ &mdash;
100
+ <span class="container">BulmaFormRails::Helpers</span>
101
+
102
+ <li class="method">
103
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_text_area">#bulma_text_area</a>
104
+ &mdash;
105
+ <span class="container">BulmaFormRails::Helpers</span>
106
+
107
+ <li class="method">
108
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_time_select">#bulma_time_select</a>
109
+ &mdash;
110
+ <span class="container">BulmaFormRails::Helpers</span>
111
+
112
+ <li class="method">
113
+ <a href="BulmaFormRails/Helpers.html#method-i-bulma_validation_box">#bulma_validation_box</a>
114
+ &mdash;
115
+ <span class="container">BulmaFormRails::Helpers</span>
116
+ </ul>
117
+ </main>
118
+
119
+
120
+ <footer id="validator-badges" role="contentinfo">
121
+ <p><a href="https://validator.w3.org/check/referer">Validate</a>
122
+ <p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.4.0.
123
+ <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
124
+ </footer>
125
+
@@ -0,0 +1,239 @@
1
+ require 'rexml/document'
2
+
3
+ # rdoc-image:images/moderngeosystems_logo.png
4
+ module BulmaFormRails
5
+
6
+ # rdoc-image:../images/moderngeosystems_logo.png
7
+ #
8
+ # This Ruby on Rails Helper module allows easy and efficient web form construction with labeled fields of different types.
9
+ # It also supports tabular editable multi-object subforms.
10
+ module FieldHelpers
11
+
12
+ # Render a labeled field with custom content.
13
+ # * +form_or_object+ - the form or object
14
+ # * +field_name+ - a symbol representing the name of the field as a whole, regardless of how many tags are in the specified ERb block
15
+ # * +options+ - a hash of additional options:
16
+ # * +label+ - custom field label text
17
+ # * +block+ - ERb to render the field value content
18
+ def bulma_custom_field(form_or_object, field_name, options = {}, &block)
19
+ # Prepare parameters.
20
+ raise ArgumentError.new('No block given for custom field') if !block_given?
21
+ render_parameters = prepare_common_parameters(field_name, form_or_object, options)
22
+ render_parameters.merge!(additional_field_label_classes: 'is-normal') unless options[:contains_check_box_or_radio_group]
23
+
24
+ # Render the labeled field.
25
+ render layout: 'bulma_form_rails/field', locals: render_parameters, &block
26
+ end
27
+
28
+ VALID_INPUT_TYPES = %i[color date datetime_local email file hidden month number password phone telephone text time url]
29
+
30
+ # Render a labeled input field.
31
+ # Mandatory parameters:
32
+ # * +form_or_object+ - the form or object
33
+ # * +field_name+ - a symbol representing the name of the field
34
+ # * +type+ - +:color+, +:date+, +:datetime_local+, +:email+, +:file+, +:hidden+, +:month+, +:number+, +:password+, +:phone+, +:telephone+, +:text+, +:time+, or +:url+ with optional +_field+ suffix
35
+ # * +options+ - a hash of additional options:
36
+ # * +class+ - additional input classes other than +input+
37
+ # * +label+ - custom field label text
38
+ def bulma_input(form_or_object, field_name, type = :text, options = {})
39
+ # Convert type to form method.
40
+ type = type.to_s
41
+ type.delete!('_field') if type.end_with?('_field')
42
+ raise ArgumentError.new("Invalid input type #{type.inspect}") unless VALID_INPUT_TYPES.any?(type.intern)
43
+ method = "#{type}_field".intern
44
+
45
+ # Prepare parameters.
46
+ prepare_value_class!(options, base_class: 'input')
47
+ render_parameters = prepare_common_parameters(field_name, form_or_object, options)
48
+ additional_render_parameters = %i[date_field datetime_local_field month_field time_field].any?(method) ? {additional_field_classes: 'is-narrow'} : {}
49
+
50
+ # Render the labeled field.
51
+ render layout: 'bulma_form_rails/field', locals: render_parameters.merge(additional_field_label_classes: 'is-normal') do
52
+ render partial: 'bulma_form_rails/value', locals: render_parameters.merge(method: method).merge(additional_render_parameters)
53
+ end
54
+ end
55
+
56
+ # Render a labeled text area field.
57
+ # * +form_or_object+ - the form or object
58
+ # * +field_name+ - a symbol representing the name of the field
59
+ # * +options+ - a hash of additional options:
60
+ # * +class+ - additional textarea classes other than +textarea+
61
+ # * +label+ - custom field label text
62
+ # * +rows+ - number of text rows to be visible
63
+ # * +cols+ - number of text columns to be visible
64
+ def bulma_text_area(form_or_object, field_name, options = {})
65
+ # Prepare parameters.
66
+ prepare_value_class!(options, base_class: 'textarea')
67
+ render_parameters = prepare_common_parameters(field_name, form_or_object, options)
68
+
69
+ # Render the labeled field.
70
+ render layout: 'bulma_form_rails/field', locals: render_parameters.merge(additional_field_label_classes: 'is-normal') do
71
+ render partial: 'bulma_form_rails/value', locals: render_parameters.merge(method: :text_area)
72
+ end
73
+ end
74
+
75
+ # Render a labeled checkbox field.
76
+ # * +form_or_object+ - the form or object
77
+ # * +field_name+ - a symbol representing the name of the field
78
+ # * +options+ - a hash of additional options:
79
+ # * +class+ - additional checkbox classes other than +checkbox+
80
+ # * +label+ - custom field label text
81
+ def bulma_check_box(form_or_object, field_name, options = {})
82
+ # Prepare parameters.
83
+ prepare_value_class!(options, base_class: 'checkbox')
84
+ render_parameters = prepare_common_parameters(field_name, form_or_object, options)
85
+
86
+ # Render the labeled field.
87
+ render layout: 'bulma_form_rails/field', locals: render_parameters do
88
+ render partial: 'bulma_form_rails/value', locals: render_parameters.merge(method: :check_box, additional_field_classes: 'is-narrow')
89
+ end
90
+ end
91
+
92
+ # Render a labeled radio group field.
93
+ # * +form_or_object+ - the form or object
94
+ # * +field_name+ - a symbol representing the name of the field as a whole, regardless of how many radio buttons are generated by +choices+
95
+ # * +choices+ - an array of radio button choice options
96
+ # * +options+ - an array of additional options
97
+ # * +class+ - additional radio classes other than +radio+
98
+ # * +label+ - custom field label text
99
+ def bulma_radio_group(form_or_object, field_name, choices, options = {})
100
+ # Prepare parameters.
101
+ prepare_value_class!(options, base_class: 'radio')
102
+ render_parameters = prepare_common_parameters(field_name, form_or_object, options)
103
+
104
+ # Render the labeled field.
105
+ render layout: 'bulma_form_rails/field', locals: render_parameters do
106
+ render partial: 'bulma_form_rails/radio_group', locals: render_parameters.merge(choices: choices)
107
+ end
108
+ end
109
+
110
+ # Render a labeled selection field.
111
+ # * +form_or_object+ - the form or object
112
+ # * +field_name+ - a symbol representing the name of the field
113
+ # * +choices+ - an array of select choice options
114
+ # * +options+ - a hash of additional options
115
+ # * +class+ - additional select classes other than +select+
116
+ # * +label+ - custom field label text
117
+ # * +html_options+ - a hash of additional options:
118
+ def bulma_select(form_or_object, field_name, choices, options = {}, html_options = {})
119
+ # Prepare parameters.
120
+ prepare_value_class!(options, base_class: 'select is-fullwidth')
121
+ render_parameters = prepare_common_parameters(field_name, form_or_object, options)
122
+
123
+ # Render the labeled field.
124
+ render layout: 'bulma_form_rails/field', locals: render_parameters.merge(additional_field_label_classes: 'is-normal') do
125
+ render partial: 'bulma_form_rails/select', locals: render_parameters.merge(choices: choices, html_options: html_options)
126
+ end
127
+ end
128
+
129
+ # Render a labeled date+time selection field.
130
+ # * +form_or_object+ - the form or object
131
+ # * +field_name+ - a symbol representing the name of the field
132
+ # * +options+ - a hash of additional options
133
+ # * +html_options+ - a hash of additional options:
134
+ # * +class+ - additional select classes other than +select+
135
+ # * +label+ - custom field label text
136
+ def bulma_datetime_select(form_or_object, field_name, options = {}, html_options = {})
137
+ # Prepare parameters.
138
+ prepare_value_class!(options, base_class: 'select is-fullwidth')
139
+ render_parameters = prepare_common_parameters(field_name, form_or_object, options)
140
+
141
+ # Render the labeled field.
142
+ render layout: 'bulma_form_rails/field', locals: render_parameters.merge(additional_field_label_classes: 'is-normal') do
143
+ render partial: 'bulma_form_rails/datetime_select', locals: render_parameters.merge(html_options: html_options)
144
+ end
145
+ end
146
+
147
+ # Render a labeled time selection field.
148
+ # * +form_or_object+ - the form or object
149
+ # * +field_name+ - a symbol representing the name of the field
150
+ # * +options+ - a hash of additional options
151
+ # * +html_options+ - a hash of additional options:
152
+ # * +class+ - additional select classes other than +select+
153
+ # * +label+ - custom field label text
154
+ def bulma_time_select(form_or_object, field_name, options = {}, html_options = {})
155
+ # Prepare parameters.
156
+ prepare_value_class!(options, base_class: 'select is-fullwidth')
157
+ render_parameters = prepare_common_parameters(field_name, form_or_object, options)
158
+
159
+ # Render the labeled field.
160
+ render layout: 'bulma_form_rails/field', locals: render_parameters.merge(additional_field_label_classes: 'is-normal') do
161
+ render partial: 'bulma_form_rails/time_select', locals: render_parameters.merge(html_options: html_options)
162
+ end
163
+ end
164
+
165
+ private
166
+
167
+ # Render time selection tags modified for bulma compatibility.
168
+ def bulma_datetime_select_tags(html)
169
+ # Parse the template-generated HTML, wrapping it in a div to ensure a single root element.
170
+ source = if html =~ /\A\s*<div/
171
+ html
172
+ else
173
+ "<div>#{html}</div>"
174
+ end
175
+ document = REXML::Document.new(source)
176
+ root = document.root
177
+
178
+ # Remove all non-functional text nodes
179
+ root.delete_if {|child| child.instance_of?(REXML::Text)}
180
+
181
+ # Subsume all select elements under their own bulma span tags.
182
+ root.each_element do |element|
183
+ if element.name == "select"
184
+ # Create the span.
185
+ span = REXML::Element.new('span')
186
+ span.add_attribute('class', 'control')
187
+ span.add_attribute('style', 'display: inline-block')
188
+
189
+ # Reparent the select.
190
+ root.add_element(span)
191
+ span.add_element(element)
192
+ end
193
+ end
194
+
195
+ # Emit the modified HTML.
196
+ output = ""
197
+ document.write(output)
198
+ output
199
+ end
200
+
201
+ # Render any form element, regardless of whether a form builder or object name is provided.
202
+ def bulma_form_or_object_component(form_or_object, method, *params)
203
+ if form_or_object.kind_of?(ActionView::Helpers::FormBuilder)
204
+ form_or_object.public_send(method, *params)
205
+ else
206
+ self.public_send(method, *([form_or_object] + params))
207
+ end
208
+ end
209
+
210
+ def prepare_common_parameters(field_name, form_or_object, options)
211
+ { form_or_object: form_or_object, field_name: field_name, label_parameters: prepare_label_parameters(field_name, options), options: options }
212
+ end
213
+
214
+ # Grab and purge the textual field label from options if specified.
215
+ def prepare_label_parameters(field_name, options)
216
+ label_parameters = [field_name]
217
+ field_label = options[:label]
218
+ if field_label
219
+ label_parameters << field_label
220
+ options.delete(:label)
221
+ end
222
+ label_parameters << { class: 'label' }
223
+ end
224
+
225
+ # Grab and purge value CSS classes from options if specified.
226
+ def prepare_value_class!(options, base_class: String)
227
+ additional_classes = options[:class]
228
+ if additional_classes
229
+ additional_classes = " #{additional_classes}"
230
+ options.delete(:class)
231
+ else
232
+ additional_classes = ''
233
+ end
234
+ options[:class] = base_class + additional_classes
235
+ end
236
+
237
+ end
238
+
239
+ end
@@ -0,0 +1,36 @@
1
+ require 'rexml/document'
2
+
3
+ # rdoc-image:images/moderngeosystems_logo.png
4
+ module BulmaFormRails
5
+
6
+ # rdoc-image:../images/moderngeosystems_logo.png
7
+ #
8
+ # This Ruby on Rails Helper module allows easy and efficient web form construction with labeled fields of different types.
9
+ # It also supports tabular editable multi-object subforms.
10
+ module FormPageHelpers
11
+
12
+ # Render a standard model creation form page.
13
+ # * +name+ - a symbol representing the model name
14
+ # * +model+ - the model object
15
+ # * +models_path+ - the controller URL path for the action that renders the model collection
16
+ def bulma_new_form_page(name, model, models_path)
17
+ render partial: 'bulma_form_rails/new_form_page', locals: {name: name, model: model, models_path: models_path}
18
+ end
19
+
20
+ # Render a standard model edit form page.
21
+ # * +name+ - a symbol representing the model name
22
+ # * +model+ - the model object
23
+ # * +models_path+ - the controller URL path for the action that renders the model collection
24
+ # * +model_path+ - the controller URL path for the action that renders this individual model
25
+ def bulma_edit_form_page(name, model, models_path, model_path)
26
+ render partial: 'bulma_form_rails/edit_form_page', locals: {name: name, model: model, models_path: models_path, model_path: model_path}
27
+ end
28
+
29
+ # Render a standard flash messages box. Automatically included with +bulma_validation_box+ and +bulma_index_header+ output.
30
+ def bulma_message_box
31
+ render partial: 'bulma_form_rails/message_box'
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,36 @@
1
+ require 'rexml/document'
2
+
3
+ # rdoc-image:images/moderngeosystems_logo.png
4
+ module BulmaFormRails
5
+
6
+ # rdoc-image:../images/moderngeosystems_logo.png
7
+ #
8
+ # This Ruby on Rails Helper module allows easy and efficient web form construction with labeled fields of different types.
9
+ # It also supports tabular editable multi-object subforms.
10
+ module HeaderAndFooterHelpers
11
+
12
+ # Render the header for a standard index page. Automatically calls +bulma_message_box+.
13
+ # * +name+ - a symbol representing the model name
14
+ # * +models_path+ - the controller URL path for the action that renders the model collection
15
+ def bulma_index_header(name, models_path)
16
+ render partial: 'bulma_form_rails/index_header', locals: {name: name, models_path: models_path}
17
+ end
18
+
19
+ # Render a standard model form page footer.
20
+ # * +form+ - the form object
21
+ # * +models_path+ - the controller URL path for the action that renders the model collection
22
+ # * +options+ - a hash of additional options:
23
+ # * +exclude_submit_button+ - don't include a submit button if true
24
+ # * +block+ - optional ERb to render any additional content for the footer, such as additional buttons
25
+ def bulma_form_footer(form, models_path, options = {}, &block)
26
+ if block_given?
27
+ render layout: 'bulma_form_rails/form_footer', locals: {form: form, url: models_path, options: options}, &block
28
+ else
29
+ render partial: 'bulma_form_rails/form_footer', locals: {form: form, url: models_path, options: options}
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,66 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+ import { put } from "@rails/request.js"
3
+
4
+ // Connects to data-controller="child-objects"
5
+ export default class extends Controller
6
+ {
7
+ static targets = ["table"]
8
+ static values =
9
+ {
10
+ name: String,
11
+ attributesKey: String,
12
+ url: String
13
+ }
14
+
15
+ addRow(event)
16
+ {
17
+ // Remove existing adder bar.
18
+ const adderBarId = `${this.nameValue}-adder-bar`
19
+ document.getElementById(adderBarId).remove()
20
+
21
+ // Append new adder bar.
22
+ const tbody = this.tableTarget
23
+
24
+ let params = new URLSearchParams()
25
+ params.append("name", this.nameValue)
26
+ params.append("attributes_key", this.attributesKeyValue)
27
+ params.append("size", tbody.childElementCount - 2)
28
+
29
+ const new_row_url = `${this.urlValue}?${params}`
30
+ put(new_row_url, {responseKind: "turbo_stream"})
31
+ }
32
+
33
+ deleteRow(event)
34
+ {
35
+ const tbody = this.tableTarget
36
+
37
+ if (tbody.childElementCount > 3)
38
+ {
39
+ // Remove the specified row.
40
+ const targetRowId = event.target.parentNode.parentNode.id;
41
+ const rowIdName = this.nameFromId(targetRowId)
42
+ const targetRowIndex = this.indexFromId(targetRowId)
43
+ const targetRow = document.getElementById(targetRowId)
44
+ targetRow.remove()
45
+
46
+ // Renumber the remaining rows.
47
+ for (let i = targetRowIndex + 1; i < tbody.children.length - 1; i++)
48
+ {
49
+ let row = tbody.children[i]
50
+ let newRowIndex = i - 1
51
+ row.id = `${rowIdName}[${newRowIndex}]`
52
+ for (let cell of row.children)
53
+ {
54
+ for (let field of cell.children)
55
+ {
56
+ field.id = field.id.replace(`_${i}_`, `_${newRowIndex}_`)
57
+ field.name = field.name.replace(`[${i}]`, `[${newRowIndex}]`)
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
63
+
64
+ nameFromId(id) { return id.substring(0, id.indexOf("[")) }
65
+ indexFromId(id) { return parseInt(id.slice(id.search(/\[\d+\]$/) + 1, -1)) }
66
+ }
@@ -0,0 +1,25 @@
1
+ require 'rexml/document'
2
+
3
+ # rdoc-image:images/moderngeosystems_logo.png
4
+ module BulmaFormRails
5
+
6
+ # rdoc-image:../images/moderngeosystems_logo.png
7
+ #
8
+ # This Ruby on Rails Helper module allows easy and efficient web form construction with labeled fields of different types.
9
+ # It also supports tabular editable multi-object subforms.
10
+ module MessageBoxHelpers
11
+
12
+ # Render a standard flash messages box. Automatically included with +bulma_validation_box+ and +bulma_index_header+ output.
13
+ def bulma_message_box
14
+ render partial: 'bulma_form_rails/message_box'
15
+ end
16
+
17
+ # Render a standard model validation messages box. Automatically calls +bulma_message_box+.
18
+ # * +model+ - the model object
19
+ def bulma_validation_box(model)
20
+ render partial: 'bulma_form_rails/validation_box', locals: {model: model}
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,62 @@
1
+ require 'bulma_form_rails/field_helpers'
2
+ require 'bulma_form_rails/form_page_helpers'
3
+ require 'bulma_form_rails/header_and_footer_helpers'
4
+ require 'bulma_form_rails/message_box_helpers'
5
+ require 'bulma_form_rails/subform_helpers'
6
+
7
+ module BulmaFormRails
8
+ class Railtie < Rails::Railtie
9
+ railtie_name :bulma_form_rails
10
+
11
+ rake_tasks do
12
+ path = File.expand_path(__dir__)
13
+ Dir.glob("#{path}/../tasks/**/*.rake").each {|filename| load filename}
14
+ end
15
+
16
+ VIEW_PATH = 'lib/templates/app/views'
17
+
18
+ @@bulma_form_initializer = Proc.new do
19
+ ActionView::Helpers.send :include, FieldHelpers
20
+ ActionView::Helpers.send :include, FormPageHelpers
21
+ ActionView::Helpers.send :include, HeaderAndFooterHelpers
22
+ ActionView::Helpers.send :include, MessageBoxHelpers
23
+ ActionView::Helpers.send :include, SubformHelpers
24
+
25
+ ActionController::Base.class_eval do
26
+ append_view_path VIEW_PATH
27
+ helper_method :lookup_attributes
28
+
29
+ def self.bulma_child_forms(attributes)
30
+ class_eval do
31
+ def add_child
32
+ # Protect against code injection
33
+ if not %r|\A[a-zA-Z_]+\Z|.match(params[:name])
34
+ raise ActiveRecord::RecordNotFound
35
+ end
36
+ @name = params[:name]
37
+ @attributes_key = params[:attributes_key]
38
+ @attributes = lookup_attributes(params[:attributes_key]) unless @attributes_key.blank?
39
+ @size = params[:size].to_i + 1
40
+ respond_to do |format|
41
+ format.turbo_stream do
42
+ render turbo_stream: turbo_stream.append("#{@name}-table",
43
+ partial: 'bulma_form_rails/child',
44
+ locals: {child: eval("#{@name.capitalize.gsub(/_(.)/) {|s| $1.capitalize }}.new"), child_counter: @size, name: @name, attributes: @attributes, attributes_key: @attributes_key, last: true, container: '', system_controlled: false})
45
+ end
46
+ end
47
+ end
48
+
49
+ private
50
+ @@child_attributes = attributes
51
+ end
52
+ end
53
+
54
+ def lookup_attributes(key)
55
+ @@child_attributes[key.to_sym]
56
+ end
57
+ end
58
+ end
59
+
60
+ ActiveSupport.on_load(:action_controller, &@@bulma_form_initializer)
61
+ end
62
+ end
@@ -0,0 +1,33 @@
1
+ require 'rexml/document'
2
+
3
+ # rdoc-image:images/moderngeosystems_logo.png
4
+ module BulmaFormRails
5
+
6
+ # rdoc-image:../images/moderngeosystems_logo.png
7
+ #
8
+ # This Ruby on Rails Helper module allows easy and efficient web form construction with labeled fields of different types.
9
+ # It also supports tabular editable multi-object subforms.
10
+ module SubformHelpers
11
+
12
+ # Renders a child objects collection management UI subform, including row addition and deletion buttons by default.
13
+ # * +collection+ - an array of serializable objects
14
+ # * +name+ - the lower-case singular name of the object for display purposes
15
+ # * +attributes_key+ - a symbolic key into the attribute reference hash retrievable via the <tt>lookup_attributes(key)</tt> method defined on the controller as a +helper_method+, eg +:object+ for:
16
+ # {object: ["attribute_1", "attribute_2"]}
17
+ # * +add_child_path+ - the controller URL path for the action to add a child object to the collection
18
+ # * +options+ - a hash of additional options to pass to the partials
19
+ # * +system_controlled+ - +true+ if you want no row add or delete buttons, +false+ or unspecified if you do want add and delete buttons
20
+ # * +total_columns+ - an array of integers representing column numbers requiring arithmetic totals at the bottom of the subform, eg:
21
+ # [3, 4]
22
+ # * +container+ - a string representing an array index expression for a row if not a single index, eg:
23
+ # "[related_reservations][#{related_reservation_counter}]"
24
+ # To use this helper method, you will first need to do the following:
25
+ # 1. Call <tt>bulma_child_forms</tt> from the specific controller (but outside any existing method definitions) for your view, passing in a hash of the object collections to be managed along with their attributes, for example, <tt>{object1: %w[attr1 attr2], object2: %w[attr3 attr4]}</tt>.
26
+ # 2. Add a route to the <tt>add_child</tt> action for the same controller, for example, <tt>put 'users/add_child', to: 'users#add_child'</tt>.
27
+ def bulma_child_objects(collection, name, attributes_key, add_child_path, options = {})
28
+ render partial: 'bulma_form_rails/children', object: collection, locals: {url: add_child_path, name: name, attributes_key: attributes_key}.merge(options)
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,3 @@
1
+ module BulmaFormRails
2
+ VERSION = '0.9.1'
3
+ end
@@ -0,0 +1,3 @@
1
+ module BulmaFormRails
2
+ require 'bulma_form_rails/railtie' if defined?(Rails)
3
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+
5
+ module BulmaFormRails
6
+ module Generators
7
+ class PagyConfigGenerator < Rails::Generators::Base
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ def copy_pagy_config
11
+ copy_file File.join(Gem.loaded_specs['bulma_form_rails'].full_gem_path, 'lib', 'templates', 'config', 'initializers', 'pagy.rb'), File.join('config', 'initializers', 'pagy.rb')
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+
5
+ module BulmaFormRails
6
+ module Generators
7
+ class ViewsGenerator < Rails::Generators::Base
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ def copy_views
11
+ gem_directory = File.join(Gem.loaded_specs['bulma_form_rails'].full_gem_path, 'lib', 'templates', 'app', 'views', 'bulma_form_rails')
12
+ app_directory = File.join('app', 'views', 'bulma_form_rails')
13
+ Dir.each_child(gem_directory) do |template_file|
14
+ copy_file File.join(gem_directory, template_file), File.join(app_directory, template_file)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end