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
@@ -0,0 +1,6 @@
1
+ module Matestack::Ui::Core::Dfn
2
+ class Dfn < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
6
+
@@ -0,0 +1,5 @@
1
+ %dialog{@tag_attributes}
2
+ - if options[:text].blank? && block_given?
3
+ = yield
4
+ - else
5
+ = options[:text]
@@ -0,0 +1,9 @@
1
+ module Matestack::Ui::Core::Dialog
2
+ class Dialog < Matestack::Ui::Core::Component::Static
3
+ def setup
4
+ @tag_attributes.merge!({
5
+ "open": options[:open] ||= nil
6
+ })
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ %dl{@tag_attributes}
2
+ - if options[:text].nil? && block_given?
3
+ = yield
4
+ - else
5
+ = options[:text]
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Dl
2
+ class Dl < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ %dt{@tag_attributes}
2
+ - if options[:text].nil? && block_given?
3
+ = yield
4
+ - else
5
+ = options[:text]
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Dt
2
+ class Dt < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ %em{@tag_attributes}
2
+ - if options[:text].nil? && block_given?
3
+ = yield
4
+ - else
5
+ = options[:text]
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Em
2
+ class Em < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ %fieldset{@tag_attributes}
2
+ -if options[:text].nil? && block_given?
3
+ = yield
4
+ - else
5
+ = options[:text]
@@ -0,0 +1,9 @@
1
+ module Matestack::Ui::Core::Fieldset
2
+ class Fieldset < Matestack::Ui::Core::Component::Static
3
+ def setup
4
+ @tag_attributes.merge!({
5
+ disabled: options[:disabled]
6
+ })
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ %figure{@tag_attributes}
2
+ - if block_given?
3
+ = yield
@@ -0,0 +1,5 @@
1
+ module Matestack::Ui::Core::Figure
2
+ class Figure < Matestack::Ui::Core::Component::Static
3
+
4
+ end
5
+ end
@@ -0,0 +1,79 @@
1
+ require_relative '../utils'
2
+ require_relative '../has_input_html_attributes'
3
+ require_relative '../has_errors'
4
+ module Matestack::Ui::Core::Form::Checkbox
5
+ class Checkbox < 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 :value, :false_value, :multiple, :init, for: { as: :input_for }, label: { as: :input_label }, options: { as: :checkbox_options }
12
+
13
+ def response
14
+ # multiple values
15
+ if checkbox_options
16
+ checkbox_options.to_a.each do |item|
17
+ input html_attributes.merge(
18
+ attributes: vue_attributes,
19
+ type: :checkbox,
20
+ id: "#{id_for_item(item_value(item))}",
21
+ name: item_name(item),
22
+ value: item_value(item)
23
+ )
24
+ label text: item_name(item), for: id_for_item(item_value(item))
25
+ end
26
+ # checked/unchecked checkbox
27
+ else
28
+ form_input type: :hidden, key: key, value: (false_value || 0), errors: false
29
+ form_input type: :checkbox, key: key, value: checked_value, id: id_for_item(value), errors: false
30
+ label text: input_label, for: id_for_item(value)
31
+ end
32
+ render_errors
33
+ end
34
+
35
+ def vue_attributes
36
+ (options[:attributes] || {}).merge({
37
+ "@change": change_event,
38
+ ref: "select.multiple.#{attr_key}",
39
+ 'init-value': init_value,
40
+ 'v-bind:class': "{ '#{input_error_class}': #{error_key} }",
41
+ 'value-type': value_type,
42
+ "#{v_model_type}": input_key,
43
+ })
44
+ end
45
+
46
+ def value_type
47
+ item_value(checkbox_options.first).is_a?(Integer) ? Integer : nil
48
+ end
49
+
50
+ def item_value(item)
51
+ item.is_a?(Array) ? item.last : item
52
+ end
53
+
54
+ def item_name(item)
55
+ item.is_a?(Array) ? item.first : item
56
+ end
57
+
58
+ def checked_value
59
+ value || 1
60
+ end
61
+
62
+ def v_model_type
63
+ if checkbox_options && checkbox_options.first.is_a?(Integer)
64
+ 'v-model.number'
65
+ else
66
+ 'v-model'
67
+ end
68
+ end
69
+
70
+ def change_event
71
+ "inputChanged('#{attr_key}')"
72
+ end
73
+
74
+ def id_for_item(value)
75
+ "#{html_attributes[:id]}_#{value}"
76
+ end
77
+
78
+ end
79
+ end
@@ -1,136 +1,306 @@
1
- import Vue from 'vue/dist/vue.esm'
2
- import Vuex from 'vuex'
3
- import axios from 'axios'
1
+ import Vue from "vue/dist/vue.esm";
2
+ import Vuex from "vuex";
3
+ import axios from "axios";
4
4
 
5
- import matestackEventHub from 'js/event-hub'
6
-
7
- import componentMixin from 'component/component'
5
+ import matestackEventHub from "../js/event-hub";
6
+ import componentMixin from "../component/component";
8
7
 
9
8
  const componentDef = {
10
9
  mixins: [componentMixin],
11
- data: function(){
10
+ data: function () {
12
11
  return {
13
12
  data: {},
14
- showInlineForm: false,
15
- errors: {}
16
- }
13
+ errors: {},
14
+ loading: false
15
+ };
17
16
  },
18
17
  methods: {
19
- initDataKey: function(key, initValue){
18
+ initDataKey: function (key, initValue) {
20
19
  this.data[key] = initValue;
21
20
  },
22
- inputChanged: function(key){
23
- this.resetErrors(key)
21
+ inputChanged: function (key) {
22
+ this.resetErrors(key);
24
23
  },
25
- updateFormValue: function(key, value){
24
+ updateFormValue: function (key, value) {
26
25
  this.data[key] = value;
27
26
  },
28
- resetErrors: function(key){
29
- if (this.errors[key]){
30
- this.errors[key] = null;
27
+ hasErrors: function(){
28
+ //https://stackoverflow.com/a/27709663/13886137
29
+ for (var key in this.errors) {
30
+ if (this.errors[key] !== null && this.errors[key] != ""){
31
+ return true;
32
+ }
31
33
  }
34
+ return false;
32
35
  },
33
- launchInlineForm: function(key, value){
34
- this.showInlineForm = true;
35
- this.data[key] = value;
36
- const self = this;
37
- setTimeout(function () {
38
- self.$refs.inlineinput.focus();
39
- }, 300);
36
+ resetErrors: function (key) {
37
+ if (this.errors[key]) {
38
+ this.errors[key] = null;
39
+ }
40
40
  },
41
- closeInlineForm: function(){
42
- this.showInlineForm = false;
41
+ setProps: function (flat, newVal) {
42
+ for (var i in flat) {
43
+ if (flat[i] === null){
44
+ flat[i] = newVal;
45
+ } else if (flat[i] instanceof File){
46
+ flat[i] = newVal;
47
+ this.$refs["input."+i].value = newVal
48
+ } else if (flat[i] instanceof Array) {
49
+ if(flat[i][0] instanceof File){
50
+ flat[i] = newVal
51
+ this.$refs["input."+i].value = newVal
52
+ }
53
+ } else if (typeof flat[i] === "object" && !(flat[i] instanceof Array)) {
54
+ setProps(flat[i], newVal);
55
+ } else {
56
+ flat[i] = newVal;
57
+ }
58
+ }
43
59
  },
44
- setProps: function(flat, newVal){
45
- for(var i in flat){
46
- if((typeof flat[i] === "object") && !(flat[i] instanceof Array)){
47
- setProps(flat[i], newVal);
48
- return;
49
- } else {
50
- flat[i] = newVal;
51
- }
60
+ filesAdded: function (key) {
61
+ const dataTransfer = event.dataTransfer || event.target;
62
+ const files = dataTransfer.files;
63
+ if (event.target.attributes.multiple) {
64
+ this.data[key] = [];
65
+ for (let index in files) {
66
+ if (files[index] instanceof File) {
67
+ this.data[key].push(files[index]);
68
+ }
69
+ }
70
+ } else {
71
+ this.data[key] = files[0];
52
72
  }
53
73
  },
54
- initValues: function(){
74
+ initValues: function () {
55
75
  let self = this;
56
- let data = {}
76
+ let data = {};
57
77
  for (let key in self.$refs) {
58
- let initValue = self.$refs[key]["attributes"]["init-value"]
59
- let valueType = self.$refs[key]["attributes"]["value-type"]
78
+ let initValue = self.$refs[key]["attributes"]["init-value"];
79
+ let valueType = self.$refs[key]["attributes"]["value-type"];
60
80
 
61
- if (key.startsWith("input.")){
62
- if(initValue){
63
- data[key.replace('input.', '')] = initValue["value"]
64
- }else{
65
- data[key.replace('input.', '')] = null
81
+ if (key.startsWith("input.")) {
82
+ if (initValue) {
83
+ data[key.replace("input.", "")] = initValue["value"];
84
+ } else {
85
+ data[key.replace("input.", "")] = null;
66
86
  }
67
87
  }
68
- if (key.startsWith("select.")){
69
- if (key.startsWith("select.multiple.")){
70
- if(initValue){
71
- data[key.replace('select.multiple.', '')] = JSON.parse(initValue["value"])
72
- }else{
73
- data[key.replace('select.multiple.', '')] = []
88
+ if (key.startsWith("select.")) {
89
+ if (key.startsWith("select.multiple.")) {
90
+ if (initValue) {
91
+ data[key.replace("select.multiple.", "")] = JSON.parse(initValue["value"]);
92
+ } else {
93
+ data[key.replace("select.multiple.", "")] = [];
74
94
  }
75
- }else{
76
- if(initValue){
77
- if(valueType && valueType["value"] == "Integer")
78
- data[key.replace('select.', '')] = parseInt(initValue["value"])
79
- else{
80
- data[key.replace('select.', '')] = initValue["value"]
95
+ } else {
96
+ if (initValue) {
97
+ if (valueType && valueType["value"] == "Integer") data[key.replace("select.", "")] = parseInt(initValue["value"]);
98
+ else {
99
+ data[key.replace("select.", "")] = initValue["value"];
81
100
  }
82
- }else{
83
- data[key.replace('select.', '')] = null
101
+ } else {
102
+ data[key.replace("select.", "")] = null;
84
103
  }
85
104
  }
86
-
87
105
  }
88
106
  }
89
107
  self.data = data;
90
108
  },
109
+ shouldResetFormOnSuccessfulSubmit() {
110
+ const self = this;
111
+ if (self.componentConfig["success"] != undefined && self.componentConfig["success"]["reset"] != undefined) {
112
+ return self.componentConfig["success"]["reset"];
113
+ } else {
114
+ return self.shouldResetFormOnSuccessfulSubmitByDefault();
115
+ }
116
+ },
117
+ shouldResetFormOnSuccessfulSubmitByDefault() {
118
+ const self = this;
119
+ if (self.componentConfig["method"] == "put") {
120
+ return false;
121
+ } else {
122
+ return true;
123
+ }
124
+ },
91
125
  perform: function(){
92
126
  const self = this
93
- let payload = {}
94
- payload[self.componentConfig["for"]] = self.data
95
- axios({
96
- method: self.componentConfig["method"],
97
- url: self.componentConfig["submit_path"],
98
- data: payload,
99
- headers: {
100
- 'X-CSRF-Token': document.getElementsByName("csrf-token")[0].getAttribute('content')
101
- }
102
- })
103
- .then(function(response){
104
- if (self.componentConfig["success"] != undefined && self.componentConfig["success"]["emit"] != undefined) {
105
- matestackEventHub.$emit(self.componentConfig["success"]["emit"], response.data);
106
- }
107
- if (self.componentConfig["success"] != undefined && self.componentConfig["success"]["transition"] != undefined && self.$store != undefined) {
108
- let path = self.componentConfig["success"]["transition"]["path"]
109
- self.$store.dispatch('navigateTo', {url: path, backwards: false})
110
- }
111
- self.setProps(self.data, null);
112
- self.initValues()
113
- self.showInlineForm = false;
114
- })
115
- .catch(function(error){
116
- if(error.response && error.response.data && error.response.data.errors){
117
- self.errors = error.response.data.errors;
127
+ var form = self.$el.tagName == 'FORM' ? self.$el : self.$el.querySelector('form');
128
+ if(form.checkValidity()){
129
+ self.loading = true;
130
+ if (self.componentConfig["emit"] != undefined) {
131
+ matestackEventHub.$emit(self.componentConfig["emit"]);
118
132
  }
119
- if (self.componentConfig["failure"] != undefined && self.componentConfig["failure"]["emit"] != undefined) {
120
- matestackEventHub.$emit(self.componentConfig["failure"]["emit"], error.response.data);
133
+ if (self.componentConfig["delay"] != undefined) {
134
+ setTimeout(function () {
135
+ self.sendRequest()
136
+ }, parseInt(self.componentConfig["delay"]));
137
+ } else {
138
+ self.sendRequest()
121
139
  }
122
- if (self.componentConfig["failure"] != undefined && self.componentConfig["failure"]["transition"] != undefined && self.$store != undefined) {
123
- let path = self.componentConfig["failure"]["transition"]["path"]
124
- self.$store.dispatch('navigateTo', {url: path, backwards: false})
140
+ } else {
141
+ matestackEventHub.$emit('static_form_errors');
142
+ }
143
+ },
144
+ sendRequest: function(){
145
+ const self = this;
146
+ let payload = {};
147
+ payload[self.componentConfig["for"]] = self.data;
148
+ let axios_config = {};
149
+ if (self.componentConfig["multipart"] == true ) {
150
+ let form_data = new FormData();
151
+ for (let key in self.data) {
152
+ if (key.endsWith("[]")) {
153
+ for (let i in self.data[key]) {
154
+ let file = self.data[key][i];
155
+ form_data.append(self.componentConfig["for"] + "[" + key.slice(0, -2) + "][]", file);
156
+ }
157
+ } else {
158
+ if (self.data[key] != null){
159
+ form_data.append(self.componentConfig["for"] + "[" + key + "]", self.data[key]);
160
+ }
161
+ }
125
162
  }
126
- })
127
- }
163
+ axios_config = {
164
+ method: self.componentConfig["method"],
165
+ url: self.componentConfig["submit_path"],
166
+ data: form_data,
167
+ headers: {
168
+ "X-CSRF-Token": document.getElementsByName("csrf-token")[0].getAttribute("content"),
169
+ "Content-Type": "multipart/form-data",
170
+ },
171
+ };
172
+ } else {
173
+ axios_config = {
174
+ method: self.componentConfig["method"],
175
+ url: self.componentConfig["submit_path"],
176
+ data: payload,
177
+ headers: {
178
+ "X-CSRF-Token": document.getElementsByName("csrf-token")[0].getAttribute("content"),
179
+ "Content-Type": "application/json",
180
+ },
181
+ };
182
+ }
183
+ axios(axios_config)
184
+ .then(function (response) {
185
+ self.loading = false;
186
+ if (self.componentConfig["success"] != undefined && self.componentConfig["success"]["emit"] != undefined) {
187
+ matestackEventHub.$emit(self.componentConfig["success"]["emit"], response.data);
188
+ }
189
+ // transition handling
190
+ if (self.componentConfig["success"] != undefined
191
+ && self.componentConfig["success"]["transition"] != undefined
192
+ && (
193
+ self.componentConfig["success"]["transition"]["follow_response"] == undefined
194
+ ||
195
+ self.componentConfig["success"]["transition"]["follow_response"] === false
196
+ )
197
+ && self.$store != undefined
198
+ ) {
199
+ let path = self.componentConfig["success"]["transition"]["path"]
200
+ self.$store.dispatch('navigateTo', {url: path, backwards: false})
201
+ return;
202
+ }
203
+ if (self.componentConfig["success"] != undefined
204
+ && self.componentConfig["success"]["transition"] != undefined
205
+ && self.componentConfig["success"]["transition"]["follow_response"] === true
206
+ && self.$store != undefined
207
+ ) {
208
+ let path = response.data["transition_to"] || response.request.responseURL
209
+ self.$store.dispatch('navigateTo', {url: path, backwards: false})
210
+ return;
211
+ }
212
+ // redirect handling
213
+ if (self.componentConfig["success"] != undefined
214
+ && self.componentConfig["success"]["redirect"] != undefined
215
+ && (
216
+ self.componentConfig["success"]["redirect"]["follow_response"] == undefined
217
+ ||
218
+ self.componentConfig["success"]["redirect"]["follow_response"] === false
219
+ )
220
+ && self.$store != undefined
221
+ ) {
222
+ let path = self.componentConfig["success"]["redirect"]["path"]
223
+ window.location.href = path
224
+ return;
225
+ }
226
+ if (self.componentConfig["success"] != undefined
227
+ && self.componentConfig["success"]["redirect"] != undefined
228
+ && self.componentConfig["success"]["redirect"]["follow_response"] === true
229
+ && self.$store != undefined
230
+ ) {
231
+ let path = response.data["redirect_to"] || response.request.responseURL
232
+ window.location.href = path
233
+ return;
234
+ }
235
+
236
+ if (self.shouldResetFormOnSuccessfulSubmit())
237
+ {
238
+ self.setProps(self.data, null);
239
+ self.initValues();
240
+ }
241
+ })
242
+ .catch(function (error) {
243
+ self.loading = false;
244
+ if (error.response && error.response.data && error.response.data.errors) {
245
+ self.errors = error.response.data.errors;
246
+ }
247
+ if (self.componentConfig["failure"] != undefined && self.componentConfig["failure"]["emit"] != undefined) {
248
+ matestackEventHub.$emit(self.componentConfig["failure"]["emit"], error.response.data);
249
+ }
250
+ // transition handling
251
+ if (self.componentConfig["failure"] != undefined
252
+ && self.componentConfig["failure"]["transition"] != undefined
253
+ && (
254
+ self.componentConfig["failure"]["transition"]["follow_response"] == undefined
255
+ ||
256
+ self.componentConfig["failure"]["transition"]["follow_response"] === false
257
+ )
258
+ && self.$store != undefined
259
+ ) {
260
+ let path = self.componentConfig["failure"]["transition"]["path"]
261
+ self.$store.dispatch('navigateTo', {url: path, backwards: false})
262
+ return;
263
+ }
264
+ if (self.componentConfig["failure"] != undefined
265
+ && self.componentConfig["failure"]["transition"] != undefined
266
+ && self.componentConfig["failure"]["transition"]["follow_response"] === true
267
+ && self.$store != undefined
268
+ ) {
269
+ let path = error.response.data["transition_to"] || response.request.responseURL
270
+ self.$store.dispatch('navigateTo', {url: path, backwards: false})
271
+ return;
272
+ }
273
+ // redirect handling
274
+ if (self.componentConfig["failure"] != undefined
275
+ && self.componentConfig["failure"]["redirect"] != undefined
276
+ && (
277
+ self.componentConfig["failure"]["redirect"]["follow_response"] == undefined
278
+ ||
279
+ self.componentConfig["failure"]["redirect"]["follow_response"] === false
280
+ )
281
+ && self.$store != undefined
282
+ ) {
283
+ let path = self.componentConfig["failure"]["redirect"]["path"]
284
+ window.location.href = path
285
+ return;
286
+ }
287
+ if (self.componentConfig["failure"] != undefined
288
+ && self.componentConfig["failure"]["redirect"] != undefined
289
+ && self.componentConfig["failure"]["redirect"]["follow_response"] === true
290
+ && self.$store != undefined
291
+ ) {
292
+ let path = error.response.data["redirect_to"] || response.request.responseURL
293
+ window.location.href = path
294
+ return;
295
+ }
296
+ });
297
+ },
298
+ },
299
+ mounted: function () {
300
+ this.initValues();
128
301
  },
129
- mounted: function(){
130
- this.initValues()
131
- }
132
- }
302
+ };
133
303
 
134
- let component = Vue.component('matestack-ui-core-form', componentDef)
304
+ let component = Vue.component("matestack-ui-core-form", componentDef);
135
305
 
136
- export default componentDef
306
+ export default componentDef;