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 @@
1
+ %wbr{@tag_attributes}
@@ -0,0 +1,4 @@
1
+ module Matestack::Ui::Core::Wbr
2
+ class Wbr < Matestack::Ui::Core::Component::Static
3
+ end
4
+ end
@@ -1,7 +1,7 @@
1
1
  module Matestack::Ui::Core::Youtube
2
2
  class Youtube < Matestack::Ui::Core::Component::Static
3
3
 
4
- REQUIRED_KEYS = [:yt_id, :height, :width]
4
+ requires :yt_id, :height, :width
5
5
 
6
6
  def setup
7
7
  url = 'https://www.youtube.com/embed/'
@@ -1,34 +1,106 @@
1
1
  module Matestack
2
2
  module Ui
3
3
  module Core
4
+ # We're called ApplicationHelper but all we do so far is rendering.
4
5
  module ApplicationHelper
5
6
 
6
- def render_page(page_class, only_page=false)
7
- page_class.new(nil, context: {
8
- params: params,
9
- request: request
10
- }, controller_instance: self).call(:show, nil, only_page)
7
+ # Allow the definition of a controller wide get_matestack_app_class
8
+ #
9
+ # class SomeController < ActionController::Base
10
+ # matestack_app MyAppClass
11
+ # #...
12
+ # end
13
+ #
14
+ def self.included(base)
15
+ base.extend(ClassMethods)
11
16
  end
17
+ module ClassMethods
18
+ def matestack_app _class
19
+ @matestack_app_class = _class
20
+ end
21
+
22
+ def get_matestack_app_class
23
+ if defined?(@matestack_app_class)
24
+ @matestack_app_class
25
+ else
26
+ nil
27
+ end
28
+ end
12
29
 
13
- def render_component(page_class, component_key)
14
- page_class.new(nil, context: {
15
- params: params,
16
- request: request
17
- }, controller_instance: self).call(:show, component_key)
18
30
  end
19
31
 
20
- def responder_for(page_class, options = {})
21
- unless params[:component_key].blank?
22
- render plain: render_component(page_class, params[:component_key])
23
- return
32
+ # Matestack allows you to use `render` to render matestack pages.
33
+ #
34
+ # render Pages::Member::Bookings::Index
35
+ # render matestack: Pages::Member::Bookings::Index
36
+ #
37
+ def render(*args)
38
+ if (matestack_class = args.first).is_a?(Class) && (matestack_class < Matestack::Ui::Page)
39
+ options_hash = args[1].is_a?(Hash) ? args[1] : {}
40
+ Rendering::MainRenderer.render(self, matestack_class, options_hash)
41
+ elsif (options = args.first).is_a?(Hash) &&
42
+ (matestack_arg = options[:matestack]) &&
43
+ matestack_arg.is_a?(Class) &&
44
+ (matestack_arg < Matestack::Ui::Page)
45
+ Rendering::MainRenderer.render(self, matestack_arg, options)
46
+ else
47
+ if params[:component_class].present? && !((options = args.first).is_a?(Hash) && options[:html].present?)
48
+ Rendering::MainRenderer.render(self, Matestack::Ui::Page, {})
49
+ else
50
+ super
51
+ end
24
52
  end
25
- if params[:only_page]
26
- render html: render_page(page_class, true)
53
+ end
54
+
55
+ # TODO: maybe/Axe remove this?
56
+ # Matestack allows implicit rendering. The matestack page class name is inferred from the
57
+ # controller path and action name.
58
+ #
59
+ # class Clients::BookingsController < ApplicationController
60
+ # def index
61
+ # @bookings = Booking.all
62
+ # # looks for Pages::Clients::Bookings::Index
63
+ # end
64
+ #
65
+ # def show
66
+ # @booking = Booking.find params[:id]
67
+ # # looks for Pages::Clients::Bookings::Show
68
+ # end
69
+ # end
70
+ #
71
+ # In this example, `clients/bookings#index` will render `Pages::Clients::Bookings::Index`,
72
+ # `clients/bookings#show` will render `Pages::Clients::Bookings::Show`.
73
+ #
74
+ # Custom action names translate also into page names.
75
+ #
76
+ # class Clients::BookingsController < ApplicationController
77
+ # def step1
78
+ # # looks for Pages::Clients::Bookings::Step1
79
+ # end
80
+ # end
81
+ #
82
+ # In this example, the `clients/bookings#step1` action will render
83
+ # `Pages::Clients::Bookings::Step1`.
84
+ #
85
+ def default_render(*args)
86
+ matestack_page_class =
87
+ Rendering::DefaultRendererClassDeterminer.determine_class(controller_path, action_name)
88
+ if matestack_page_class
89
+ render matestack_page_class
27
90
  else
28
- render html: render_page(page_class), layout: true
91
+ super
29
92
  end
30
93
  end
31
94
 
95
+ # Kept around for compatibility. Probably worth removing.
96
+ def responder_for(*args)
97
+ render(*args)
98
+ end
99
+
100
+ def matestack_component(component, options = {}, &block)
101
+ context = (options[:matestack_context] ||= {}).merge(controller: @_controller)
102
+ Matestack::Ui::Core::Component::Base.new(options.merge(matestack_context: context)).send(component, options.merge(matestack_context: context), &block)
103
+ end
32
104
  end
33
105
  end
34
106
  end
@@ -0,0 +1,22 @@
1
+ import Vue from 'vue/dist/vue.esm'
2
+ import Vuex from 'vuex'
3
+ import axios from 'axios'
4
+
5
+ // Import from app/concepts/matestack/ui/core:
6
+ import matestackEventHub from '../../../app/concepts/matestack/ui/core/js/event-hub'
7
+ import componentMixin from '../../../app/concepts/matestack/ui/core/component/component'
8
+ import matestackUiCore from '../../../app/concepts/matestack/ui/core/js/core'
9
+
10
+ import styles from './styles/index.scss'
11
+
12
+ const MatestackUiCore = {
13
+ Vue,
14
+ Vuex,
15
+ axios,
16
+ matestackEventHub,
17
+ componentMixin
18
+ }
19
+
20
+ window.MatestackUiCore = MatestackUiCore
21
+
22
+ export default MatestackUiCore
@@ -0,0 +1,5 @@
1
+ // glob imports are not supported out of the box.
2
+ //
3
+ // @import "../../../concepts/matestack/ui/core/**/*.scss";
4
+ // @import "../../../concepts/matestack/ui/core/**/*.sass";
5
+ // @import "../../../concepts/matestack/ui/core/**/*.css";
@@ -0,0 +1,8 @@
1
+ // // Add polyfills for the asset pipeline
2
+ // // https://github.com/matestack/matestack-ui-core/issues/238#issuecomment-583905838
3
+ //
4
+ // import 'core-js/stable'
5
+ // import 'regenerator-runtime/runtime'
6
+
7
+ import '../matestack-ui-core/index'
8
+ export default MatestackUiCore
@@ -0,0 +1 @@
1
+ Matestack::Ui::Component = Matestack::Ui::Core::Component::Static
@@ -0,0 +1,14 @@
1
+ module Matestack::Ui::Core::HasViewContext
2
+ def initialize(*args)
3
+ super
4
+ @view_context = @options.dig(:context, :view_context)
5
+ end
6
+
7
+ def method_missing(*args, &block)
8
+ if @view_context.respond_to? args.first
9
+ @view_context.send(*args, &block)
10
+ else
11
+ raise NameError, "NameError: undefined method or local variable `#{args.first}' for #{self.class.name}"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,43 @@
1
+ module Matestack::Ui::Core::HtmlAttributes
2
+
3
+ HTML_GLOBAL_ATTRIBUTES = [
4
+ :accesskey, :class, :contenteditable, :data, :dir, :draggable,
5
+ :hidden, :id, :lang, :spellcheck, :style, :tabindex, :title, :translate
6
+ ]
7
+
8
+ HTML_EVENT_ATTRIBUTES = [
9
+ :onafterprint, :onbeforeprint, :onbeforeunload, :onerror, :onhashchange, :onload, :onmessage,
10
+ :onoffline, :ononline, :onpagehide, :onpageshow, :onpopstate, :onresize, :onstorage, :onunload
11
+ ]
12
+
13
+ # prepend the initializer and add class methods
14
+ def self.included(base)
15
+ base.class_eval do
16
+ extend ClassMethods
17
+ end
18
+ end
19
+
20
+ module ClassMethods
21
+
22
+ def inherited(subclass)
23
+ subclass.html_attributes *self.allowed_html_attributes
24
+ end
25
+
26
+ def html_attributes(*attributes)
27
+ attributes.each do |attribute|
28
+ allowed_html_attributes.push(attribute)
29
+ end
30
+ end
31
+
32
+ def allowed_html_attributes
33
+ @allowed_html_attributes.flatten!&.uniq! if defined? @allowed_html_attributes
34
+ @allowed_html_attributes ||= []
35
+ end
36
+
37
+ end
38
+
39
+ def html_attributes
40
+ options.slice(*self.class.allowed_html_attributes).merge((options[:attributes] || {}))
41
+ end
42
+
43
+ end
@@ -0,0 +1,88 @@
1
+ module Matestack::Ui::Core::Properties
2
+
3
+ class PropertyMissingException < StandardError
4
+ end
5
+
6
+ class PropertyOverwritingExistingMethodException < StandardError
7
+ end
8
+
9
+ # prepend the initializer and add class methods
10
+ def self.included(base)
11
+ base.class_eval do
12
+ extend ClassMethods
13
+ end
14
+ base.send :prepend, Initializer
15
+ end
16
+
17
+ # initializer calls super and creates instance methods for defined required and optional properties afterwards
18
+ module Initializer
19
+ def initialize(model=nil, options={})
20
+ options = model.dup if options.empty? && model.is_a?(Hash)
21
+ required_hooks(options)
22
+ optional_hooks(options)
23
+ super
24
+ end
25
+ end
26
+
27
+ module ClassMethods
28
+ # define optinoal properties for custom components with `optional :foo, :bar`
29
+ def optional(*properties)
30
+ add_properties_to_list(optional_properties, properties)
31
+ end
32
+
33
+ # define required properties for custom components with `requires :title, :foo, :bar`
34
+ def requires(*properties)
35
+ add_properties_to_list(requires_properties, properties)
36
+ end
37
+
38
+ def add_properties_to_list(list, properties)
39
+ properties.each do |property|
40
+ if property.is_a? Hash
41
+ property.each { |tmp_property| list.push(tmp_property) }
42
+ else
43
+ list.push(property)
44
+ end
45
+ end
46
+ end
47
+
48
+ # array of properties created from the component
49
+ def optional_properties
50
+ @component_properties ||= []
51
+ end
52
+
53
+ # array of required properties from the component
54
+ def requires_properties
55
+ @requires_properties ||= []
56
+ end
57
+ end
58
+
59
+ def optional_hooks(options)
60
+ self.class.optional_properties.compact.each do |prop|
61
+ if prop.is_a? Array
62
+ hash = prop.flatten
63
+ options[hash.last[:as]] = options[hash.first]
64
+ prop = hash.last[:as]
65
+ end
66
+ raise PropertyOverwritingExistingMethodException, "Optional property #{prop} would overwrite already defined instance method for #{self.class}" if self.respond_to? prop
67
+ send(:define_singleton_method, prop) do
68
+ options[prop]
69
+ end
70
+ end
71
+ end
72
+
73
+ def required_hooks(options)
74
+ self.class.requires_properties.compact.each do |prop|
75
+ if prop.is_a? Array
76
+ hash = prop.flatten
77
+ options[hash.last[:as]] = options[hash.first]
78
+ prop = hash.last[:as]
79
+ end
80
+ raise PropertyMissingException, "Required property #{prop} is missing for #{self.class}" if options[prop].nil?
81
+ raise PropertyOverwritingExistingMethodException, "Required property #{prop} would overwrite already defined instance method for #{self.class}" if self.respond_to? prop
82
+ send(:define_singleton_method, prop) do
83
+ options[prop]
84
+ end
85
+ end
86
+ end
87
+
88
+ end
@@ -0,0 +1,33 @@
1
+ # Handles the default rendering mechanism
2
+ #
3
+ # Not really compatible with the new flexible naming schemes
4
+ module Matestack::Ui::Core::Rendering::DefaultRendererClassDeterminer
5
+ module_function
6
+
7
+ def determine_class(controller_path, action_name)
8
+ possible_default_render_matestack_page_class_names(controller_path, action_name).each do |class_name|
9
+ begin
10
+ return matestack_class = class_name.constantize
11
+ rescue NameError
12
+ end
13
+ end
14
+ return nil
15
+ end
16
+
17
+ def possible_default_render_matestack_page_class_names(controller_path, action_name)
18
+ possible_default_render_matestack_page_paths(controller_path, action_name).collect { |page_path|
19
+ page_path.split("/").collect { |str| str.camelcase }.join("::")
20
+ }
21
+ end
22
+
23
+ def possible_default_render_matestack_page_paths(controller_path, action_name)
24
+ paths = []
25
+ paths << "pages/#{controller_path}/#{action_name}"
26
+ paths << "pages/#{controller_path}" if action_name == "index"
27
+ paths << "pages/#{controller_path.singularize}" if action_name == "show"
28
+ paths << "#{controller_path}/#{action_name}_page"
29
+ paths << "#{controller_path}_page" if action_name == "index"
30
+ paths << "#{controller_path.singularize}_page" if action_name == "show"
31
+ paths
32
+ end
33
+ end
@@ -0,0 +1,199 @@
1
+ # The main renderer that is usually called to determine how to perform rendering
2
+ module Matestack::Ui::Core::Rendering::MainRenderer
3
+ module_function
4
+
5
+ EMPTY_JSON = "{}"
6
+
7
+ # Instead of rendering without an app class, we always have an "empty" app class
8
+ # to fall back to
9
+ DEFAULT_APP_CLASS = Matestack::Ui::Core::App::App
10
+
11
+ def render(controller_instance, page_class, options)
12
+ app_class = resolve_app_class(controller_instance, options)
13
+
14
+ params = controller_instance.params
15
+
16
+ context = create_context_hash(controller_instance)
17
+
18
+ if params[:only_page]
19
+ # standalone page rendering, used when performing a transition
20
+ page_instance = page_class.new(controller_instance: controller_instance, context: context)
21
+ render_matestack_object(controller_instance, page_instance)
22
+ elsif (params[:component_key].present? && params[:component_class].blank?)
23
+ # async component rerendering from non isolated context
24
+ component_key = params[:component_key]
25
+ page_instance = page_class.new(controller_instance: controller_instance, context: context)
26
+ render_component(component_key, page_instance, controller_instance, context)
27
+ elsif (params[:component_class].present? && params[:component_key].blank?)
28
+ # isolated component rendering
29
+ component_class = params[:component_class]
30
+ page_instance = page_class.new(controller_instance: controller_instance, context: context)
31
+ public_options = JSON.parse(params[:public_options]).with_indifferent_access rescue nil
32
+ render_isolated_component(component_class, page_instance, controller_instance, context, public_options)
33
+ elsif (params[:component_class].present? && params[:component_key].present?)
34
+ # async component rerendering from isolated context
35
+ component_class_name = params[:component_class]
36
+ component_key = params[:component_key]
37
+ page_instance = page_class.new(controller_instance: controller_instance, context: context)
38
+ if params[:public_options].present?
39
+ public_options = JSON.parse(params[:public_options]).with_indifferent_access
40
+ else
41
+ public_options = nil
42
+ end
43
+ component_class = resolve_isolated_component(component_class_name)
44
+ if component_class
45
+ component_instance = component_class.new(public_options: public_options, context: context)
46
+ if component_instance.authorized?
47
+ render_component(component_key, component_instance, controller_instance, context)
48
+ else
49
+ raise "not authorized"
50
+ end
51
+ end
52
+ else
53
+ if app_class == false
54
+ page_instance = page_class.new(controller_instance: controller_instance, context: context)
55
+ render_matestack_object(controller_instance, page_instance, layout: true)
56
+ else
57
+ app_instance = app_class.new(page_class, controller_instance, context)
58
+ render_matestack_object(controller_instance, app_instance, layout: true)
59
+ end
60
+ end
61
+ end
62
+
63
+ def create_context_hash(controller_instance)
64
+ {
65
+ view_context: controller_instance.view_context,
66
+ params: controller_instance.params,
67
+ request: controller_instance.request
68
+ }
69
+ end
70
+
71
+ def render_matestack_object(controller_instance, object, opts = {}, render_method = :show)
72
+ object.prepare
73
+ object.response if object.respond_to? :response
74
+ rendering_options = {html: object.call(render_method)}.merge!(opts)
75
+ controller_instance.render rendering_options
76
+ end
77
+
78
+ def render_component(component_key, page_instance, controller_instance, context)
79
+ matched_component = nil
80
+
81
+ page_instance.matestack_set_skip_defer(false)
82
+
83
+ page_instance.prepare
84
+ page_instance.response
85
+
86
+ matched_component = dig_for_component(component_key, page_instance)
87
+
88
+ unless matched_component.nil?
89
+ render_matestack_object(controller_instance, matched_component, {}, :render_content)
90
+ else
91
+ # some 404 probably
92
+ raise Exception, "Async component with id #{component_key} could not be found while rerendering."
93
+ end
94
+ rescue Exception => e
95
+ Rails.logger.warn e
96
+ render json: {}, status: :not_found
97
+ end
98
+
99
+ def dig_for_component component_key, component_instance
100
+ matched_component = nil
101
+
102
+ component_instance.children.each do |child|
103
+ if child.respond_to?(:get_component_key)
104
+ if child.get_component_key == component_key
105
+ matched_component = child
106
+ end
107
+ end
108
+ end
109
+
110
+ if matched_component.nil?
111
+ component_instance.children.each do |child|
112
+ if child.children.any?
113
+ matched_component = dig_for_component(component_key, child)
114
+ break if !matched_component.nil?
115
+ end
116
+ end
117
+ return matched_component
118
+ else
119
+ return matched_component
120
+ end
121
+
122
+ end
123
+
124
+ # TODO: too many arguments maybe get some of them together?
125
+ def render_isolated_component(component_class_name, page_instance, controller_instance, context, public_options = nil)
126
+ component_class = resolve_isolated_component(component_class_name)
127
+
128
+ if component_class
129
+ component_instance = component_class.new(public_options: public_options, context: context)
130
+ if component_instance.authorized?
131
+ render_matestack_object(controller_instance, component_instance, {}, :render_isolated_content)
132
+ else
133
+ # some 4xx? 404?
134
+ raise "not authorized"
135
+ end
136
+ else
137
+ # some 404 probably
138
+ raise "component not found"
139
+ end
140
+ end
141
+
142
+ def resolve_component(name)
143
+ constant = const_get(name)
144
+ # change to specific AsyncComponent parent class
145
+ if constant < Matestack::Ui::Core::Async::Async
146
+ constant
147
+ else
148
+ nil
149
+ end
150
+ rescue NameError
151
+ nil
152
+ end
153
+
154
+ def resolve_isolated_component(name)
155
+ constant = const_get(name)
156
+ if constant < Matestack::Ui::Core::Isolated::Isolated
157
+ constant
158
+ else
159
+ nil
160
+ end
161
+ rescue NameError
162
+ nil
163
+ end
164
+
165
+
166
+ def resolve_app_class(controller_instance, options)
167
+ app_class = DEFAULT_APP_CLASS
168
+
169
+ controller_level_app_class = controller_instance.class.get_matestack_app_class
170
+ action_level_app_class = options[:matestack_app]
171
+
172
+ if !controller_level_app_class.nil?
173
+ if controller_level_app_class == false
174
+ app_class = false
175
+ else
176
+ if controller_level_app_class.is_a?(Class) && (controller_level_app_class < Matestack::Ui::App)
177
+ app_class = controller_level_app_class
178
+ else
179
+ raise "#{controller_level_app_class} is not a valid Matestack::Ui::App class"
180
+ end
181
+ end
182
+ end
183
+ if !action_level_app_class.nil?
184
+ if action_level_app_class == false
185
+ app_class = false
186
+ else
187
+ matestack_app_class = action_level_app_class
188
+ if action_level_app_class.is_a?(Class) && (action_level_app_class < Matestack::Ui::App)
189
+ app_class = action_level_app_class
190
+ else
191
+ raise "#{action_level_app_class} is not a valid Matestack::Ui::App class"
192
+ end
193
+ end
194
+ end
195
+
196
+ return app_class
197
+ end
198
+
199
+ end