matestack-ui-core 0.7.2.1 → 1.0.0.rc.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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +8 -0
  3. data/README.md +28 -204
  4. data/Rakefile +32 -0
  5. data/app/concepts/matestack/ui/core/abbr/abbr.haml +2 -2
  6. data/app/concepts/matestack/ui/core/abbr/abbr.rb +3 -2
  7. data/app/concepts/matestack/ui/core/action/action.js +114 -11
  8. data/app/concepts/matestack/ui/core/action/action.rb +41 -13
  9. data/app/concepts/matestack/ui/core/{component/response_dynamic.haml → actionview/dynamic.haml} +2 -3
  10. data/app/concepts/matestack/ui/core/actionview/dynamic.rb +28 -0
  11. data/app/concepts/matestack/ui/core/{component → actionview}/static.haml +0 -0
  12. data/app/concepts/matestack/ui/core/actionview/static.rb +28 -0
  13. data/app/concepts/matestack/ui/core/address/address.haml +2 -2
  14. data/app/concepts/matestack/ui/core/address/address.rb +1 -1
  15. data/app/concepts/matestack/ui/core/app/app.haml +2 -3
  16. data/app/concepts/matestack/ui/core/app/app.js +18 -4
  17. data/app/concepts/matestack/ui/core/app/app.rb +34 -81
  18. data/app/concepts/matestack/ui/core/app/location.js +9 -0
  19. data/app/concepts/matestack/ui/core/app/store.js +35 -6
  20. data/app/concepts/matestack/ui/core/area/area.haml +1 -0
  21. data/app/concepts/matestack/ui/core/area/area.rb +20 -0
  22. data/app/concepts/matestack/ui/core/aside/aside.haml +3 -0
  23. data/app/concepts/matestack/ui/core/aside/aside.rb +5 -0
  24. data/app/concepts/matestack/ui/core/async/async.haml +6 -2
  25. data/app/concepts/matestack/ui/core/async/async.js +64 -8
  26. data/app/concepts/matestack/ui/core/async/async.rb +29 -4
  27. data/app/concepts/matestack/ui/core/async/children_wrapper.haml +2 -0
  28. data/app/concepts/matestack/ui/core/{pg/pg.haml → b/b.haml} +1 -1
  29. data/app/concepts/matestack/ui/core/b/b.rb +5 -0
  30. data/app/concepts/matestack/ui/core/bdi/bdi.haml +5 -0
  31. data/app/concepts/matestack/ui/core/bdi/bdi.rb +4 -0
  32. data/app/concepts/matestack/ui/core/bdo/bdo.haml +5 -0
  33. data/app/concepts/matestack/ui/core/bdo/bdo.rb +11 -0
  34. data/app/concepts/matestack/ui/core/cite/cite.haml +5 -0
  35. data/app/concepts/matestack/ui/core/cite/cite.rb +5 -0
  36. data/app/concepts/matestack/ui/core/code/code.haml +5 -0
  37. data/app/concepts/matestack/ui/core/code/code.rb +5 -0
  38. data/app/concepts/matestack/ui/core/collection/content/content.js +4 -4
  39. data/app/concepts/matestack/ui/core/collection/content/content.rb +2 -2
  40. data/app/concepts/matestack/ui/core/collection/content/page/link/link.rb +4 -2
  41. data/app/concepts/matestack/ui/core/collection/filter/filter.js +3 -3
  42. data/app/concepts/matestack/ui/core/collection/filter/filter.rb +4 -5
  43. data/app/concepts/matestack/ui/core/collection/filter/select/select.haml +10 -0
  44. data/app/concepts/matestack/ui/core/collection/filter/select/select.rb +29 -0
  45. data/app/concepts/matestack/ui/core/collection/helper.rb +14 -6
  46. data/app/concepts/matestack/ui/core/collection/order/order.js +4 -4
  47. data/app/concepts/matestack/ui/core/collection/order/order.rb +4 -5
  48. data/app/concepts/matestack/ui/core/collection/order/toggle/indicator/indicator.rb +6 -5
  49. data/app/concepts/matestack/ui/core/component/anonym-dynamic-component.js +1 -1
  50. data/app/concepts/matestack/ui/core/component/base.rb +424 -0
  51. data/app/concepts/matestack/ui/core/component/children.haml +2 -2
  52. data/app/concepts/matestack/ui/core/component/component.js +1 -55
  53. data/app/concepts/matestack/ui/core/component/dynamic.haml +1 -1
  54. data/app/concepts/matestack/ui/core/component/dynamic.rb +24 -239
  55. data/app/concepts/matestack/ui/core/component/rerender.rb +8 -0
  56. data/app/concepts/matestack/ui/core/component/static.rb +3 -12
  57. data/app/concepts/matestack/ui/core/data/data.haml +5 -0
  58. data/app/concepts/matestack/ui/core/data/data.rb +9 -0
  59. data/app/concepts/matestack/ui/core/datalist/datalist.haml +3 -0
  60. data/app/concepts/matestack/ui/core/datalist/datalist.rb +5 -0
  61. data/app/concepts/matestack/ui/core/dd/dd.haml +5 -0
  62. data/app/concepts/matestack/ui/core/dd/dd.rb +5 -0
  63. data/app/concepts/matestack/ui/core/del/del.haml +5 -0
  64. data/app/concepts/matestack/ui/core/del/del.rb +4 -0
  65. data/app/concepts/matestack/ui/core/dfn/dfn.haml +5 -0
  66. data/app/concepts/matestack/ui/core/dfn/dfn.rb +6 -0
  67. data/app/concepts/matestack/ui/core/dialog/dialog.haml +5 -0
  68. data/app/concepts/matestack/ui/core/dialog/dialog.rb +9 -0
  69. data/app/concepts/matestack/ui/core/dl/dl.haml +5 -0
  70. data/app/concepts/matestack/ui/core/dl/dl.rb +5 -0
  71. data/app/concepts/matestack/ui/core/dt/dt.haml +5 -0
  72. data/app/concepts/matestack/ui/core/dt/dt.rb +5 -0
  73. data/app/concepts/matestack/ui/core/em/em.haml +5 -0
  74. data/app/concepts/matestack/ui/core/em/em.rb +5 -0
  75. data/app/concepts/matestack/ui/core/fieldset/fieldset.haml +5 -0
  76. data/app/concepts/matestack/ui/core/fieldset/fieldset.rb +9 -0
  77. data/app/concepts/matestack/ui/core/figure/figure.haml +3 -0
  78. data/app/concepts/matestack/ui/core/figure/figure.rb +5 -0
  79. data/app/concepts/matestack/ui/core/form/checkbox/checkbox.rb +79 -0
  80. data/app/concepts/matestack/ui/core/form/form.js +266 -96
  81. data/app/concepts/matestack/ui/core/form/form.rb +29 -2
  82. data/app/concepts/matestack/ui/core/form/has_errors.rb +54 -0
  83. data/app/concepts/matestack/ui/core/form/has_input_html_attributes.rb +13 -0
  84. data/app/concepts/matestack/ui/core/form/input/input.rb +39 -52
  85. data/app/concepts/matestack/ui/core/form/radio/radio.rb +71 -0
  86. data/app/concepts/matestack/ui/core/form/select/select.haml +9 -76
  87. data/app/concepts/matestack/ui/core/form/select/select.rb +64 -49
  88. data/app/concepts/matestack/ui/core/form/submit/submit.rb +4 -1
  89. data/app/concepts/matestack/ui/core/form/textarea/textarea.rb +28 -0
  90. data/app/concepts/matestack/ui/core/form/utils.rb +47 -0
  91. data/app/concepts/matestack/ui/core/heading/heading.rb +2 -0
  92. data/app/concepts/matestack/ui/core/iframe/iframe.haml +5 -0
  93. data/app/concepts/matestack/ui/core/iframe/iframe.rb +14 -0
  94. data/app/concepts/matestack/ui/core/img/img.rb +1 -0
  95. data/app/concepts/matestack/ui/core/input/input.haml +1 -3
  96. data/app/concepts/matestack/ui/core/input/input.rb +8 -0
  97. data/app/concepts/matestack/ui/core/ins/ins.haml +5 -0
  98. data/app/concepts/matestack/ui/core/ins/ins.rb +10 -0
  99. data/app/concepts/matestack/ui/core/isolated/children_wrapper.haml +2 -0
  100. data/app/concepts/matestack/ui/core/isolated/isolated.haml +10 -0
  101. data/app/concepts/matestack/ui/core/isolated/isolated.js +108 -0
  102. data/app/concepts/matestack/ui/core/isolated/isolated.rb +59 -0
  103. data/app/concepts/matestack/ui/core/js/core.js +43 -19
  104. data/app/concepts/matestack/ui/core/kbd/kbd.haml +5 -0
  105. data/app/concepts/matestack/ui/core/kbd/kbd.rb +4 -0
  106. data/app/concepts/matestack/ui/core/label/label.rb +6 -1
  107. data/app/concepts/matestack/ui/core/legend/legend.haml +5 -0
  108. data/app/concepts/matestack/ui/core/legend/legend.rb +5 -0
  109. data/app/concepts/matestack/ui/core/link/link.rb +7 -6
  110. data/app/concepts/matestack/ui/core/{absolute/absolute.haml → map/map.haml} +1 -1
  111. data/app/concepts/matestack/ui/core/map/map.rb +11 -0
  112. data/app/concepts/matestack/ui/core/mark/mark.haml +5 -0
  113. data/app/concepts/matestack/ui/core/mark/mark.rb +4 -0
  114. data/app/concepts/matestack/ui/core/meter/meter.haml +4 -0
  115. data/app/concepts/matestack/ui/core/meter/meter.rb +14 -0
  116. data/app/concepts/matestack/ui/core/noscript/noscript.haml +5 -0
  117. data/app/concepts/matestack/ui/core/noscript/noscript.rb +5 -0
  118. data/app/concepts/matestack/ui/core/object/object.haml +1 -0
  119. data/app/concepts/matestack/ui/core/object/object.rb +15 -0
  120. data/app/concepts/matestack/ui/core/onclick/onclick.js +2 -3
  121. data/app/concepts/matestack/ui/core/onclick/onclick.rb +1 -0
  122. data/app/concepts/matestack/ui/core/optgroup/optgroup.haml +3 -0
  123. data/app/concepts/matestack/ui/core/optgroup/optgroup.rb +10 -0
  124. data/app/concepts/matestack/ui/core/option/option.haml +5 -0
  125. data/app/concepts/matestack/ui/core/option/option.rb +12 -0
  126. data/app/concepts/matestack/ui/core/output/output.haml +5 -0
  127. data/app/concepts/matestack/ui/core/output/output.rb +11 -0
  128. data/app/concepts/matestack/ui/core/page/{content.js → content/content.js} +8 -2
  129. data/app/concepts/matestack/ui/core/page/content/content.rb +29 -0
  130. data/app/concepts/matestack/ui/core/page/page.haml +3 -9
  131. data/app/concepts/matestack/ui/core/page/page.rb +15 -160
  132. data/app/concepts/matestack/ui/core/param/param.haml +1 -0
  133. data/app/concepts/matestack/ui/core/param/param.rb +10 -0
  134. data/app/concepts/matestack/ui/core/picture/picture.haml +3 -0
  135. data/app/concepts/matestack/ui/core/picture/picture.rb +4 -0
  136. data/app/concepts/matestack/ui/core/plain/plain.rb +1 -1
  137. data/app/concepts/matestack/ui/core/pre/pre.haml +5 -0
  138. data/app/concepts/matestack/ui/core/pre/pre.rb +5 -0
  139. data/app/concepts/matestack/ui/core/progress/progress.rb +1 -1
  140. data/app/concepts/matestack/ui/core/q/q.haml +5 -0
  141. data/app/concepts/matestack/ui/core/q/q.rb +11 -0
  142. data/app/concepts/matestack/ui/core/rp/rp.haml +5 -0
  143. data/app/concepts/matestack/ui/core/rp/rp.rb +5 -0
  144. data/app/concepts/matestack/ui/core/rt/rt.haml +5 -0
  145. data/app/concepts/matestack/ui/core/rt/rt.rb +5 -0
  146. data/app/concepts/matestack/ui/core/ruby/ruby.haml +5 -0
  147. data/app/concepts/matestack/ui/core/ruby/ruby.rb +5 -0
  148. data/app/concepts/matestack/ui/core/s/s.haml +5 -0
  149. data/app/concepts/matestack/ui/core/s/s.rb +6 -0
  150. data/app/concepts/matestack/ui/core/samp/samp.haml +5 -0
  151. data/app/concepts/matestack/ui/core/samp/samp.rb +4 -0
  152. data/app/concepts/matestack/ui/core/slot/slot.rb +2 -2
  153. data/app/concepts/matestack/ui/core/sup/sup.haml +5 -0
  154. data/app/concepts/matestack/ui/core/sup/sup.rb +5 -0
  155. data/app/concepts/matestack/ui/core/template/template.haml +3 -0
  156. data/app/concepts/matestack/ui/core/template/template.rb +4 -0
  157. data/app/concepts/matestack/ui/core/textarea/textarea.haml +2 -0
  158. data/app/concepts/matestack/ui/core/textarea/textarea.rb +10 -0
  159. data/app/concepts/matestack/ui/core/toggle/toggle.haml +2 -0
  160. data/app/concepts/matestack/ui/core/toggle/toggle.js +71 -0
  161. data/app/concepts/matestack/ui/core/toggle/toggle.rb +14 -0
  162. data/app/concepts/matestack/ui/core/transition/transition.js +18 -2
  163. data/app/concepts/matestack/ui/core/transition/transition.rb +2 -1
  164. data/app/concepts/matestack/ui/core/u/u.haml +5 -0
  165. data/app/concepts/matestack/ui/core/u/u.rb +6 -0
  166. data/app/concepts/matestack/ui/core/unescaped/unescaped.rb +7 -0
  167. data/app/concepts/matestack/ui/core/var/var.haml +5 -0
  168. data/app/concepts/matestack/ui/core/var/var.rb +4 -0
  169. data/app/concepts/matestack/ui/core/video/video.haml +3 -1
  170. data/app/concepts/matestack/ui/core/video/video.rb +17 -1
  171. data/app/concepts/matestack/ui/core/view/view.haml +1 -2
  172. data/app/concepts/matestack/ui/core/view/view.rb +27 -2
  173. data/app/concepts/matestack/ui/core/wbr/wbr.haml +1 -0
  174. data/app/concepts/matestack/ui/core/wbr/wbr.rb +4 -0
  175. data/app/concepts/matestack/ui/core/youtube/youtube.rb +1 -1
  176. data/app/helpers/matestack/ui/core/application_helper.rb +89 -17
  177. data/app/javascript/matestack-ui-core/index.js +22 -0
  178. data/app/javascript/matestack-ui-core/styles/index.scss +5 -0
  179. data/app/javascript/packs/matestack-ui-core.js +8 -0
  180. data/app/lib/matestack/ui/component.rb +1 -0
  181. data/app/lib/matestack/ui/core/has_view_context.rb +14 -0
  182. data/app/lib/matestack/ui/core/html_attributes.rb +43 -0
  183. data/app/lib/matestack/ui/core/properties.rb +88 -0
  184. data/app/lib/matestack/ui/core/rendering/default_renderer_class_determiner.rb +33 -0
  185. data/app/lib/matestack/ui/core/rendering/main_renderer.rb +199 -0
  186. data/app/lib/matestack/ui/dynamic_actionview_component.rb +1 -0
  187. data/app/lib/matestack/ui/isolated_component.rb +1 -0
  188. data/app/lib/matestack/ui/static_actionview_component.rb +1 -0
  189. data/app/lib/matestack/ui/vue_js_component.rb +1 -0
  190. data/config/routes.rb +0 -1
  191. data/lib/generators/matestack/app/USAGE +21 -0
  192. data/lib/generators/matestack/app/app_generator.rb +25 -0
  193. data/lib/generators/{matestack_app/templates/matestack_app_controller.erb → matestack/app/templates/app/controllers/%file_name%_controller.rb.tt} +0 -2
  194. data/lib/generators/matestack/app/templates/app/matestack/apps/%file_name%.rb.tt +28 -0
  195. data/lib/generators/matestack/component/USAGE +20 -0
  196. data/lib/generators/matestack/component/component_generator.rb +29 -0
  197. data/lib/generators/{matestack_component/templates/matestack_component.haml.erb → matestack/component/templates/app/matestack/components/%namespace%/%file_name%.haml.tt} +0 -0
  198. data/lib/generators/{matestack_component/templates/matestack_component.js.erb → matestack/component/templates/app/matestack/components/%namespace%/%file_name%.js.tt} +2 -2
  199. data/lib/generators/matestack/component/templates/app/matestack/components/%namespace%/%file_name%.rb.tt +11 -0
  200. data/lib/generators/{matestack_component/templates/matestack_component.scss.erb → matestack/component/templates/app/matestack/components/%namespace%/%file_name%.scss.tt} +0 -0
  201. data/lib/generators/matestack/core/component/USAGE +16 -0
  202. data/lib/generators/matestack/core/component/component_generator.rb +23 -0
  203. data/lib/generators/matestack/core/component/templates/app/concepts/matestack/ui/core/%file_name%/%file_name%.haml.tt +5 -0
  204. data/lib/generators/matestack/core/component/templates/app/concepts/matestack/ui/core/%file_name%/%file_name%.rb.tt +4 -0
  205. data/lib/generators/matestack/core/component/templates/docs/components/%file_name%.md.tt +45 -0
  206. data/lib/generators/matestack/core/component/templates/spec/usage/components/%file_name%_spec.rb +31 -0
  207. data/lib/generators/matestack/page/USAGE +28 -0
  208. data/lib/generators/matestack/page/page_generator.rb +54 -0
  209. data/lib/generators/matestack/page/templates/app/matestack/pages/%app_name%/%namespace%/%file_name%.rb.tt +29 -0
  210. data/lib/matestack/ui/core.rb +5 -2
  211. data/lib/matestack/ui/core/cell.rb +31 -0
  212. data/lib/matestack/ui/core/component/registry.rb +47 -0
  213. data/lib/matestack/ui/core/components.rb +267 -0
  214. data/lib/matestack/ui/core/dsl.rb +6 -0
  215. data/lib/matestack/ui/core/engine.rb +16 -0
  216. data/lib/matestack/ui/core/version.rb +1 -1
  217. data/vendor/assets/javascripts/dist/manifest.json +18 -0
  218. data/vendor/assets/javascripts/dist/manifest.json.br +0 -0
  219. data/vendor/assets/javascripts/dist/manifest.json.gz +0 -0
  220. data/vendor/assets/javascripts/dist/matestack-ui-core.css +3 -0
  221. data/vendor/assets/javascripts/dist/matestack-ui-core.css.map +1 -0
  222. data/vendor/assets/javascripts/dist/matestack-ui-core.js +17060 -0
  223. data/vendor/assets/javascripts/dist/matestack-ui-core.js.map +1 -0
  224. data/vendor/assets/javascripts/dist/matestack-ui-core.min.css +0 -0
  225. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js +3 -0
  226. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.LICENSE.txt +18 -0
  227. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.gz +0 -0
  228. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.map +1 -0
  229. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.map.gz +0 -0
  230. data/vendor/assets/javascripts/matestack-ui-core.js.erb +2 -0
  231. data/vendor/assets/stylesheets/dist +1 -0
  232. data/vendor/assets/stylesheets/matestack-ui-core.css.erb +2 -0
  233. metadata +188 -89
  234. data/MIT-LICENSE +0 -20
  235. data/app/concepts/matestack/ui/core/absolute/absolute.rb +0 -17
  236. data/app/concepts/matestack/ui/core/component/response.haml +0 -2
  237. data/app/concepts/matestack/ui/core/component/response_dynamic_without_rerender.haml +0 -3
  238. data/app/concepts/matestack/ui/core/form/inline/inline.haml +0 -6
  239. data/app/concepts/matestack/ui/core/form/inline/inline.rb +0 -9
  240. data/app/concepts/matestack/ui/core/form/input/input.haml +0 -27
  241. data/app/concepts/matestack/ui/core/html/html.haml +0 -3
  242. data/app/concepts/matestack/ui/core/html/html.js +0 -10
  243. data/app/concepts/matestack/ui/core/html/html.rb +0 -17
  244. data/app/concepts/matestack/ui/core/isolate/isolate.haml +0 -2
  245. data/app/concepts/matestack/ui/core/isolate/isolate.rb +0 -11
  246. data/app/concepts/matestack/ui/core/page/content.haml +0 -7
  247. data/app/concepts/matestack/ui/core/page/content.rb +0 -5
  248. data/app/concepts/matestack/ui/core/pg/pg.rb +0 -5
  249. data/app/concepts/matestack/ui/core/view/view.js +0 -42
  250. data/app/lib/matestack/ui/core/app_node.rb +0 -53
  251. data/app/lib/matestack/ui/core/component_node.rb +0 -73
  252. data/app/lib/matestack/ui/core/page_node.rb +0 -96
  253. data/app/lib/matestack/ui/core/to_cell.rb +0 -129
  254. data/lib/generators/matestack_app/USAGE +0 -21
  255. data/lib/generators/matestack_app/matestack_app_generator.rb +0 -26
  256. data/lib/generators/matestack_app/templates/matestack_app.erb +0 -26
  257. data/lib/generators/matestack_component/USAGE +0 -20
  258. data/lib/generators/matestack_component/matestack_component_generator.rb +0 -30
  259. data/lib/generators/matestack_component/templates/matestack_component.rb.erb +0 -13
  260. data/lib/generators/matestack_page/USAGE +0 -28
  261. data/lib/generators/matestack_page/matestack_page_generator.rb +0 -41
  262. data/lib/generators/matestack_page/templates/matestack_page.erb +0 -15
  263. data/vendor/assets/javascripts/manifest.json +0 -4
  264. data/vendor/assets/javascripts/matestack-ui-core.js +0 -15309
  265. data/vendor/assets/javascripts/matestack-ui-core.js.map +0 -1
@@ -1,7 +1,8 @@
1
1
  module Matestack::Ui::Core::Form
2
2
  class Form < Matestack::Ui::Core::Component::Dynamic
3
+ vue_js_component_name "matestack-ui-core-form"
3
4
 
4
- REQUIRED_KEYS = [:for, :path, :method]
5
+ requires :for, :path, method: { as: :form_method }
5
6
 
6
7
  def setup
7
8
  begin
@@ -9,18 +10,29 @@ module Matestack::Ui::Core::Form
9
10
  @component_config[:submit_path] = submit_path
10
11
  @component_config[:method] = options[:method]
11
12
  @component_config[:success] = options[:success]
13
+ @component_config[:multipart] = options[:multipart] == true
12
14
  unless options[:success].nil?
13
15
  unless options[:success][:transition].nil?
14
16
  @component_config[:success][:transition][:path] = transition_path options[:success]
15
17
  end
18
+ unless options[:success][:redirect].nil?
19
+ @component_config[:success][:redirect][:path] = redirect_path options[:success]
20
+ end
16
21
  end
17
22
  @component_config[:failure] = options[:failure]
18
23
  unless options[:failure].nil?
19
24
  unless options[:failure][:transition].nil?
20
25
  @component_config[:failure][:transition][:path] = transition_path options[:failure]
21
26
  end
27
+ unless options[:failure][:redirect].nil?
28
+ @component_config[:failure][:redirect][:path] = redirect_path options[:failure]
29
+ end
22
30
  end
23
- @tag_attributes.merge!({"@submit.prevent": true})
31
+ @tag_attributes.merge!({
32
+ "@submit.prevent": true,
33
+ "class": "matestack-form #{options[:class]}",
34
+ "v-bind:class": "{ 'has-errors': hasErrors(), 'loading': loading }"
35
+ })
24
36
  rescue => e
25
37
  raise "Form component could not be setted up. Reason: #{e}"
26
38
  end
@@ -53,6 +65,21 @@ module Matestack::Ui::Core::Form
53
65
  end
54
66
  end
55
67
 
68
+ def redirect_path callback_options
69
+ begin
70
+ if callback_options[:redirect][:path].is_a?(Symbol)
71
+ return ::Rails.application.routes.url_helpers.send(
72
+ callback_options[:redirect][:path],
73
+ callback_options[:redirect][:params]
74
+ )
75
+ else
76
+ return callback_options[:redirect][:path]
77
+ end
78
+ rescue
79
+ raise "Redirect path not found"
80
+ end
81
+ end
82
+
56
83
  def form_wrapper
57
84
  case options[:for]
58
85
  when Symbol
@@ -0,0 +1,54 @@
1
+ module Matestack::Ui::Core::Form::HasErrors
2
+
3
+ def self.included(base)
4
+ base.class_eval do
5
+ optional :errors
6
+ end
7
+ end
8
+
9
+ def error_key
10
+ "errors['#{key.to_s}']"
11
+ end
12
+
13
+ # error partial
14
+ # overwrite render_errors to customize error rendering
15
+ def render_errors
16
+ unless @included_config[:errors] == false && (errors == false || errors.nil?) || errors == false
17
+ self.send(wrapper_tag, class: wrapper_class, attributes: { 'v-if': error_key }) do
18
+ self.send(error_tag, class: error_class, attributes: { 'v-for': "error in #{error_key}" }) do
19
+ plain '{{ error }}'
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def wrapper_tag
26
+ tag = get_error_config(@included_config[:errors], :wrapper, :tag) || :span
27
+ tag = get_error_config(errors, :wrapper, :tag) || tag
28
+ end
29
+
30
+ def wrapper_class
31
+ klass = get_error_config(@included_config[:errors], :wrapper, :class) || 'errors'
32
+ klass = get_error_config(errors, :wrapper, :class) || klass
33
+ end
34
+
35
+ def error_tag
36
+ tag = get_error_config(@included_config[:errors], :tag) || :span
37
+ tag = get_error_config(errors, :tag) || tag
38
+ end
39
+
40
+ def error_class
41
+ klass = get_error_config(@included_config[:errors], :class) || 'error'
42
+ klass = get_error_config(errors, :class) || klass
43
+ end
44
+
45
+ def input_error_class
46
+ klass = get_error_config(@included_config[:errors], :input, :class) || 'error'
47
+ klass = get_error_config(errors, :input, :class) || klass
48
+ end
49
+
50
+ def get_error_config(hash, *keys)
51
+ hash.dig(*keys) if hash.is_a?(Hash) && hash.dig(*keys)
52
+ end
53
+
54
+ end
@@ -0,0 +1,13 @@
1
+ module Matestack::Ui::Core::Form::HasInputHtmlAttributes
2
+
3
+ def self.included(base)
4
+ base.class_eval do
5
+ html_attributes(
6
+ :accept, :alt, :autocomplete, :autofocus, :checked, :dirname, :disabled, :form, :formaction,
7
+ :formenctype, :formmethod, :formnovalidate, :formtarget, :height, :list, :max, :maxlength, :min, :minlength,
8
+ :multiple, :name, :pattern, :placeholder, :readonly, :required, :size, :src, :step, :type, :value, :width
9
+ )
10
+ end
11
+ end
12
+
13
+ end
@@ -1,72 +1,59 @@
1
+ require_relative '../utils'
2
+ require_relative '../has_input_html_attributes'
3
+ require_relative '../has_errors'
1
4
  module Matestack::Ui::Core::Form::Input
2
5
  class Input < Matestack::Ui::Core::Component::Static
6
+ include Matestack::Ui::Core::Form::Utils
7
+ include Matestack::Ui::Core::Form::HasInputHtmlAttributes
8
+ include Matestack::Ui::Core::Form::HasErrors
3
9
 
4
- REQUIRED_KEYS = [:key, :type]
10
+ requires :key, :type
11
+ optional :multiple, :init, for: { as: :input_for }, label: { as: :input_label }
5
12
 
6
- def custom_options_validation
7
- raise "included form config is missing, please add ':include' to parent form component" if @included_config.nil?
13
+ def response
14
+ label text: input_label if input_label
15
+ input html_attributes.merge(attributes: vue_attributes)
16
+ render_errors
8
17
  end
9
18
 
10
- def input_key
11
- 'data["' + options[:key].to_s + '"]'
19
+ def vue_attributes
20
+ (options[:attributes] || {}).merge({
21
+ "@change": change_event,
22
+ ref: "input.#{attr_key}",
23
+ 'init-value': init_value,
24
+ 'v-bind:class': "{ '#{input_error_class}': #{error_key} }"
25
+ }).merge(
26
+ type != :file ? { "#{v_model_type}": input_key } : {}
27
+ ) # file inputs are readonly, no v-model possible
12
28
  end
13
29
 
14
- def error_key
15
- 'errors["' + options[:key].to_s + '"]'
30
+ def v_model_type
31
+ if type == :number || init_value.is_a?(Integer)
32
+ 'v-model.number'
33
+ else
34
+ 'v-model'
35
+ end
16
36
  end
17
37
 
18
- def input_wrapper
19
- case options[:for]
20
- when nil
21
- return nil
22
- when Symbol
23
- return options[:for]
24
- when String
25
- return options[:for]
26
- end
27
- if options[:for].respond_to?(:model_name)
28
- return options[:for].model_name.singular
29
- end
38
+ def change_event
39
+ "inputChanged('#{attr_key}'); #{ "filesAdded('#{attr_key}');" if type == :file }".strip
40
+ end
41
+
42
+ def custom_options_validation
43
+ raise "included form config is missing, please add ':include' to parent form component" if @included_config.nil?
30
44
  end
31
45
 
32
46
  def attr_key
33
- if input_wrapper.nil?
34
- return options[:key].to_s
35
- else
36
- return "#{input_wrapper}.#{options[:key].to_s}"
37
- end
47
+ super + "#{'[]' if multiple && type == :file}"
38
48
  end
39
49
 
40
- def init_value
41
- unless options[:init].nil?
42
- return options[:init]
43
- end
50
+ private
44
51
 
45
- unless options[:for].nil?
46
- value = options[:for].send(options[:key])
47
- if [true, false].include? value
48
- value ? 1 : 0
49
- else
50
- return value
51
- end
52
+ def parse_value(value)
53
+ if [true, false].include? value
54
+ value ? 1 : 0
52
55
  else
53
- unless @included_config.nil? && @included_config[:for].nil?
54
- if @included_config[:for].respond_to?(options[:key])
55
- value = @included_config[:for].send(options[:key])
56
- if [true, false].include? value
57
- value ? 1 : 0
58
- else
59
- return value
60
- end
61
- else
62
- if @included_config[:for].is_a?(Symbol) || @included_config[:for].is_a?(String)
63
- return nil
64
- end
65
- if @included_config[:for].is_a?(Hash)
66
- return @included_config[:for][options[:key]]
67
- end
68
- end
69
- end
56
+ return value
70
57
  end
71
58
  end
72
59
 
@@ -0,0 +1,71 @@
1
+ require_relative '../utils'
2
+ require_relative '../has_input_html_attributes'
3
+ require_relative '../has_errors'
4
+ module Matestack::Ui::Core::Form::Radio
5
+ class Radio < Matestack::Ui::Core::Component::Static
6
+ include Matestack::Ui::Core::Form::Utils
7
+ include Matestack::Ui::Core::Form::HasInputHtmlAttributes
8
+ include Matestack::Ui::Core::Form::HasErrors
9
+
10
+ requires :key
11
+ optional :multiple, :init, for: { as: :input_for }, label: { as: :input_label }, options: { as: :radio_options }
12
+
13
+ def response
14
+ radio_options.to_a.each do |item|
15
+ input html_attributes.merge(
16
+ attributes: vue_attributes,
17
+ type: :radio,
18
+ id: "#{id_for_item(item_value(item))}",
19
+ name: item_name(item),
20
+ value: item_value(item),
21
+ )
22
+ label text: item_label(item), for: id_for_item(item_value(item))
23
+ end
24
+ render_errors
25
+ end
26
+
27
+ def vue_attributes
28
+ (options[:attributes] || {}).merge({
29
+ "@change": change_event,
30
+ ref: "select.#{attr_key}",
31
+ 'init-value': init_value,
32
+ 'v-bind:class': "{ '#{input_error_class}': #{error_key} }",
33
+ 'value-type': value_type,
34
+ "#{v_model_type}": input_key,
35
+ })
36
+ end
37
+
38
+ def value_type
39
+ item_value(radio_options.first).is_a?(Integer) ? Integer : nil
40
+ end
41
+
42
+ def item_value(item)
43
+ item.is_a?(Array) ? item.last : item
44
+ end
45
+
46
+ def item_name(item)
47
+ "#{attr_key}_#{item.is_a?(Array) ? item.first : item}"
48
+ end
49
+
50
+ def item_label(item)
51
+ item.is_a?(Array) ? item.first : item
52
+ end
53
+
54
+ def v_model_type
55
+ if radio_options && item_value(radio_options.first).is_a?(Integer)
56
+ 'v-model.number'
57
+ else
58
+ 'v-model'
59
+ end
60
+ end
61
+
62
+ def change_event
63
+ "inputChanged('#{attr_key}')"
64
+ end
65
+
66
+ def id_for_item(value)
67
+ "#{html_attributes[:id] || attr_key}_#{value}"
68
+ end
69
+
70
+ end
71
+ end
@@ -1,76 +1,9 @@
1
- - if options[:label]
2
-
3
- %label=options[:label]
4
-
5
- - if options[:type] == :dropdown
6
-
7
- %select{@tag_attributes,
8
- "#{model_binding}" => input_key,
9
- ref: "select.#{attr_key}",
10
- "@change": "inputChanged(\"#{attr_key}\")",
11
- "init-value": init_value,
12
- "value-type": options_type}
13
- %option{disabled: true}= options[:placeholder]
14
- - if options[:options].is_a?(Hash)
15
- - options[:options].each do |key, value|
16
- %option{value: key}=value
17
- - if options[:options].is_a?(Array)
18
- - options[:options].each do |option|
19
- %option{value: option}=option
20
- %span{class: "errors", "v-if": error_key }
21
- %span{class: "error", "v-for": "error in #{error_key}"}
22
- {{ error }}
23
-
24
- - if options[:type] == :checkbox
25
-
26
- %div{id: component_id, ref: "select.multiple.#{attr_key}", "init-value": init_value}
27
- - if options[:options].is_a?(Hash)
28
- - options[:options].each do |key, value|
29
- %input{@tag_attributes,
30
- type: :checkbox,
31
- "#{model_binding}": input_key,
32
- "@change": "inputChanged(\"#{attr_key}\")",
33
- "value-type": options_type,
34
- name: value,
35
- value: key}/
36
- %label=value
37
- - if options[:options].is_a?(Array)
38
- - options[:options].each do |value|
39
- %input{@tag_attributes,
40
- type: :checkbox,
41
- "#{model_binding}": input_key,
42
- "@change": "inputChanged(\"#{attr_key}\")",
43
- "value-type": options_type,
44
- name: value,
45
- value: value}/
46
- %label=value
47
- %span{class: "errors", "v-if": error_key }
48
- %span{class: "error", "v-for": "error in #{error_key}"}
49
- {{ error }}
50
-
51
- - if options[:type] == :radio
52
-
53
- %div{id: component_id, ref: "select.#{attr_key}", "init-value": init_value}
54
- - if options[:options].is_a?(Hash)
55
- - options[:options].each do |key, value|
56
- %input{@tag_attributes,
57
- type: :radio,
58
- "#{model_binding}": input_key,
59
- "@change": "inputChanged(\"#{attr_key}\")",
60
- "value-type": options_type,
61
- name: value,
62
- value: key}/
63
- %label=value
64
- - if options[:options].is_a?(Array)
65
- - options[:options].each do |value|
66
- %input{@tag_attributes,
67
- type: :radio,
68
- "#{model_binding}": input_key,
69
- "@change": "inputChanged(\"#{attr_key}\")",
70
- "value-type": options_type,
71
- name: value,
72
- value: value}/
73
- %label=value
74
- %span{class: "errors", "v-if": error_key }
75
- %span{class: "error", "v-for": "error in #{error_key}"}
76
- {{ error }}
1
+ - if input_label
2
+ %label= input_label
3
+
4
+ %select{html_attributes.merge(vue_attributes)}
5
+ - if placeholder
6
+ %option{value: 'null', disabled: true, selected: init_value.nil?}= placeholder
7
+ - select_options.to_a.each do |item|
8
+ %option{value: item_value(item), disabled: item_disabled(item)}= item_label(item)
9
+ = render_errors
@@ -1,73 +1,88 @@
1
+ require_relative '../utils'
2
+ require_relative '../has_errors'
1
3
  module Matestack::Ui::Core::Form::Select
2
4
  class Select < Matestack::Ui::Core::Component::Static
5
+ include Matestack::Ui::Core::Form::Utils
6
+ include Matestack::Ui::Core::Form::HasErrors
3
7
 
4
- REQUIRED_KEYS = [:options]
8
+ html_attributes :autofocus, :disabled, :form, :multiple, :name, :required, :size
5
9
 
6
- def input_key
7
- 'data["' + options[:key].to_s + '"]'
8
- end
10
+ requires :key
11
+ optional :multiple, :init, :placeholder, :disabled_values,
12
+ for: { as: :input_for },
13
+ label: { as: :input_label },
14
+ options: { as: :select_options }
15
+
16
+ # def response
17
+ # radio_options.to_a.each do |item|
18
+ # input html_attributes.merge(
19
+ # attributes: vue_attributes.merge(ref: "select.#{attr_key}"),
20
+ # type: :radio,
21
+ # id: "#{id_for_item(item_value(item))}",
22
+ # name: item_name(item),
23
+ # value: item_value(item),
24
+ # )
25
+ # label text: item_label(item), for: id_for_item(item_value(item))
26
+ # end
27
+ # render_errors
28
+ # end
29
+
30
+ # def html_options
31
+ # html_attributes.merge(
32
+ # attributes: vue_attributes,
33
+ # )
34
+ # end
9
35
 
10
- def error_key
11
- 'errors["' + options[:key].to_s + '"]'
36
+ def vue_attributes
37
+ (options[:attributes] || {}).merge({
38
+ "@change": change_event,
39
+ ref: vue_ref,
40
+ 'init-value': init_value || [],
41
+ 'v-bind:class': "{ '#{input_error_class}': #{error_key} }",
42
+ 'value-type': value_type,
43
+ "#{v_model_type}": input_key,
44
+ })
12
45
  end
13
46
 
14
- def attr_key
15
- options[:key].to_s
47
+ def vue_ref
48
+ "select#{'.multiple' if multiple}.#{attr_key}"
16
49
  end
17
50
 
18
- def option_values
19
- values = options[:options] if options[:options].is_a?(Array)
20
- values = options[:options].keys if options[:options].is_a?(Hash)
21
- return values
51
+ def value_type
52
+ item_value(select_options.first).is_a?(Integer) ? Integer : nil
22
53
  end
23
54
 
24
- def options_type
25
- return Integer if option_values.first.is_a?(Integer)
26
- return String if option_values.first.is_a?(String)
55
+ def item_value(item)
56
+ item.is_a?(Array) ? item.last : item
27
57
  end
28
58
 
29
- def model_binding
59
+ def item_name(item)
60
+ "#{attr_key}_#{item.is_a?(Array) ? item.first : item}"
61
+ end
30
62
 
31
- if option_values.first.is_a?(Integer)
32
- return "v-model.number"
33
- else
34
- return "v-model"
35
- end
63
+ def item_disabled(item)
64
+ disabled_values.present? && disabled_values.include?(item_value(item))
36
65
  end
37
66
 
38
- def init_value
39
- unless options[:init].nil?
40
- return options[:init]
41
- end
67
+ def item_label(item)
68
+ item.is_a?(Array) ? item.first : item
69
+ end
42
70
 
43
- unless options[:for].nil?
44
- value = options[:for].send(options[:key])
45
- if [true, false].include? value
46
- value ? 1 : 0
47
- else
48
- return value
49
- end
71
+ def v_model_type
72
+ if select_options && item_value(select_options.first).is_a?(Integer) && !multiple
73
+ 'v-model.number'
50
74
  else
51
- unless @included_config.nil? && @included_config[:for].nil?
52
- if @included_config[:for].respond_to?(options[:key])
53
- value = @included_config[:for].send(options[:key])
54
- if [true, false].include? value
55
- value ? 1 : 0
56
- else
57
- return value
58
- end
59
- else
60
- if @included_config[:for].is_a?(Symbol) || @included_config[:for].is_a?(String)
61
- return nil
62
- end
63
- if @included_config[:for].is_a?(Hash)
64
- return @included_config[:for][options[:key]]
65
- end
66
- end
67
- end
75
+ 'v-model'
68
76
  end
69
77
  end
70
78
 
79
+ def change_event
80
+ "inputChanged('#{attr_key}')"
81
+ end
82
+
83
+ def id_for_item(value)
84
+ "#{html_attributes[:id]}_#{value}"
85
+ end
71
86
 
72
87
  end
73
88
  end