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,35 +1,45 @@
1
1
  module Matestack::Ui::Core::Action
2
2
  class Action < Matestack::Ui::Core::Component::Dynamic
3
+ vue_js_component_name 'matestack-ui-core-action'
4
+
5
+ optional :path, :success, :failure, :notify, :confirm,
6
+ method: { as: :action_method }, params: { as: :action_params }
3
7
 
4
8
  def setup
5
9
  @component_config[:action_path] = action_path
6
- @component_config[:method] = options[:method]
7
- @component_config[:success] = options[:success]
8
- unless options[:success].nil?
9
- unless options[:success][:transition].nil?
10
- @component_config[:success][:transition][:path] = transition_path options[:success]
10
+ @component_config[:method] = action_method
11
+ @component_config[:success] = success
12
+ unless success.nil?
13
+ unless success[:transition].nil?
14
+ @component_config[:success][:transition][:path] = transition_path success
15
+ end
16
+ unless success[:redirect].nil?
17
+ @component_config[:success][:redirect][:path] = redirect_path success
11
18
  end
12
19
  end
13
- @component_config[:failure] = options[:failure]
14
- unless options[:failure].nil?
15
- unless options[:failure][:transition].nil?
16
- @component_config[:failure][:transition][:path] = transition_path options[:failure]
20
+ @component_config[:failure] = failure
21
+ unless failure.nil?
22
+ unless failure[:transition].nil?
23
+ @component_config[:failure][:transition][:path] = transition_path failure
24
+ end
25
+ unless failure[:redirect].nil?
26
+ @component_config[:failure][:redirect][:path] = redirect_path failure
17
27
  end
18
28
  end
19
- if options[:notify].nil?
29
+ if notify.nil?
20
30
  @component_config[:notify] = true
21
31
  end
22
- if @component_config[:confirm] = options[:confirm]
23
- @component_config[:confirm_text] = options[:confirm].try(:[], :text) || "Are you sure?"
32
+ if @component_config[:confirm] = confirm
33
+ @component_config[:confirm_text] = confirm.try(:[], :text) || "Are you sure?"
24
34
  end
25
35
  end
26
36
 
27
37
  def action_path
28
38
  begin
29
- if options[:path].is_a?(Symbol)
30
- return ::Rails.application.routes.url_helpers.send(options[:path], options[:params])
39
+ if path.is_a?(Symbol)
40
+ return ::Rails.application.routes.url_helpers.send(path, action_params)
31
41
  else
32
- return options[:path]
42
+ return path
33
43
  end
34
44
  rescue
35
45
  raise "Action path not found"
@@ -51,5 +61,20 @@ module Matestack::Ui::Core::Action
51
61
  end
52
62
  end
53
63
 
64
+ def redirect_path callback_options
65
+ begin
66
+ if callback_options[:redirect][:path].is_a?(Symbol)
67
+ return ::Rails.application.routes.url_helpers.send(
68
+ callback_options[:redirect][:path],
69
+ callback_options[:redirect][:params]
70
+ )
71
+ else
72
+ return callback_options[:redirect][:path]
73
+ end
74
+ rescue
75
+ raise "Redirect path not found"
76
+ end
77
+ end
78
+
54
79
  end
55
80
  end
@@ -1,6 +1,6 @@
1
- %component{dynamic_tag_attributes}
1
+ %component{ dynamic_tag_attributes }
2
2
  %div
3
- %div{"v-if": "asyncTemplate == null"}
3
+ %div{ "v-if": "asyncTemplate == null" }
4
4
  = render_content
5
- %div{"v-if": "asyncTemplate != null"}
6
- %v-runtime-template{":template":"asyncTemplate"}
5
+ %div{ "v-if": "asyncTemplate != null" }
6
+ %v-runtime-template{ ":template":"asyncTemplate" }
@@ -1,5 +1,5 @@
1
- %address{@tag_attributes}
2
- - if options[:text].nil? && block_given?
1
+ %address{ html_attributes }
2
+ - if text.blank? && block_given?
3
3
  = yield
4
4
  - else
5
- = options[:text]
5
+ = text
@@ -1,5 +1,5 @@
1
1
  module Matestack::Ui::Core::Address
2
2
  class Address < Matestack::Ui::Core::Component::Static
3
-
3
+ optional :text
4
4
  end
5
5
  end
@@ -1,4 +1,3 @@
1
1
  %component{"is": "matestack-ui-core-app", "inline-template": true}
2
- %div{"class": "matestack_app"}
3
- - @cells.each do |key, cell|
4
- = cell.call(:show)
2
+ %div{class: "matestack-app-wrapper"}
3
+ = render_content
@@ -2,6 +2,7 @@ import Vue from 'vue/dist/vue.esm'
2
2
  import VRuntimeTemplate from "v-runtime-template"
3
3
  import Vuex from 'vuex'
4
4
  import isNavigatingToAnotherPage from "./location"
5
+ import matestackEventHub from '../js/event-hub'
5
6
 
6
7
  const componentDef = {
7
8
  props: ['appConfig', 'params'],
@@ -16,15 +17,17 @@ const componentDef = {
16
17
  }),
17
18
  mounted: function(){
18
19
  const self = this;
19
- window.onpopstate = (event) => {
20
+ window.addEventListener("popstate", (event) => {
20
21
  if (isNavigatingToAnotherPage({
21
22
  origin: self.currentOrigin,
22
23
  pathName: self.currentPathName,
23
24
  search: self.currentSearch
24
25
  }, document.location)){
25
- self.$store.dispatch("navigateTo", {url: document.location.pathname, backwards: true} );
26
+ matestackEventHub.$emit("page_loading_triggered", document.location.pathname + document.location.search);
27
+ this.$store.commit('setPageLoading', true);
28
+ self.$store.dispatch("navigateTo", { url: document.location.pathname + document.location.search, backwards: true } );
26
29
  }
27
- }
30
+ })
28
31
  },
29
32
  components: {
30
33
  VRuntimeTemplate: VRuntimeTemplate
@@ -1,74 +1,51 @@
1
1
  module Matestack::Ui::Core::App
2
- class App < Trailblazer::Cell
3
-
2
+ # TODO: Similar to page, App doesn't need everything base offers atm
3
+ class App < Matestack::Ui::Core::Component::Base
4
4
  include Matestack::Ui::Core::Cell
5
5
  include Matestack::Ui::Core::ApplicationHelper
6
- include Matestack::Ui::Core::ToCell
7
-
8
- view_paths << "#{Matestack::Ui::Core::Engine.root}/app/concepts"
9
-
10
- extend ViewName::Flat
11
-
12
- def self.prefixes
13
- _prefixes = super
14
- modified_prefixes = _prefixes.map do |prefix|
15
- prefix_parts = prefix.split("/")
16
-
17
- if prefix_parts.last.include?(self.name.split("::")[-1].downcase)
18
- prefix_parts[0..-2].join("/")
19
- else
20
- prefix
21
- end
22
-
23
- end
24
-
25
- return modified_prefixes
26
- end
27
-
28
- def self.views_dir
29
- return ""
30
- end
31
-
32
- def initialize(model=nil, options={})
33
- super
34
- @nodes = {}
35
- @cells = {}
36
- @page_block = nil
37
- @page_id = ""
38
- setup
39
- end
6
+ # include Matestack::Ui::Core::ToCell
7
+ include Matestack::Ui::Core::HasViewContext
40
8
 
41
- def setup
42
- true
43
- end
9
+ def initialize(page_class, controller_instance, context)
10
+ super(nil, context: context)
44
11
 
45
- def prepare
46
- true
12
+ @page_class = page_class
13
+ @controller_instance = controller_instance
47
14
  end
48
15
 
49
- def show(page_id, page_nodes, &block)
50
- @page_id = page_id
51
- @page_nodes = page_nodes
52
- prepare
53
- response
54
- render(view: :app, &block)
16
+ def show
17
+ render :app
55
18
  end
56
19
 
57
- def page_nodes
58
- @page_nodes
20
+ # Default "response" for just rendering the page without a more
21
+ # sophisticated app being supplied
22
+ def response
23
+ page_content
59
24
  end
60
25
 
61
- def components(&block)
62
- @nodes = Matestack::Ui::Core::AppNode.build(self, &block)
63
-
64
- @nodes.each do |key, node|
65
- @cells[key] = to_cell(key, node["component_name"], node["config"], node["argument"], node["components"], nil, node["cached_params"])
26
+ # new alternative method name to be used in app defentions
27
+ # slots may contain a loading state element will be rendered during form start to finish of a transition
28
+ def yield_page slots: {}
29
+ page_content_wrapper slots: slots do
30
+ add_child @page_class,
31
+ controller_instance: @controller_instance,
32
+ context: context
66
33
  end
67
34
  end
68
35
 
69
- def partial(&block)
70
- Matestack::Ui::Core::AppNode.build(self, &block)
36
+ def page_content slots: {}
37
+ yield_page slots: slots
71
38
  end
72
39
 
40
+
41
+ # def page_content loading_state_element_slot: nil
42
+ # # TODO: Content probably needs/would benefit from a better name - like "DynamicWrapper" ?
43
+ # context[:loading_state_element_slot] = loading_state_element_slot
44
+ # add_child Matestack::Ui::Core::Page::Content, context: context do
45
+ # add_child @page_class,
46
+ # controller_instance: @controller_instance,
47
+ # context: context
48
+ # end
49
+ # end
73
50
  end
74
51
  end
@@ -8,6 +8,7 @@ Vue.use(Vuex)
8
8
  const store = new Vuex.Store({
9
9
  state: {
10
10
  pageTemplate: null,
11
+ pageLoading: false,
11
12
  currentPathName: document.location.pathname,
12
13
  currentSearch: document.location.search,
13
14
  currentOrigin: document.location.origin
@@ -16,6 +17,9 @@ const store = new Vuex.Store({
16
17
  setPageTemplate (state, serverResponse){
17
18
  state.pageTemplate = serverResponse
18
19
  },
20
+ setPageLoading (state, boolean){
21
+ state.pageLoading = boolean
22
+ },
19
23
  setCurrentLocation (state, current){
20
24
  state.currentPathName = current.path
21
25
  state.currentSearch = current.search
@@ -23,10 +27,30 @@ const store = new Vuex.Store({
23
27
  },
24
28
  resetPageTemplate (state) {
25
29
  state.pageTemplate = null;
30
+ },
31
+ pageScrollTop (state) {
32
+ //https://stackoverflow.com/a/35940276/13886137
33
+ const getScrollParent = function(node) {
34
+ if (node == null) {
35
+ return null
36
+ }
37
+ if (node.scrollHeight > node.clientHeight) {
38
+ return node
39
+ } else {
40
+ return getScrollParent(node.parentNode)
41
+ }
42
+ }
43
+ var scrollParent = getScrollParent(document.getElementsByClassName("matestack-page-root")[0])
44
+ if(scrollParent){
45
+ scrollParent.scrollTop = 0;
46
+ }
47
+ // getScrollParent(document.getElementsByClassName("matestack-page-root")[0]).scrollTop = 0
26
48
  }
27
49
  },
28
50
  actions: {
29
51
  navigateTo ({ commit, state }, { url, backwards }) {
52
+ const self = this
53
+ commit('setPageLoading', true)
30
54
  matestackEventHub.$emit("page_loading", url);
31
55
  if (typeof matestackUiCoreTransitionStart !== 'undefined') {
32
56
  matestackUiCoreTransitionStart(url);
@@ -51,9 +75,11 @@ const store = new Vuex.Store({
51
75
  window.history.pushState({matestackApp: true, url: url}, null, url);
52
76
  }
53
77
  setTimeout(function () {
54
- resolve(response["data"])
78
+ resolve(response["data"]);
55
79
  commit('setPageTemplate', response["data"])
56
- commit('setCurrentLocation', { path: url, search: document.location.search, origin: document.location.origin })
80
+ commit('setCurrentLocation', { path: url.split("?")[0], search: document.location.search, origin: document.location.origin })
81
+ commit('setPageLoading', false)
82
+ commit('pageScrollTop')
57
83
  matestackEventHub.$emit("page_loaded", url);
58
84
  if (typeof matestackUiCoreTransitionSuccess !== 'undefined') {
59
85
  matestackUiCoreTransitionSuccess(url);
@@ -1 +1 @@
1
- %area{@tag_attributes}
1
+ %area{ html_attributes, "coords": coords.join(',') }
@@ -1,18 +1,6 @@
1
1
  module Matestack::Ui::Core::Area
2
2
  class Area < Matestack::Ui::Core::Component::Static
3
- def setup
4
- @tag_attributes.merge!({
5
- alt: options[:alt],
6
- coords: options[:coords].join(','),
7
- download: options[:download],
8
- href: options[:href],
9
- hreflang: options[:hreflang],
10
- media: options[:media],
11
- rel: options[:rel],
12
- shape: options[:shape],
13
- target: options[:target],
14
- type: options[:type]
15
- })
16
- end
3
+ html_attributes :alt, :download, :href, :hreflang, :media, :rel, :shape, :target, :type
4
+ optional :coords
17
5
  end
18
6
  end
@@ -1,5 +1,5 @@
1
- %article{@tag_attributes}
2
- - if options[:text].nil? && block_given?
1
+ %article{ html_attributes }
2
+ - if text.nil? && block_given?
3
3
  = yield
4
4
  - else
5
- = options[:text]
5
+ = text
@@ -1,5 +1,5 @@
1
1
  module Matestack::Ui::Core::Article
2
2
  class Article < Matestack::Ui::Core::Component::Static
3
-
3
+ optional :text
4
4
  end
5
5
  end
@@ -1,3 +1,3 @@
1
- %aside{@tag_attributes}
1
+ %aside{ html_attributes }
2
2
  - if block_given?
3
3
  = yield
@@ -1,5 +1,4 @@
1
1
  module Matestack::Ui::Core::Aside
2
2
  class Aside < Matestack::Ui::Core::Component::Static
3
-
4
3
  end
5
4
  end
@@ -1,2 +1,6 @@
1
- %div{@tag_attributes}
2
- = yield
1
+ %component{dynamic_tag_attributes}
2
+ %div{class: "matestack-async-component-container", "v-bind:class": "{ 'loading': loading === true }"}
3
+ %div{class: "matestack-async-component-wrapper", "v-if": "asyncTemplate == null", "v-bind:class": "{ 'loading': loading === true }"}
4
+ = render_content
5
+ %div{class: "matestack-async-component-wrapper", "v-if": "asyncTemplate != null", "v-bind:class": "{ 'loading': loading === true }"}
6
+ %v-runtime-template{":template":"asyncTemplate"}
@@ -1,4 +1,6 @@
1
1
  import Vue from 'vue/dist/vue.esm'
2
+ import axios from 'axios'
3
+ import VRuntimeTemplate from "v-runtime-template"
2
4
  import matestackEventHub from '../js/event-hub'
3
5
  import componentMixin from '../component/component'
4
6
 
@@ -6,8 +8,10 @@ const componentDef = {
6
8
  mixins: [componentMixin],
7
9
  data: function(){
8
10
  return {
11
+ asyncTemplate: null,
9
12
  showing: true,
10
- hide_after_timeout: null,
13
+ loading: false,
14
+ hideAfterTimeout: null,
11
15
  event: {
12
16
  data: {}
13
17
  }
@@ -27,7 +31,7 @@ const componentDef = {
27
31
  }
28
32
  }
29
33
  if(this.componentConfig["hide_after"] != undefined){
30
- self.hide_after_timeout = setTimeout(function () {
34
+ self.hideAfterTimeout = setTimeout(function () {
31
35
  self.hide()
32
36
  }, parseInt(this.componentConfig["hide_after"]));
33
37
  }
@@ -38,16 +42,43 @@ const componentDef = {
38
42
  },
39
43
  startDefer: function(){
40
44
  const self = this
45
+ self.loading = true;
41
46
  setTimeout(function () {
42
47
  self.rerender()
43
48
  }, parseInt(this.componentConfig["defer"]));
49
+ },
50
+ rerender: function(){
51
+ var self = this;
52
+ self.loading = true;
53
+ axios({
54
+ method: "get",
55
+ url: location.pathname + location.search,
56
+ headers: {
57
+ 'X-CSRF-Token': document.getElementsByName("csrf-token")[0].getAttribute('content')
58
+ },
59
+ params: {
60
+ "component_key": self.componentConfig["component_key"],
61
+ "component_class": self.componentConfig["parent_class"]
62
+ }
63
+ })
64
+ .then(function(response){
65
+ var tmp_dom_element = document.createElement('div');
66
+ tmp_dom_element.innerHTML = response['data'];
67
+ var template = tmp_dom_element.querySelector('#' + self.componentConfig["component_key"]).outerHTML;
68
+ self.loading = false;
69
+ self.asyncTemplate = template;
70
+ })
71
+ .catch(function(error){
72
+ console.log(error)
73
+ matestackEventHub.$emit('async_rerender_error', { id: self.componentConfig["component_key"] })
74
+ })
44
75
  }
45
76
  },
46
77
  created: function () {
47
78
  const self = this
48
- matestackEventHub.$on(this.componentConfig["rerender_on"], self.rerender)
49
- matestackEventHub.$on(this.componentConfig["show_on"], self.show)
50
- matestackEventHub.$on(this.componentConfig["hide_on"], self.hide)
79
+ self.registerEvents(this.componentConfig['show_on'], self.show)
80
+ self.registerEvents(this.componentConfig['hide_on'], self.hide)
81
+ self.registerEvents(this.componentConfig['rerender_on'], self.rerender)
51
82
  if(this.componentConfig["show_on"] != undefined){
52
83
  this.showing = false
53
84
  }
@@ -64,11 +95,14 @@ const componentDef = {
64
95
  },
65
96
  beforeDestroy: function() {
66
97
  const self = this
67
- clearTimeout(self.hide_after_timeout)
68
- matestackEventHub.$off(this.componentConfig["rerender_on"], self.rerender);
69
- matestackEventHub.$off(this.componentConfig["show_on"], self.show);
70
- matestackEventHub.$off(this.componentConfig["hide_on"], self.hide);
98
+ clearTimeout(self.hideAfterTimeout)
99
+ self.removeEvents(this.componentConfig["show_on"], self.show)
100
+ self.removeEvents(this.componentConfig["hide_on"], self.hide)
101
+ self.removeEvents(this.componentConfig["rerender_on"], self.rerender)
71
102
  },
103
+ components: {
104
+ VRuntimeTemplate: VRuntimeTemplate
105
+ }
72
106
  }
73
107
 
74
108
  let component = Vue.component('matestack-ui-core-async', componentDef)