headmin 0.2.7 → 0.3.3

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 (270) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +29 -3
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +39 -24
  6. data/README.md +64 -57
  7. data/app/assets/config/headmin_manifest.js +2 -0
  8. data/app/assets/images/document.docx +0 -0
  9. data/{src/scss/headmin/filters.scss → app/assets/images/document.pdf} +0 -0
  10. data/app/assets/images/image.jpg +0 -0
  11. data/app/assets/images/spreadsheet.xls +0 -0
  12. data/app/assets/images/video.mp4 +0 -0
  13. data/app/assets/javascripts/headmin/config/i18n.js +11 -0
  14. data/{src/js → app/assets/javascripts}/headmin/controllers/blocks_controller.js +0 -1
  15. data/app/assets/javascripts/headmin/controllers/date_range_controller.js +32 -0
  16. data/app/assets/javascripts/headmin/controllers/dropzone_controller.js +33 -0
  17. data/app/assets/javascripts/headmin/controllers/file_preview_controller.js +244 -0
  18. data/{src/js → app/assets/javascripts}/headmin/controllers/filter_controller.js +12 -6
  19. data/{src/js → app/assets/javascripts}/headmin/controllers/filters_controller.js +0 -0
  20. data/app/assets/javascripts/headmin/controllers/flatpickr_controller.js +39 -0
  21. data/app/assets/javascripts/headmin/controllers/hello_controller.js +7 -0
  22. data/app/assets/javascripts/headmin/controllers/notification_controller.js +8 -0
  23. data/{src/js → app/assets/javascripts}/headmin/controllers/popup_controller.js +0 -1
  24. data/app/assets/javascripts/headmin/controllers/redactorx_controller.js +13 -0
  25. data/{src/js → app/assets/javascripts}/headmin/controllers/repeater_controller.js +0 -1
  26. data/app/assets/javascripts/headmin/controllers/select_controller.js +48 -0
  27. data/{src/js → app/assets/javascripts}/headmin/controllers/table_actions_controller.js +9 -39
  28. data/{src/js → app/assets/javascripts}/headmin/controllers/table_controller.js +51 -16
  29. data/app/assets/javascripts/headmin/index.js +37 -0
  30. data/app/assets/javascripts/headmin.js +15271 -0
  31. data/{src/scss → app/assets/stylesheets}/headmin/filter.scss +0 -0
  32. data/app/assets/stylesheets/headmin/filters.scss +0 -0
  33. data/{src/scss → app/assets/stylesheets}/headmin/form.scss +57 -4
  34. data/{src/scss → app/assets/stylesheets}/headmin/general.scss +0 -0
  35. data/{src/scss → app/assets/stylesheets}/headmin/layout/body.scss +0 -0
  36. data/{src/scss → app/assets/stylesheets}/headmin/layout/sidebar.scss +0 -0
  37. data/{src/scss → app/assets/stylesheets}/headmin/layout.scss +0 -0
  38. data/{src/scss → app/assets/stylesheets}/headmin/login.scss +0 -0
  39. data/{src/scss/vendor/bootstrap/variables.scss → app/assets/stylesheets/headmin/overrides/bootstrap.scss} +0 -0
  40. data/{src/scss/vendor/redactorx/override.css → app/assets/stylesheets/headmin/overrides/redactorx.css} +0 -0
  41. data/{src/scss → app/assets/stylesheets}/headmin/popup.scss +0 -0
  42. data/app/assets/stylesheets/headmin/syntax.scss +349 -0
  43. data/{src/scss → app/assets/stylesheets}/headmin/table.scss +0 -0
  44. data/app/assets/stylesheets/headmin/thumbnail.scss +20 -0
  45. data/app/assets/stylesheets/headmin/utilities.scss +68 -0
  46. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_accordion.scss +118 -0
  47. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_alert.scss +57 -0
  48. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_badge.scss +29 -0
  49. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_breadcrumb.scss +28 -0
  50. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_button-group.scss +139 -0
  51. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_buttons.scss +111 -0
  52. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_card.scss +216 -0
  53. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_carousel.scss +229 -0
  54. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_close.scss +40 -0
  55. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_containers.scss +41 -0
  56. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_dropdown.scss +240 -0
  57. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_forms.scss +9 -0
  58. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_functions.scss +302 -0
  59. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_grid.scss +33 -0
  60. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_helpers.scss +9 -0
  61. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_images.scss +42 -0
  62. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_list-group.scss +174 -0
  63. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_mixins.scss +43 -0
  64. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_modal.scss +209 -0
  65. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_nav.scss +139 -0
  66. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_navbar.scss +335 -0
  67. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_offcanvas.scss +83 -0
  68. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_pagination.scss +64 -0
  69. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_placeholders.scss +51 -0
  70. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_popover.scss +158 -0
  71. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_progress.scss +48 -0
  72. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_reboot.scss +625 -0
  73. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_root.scss +54 -0
  74. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_spinners.scss +69 -0
  75. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_tables.scss +155 -0
  76. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_toasts.scss +51 -0
  77. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_tooltip.scss +115 -0
  78. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_transitions.scss +27 -0
  79. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_type.scss +104 -0
  80. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_utilities.scss +630 -0
  81. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/_variables.scss +1641 -0
  82. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/bootstrap-grid.scss +67 -0
  83. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/bootstrap-reboot.scss +13 -0
  84. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/bootstrap-utilities.scss +18 -0
  85. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/bootstrap.scss +53 -0
  86. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_floating-labels.scss +63 -0
  87. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-check.scss +152 -0
  88. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-control.scss +219 -0
  89. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-range.scss +91 -0
  90. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-select.scss +72 -0
  91. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_form-text.scss +11 -0
  92. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_input-group.scss +121 -0
  93. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_labels.scss +36 -0
  94. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/forms/_validation.scss +12 -0
  95. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_clearfix.scss +3 -0
  96. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_colored-links.scss +12 -0
  97. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_position.scss +30 -0
  98. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_ratio.scss +26 -0
  99. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_stacks.scss +15 -0
  100. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  101. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  102. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  103. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/helpers/_vr.scss +8 -0
  104. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_alert.scss +11 -0
  105. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_backdrop.scss +14 -0
  106. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_border-radius.scss +78 -0
  107. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  108. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  109. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_buttons.scss +133 -0
  110. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_caret.scss +64 -0
  111. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_clearfix.scss +9 -0
  112. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  113. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_container.scss +9 -0
  114. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_deprecate.scss +10 -0
  115. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_forms.scss +144 -0
  116. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_gradients.scss +47 -0
  117. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_grid.scss +151 -0
  118. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_image.scss +16 -0
  119. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_list-group.scss +24 -0
  120. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_lists.scss +7 -0
  121. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_pagination.scss +31 -0
  122. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_reset-text.scss +17 -0
  123. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_resize.scss +6 -0
  124. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_table-variants.scss +21 -0
  125. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  126. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_transition.scss +26 -0
  127. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_utilities.scss +89 -0
  128. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/mixins/_visually-hidden.scss +29 -0
  129. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/utilities/_api.scss +47 -0
  130. data/app/assets/stylesheets/headmin/vendor/bootstrap/scss/vendor/_rfs.scss +354 -0
  131. data/app/assets/stylesheets/headmin/vendor/flatpickr.css +903 -0
  132. data/{src/scss/vendor/redactorx → app/assets/stylesheets/headmin/vendor}/redactorx.css +0 -0
  133. data/app/assets/stylesheets/headmin/vendor/tom-select-bootstrap.css +536 -0
  134. data/app/assets/stylesheets/headmin.css +13454 -0
  135. data/app/assets/stylesheets/headmin.scss +65 -0
  136. data/app/controllers/concerns/headmin/authentication.rb +1 -1
  137. data/app/controllers/concerns/headmin/searchable.rb +1 -1
  138. data/app/controllers/concerns/headmin/sortable.rb +7 -7
  139. data/app/helpers/headmin/admin_helper.rb +2 -1
  140. data/app/helpers/headmin/bootstrap_helper.rb +4 -4
  141. data/app/helpers/headmin/documentation_helper.rb +35 -0
  142. data/app/helpers/headmin/filter_helper.rb +1 -1
  143. data/app/helpers/headmin/form_helper.rb +7 -3
  144. data/app/helpers/headmin/notification_helper.rb +21 -21
  145. data/app/helpers/headmin/request_helper.rb +5 -10
  146. data/app/models/concerns/headmin/block.rb +1 -2
  147. data/app/models/concerns/headmin/blockable.rb +1 -1
  148. data/app/models/concerns/headmin/field.rb +1 -1
  149. data/app/models/concerns/headmin/fieldable.rb +8 -8
  150. data/app/models/headmin/documentation_renderer.rb +32 -0
  151. data/app/models/headmin/form/base.rb +78 -0
  152. data/app/models/headmin/form/text.rb +51 -0
  153. data/app/models/headmin/thumbnail.rb +61 -0
  154. data/app/services/block_service.rb +53 -53
  155. data/app/views/examples/admin.html.erb +1 -1
  156. data/app/views/headmin/_blocks.html.erb +2 -2
  157. data/app/views/headmin/_breadcrumbs.html.erb +1 -1
  158. data/app/views/headmin/_card.html.erb +10 -6
  159. data/app/views/headmin/_dropdown.html.erb +1 -1
  160. data/app/views/headmin/_filters.html.erb +22 -10
  161. data/app/views/headmin/_form.html.erb +14 -14
  162. data/app/views/headmin/_heading.html.erb +1 -1
  163. data/app/views/headmin/_notifications.html.erb +1 -1
  164. data/app/views/headmin/_pagination.html.erb +3 -5
  165. data/app/views/headmin/_popup.html.erb +10 -4
  166. data/app/views/headmin/_table.html.erb +10 -4
  167. data/app/views/headmin/_thumbnail.html.erb +47 -0
  168. data/app/views/headmin/dropdown/_devise.html.erb +2 -2
  169. data/app/views/headmin/dropdown/_item.html.erb +1 -1
  170. data/app/views/headmin/dropdown/_list.html.erb +3 -6
  171. data/app/views/headmin/filters/_date.html.erb +9 -13
  172. data/app/views/headmin/filters/_flatpickr.html.erb +57 -0
  173. data/app/views/headmin/filters/_search.html.erb +5 -5
  174. data/app/views/headmin/filters/_select.html.erb +6 -6
  175. data/app/views/headmin/filters/filter/_button.html.erb +7 -7
  176. data/app/views/headmin/filters/filter/_template.html.erb +1 -1
  177. data/app/views/headmin/forms/_actions.html.erb +1 -1
  178. data/app/views/headmin/forms/_base.html.erb +100 -46
  179. data/app/views/headmin/forms/_blocks.html.erb +4 -4
  180. data/app/views/headmin/forms/_checkbox.html.erb +4 -4
  181. data/app/views/headmin/forms/_date.html.erb +30 -34
  182. data/app/views/headmin/forms/_date_range.html.erb +42 -0
  183. data/app/views/headmin/forms/_email.html.erb +35 -26
  184. data/app/views/headmin/forms/_file.html.erb +186 -34
  185. data/app/views/headmin/forms/_flatpickr.html.erb +34 -0
  186. data/app/views/headmin/forms/_flatpickr_range.html.erb +50 -0
  187. data/app/views/headmin/forms/_hidden.html.erb +24 -0
  188. data/app/views/headmin/forms/_image.html.erb +11 -45
  189. data/app/views/headmin/forms/_label.html.erb +18 -12
  190. data/app/views/headmin/forms/_number.html.erb +40 -37
  191. data/app/views/headmin/forms/_password.html.erb +37 -58
  192. data/app/views/headmin/forms/_redactorx.html.erb +8 -7
  193. data/app/views/headmin/forms/_repeater.html.erb +7 -7
  194. data/app/views/headmin/forms/_select.html.erb +43 -45
  195. data/app/views/headmin/forms/_text.html.erb +94 -59
  196. data/app/views/headmin/forms/_textarea.html.erb +37 -26
  197. data/app/views/headmin/forms/_url.html.erb +35 -26
  198. data/app/views/headmin/forms/_validation.html.erb +3 -3
  199. data/app/views/headmin/forms/_video.html.erb +21 -0
  200. data/app/views/headmin/forms/actions/_destroy.html.erb +3 -3
  201. data/app/views/headmin/forms/fields/_base.html.erb +3 -3
  202. data/app/views/headmin/forms/fields/_file.html.erb +2 -2
  203. data/app/views/headmin/forms/fields/_group.html.erb +4 -4
  204. data/app/views/headmin/forms/fields/_image.html.erb +2 -2
  205. data/app/views/headmin/forms/fields/_list.html.erb +3 -3
  206. data/app/views/headmin/forms/fields/_text.html.erb +2 -2
  207. data/app/views/headmin/forms/repeater/_row.html.erb +1 -1
  208. data/app/views/headmin/heading/_title.html.erb +1 -1
  209. data/app/views/headmin/layout/_body.html.erb +1 -1
  210. data/app/views/headmin/layout/_content.html.erb +1 -1
  211. data/app/views/headmin/layout/_footer.html.erb +1 -1
  212. data/app/views/headmin/layout/_header.html.erb +1 -1
  213. data/app/views/headmin/layout/_main.html.erb +12 -6
  214. data/app/views/headmin/layout/_sidebar.html.erb +3 -3
  215. data/app/views/headmin/layout/sidebar/_bottom.html.erb +1 -1
  216. data/app/views/headmin/layout/sidebar/_nav.html.erb +1 -1
  217. data/app/views/headmin/nav/_dropdown.html.erb +34 -0
  218. data/app/views/headmin/nav/_item.html.erb +22 -13
  219. data/app/views/headmin/nav/item/_devise.html.erb +1 -1
  220. data/app/views/headmin/table/_actions.html.erb +3 -5
  221. data/app/views/headmin/table/_body.html.erb +1 -1
  222. data/app/views/headmin/table/_foot.html.erb +1 -1
  223. data/app/views/headmin/table/_footer.html.erb +1 -1
  224. data/app/views/headmin/table/_head.html.erb +1 -1
  225. data/app/views/headmin/table/_header.html.erb +1 -1
  226. data/app/views/headmin/table/actions/_action.html.erb +4 -4
  227. data/app/views/headmin/table/actions/_delete.html.erb +1 -1
  228. data/app/views/headmin/table/actions/_export.html.erb +1 -1
  229. data/app/views/headmin/table/body/_row.html.erb +15 -7
  230. data/app/views/headmin/views/devise/registrations/_edit.html.erb +2 -2
  231. data/config/importmap.rb +2 -0
  232. data/config/initializers/customize_input_error.rb +4 -4
  233. data/config/locales/en.yml +0 -3
  234. data/config/locales/headmin/forms/en.yml +5 -0
  235. data/config/locales/headmin/forms/nl.yml +5 -0
  236. data/config/locales/headmin/popup/en.yml +4 -0
  237. data/config/locales/headmin/popup/nl.yml +4 -0
  238. data/config/locales/headmin/thumbnail/en.yml +4 -0
  239. data/config/locales/headmin/thumbnail/nl.yml +4 -0
  240. data/config/locales/nl.yml +0 -3
  241. data/esbuild-css.js +25 -0
  242. data/esbuild-js.js +11 -0
  243. data/headmin.gemspec +4 -1
  244. data/lib/generators/headmin/blocks_generator.rb +8 -8
  245. data/lib/generators/headmin/devise_generator.rb +4 -4
  246. data/lib/generators/headmin/fields_generator.rb +9 -9
  247. data/lib/generators/templates/controllers/auth/confirmations_controller.rb +1 -1
  248. data/lib/generators/templates/controllers/auth/omniauth_callbacks_controller.rb +1 -1
  249. data/lib/generators/templates/controllers/auth/passwords_controller.rb +1 -1
  250. data/lib/generators/templates/controllers/auth/registrations_controller.rb +1 -1
  251. data/lib/generators/templates/controllers/auth/sessions_controller.rb +1 -1
  252. data/lib/generators/templates/controllers/auth/unlocks_controller.rb +1 -1
  253. data/lib/generators/templates/models/block.rb +1 -1
  254. data/lib/headmin/engine.rb +18 -3
  255. data/lib/headmin/version.rb +1 -1
  256. data/lib/headmin.rb +1 -1
  257. data/package.json +17 -34
  258. data/src/js/headmin.js +1 -1
  259. data/src/scss/headmin.scss +1 -61
  260. data/yarn.lock +234 -5275
  261. metadata +198 -36
  262. data/.nvmrc +0 -1
  263. data/.rubocop.yml +0 -13
  264. data/app/controllers/concerns/headmin/ckeditor.rb +0 -27
  265. data/app/views/headmin/forms/_ckeditor.html.erb +0 -42
  266. data/dist/css/headmin.css +0 -12354
  267. data/dist/js/headmin.js +0 -1080
  268. data/src/js/headmin/headmin.js +0 -141
  269. data/src/scss/headmin/utilities.scss +0 -19
  270. data/webpack.config.js +0 -30
@@ -2,16 +2,16 @@
2
2
  # headmin/filters/select
3
3
  #
4
4
  # ==== Options
5
- # * <tt>name</tt> - Name of the filter parameter
6
- # * <tt>label</tt> - Display name
7
- # * <tt>options</tt> - List of options to select from
5
+ # * +name</tt> - Name of the filter parameter
6
+ # * +label</tt> - Display name
7
+ # * +options</tt> - List of options to select from
8
8
  #
9
9
  # ==== Examples
10
10
  # Basic version
11
11
  # <%= render "headmin/filters/select", name: :poll_type, label: 'Type', options: [["General", "general", "Fun", "fun"]] %#>
12
12
 
13
- label = local_assigns.has_key?(:label) ? label : nil
14
- name = local_assigns.has_key?(:name) ? name : nil
13
+ name = local_assigns.has_key?(:name) ? name.to_sym : nil
14
+ label = local_assigns.has_key?(:label) ? label : name.to_s.humanize
15
15
  options = local_assigns.has_key?(:options) ? options : []
16
16
 
17
17
  select_options = {
@@ -38,7 +38,7 @@
38
38
  <% (params[name] || []).each_with_index do |param, index| %>
39
39
  <% selected_option = options.detect { |value, key, config| (key.present? ? key : value) == param } %>
40
40
  <% selected_value = selected_option.is_a?(Array) ? selected_option.first : selected_option %>
41
- <%= render 'headmin/filters/filter/button', name: name, label: label, value: selected_value, id: "#{name}_#{index}" do %>
41
+ <%= render 'headmin/filters/filter/button', name: name, label: label, value: selected_value, id: "#{name}_#{index}_#{SecureRandom.hex}" do %>
42
42
  <%= select_tag("#{name}[]", options_for_select(options, param), select_options) %>
43
43
  <% end %>
44
44
  <% end %>
@@ -6,15 +6,16 @@
6
6
  label: (string) Display name
7
7
  value: (string) Value of the parameter
8
8
  %>
9
- <% id = local_assigns.has_key?(:id) ? id : Time.now.utc.to_i %>
10
- <% name = local_assigns.has_key?(:name) ? name : nil %>
11
- <% label = local_assigns.has_key?(:label) ? label : nil %>
9
+ <% id = local_assigns.has_key?(:id) ? id : SecureRandom.hex %>
10
+ <% name = local_assigns.has_key?(:name) ? name.to_sym : nil %>
11
+ <% label = local_assigns.has_key?(:label) ? label : name.to_s.humanize %>
12
12
  <% value = local_assigns.has_key?(:value) ? value : nil %>
13
13
 
14
- <div class="h-filter me-1 my-1" data-filter-name="<%= name %>">
14
+ <div class="h-filter me-1 my-1" data-controller="filter" data-filter-name="<%= name %>">
15
15
  <button
16
16
  type="button"
17
17
  class="h-filter-button btn h-btn-outline-transparent"
18
+ data-filter-target="button"
18
19
  data-popup-target="button"
19
20
  data-popup-id="<%= id %>"
20
21
  data-action="click->popup#open"
@@ -23,8 +24,7 @@
23
24
  <span class="h-filter-remove" data-action="click->filters#remove"><%= bootstrap_icon('x-lg') %></span>
24
25
  </button>
25
26
 
26
- <%= render 'headmin/popup', id: "#{id}" do %>
27
- <%= yield if block_given? %>
27
+ <%= render 'headmin/popup', id: "#{id}", data: {'filter-target': 'popup'} do %>
28
+ <%= yield %>
28
29
  <% end %>
29
-
30
30
  </div>
@@ -8,6 +8,6 @@
8
8
 
9
9
  <template data-filter-name="<%= name %>" data-filters-target="template">
10
10
  <%= render 'headmin/filters/filter/button', name: name, label: label, value: nil, id: 'template_id' do %>
11
- <%= yield if block_given? %>
11
+ <%= yield %>
12
12
  <% end %>
13
13
  </template>
@@ -19,7 +19,7 @@
19
19
  </dl>
20
20
  <% end %>
21
21
 
22
- <%= yield if block_given? %>
22
+ <%= yield %>
23
23
 
24
24
  <%= render 'headmin/forms/actions/destroy', form: form %>
25
25
  <hr>
@@ -1,60 +1,114 @@
1
- <%
2
- # headmin/forms/base
3
- #
4
- # ==== Options
5
- # * <tt>form<tt> - Form object
6
- # * <tt>attribute<tt> - Name of the attribute of the form model
7
- # * <tt>options<tt> - Hash with all HTML options to pass to
8
- # * <tt>label<tt> - Text to show as label. Label will be hidden if value is false
9
- # * <tt>required<tt> - Set to true to mark as required
10
- # * <tt>float<tt> - Set to true if you want to show floating labels
11
- # * <tt>append<tt> - Text or icon to be shown on the left hand side of the input, Doesn't work with float
12
- # * <tt>prepend<tt> - Text or icon to be shown on the right hand side of the input, Doesn't work with float
13
- #
14
- # ==== Examples
15
- # Basic version
16
- # <%= render 'headmin/forms/date', form: form, attribute: :title %#>
17
- #
18
- # With datepicker
19
- # <%= render 'headmin/forms/text', form: form, attribute: :title, datepicker: true %#>
20
-
21
- append = local_assigns.has_key?(:append) ? append : nil
22
- float = local_assigns.has_key?(:float) ? float : false
23
- label = local_assigns.has_key?(:label) ? label : nil
24
- prepend = local_assigns.has_key?(:prepend) ? prepend : nil
25
- required = local_assigns.has_key?(:required) ? required : false
26
-
27
- show_label = label != false
28
- %>
29
-
30
- <div class="<%= 'form-floating' if float %> <%= ('mb-3 text-start' if show_label) %>">
31
- <% if show_label && !float %>
32
- <%= render 'headmin/forms/label', form: form, attribute: attribute, name: label, required: required %>
33
- <% end %>
34
-
35
- <% if float %>
36
- <%= yield form %>
37
- <%= render 'headmin/forms/validation', form: form, attribute: attribute %>
38
- <% else %>
1
+ <!--
2
+ <% documentation do %>
3
+ # Base
4
+ This serves as a wrapper around most form views. It allows defining everything that happens outside the input field.
5
+ The main purpose of this view is to coordinate labels and appendages.
6
+
7
+ ```erbx
8
+ <%= form_with do |form| %>
9
+ <%= render "headmin/forms/base", form: form, attribute: "basic_example" do |form| %>
10
+ <%= form.text_field("attribute", class: 'form-control') %>
11
+ <% end %>
12
+ <% end %>
13
+ ```
14
+
15
+ # Parameters
16
+ | Name | Required | Type | Description |
17
+ | ------------ | -------- | ---------------- | ----------- |
18
+ | form | yes | Object | Form object |
19
+ | attribute | yes | String, Symbol | Name of the attribute of the form model |
20
+ | append | no | Boolean | Text or icon to be shown on the left hand side of the input, Doesn't work with float |
21
+ | class | no | String | A space separated string of HTML class names |
22
+ | float | no | Boolean | Set to true if you want to show floating labels |
23
+ | id | no | String | Input identifier to be used as "for" in the label |
24
+ | label | no | Hash | Text to show as label. Label will be hidden if value is false |
25
+ | prepend | no | Boolean | Text or icon to be shown on the right hand side of the input, Doesn't work with float |
26
+
27
+ ## Examples
28
+
29
+ ### Sizing
30
+ ```erbx
31
+ <%= form_with do |form| %>
32
+ <%= render "headmin/forms/base", form: form, attribute: "small", class: 'input-group-sm' do |form| %>
33
+ <%= form.text_field("attribute", class: 'form-control', placeholder: '.input-group-sm') %>
34
+ <% end %>
35
+ <%= render "headmin/forms/base", form: form, attribute: "medium" do |form| %>
36
+ <%= form.text_field("attribute", class: 'form-control', placeholder: 'Default size') %>
37
+ <% end %>
38
+ <%= render "headmin/forms/base", form: form, attribute: "large", class: 'input-group-lg' do |form| %>
39
+ <%= form.text_field("attribute", class: 'form-control', placeholder: '.input-group-lg') %>
40
+ <% end %>
41
+ <% end %>
42
+ ```
43
+
44
+ ### Labels
45
+ ```erbx
46
+ <%= form_with do |form| %>
47
+ <%= render "headmin/forms/base", form: form, attribute: "no_label", label: false do |form| %>
48
+ <%= form.text_field("attribute", class: 'form-control', placeholder: 'Without label') %>
49
+ <% end %>
50
+ <%= render "headmin/forms/base", form: form, attribute: "floating_label", float: true do |form| %>
51
+ <%= form.text_field("attribute", class: 'form-control', placeholder: 'Default size') %>
52
+ <% end %>
53
+ <%= render "headmin/forms/base", form: form, attribute: "custom_label", label: 'Custom label' do |form| %>
54
+ <%= form.text_field("attribute", class: 'form-control') %>
55
+ <% end %>
56
+ <% end %>
57
+ ```
58
+
59
+ ### Appendages
60
+ ```erbx
61
+ <%= form_with do |form| %>
62
+ <%= render "headmin/forms/base", form: form, attribute: "prepend", prepend: "€" do |form| %>
63
+ <%= form.text_field("attribute", class: 'form-control') %>
64
+ <% end %>
65
+ <%= render "headmin/forms/base", form: form, attribute: "append", append: "m²" do |form| %>
66
+ <%= form.text_field("attribute", class: 'form-control') %>
67
+ <% end %>
68
+ <%= render "headmin/forms/base", form: form, attribute: "prepend_and_append", prepend: "€", append: "m²" do |form| %>
69
+ <%= form.text_field("attribute", class: 'form-control') %>
70
+ <% end %>
71
+ <% end %>
72
+ ```
73
+ <% end %>
74
+ -->
75
+
76
+ <% base = Headmin::Form::Base.new(local_assigns) %>
77
+
78
+ <%= tag.div(class: base.class_names, data: base.data) do %>
79
+ <% if base.label != false && !base.float %>
80
+ <%= render 'headmin/forms/label', base.label_options %>
81
+ <% end %>
82
+
83
+ <% if base.append || base.prepend %>
39
84
  <div class="input-group w-100">
40
- <% if prepend %>
85
+ <% if base.prepend %>
41
86
  <span class="input-group-text">
42
- <%= prepend %>
87
+ <%= base.prepend %>
43
88
  </span>
44
89
  <% end %>
45
90
 
46
91
  <%= yield form %>
47
- <%= render 'headmin/forms/validation', form: form, attribute: attribute %>
92
+ <%= render 'headmin/forms/validation', base.validation_options if form.object.respond_to?(:errors) %>
48
93
 
49
- <% if append %>
94
+ <% if base.append %>
50
95
  <span class="input-group-text">
51
- <%= append %>
96
+ <%= base.append %>
52
97
  </span>
53
98
  <% end %>
54
99
  </div>
100
+ <% else %>
101
+ <%= yield form %>
102
+ <%= render 'headmin/forms/validation', base.validation_options if form.object.respond_to?(:errors) %>
103
+ <% end %>
104
+
105
+ <% if base.label != false && base.float %>
106
+ <%= render 'headmin/forms/label', base.label_options %>
55
107
  <% end %>
56
108
 
57
- <% if show_label && float %>
58
- <%= render 'headmin/forms/label', form: form, attribute: attribute, name: label, required: required %>
109
+ <% if base.list %>
110
+ <datalist id="<%= base.list_id %>">
111
+ <%= options_for_select(base.list) %>
112
+ </datalist>
59
113
  <% end %>
60
- </div>
114
+ <% end %>
@@ -2,9 +2,9 @@
2
2
  # headmin/forms/blocks
3
3
  #
4
4
  # ==== Options
5
- # * <tt>form</tt> - Form object
6
- # * <tt>path</tt> - Directory where to look for block templates
7
- # * <tt>allow</tt> - Names of block templates that can be added
5
+ # * +form</tt> - Form object
6
+ # * +path</tt> - Directory where to look for block templates
7
+ # * +allow</tt> - Names of block templates that can be added
8
8
  #
9
9
  # ==== Examples
10
10
  # Basic version. This will only look for blocks in 'admin/blocks'
@@ -29,7 +29,7 @@
29
29
  <%= block_form.hidden_field :name, value: name %>
30
30
 
31
31
  <!-- Render block form fields -->
32
- <% view_path = BlockService.form_view(name, path: path).gsub('/_', '/') %>
32
+ <% view_path = BlockService.form_view(name, path: path).gsub('/_', '/').split('.')[0] %>
33
33
  <%= render view_path, form: block_form %>
34
34
 
35
35
  <!-- Label -->
@@ -2,9 +2,9 @@
2
2
  # headmin/forms/checkbox
3
3
  #
4
4
  # ==== Options
5
- # * <tt>form<tt> - Form object
6
- # * <tt>attribute<tt> - Name of the attribute of the form model
7
- # * <tt>label<tt> - Text to show as label. Label will be hidden if value is false
5
+ # * +form+ - Form object
6
+ # * +attribute+ - Name of the attribute of the form model
7
+ # * +label+ - Text to show as label. Label will be hidden if value is false
8
8
  #
9
9
  # ==== Examples
10
10
  # Basic version
@@ -33,7 +33,7 @@
33
33
  <div class="<%= ('mb-3 text-start' if show_label) %>">
34
34
  <%= form.check_box(attribute, options) %>
35
35
  <% if show_label %>
36
- <%= render 'headmin/forms/label', form: form, attribute: attribute, name: label, required: required %>
36
+ <%= render 'headmin/forms/label', form: form, attribute: attribute, text: label, required: required %>
37
37
  <% end %>
38
38
  <%= render 'headmin/forms/validation', form: form, attribute: attribute %>
39
39
  </div>
@@ -1,45 +1,41 @@
1
1
  <%
2
2
  # headmin/forms/date
3
3
  #
4
- # ==== Options
5
- # * <tt>form<tt> - Form object
6
- # * <tt>attribute<tt> - Name of the attribute of the form model
7
- # * <tt>label<tt> - Text to show as label. Label will be hidden if value is false
8
- # * <tt>float<tt> - Set to true if you want to show floating labels
9
- # * <tt>append<tt> - Text or icon to be shown on the left hand side of the input, Doesn't work with float
10
- # * <tt>prepend<tt> - Text or icon to be shown on the right hand side of the input, Doesn't work with float
4
+ # ==== Required parameters
5
+ # * +form+ - Form object
6
+ # * +attribute+ - Name of the attribute of the form model
7
+ #
8
+ # ==== Optional parameters
9
+ # * +aria+ - Provide a hash to define all aria attributes
10
+ # * +autocomplete+ - Value to be autofilled by the browser
11
+ # * +autofocus+ - Set to true to focus on this field when the page renders
12
+ # * +data+ - Optional HTML data attributes
13
+ # * +disabled+ - Set to true if the input should be shown as disabled
14
+ # * +id+ - Input identifier
15
+ # * +list+ - Add array of options to show in a data list
16
+ # * +readonly+ - Set to true if the value of the field can only be read and not be modified
17
+ # * +required+ - Set to true to mark as required
18
+ # * +step+ - The acceptable value granularity
19
+ # * +value+ - Overrides the value of the form
20
+ #
21
+ # ==== Extra parameters
22
+ # Listed in 'headmin/forms/base'
23
+ #
24
+ # ==== References
25
+ # https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date
26
+ # https://apidock.com/rails/ActionView/Helpers/FormHelper/date_field
11
27
  #
12
28
  # ==== Examples
13
29
  # Basic version
14
- # <%= render 'headmin/forms/date', form: form, attribute: :title %#>
15
- #
16
- # With datepicker
17
- # <%= render 'headmin/forms/text', form: form, attribute: :title, datepicker: true %#>
18
-
19
- append = local_assigns.has_key?(:append) ? append : nil
20
- class_names = local_assigns.has_key?(:class) ? local_assigns[:class] : false
21
- data = local_assigns.has_key?(:data) ? data : nil
22
- disabled = local_assigns.has_key?(:disabled) ? disabled : false
23
- float = local_assigns.has_key?(:float) ? float : false
24
- label = local_assigns.has_key?(:label) ? label : nil
25
- prepend = local_assigns.has_key?(:prepend) ? prepend : nil
26
- readonly = local_assigns.has_key?(:readonly) ? readonly : false
27
- required = local_assigns.has_key?(:required) ? required : false
28
- datepicker = local_assigns.has_key?(:datepicker) ? local_assigns[:datepicker] : false
29
-
30
- class_names = "#{class_names} flatpickr" if datepicker
30
+ # <%= render 'headmin/forms/date', form: form, attribute: :date %#>
31
31
 
32
- options = {
33
- 'aria-describedby': form_field_validation_id(form, attribute),
34
- class: "form-control #{form_field_validation_class(form, attribute)} #{class_names}",
35
- data: data,
36
- disabled: disabled,
37
- placeholder: attribute,
38
- readonly: readonly,
39
- required: required,
40
- }
32
+ option_keys = %i(aria autocomplete autofocus data disabled id list readonly required step value)
33
+ options = local_assigns.slice(*option_keys).merge(
34
+ aria: { describedby: form_field_validation_id(form, attribute) },
35
+ class: ['form-control', form_field_validation_class(form, attribute)].join(' '),
36
+ )
41
37
  %>
42
38
 
43
- <%= render 'headmin/forms/base', form: form, attribute: attribute, append: append, prepend: prepend, float: float, label: label, required: required do |form| %>
39
+ <%= render 'headmin/forms/base', local_assigns do |form| %>
44
40
  <%= form.date_field(attribute, options) %>
45
41
  <% end %>
@@ -0,0 +1,42 @@
1
+ <%
2
+ # headmin/forms/date_range
3
+ #
4
+ # ==== Required parameters
5
+ # * +form+ - Form object
6
+ # * +start_attribute+ - Name of the start date attribute of the form model
7
+ # * +end_attribute+ - Name of the end date attribute of the form model
8
+ #
9
+ # ==== Optional parameters
10
+ # * +end_label+ - Label for the end attribute
11
+ # * +start_label+ - Label for the start attribute
12
+ #
13
+ # ==== Extra parameters
14
+ # Listed in 'headmin/forms/date'
15
+ # Listed in 'headmin/forms/base'
16
+ #
17
+ # ==== Examples
18
+ # Basic version
19
+ # <%= render 'headmin/forms/date_range', form: form, start_attribute: :start_date, end_attribute: :end_date %#>
20
+ #
21
+ # With custom labels
22
+ # <%= render 'headmin/forms/date_range', form: form, start_attribute: :start_date_2, start_label: :start_date, end_attribute: :end_date_2, end_label: :end_date %#>
23
+
24
+ start_date_options = local_assigns.merge(
25
+ attribute: local_assigns[:start_attribute],
26
+ label: local_assigns[:start_label]
27
+ )
28
+ end_date_options = local_assigns.merge(
29
+ attribute: local_assigns[:end_attribute],
30
+ label: local_assigns[:end_label]
31
+ )
32
+ %>
33
+
34
+ <div class="row">
35
+ <div class="col">
36
+ <%= render 'headmin/forms/date', start_date_options %>
37
+ </div>
38
+ <div class="col">
39
+ <%= render 'headmin/forms/date', end_date_options %>
40
+ </div>
41
+ </div>
42
+
@@ -1,39 +1,48 @@
1
1
  <%
2
2
  # headmin/forms/email
3
3
  #
4
- # ==== Options
5
- # * <tt>form<tt> - Form object
6
- # * <tt>attribute<tt> - Name of the attribute of the form model
7
- # * <tt>label<tt> - Text to show as label. Label will be hidden if value is false
8
- # * <tt>float<tt> - Set to true if you want to show floating labels
9
- # * <tt>append<tt> - Text or icon to be shown on the left hand side of the input, Doesn't work with float
10
- # * <tt>prepend<tt> - Text or icon to be shown on the right hand side of the input, Doesn't work with float
4
+ # ==== Required parameters
5
+ # * +form+ - Form object
6
+ # * +attribute+ - Name of the attribute of the form model
7
+ #
8
+ # ==== Optional parameters
9
+ # * +aria+ - Provide a hash to define all aria attributes
10
+ # * +autocomplete+ - Value to be autofilled by the browser
11
+ # * +data+ - Provide a hash to define all data attributes
12
+ # * +disabled+ - Sets the placeholder of the field
13
+ # * +id+ - Input identifier
14
+ # * +list+ - Add array of options to show in a data list
15
+ # * +maxlength+ - Maximum amount of characters to be used
16
+ # * +minlength+ - Minimum amount of characters to be used
17
+ # * +multiple+ - Allow multiple comma-separated email addresses to be entered
18
+ # * +pattern+ -a A regular expression that the input's value must match
19
+ # * +placeholder+ - Sets the placeholder of the field
20
+ # * +readonly+ - Sets the placeholder of the field
21
+ # * +required+ - Set to true to mark as required
22
+ # * +size+ - How much of the input should be shown
23
+ # * +value+ - Overrides the value of the form
24
+ #
25
+ # ==== Extra parameters
26
+ # Listed in 'headmin/forms/base'
27
+ #
28
+ # ==== References
29
+ # https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/text
30
+ # https://apidock.com/rails/ActionView/Helpers/FormHelper/text_field
11
31
  #
12
32
  # ==== Examples
13
33
  # Basic version
14
34
  # <%= render 'headmin/forms/email', form: form, attribute: :email_address %#>
15
35
 
16
- append = local_assigns.has_key?(:append) ? append : nil
17
- class_names = local_assigns.has_key?(:class) ? local_assigns[:class] : false
18
- data = local_assigns.has_key?(:data) ? data : nil
19
- disabled = local_assigns.has_key?(:disabled) ? disabled : false
20
- float = local_assigns.has_key?(:float) ? float : false
21
- label = local_assigns.has_key?(:label) ? label : nil
22
- prepend = local_assigns.has_key?(:prepend) ? prepend : nil
23
- readonly = local_assigns.has_key?(:readonly) ? readonly : false
24
- required = local_assigns.has_key?(:required) ? required : false
36
+ placeholder = local_assigns[:float] ? local_assigns[:placeholder] || attribute : local_assigns[:placeholder]
25
37
 
26
- options = {
27
- 'aria-describedby': form_field_validation_id(form, attribute),
28
- class: "form-control #{form_field_validation_class(form, attribute)} #{class_names}",
29
- data: data,
30
- disabled: disabled,
31
- placeholder: attribute,
32
- readonly: readonly,
33
- required: required,
34
- }
38
+ option_keys = %i(aria autocomplete data disabled id maxlenght minlength multiple pattern placeholder readonly required size value)
39
+ options = local_assigns.slice(*option_keys).merge(
40
+ aria: { describedby: form_field_validation_id(form, attribute) },
41
+ class: ['form-control', form_field_validation_class(form, attribute)].join(' '),
42
+ placeholder: placeholder
43
+ )
35
44
  %>
36
45
 
37
- <%= render 'headmin/forms/base', form: form, attribute: attribute, append: append, prepend: prepend, float: float, label: label, required: required do |form| %>
46
+ <%= render 'headmin/forms/base', local_assigns do |form| %>
38
47
  <%= form.email_field(attribute, options) %>
39
48
  <% end %>