matestack-ui-core 0.7.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +8 -0
  3. data/README.md +28 -216
  4. data/app/concepts/matestack/ui/core/abbr/abbr.haml +3 -3
  5. data/app/concepts/matestack/ui/core/abbr/abbr.rb +1 -8
  6. data/app/concepts/matestack/ui/core/action/action.haml +1 -1
  7. data/app/concepts/matestack/ui/core/action/action.js +120 -39
  8. data/app/concepts/matestack/ui/core/action/action.rb +40 -15
  9. data/app/concepts/matestack/ui/core/actionview/dynamic.haml +4 -4
  10. data/app/concepts/matestack/ui/core/address/address.haml +3 -3
  11. data/app/concepts/matestack/ui/core/address/address.rb +1 -1
  12. data/app/concepts/matestack/ui/core/app/app.haml +2 -3
  13. data/app/concepts/matestack/ui/core/app/app.js +6 -3
  14. data/app/concepts/matestack/ui/core/app/app.rb +33 -56
  15. data/app/concepts/matestack/ui/core/app/store.js +28 -2
  16. data/app/concepts/matestack/ui/core/area/area.haml +1 -1
  17. data/app/concepts/matestack/ui/core/area/area.rb +2 -14
  18. data/app/concepts/matestack/ui/core/article/article.haml +3 -3
  19. data/app/concepts/matestack/ui/core/article/article.rb +1 -1
  20. data/app/concepts/matestack/ui/core/aside/aside.haml +1 -1
  21. data/app/concepts/matestack/ui/core/aside/aside.rb +0 -1
  22. data/app/concepts/matestack/ui/core/async/async.haml +6 -2
  23. data/app/concepts/matestack/ui/core/async/async.js +43 -9
  24. data/app/concepts/matestack/ui/core/async/async.rb +29 -4
  25. data/app/concepts/matestack/ui/core/async/children_wrapper.haml +2 -0
  26. data/app/concepts/matestack/ui/core/b/b.haml +3 -3
  27. data/app/concepts/matestack/ui/core/b/b.rb +1 -1
  28. data/app/concepts/matestack/ui/core/bdi/bdi.haml +3 -3
  29. data/app/concepts/matestack/ui/core/bdi/bdi.rb +1 -0
  30. data/app/concepts/matestack/ui/core/bdo/bdo.haml +3 -3
  31. data/app/concepts/matestack/ui/core/bdo/bdo.rb +2 -7
  32. data/app/concepts/matestack/ui/core/blockquote/blockquote.haml +3 -3
  33. data/app/concepts/matestack/ui/core/blockquote/blockquote.rb +2 -7
  34. data/app/concepts/matestack/ui/core/br/br.haml +4 -4
  35. data/app/concepts/matestack/ui/core/br/br.rb +1 -1
  36. data/app/concepts/matestack/ui/core/button/button.haml +3 -3
  37. data/app/concepts/matestack/ui/core/button/button.rb +3 -7
  38. data/app/concepts/matestack/ui/core/cable/cable.haml +4 -0
  39. data/app/concepts/matestack/ui/core/cable/cable.js +100 -0
  40. data/app/concepts/matestack/ui/core/cable/cable.rb +28 -0
  41. data/app/concepts/matestack/ui/core/cable/children_wrapper.haml +2 -0
  42. data/app/concepts/matestack/ui/core/caption/caption.haml +3 -3
  43. data/app/concepts/matestack/ui/core/caption/caption.rb +1 -1
  44. data/app/concepts/matestack/ui/core/cite/cite.haml +3 -3
  45. data/app/concepts/matestack/ui/core/cite/cite.rb +1 -1
  46. data/app/concepts/matestack/ui/core/code/code.haml +3 -3
  47. data/app/concepts/matestack/ui/core/code/code.rb +1 -1
  48. data/app/concepts/matestack/ui/core/collection/content/content.js +2 -2
  49. data/app/concepts/matestack/ui/core/collection/content/content.rb +4 -6
  50. data/app/concepts/matestack/ui/core/collection/content/next/next.haml +1 -1
  51. data/app/concepts/matestack/ui/core/collection/content/page/link/link.haml +1 -1
  52. data/app/concepts/matestack/ui/core/collection/content/page/link/link.rb +5 -3
  53. data/app/concepts/matestack/ui/core/collection/content/previous/previous.haml +1 -1
  54. data/app/concepts/matestack/ui/core/collection/filter/filter.rb +4 -5
  55. data/app/concepts/matestack/ui/core/collection/filter/input/input.rb +11 -8
  56. data/app/concepts/matestack/ui/core/collection/filter/reset/reset.haml +1 -1
  57. data/app/concepts/matestack/ui/core/collection/filter/select/select.haml +10 -0
  58. data/app/concepts/matestack/ui/core/collection/filter/select/select.rb +30 -0
  59. data/app/concepts/matestack/ui/core/collection/filter/submit/submit.haml +1 -1
  60. data/app/concepts/matestack/ui/core/collection/helper.rb +14 -6
  61. data/app/concepts/matestack/ui/core/collection/order/order.js +1 -1
  62. data/app/concepts/matestack/ui/core/collection/order/order.rb +4 -5
  63. data/app/concepts/matestack/ui/core/collection/order/toggle/indicator/indicator.rb +9 -5
  64. data/app/concepts/matestack/ui/core/collection/order/toggle/toggle.haml +1 -1
  65. data/app/concepts/matestack/ui/core/collection/order/toggle/toggle.rb +0 -1
  66. data/app/concepts/matestack/ui/core/component/base.rb +430 -0
  67. data/app/concepts/matestack/ui/core/component/children.haml +2 -2
  68. data/app/concepts/matestack/ui/core/component/component.js +9 -46
  69. data/app/concepts/matestack/ui/core/component/dynamic.haml +1 -1
  70. data/app/concepts/matestack/ui/core/component/dynamic.rb +25 -247
  71. data/app/concepts/matestack/ui/core/component/static.rb +3 -12
  72. data/app/concepts/matestack/ui/core/data/data.haml +3 -3
  73. data/app/concepts/matestack/ui/core/data/data.rb +2 -5
  74. data/app/concepts/matestack/ui/core/datalist/datalist.haml +2 -2
  75. data/app/concepts/matestack/ui/core/datalist/datalist.rb +1 -2
  76. data/app/concepts/matestack/ui/core/dd/dd.haml +3 -3
  77. data/app/concepts/matestack/ui/core/dd/dd.rb +1 -1
  78. data/app/concepts/matestack/ui/core/del/del.haml +3 -3
  79. data/app/concepts/matestack/ui/core/del/del.rb +2 -0
  80. data/app/concepts/matestack/ui/core/details/details.haml +1 -1
  81. data/app/concepts/matestack/ui/core/details/details.rb +1 -1
  82. data/app/concepts/matestack/ui/core/dfn/dfn.haml +3 -3
  83. data/app/concepts/matestack/ui/core/dfn/dfn.rb +1 -1
  84. data/app/concepts/matestack/ui/core/dialog/dialog.haml +3 -3
  85. data/app/concepts/matestack/ui/core/dialog/dialog.rb +2 -5
  86. data/app/concepts/matestack/ui/core/div/div.haml +1 -1
  87. data/app/concepts/matestack/ui/core/div/div.rb +0 -1
  88. data/app/concepts/matestack/ui/core/dl/dl.haml +3 -3
  89. data/app/concepts/matestack/ui/core/dl/dl.rb +2 -2
  90. data/app/concepts/matestack/ui/core/dt/dt.haml +3 -3
  91. data/app/concepts/matestack/ui/core/dt/dt.rb +1 -1
  92. data/app/concepts/matestack/ui/core/em/em.haml +3 -3
  93. data/app/concepts/matestack/ui/core/em/em.rb +1 -1
  94. data/app/concepts/matestack/ui/core/fieldset/fieldset.haml +4 -4
  95. data/app/concepts/matestack/ui/core/fieldset/fieldset.rb +3 -6
  96. data/app/concepts/matestack/ui/core/figure/figure.haml +1 -1
  97. data/app/concepts/matestack/ui/core/figure/figure.rb +0 -1
  98. data/app/concepts/matestack/ui/core/footer/footer.haml +1 -1
  99. data/app/concepts/matestack/ui/core/footer/footer.rb +0 -1
  100. data/app/concepts/matestack/ui/core/form/checkbox/checkbox.rb +79 -0
  101. data/app/concepts/matestack/ui/core/form/form.haml +1 -1
  102. data/app/concepts/matestack/ui/core/form/form.js +257 -123
  103. data/app/concepts/matestack/ui/core/form/form.rb +52 -19
  104. data/app/concepts/matestack/ui/core/form/has_errors.rb +54 -0
  105. data/app/concepts/matestack/ui/core/form/has_input_html_attributes.rb +13 -0
  106. data/app/concepts/matestack/ui/core/form/input/input.rb +32 -52
  107. data/app/concepts/matestack/ui/core/form/radio/radio.rb +71 -0
  108. data/app/concepts/matestack/ui/core/form/select/select.haml +9 -76
  109. data/app/concepts/matestack/ui/core/form/select/select.rb +44 -49
  110. data/app/concepts/matestack/ui/core/form/submit/submit.haml +1 -1
  111. data/app/concepts/matestack/ui/core/form/submit/submit.rb +5 -2
  112. data/app/concepts/matestack/ui/core/form/textarea/textarea.rb +28 -0
  113. data/app/concepts/matestack/ui/core/form/utils.rb +47 -0
  114. data/app/concepts/matestack/ui/core/header/header.haml +1 -1
  115. data/app/concepts/matestack/ui/core/header/header.rb +0 -1
  116. data/app/concepts/matestack/ui/core/heading/heading.haml +4 -49
  117. data/app/concepts/matestack/ui/core/heading/heading.rb +1 -1
  118. data/app/concepts/matestack/ui/core/hr/hr.haml +1 -1
  119. data/app/concepts/matestack/ui/core/hr/hr.rb +0 -1
  120. data/app/concepts/matestack/ui/core/icon/icon.haml +3 -3
  121. data/app/concepts/matestack/ui/core/icon/icon.rb +1 -1
  122. data/app/concepts/matestack/ui/core/iframe/iframe.haml +3 -3
  123. data/app/concepts/matestack/ui/core/iframe/iframe.rb +3 -10
  124. data/app/concepts/matestack/ui/core/img/img.haml +1 -1
  125. data/app/concepts/matestack/ui/core/img/img.rb +8 -8
  126. data/app/concepts/matestack/ui/core/input/input.haml +1 -2
  127. data/app/concepts/matestack/ui/core/input/input.rb +4 -4
  128. data/app/concepts/matestack/ui/core/ins/ins.haml +3 -3
  129. data/app/concepts/matestack/ui/core/ins/ins.rb +2 -6
  130. data/app/concepts/matestack/ui/core/isolated/children_wrapper.haml +2 -0
  131. data/app/concepts/matestack/ui/core/isolated/isolated.haml +10 -0
  132. data/app/concepts/matestack/ui/core/isolated/isolated.js +108 -0
  133. data/app/concepts/matestack/ui/core/isolated/isolated.rb +59 -0
  134. data/app/concepts/matestack/ui/core/js/core.js +6 -4
  135. data/app/concepts/matestack/ui/core/kbd/kbd.haml +3 -3
  136. data/app/concepts/matestack/ui/core/kbd/kbd.rb +1 -0
  137. data/app/concepts/matestack/ui/core/label/label.haml +3 -3
  138. data/app/concepts/matestack/ui/core/label/label.rb +2 -6
  139. data/app/concepts/matestack/ui/core/legend/legend.haml +3 -3
  140. data/app/concepts/matestack/ui/core/legend/legend.rb +1 -1
  141. data/app/concepts/matestack/ui/core/li/li.haml +3 -3
  142. data/app/concepts/matestack/ui/core/li/li.rb +2 -1
  143. data/app/concepts/matestack/ui/core/link/link.haml +3 -3
  144. data/app/concepts/matestack/ui/core/link/link.rb +10 -14
  145. data/app/concepts/matestack/ui/core/main/main.haml +1 -1
  146. data/app/concepts/matestack/ui/core/main/main.rb +0 -1
  147. data/app/concepts/matestack/ui/core/map/map.haml +1 -1
  148. data/app/concepts/matestack/ui/core/map/map.rb +1 -7
  149. data/app/concepts/matestack/ui/core/mark/mark.haml +3 -3
  150. data/app/concepts/matestack/ui/core/mark/mark.rb +1 -0
  151. data/app/concepts/matestack/ui/core/meter/meter.haml +1 -1
  152. data/app/concepts/matestack/ui/core/meter/meter.rb +1 -10
  153. data/app/concepts/matestack/ui/core/nav/nav.haml +1 -1
  154. data/app/concepts/matestack/ui/core/nav/nav.rb +0 -1
  155. data/app/concepts/matestack/ui/core/noscript/noscript.haml +3 -3
  156. data/app/concepts/matestack/ui/core/noscript/noscript.rb +1 -1
  157. data/app/concepts/matestack/ui/core/object/object.haml +1 -1
  158. data/app/concepts/matestack/ui/core/object/object.rb +1 -11
  159. data/app/concepts/matestack/ui/core/ol/ol.haml +1 -1
  160. data/app/concepts/matestack/ui/core/ol/ol.rb +1 -1
  161. data/app/concepts/matestack/ui/core/onclick/onclick.haml +1 -1
  162. data/app/concepts/matestack/ui/core/onclick/onclick.rb +1 -0
  163. data/app/concepts/matestack/ui/core/optgroup/optgroup.haml +1 -1
  164. data/app/concepts/matestack/ui/core/optgroup/optgroup.rb +1 -6
  165. data/app/concepts/matestack/ui/core/option/option.haml +3 -3
  166. data/app/concepts/matestack/ui/core/option/option.rb +2 -8
  167. data/app/concepts/matestack/ui/core/output/output.haml +3 -3
  168. data/app/concepts/matestack/ui/core/output/output.rb +2 -7
  169. data/app/concepts/matestack/ui/core/page/{content.js → content/content.js} +8 -2
  170. data/app/concepts/matestack/ui/core/page/content/content.rb +28 -0
  171. data/app/concepts/matestack/ui/core/page/page.haml +3 -9
  172. data/app/concepts/matestack/ui/core/page/page.rb +15 -175
  173. data/app/concepts/matestack/ui/core/paragraph/paragraph.haml +3 -3
  174. data/app/concepts/matestack/ui/core/paragraph/paragraph.rb +1 -1
  175. data/app/concepts/matestack/ui/core/param/param.haml +1 -1
  176. data/app/concepts/matestack/ui/core/param/param.rb +1 -6
  177. data/app/concepts/matestack/ui/core/partial/partial.rb +0 -1
  178. data/app/concepts/matestack/ui/core/picture/picture.haml +1 -1
  179. data/app/concepts/matestack/ui/core/pre/pre.haml +3 -3
  180. data/app/concepts/matestack/ui/core/pre/pre.rb +1 -1
  181. data/app/concepts/matestack/ui/core/progress/progress.haml +1 -1
  182. data/app/concepts/matestack/ui/core/progress/progress.rb +1 -10
  183. data/app/concepts/matestack/ui/core/q/q.haml +3 -3
  184. data/app/concepts/matestack/ui/core/q/q.rb +2 -7
  185. data/app/concepts/matestack/ui/core/rp/rp.haml +3 -3
  186. data/app/concepts/matestack/ui/core/rp/rp.rb +1 -1
  187. data/app/concepts/matestack/ui/core/rt/rt.haml +3 -3
  188. data/app/concepts/matestack/ui/core/rt/rt.rb +1 -1
  189. data/app/concepts/matestack/ui/core/ruby/ruby.haml +3 -3
  190. data/app/concepts/matestack/ui/core/ruby/ruby.rb +1 -1
  191. data/app/concepts/matestack/ui/core/s/s.haml +3 -3
  192. data/app/concepts/matestack/ui/core/s/s.rb +1 -1
  193. data/app/concepts/matestack/ui/core/samp/samp.haml +3 -3
  194. data/app/concepts/matestack/ui/core/samp/samp.rb +1 -0
  195. data/app/concepts/matestack/ui/core/section/section.haml +1 -1
  196. data/app/concepts/matestack/ui/core/section/section.rb +0 -1
  197. data/app/concepts/matestack/ui/core/slot/slot.rb +1 -2
  198. data/app/concepts/matestack/ui/core/small/small.haml +3 -3
  199. data/app/concepts/matestack/ui/core/small/small.rb +1 -1
  200. data/app/concepts/matestack/ui/core/span/span.haml +3 -3
  201. data/app/concepts/matestack/ui/core/span/span.rb +1 -1
  202. data/app/concepts/matestack/ui/core/strong/strong.haml +3 -3
  203. data/app/concepts/matestack/ui/core/strong/strong.rb +1 -1
  204. data/app/concepts/matestack/ui/core/sub/sub.haml +3 -3
  205. data/app/concepts/matestack/ui/core/sub/sub.rb +1 -1
  206. data/app/concepts/matestack/ui/core/summary/summary.haml +3 -3
  207. data/app/concepts/matestack/ui/core/summary/summary.rb +1 -1
  208. data/app/concepts/matestack/ui/core/sup/sup.haml +3 -3
  209. data/app/concepts/matestack/ui/core/sup/sup.rb +1 -1
  210. data/app/concepts/matestack/ui/core/table/table.haml +1 -1
  211. data/app/concepts/matestack/ui/core/table/table.rb +0 -1
  212. data/app/concepts/matestack/ui/core/tbody/tbody.haml +1 -1
  213. data/app/concepts/matestack/ui/core/tbody/tbody.rb +0 -1
  214. data/app/concepts/matestack/ui/core/td/td.haml +3 -3
  215. data/app/concepts/matestack/ui/core/td/td.rb +2 -1
  216. data/app/concepts/matestack/ui/core/template/template.haml +1 -1
  217. data/app/concepts/matestack/ui/core/textarea/textarea.haml +5 -0
  218. data/app/concepts/matestack/ui/core/textarea/textarea.rb +10 -0
  219. data/app/concepts/matestack/ui/core/tfoot/tfoot.haml +1 -1
  220. data/app/concepts/matestack/ui/core/tfoot/tfoot.rb +0 -1
  221. data/app/concepts/matestack/ui/core/th/th.haml +3 -3
  222. data/app/concepts/matestack/ui/core/th/th.rb +2 -1
  223. data/app/concepts/matestack/ui/core/thead/thead.haml +1 -1
  224. data/app/concepts/matestack/ui/core/thead/thead.rb +0 -1
  225. data/app/concepts/matestack/ui/core/time/time.haml +1 -1
  226. data/app/concepts/matestack/ui/core/time/time.rb +1 -7
  227. data/app/concepts/matestack/ui/core/toggle/toggle.haml +2 -0
  228. data/app/concepts/matestack/ui/core/toggle/toggle.js +71 -0
  229. data/app/concepts/matestack/ui/core/toggle/toggle.rb +13 -0
  230. data/app/concepts/matestack/ui/core/tr/tr.haml +1 -1
  231. data/app/concepts/matestack/ui/core/tr/tr.rb +0 -1
  232. data/app/concepts/matestack/ui/core/transition/transition.haml +3 -3
  233. data/app/concepts/matestack/ui/core/transition/transition.js +17 -1
  234. data/app/concepts/matestack/ui/core/transition/transition.rb +15 -8
  235. data/app/concepts/matestack/ui/core/u/u.haml +3 -3
  236. data/app/concepts/matestack/ui/core/u/u.rb +1 -1
  237. data/app/concepts/matestack/ui/core/ul/ul.haml +1 -1
  238. data/app/concepts/matestack/ui/core/ul/ul.rb +0 -1
  239. data/app/concepts/matestack/ui/core/unescaped/unescaped.rb +3 -1
  240. data/app/concepts/matestack/ui/core/var/var.haml +3 -3
  241. data/app/concepts/matestack/ui/core/var/var.rb +1 -0
  242. data/app/concepts/matestack/ui/core/video/video.haml +2 -2
  243. data/app/concepts/matestack/ui/core/video/video.rb +4 -14
  244. data/app/concepts/matestack/ui/core/view/view.haml +1 -0
  245. data/app/concepts/matestack/ui/core/view/view.rb +30 -0
  246. data/app/concepts/matestack/ui/core/wbr/wbr.haml +5 -1
  247. data/app/concepts/matestack/ui/core/wbr/wbr.rb +1 -0
  248. data/app/concepts/matestack/ui/core/youtube/youtube.haml +1 -1
  249. data/app/concepts/matestack/ui/core/youtube/youtube.rb +18 -16
  250. data/app/helpers/matestack/ui/core/application_helper.rb +94 -20
  251. data/app/lib/matestack/ui/component.rb +1 -0
  252. data/app/lib/matestack/ui/core/has_view_context.rb +4 -4
  253. data/app/lib/matestack/ui/core/html_attributes.rb +43 -0
  254. data/app/lib/matestack/ui/core/properties.rb +161 -0
  255. data/app/lib/matestack/ui/core/rendering/default_renderer_class_determiner.rb +33 -0
  256. data/app/lib/matestack/ui/core/rendering/main_renderer.rb +200 -0
  257. data/app/lib/matestack/ui/isolated_component.rb +1 -0
  258. data/app/lib/matestack/ui/vue_js_component.rb +1 -0
  259. data/lib/matestack/ui/core.rb +4 -2
  260. data/lib/matestack/ui/core/cell.rb +0 -2
  261. data/lib/matestack/ui/core/component/registry.rb +47 -0
  262. data/lib/matestack/ui/core/components.rb +269 -0
  263. data/lib/matestack/ui/core/dsl.rb +6 -0
  264. data/lib/matestack/ui/core/engine.rb +16 -0
  265. data/lib/matestack/ui/core/version.rb +1 -1
  266. data/vendor/assets/javascripts/dist/manifest.json +6 -10
  267. data/vendor/assets/javascripts/dist/matestack-ui-core.js +834 -261
  268. data/vendor/assets/javascripts/dist/matestack-ui-core.js.map +1 -1
  269. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js +1 -1
  270. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.br +0 -0
  271. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.gz +0 -0
  272. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.map +1 -1
  273. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.map.br +0 -0
  274. data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.map.gz +0 -0
  275. metadata +50 -65
  276. data/MIT-LICENSE +0 -20
  277. data/app/concepts/matestack/ui/core/absolute/absolute.haml +0 -3
  278. data/app/concepts/matestack/ui/core/absolute/absolute.rb +0 -17
  279. data/app/concepts/matestack/ui/core/collection/filter/input/input.haml +0 -2
  280. data/app/concepts/matestack/ui/core/component/response.haml +0 -2
  281. data/app/concepts/matestack/ui/core/component/response_dynamic.haml +0 -7
  282. data/app/concepts/matestack/ui/core/component/response_dynamic_without_rerender.haml +0 -3
  283. data/app/concepts/matestack/ui/core/component/static.haml +0 -1
  284. data/app/concepts/matestack/ui/core/form/inline/inline.haml +0 -6
  285. data/app/concepts/matestack/ui/core/form/inline/inline.rb +0 -9
  286. data/app/concepts/matestack/ui/core/form/input/input.haml +0 -38
  287. data/app/concepts/matestack/ui/core/html/html.haml +0 -3
  288. data/app/concepts/matestack/ui/core/html/html.js +0 -10
  289. data/app/concepts/matestack/ui/core/html/html.rb +0 -17
  290. data/app/concepts/matestack/ui/core/isolate/isolate.haml +0 -2
  291. data/app/concepts/matestack/ui/core/isolate/isolate.rb +0 -11
  292. data/app/concepts/matestack/ui/core/page/content.haml +0 -7
  293. data/app/concepts/matestack/ui/core/page/content.rb +0 -5
  294. data/app/concepts/matestack/ui/core/pg/pg.haml +0 -5
  295. data/app/concepts/matestack/ui/core/pg/pg.rb +0 -5
  296. data/app/lib/matestack/ui/core/app_node.rb +0 -53
  297. data/app/lib/matestack/ui/core/component_node.rb +0 -87
  298. data/app/lib/matestack/ui/core/page_node.rb +0 -100
  299. data/app/lib/matestack/ui/core/render.rb +0 -89
  300. data/app/lib/matestack/ui/core/to_cell.rb +0 -129
@@ -1,37 +1,55 @@
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"
4
+
5
+ html_attributes :'accept-charset', :action, :autocomplete, :enctype, :method, :name, :novalidate, :rel, :target
3
6
 
4
- REQUIRED_KEYS = [:for, :path, :method]
7
+ requires :path, for: { as: :for_option }, method: { as: :form_method }
8
+ optional :success, :failure, :multipart, params: { as: :form_params }
5
9
 
6
10
  def setup
7
11
  begin
8
12
  @component_config[:for] = form_wrapper
9
13
  @component_config[:submit_path] = submit_path
10
- @component_config[:method] = options[:method]
11
- @component_config[:success] = options[:success]
12
- unless options[:success].nil?
13
- unless options[:success][:transition].nil?
14
- @component_config[:success][:transition][:path] = transition_path options[:success]
14
+ @component_config[:method] = form_method
15
+ @component_config[:success] = success
16
+ @component_config[:multipart] = multipart == true
17
+ unless success.nil?
18
+ unless success[:transition].nil?
19
+ @component_config[:success][:transition][:path] = transition_path success
20
+ end
21
+ unless success[:redirect].nil?
22
+ @component_config[:success][:redirect][:path] = redirect_path success
15
23
  end
16
24
  end
17
- @component_config[:failure] = options[:failure]
18
- unless options[:failure].nil?
19
- unless options[:failure][:transition].nil?
20
- @component_config[:failure][:transition][:path] = transition_path options[:failure]
25
+ @component_config[:failure] = failure
26
+ unless failure.nil?
27
+ unless failure[:transition].nil?
28
+ @component_config[:failure][:transition][:path] = transition_path failure
29
+ end
30
+ unless failure[:redirect].nil?
31
+ @component_config[:failure][:redirect][:path] = redirect_path failure
21
32
  end
22
33
  end
23
- @tag_attributes.merge!({"@submit.prevent": true})
24
34
  rescue => e
25
35
  raise "Form component could not be setted up. Reason: #{e}"
26
36
  end
27
37
  end
28
38
 
39
+ def form_attributes
40
+ html_attributes.merge({
41
+ "@submit.prevent": true,
42
+ "class": "matestack-form #{options[:class]}",
43
+ "v-bind:class": "{ 'has-errors': hasErrors(), 'loading': loading }"
44
+ })
45
+ end
46
+
29
47
  def submit_path
30
48
  begin
31
- if options[:path].is_a?(Symbol)
32
- return ::Rails.application.routes.url_helpers.send(options[:path], options[:params])
49
+ if path.is_a?(Symbol)
50
+ return ::Rails.application.routes.url_helpers.send(path, form_params)
33
51
  else
34
- return options[:path]
52
+ return path
35
53
  end
36
54
  rescue
37
55
  raise "Submit path not found"
@@ -53,16 +71,31 @@ module Matestack::Ui::Core::Form
53
71
  end
54
72
  end
55
73
 
74
+ def redirect_path callback_options
75
+ begin
76
+ if callback_options[:redirect][:path].is_a?(Symbol)
77
+ return ::Rails.application.routes.url_helpers.send(
78
+ callback_options[:redirect][:path],
79
+ callback_options[:redirect][:params]
80
+ )
81
+ else
82
+ return callback_options[:redirect][:path]
83
+ end
84
+ rescue
85
+ raise "Redirect path not found"
86
+ end
87
+ end
88
+
56
89
  def form_wrapper
57
- case options[:for]
90
+ case for_option
58
91
  when Symbol
59
- return options[:for]
92
+ return for_option
60
93
  when String
61
- return options[:for]
94
+ return for_option
62
95
  end
63
96
 
64
- if options[:for].respond_to?(:model_name)
65
- return options[:for].model_name.singular
97
+ if for_option.respond_to?(:model_name)
98
+ return for_option.model_name.singular
66
99
  end
67
100
  end
68
101
 
@@ -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,70 +1,50 @@
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?
8
- end
9
-
10
- def key
11
- options[:key]
12
- end
13
-
14
- def label
15
- options[:label]
13
+ def response
14
+ label text: input_label if input_label
15
+ input html_attributes.merge(attributes: vue_attributes)
16
+ render_errors
16
17
  end
17
18
 
18
- def type
19
- options[:type]
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
20
28
  end
21
29
 
22
- def placeholder
23
- options[:placeholder]
24
- end
25
-
26
- def input_key
27
- "data['#{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
28
36
  end
29
37
 
30
- def error_key
31
- "errors['#{key.to_s}']"
38
+ def change_event
39
+ "inputChanged('#{attr_key}'); #{ "filesAdded('#{attr_key}');" if type == :file }".strip
32
40
  end
33
41
 
34
- def input_wrapper
35
- case options[:for]
36
- when nil
37
- return nil
38
- when Symbol, String
39
- return options[:for]
40
- end
41
- if options[:for].respond_to?(:model_name)
42
- return options[:for].model_name.singular
43
- end
42
+ def custom_options_validation
43
+ raise "included form config is missing, please add ':include' to parent form component" if @included_config.nil?
44
44
  end
45
45
 
46
46
  def attr_key
47
- if input_wrapper.nil?
48
- return key.to_s
49
- else
50
- return "#{input_wrapper}.#{key.to_s}"
51
- end
52
- end
53
-
54
- def init_value
55
- return options[:init] unless options[:init].nil?
56
-
57
- unless options[:for].nil?
58
- value = parse_value(options[:for].send key)
59
- else
60
- unless @included_config.nil? && @included_config[:for].nil?
61
- if @included_config[:for].respond_to?(key)
62
- value = parse_value(@included_config[:for].send key)
63
- else
64
- @included_config[:for][key] if @included_config[:for].is_a?(Hash)
65
- end
66
- end
67
- end
47
+ super + "#{'[]' if multiple && type == :file}"
68
48
  end
69
49
 
70
50
  private
@@ -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,68 @@
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 }
9
15
 
10
- def error_key
11
- 'errors["' + options[:key].to_s + '"]'
16
+ def vue_attributes
17
+ (options[:attributes] || {}).merge({
18
+ "@change": change_event,
19
+ ref: vue_ref,
20
+ 'init-value': init_value || [],
21
+ 'v-bind:class': "{ '#{input_error_class}': #{error_key} }",
22
+ 'value-type': value_type,
23
+ "#{v_model_type}": input_key,
24
+ })
12
25
  end
13
26
 
14
- def attr_key
15
- options[:key].to_s
27
+ def vue_ref
28
+ "select#{'.multiple' if multiple}.#{attr_key}"
16
29
  end
17
30
 
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
31
+ def value_type
32
+ item_value(select_options.first).is_a?(Integer) ? Integer : nil
22
33
  end
23
34
 
24
- def options_type
25
- return Integer if option_values.first.is_a?(Integer)
26
- return String if option_values.first.is_a?(String)
35
+ def item_value(item)
36
+ item.is_a?(Array) ? item.last : item
27
37
  end
28
38
 
29
- def model_binding
39
+ def item_name(item)
40
+ "#{attr_key}_#{item.is_a?(Array) ? item.first : item}"
41
+ end
30
42
 
31
- if option_values.first.is_a?(Integer)
32
- return "v-model.number"
33
- else
34
- return "v-model"
35
- end
43
+ def item_disabled(item)
44
+ disabled_values.present? && disabled_values.include?(item_value(item))
36
45
  end
37
46
 
38
- def init_value
39
- unless options[:init].nil?
40
- return options[:init]
41
- end
47
+ def item_label(item)
48
+ item.is_a?(Array) ? item.first : item
49
+ end
42
50
 
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
51
+ def v_model_type
52
+ if select_options && item_value(select_options.first).is_a?(Integer) && !multiple
53
+ 'v-model.number'
50
54
  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
55
+ 'v-model'
68
56
  end
69
57
  end
70
58
 
59
+ def change_event
60
+ "inputChanged('#{attr_key}')"
61
+ end
62
+
63
+ def id_for_item(value)
64
+ "#{html_attributes[:id]}_#{value}"
65
+ end
71
66
 
72
67
  end
73
68
  end