matestack-ui-core 0.7.2

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 (202) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +228 -0
  4. data/Rakefile +34 -0
  5. data/app/concepts/matestack/ui/core/abbr/abbr.haml +5 -0
  6. data/app/concepts/matestack/ui/core/abbr/abbr.rb +12 -0
  7. data/app/concepts/matestack/ui/core/absolute/absolute.haml +3 -0
  8. data/app/concepts/matestack/ui/core/absolute/absolute.rb +17 -0
  9. data/app/concepts/matestack/ui/core/action/action.haml +3 -0
  10. data/app/concepts/matestack/ui/core/action/action.js +49 -0
  11. data/app/concepts/matestack/ui/core/action/action.rb +52 -0
  12. data/app/concepts/matestack/ui/core/address/address.haml +5 -0
  13. data/app/concepts/matestack/ui/core/address/address.rb +5 -0
  14. data/app/concepts/matestack/ui/core/app/app.haml +4 -0
  15. data/app/concepts/matestack/ui/core/app/app.js +27 -0
  16. data/app/concepts/matestack/ui/core/app/app.rb +98 -0
  17. data/app/concepts/matestack/ui/core/app/store.js +70 -0
  18. data/app/concepts/matestack/ui/core/article/article.haml +5 -0
  19. data/app/concepts/matestack/ui/core/article/article.rb +5 -0
  20. data/app/concepts/matestack/ui/core/async/async.haml +2 -0
  21. data/app/concepts/matestack/ui/core/async/async.js +76 -0
  22. data/app/concepts/matestack/ui/core/async/async.rb +12 -0
  23. data/app/concepts/matestack/ui/core/blockquote/blockquote.haml +5 -0
  24. data/app/concepts/matestack/ui/core/blockquote/blockquote.rb +11 -0
  25. data/app/concepts/matestack/ui/core/br/br.haml +5 -0
  26. data/app/concepts/matestack/ui/core/br/br.rb +5 -0
  27. data/app/concepts/matestack/ui/core/button/button.haml +5 -0
  28. data/app/concepts/matestack/ui/core/button/button.rb +11 -0
  29. data/app/concepts/matestack/ui/core/caption/caption.haml +5 -0
  30. data/app/concepts/matestack/ui/core/caption/caption.rb +5 -0
  31. data/app/concepts/matestack/ui/core/collection/content/content.js +98 -0
  32. data/app/concepts/matestack/ui/core/collection/content/content.rb +18 -0
  33. data/app/concepts/matestack/ui/core/collection/content/next/next.haml +3 -0
  34. data/app/concepts/matestack/ui/core/collection/content/next/next.rb +5 -0
  35. data/app/concepts/matestack/ui/core/collection/content/page/link/link.haml +3 -0
  36. data/app/concepts/matestack/ui/core/collection/content/page/link/link.rb +5 -0
  37. data/app/concepts/matestack/ui/core/collection/content/previous/previous.haml +3 -0
  38. data/app/concepts/matestack/ui/core/collection/content/previous/previous.rb +5 -0
  39. data/app/concepts/matestack/ui/core/collection/filter/filter.js +48 -0
  40. data/app/concepts/matestack/ui/core/collection/filter/filter.rb +17 -0
  41. data/app/concepts/matestack/ui/core/collection/filter/input/input.haml +2 -0
  42. data/app/concepts/matestack/ui/core/collection/filter/input/input.rb +25 -0
  43. data/app/concepts/matestack/ui/core/collection/filter/reset/reset.haml +3 -0
  44. data/app/concepts/matestack/ui/core/collection/filter/reset/reset.rb +5 -0
  45. data/app/concepts/matestack/ui/core/collection/filter/submit/submit.haml +3 -0
  46. data/app/concepts/matestack/ui/core/collection/filter/submit/submit.rb +5 -0
  47. data/app/concepts/matestack/ui/core/collection/helper.rb +113 -0
  48. data/app/concepts/matestack/ui/core/collection/order/order.js +56 -0
  49. data/app/concepts/matestack/ui/core/collection/order/order.rb +17 -0
  50. data/app/concepts/matestack/ui/core/collection/order/toggle/indicator/indicator.rb +13 -0
  51. data/app/concepts/matestack/ui/core/collection/order/toggle/toggle.haml +3 -0
  52. data/app/concepts/matestack/ui/core/collection/order/toggle/toggle.rb +5 -0
  53. data/app/concepts/matestack/ui/core/component/anonym-dynamic-component.js +10 -0
  54. data/app/concepts/matestack/ui/core/component/children.haml +2 -0
  55. data/app/concepts/matestack/ui/core/component/component.js +59 -0
  56. data/app/concepts/matestack/ui/core/component/dynamic.haml +6 -0
  57. data/app/concepts/matestack/ui/core/component/dynamic.rb +261 -0
  58. data/app/concepts/matestack/ui/core/component/dynamic_without_rerender.haml +2 -0
  59. data/app/concepts/matestack/ui/core/component/response.haml +2 -0
  60. data/app/concepts/matestack/ui/core/component/response_dynamic.haml +7 -0
  61. data/app/concepts/matestack/ui/core/component/response_dynamic_without_rerender.haml +3 -0
  62. data/app/concepts/matestack/ui/core/component/static.haml +1 -0
  63. data/app/concepts/matestack/ui/core/component/static.rb +16 -0
  64. data/app/concepts/matestack/ui/core/details/details.haml +3 -0
  65. data/app/concepts/matestack/ui/core/details/details.rb +5 -0
  66. data/app/concepts/matestack/ui/core/div/div.haml +3 -0
  67. data/app/concepts/matestack/ui/core/div/div.rb +5 -0
  68. data/app/concepts/matestack/ui/core/footer/footer.haml +3 -0
  69. data/app/concepts/matestack/ui/core/footer/footer.rb +5 -0
  70. data/app/concepts/matestack/ui/core/form/form.haml +2 -0
  71. data/app/concepts/matestack/ui/core/form/form.js +136 -0
  72. data/app/concepts/matestack/ui/core/form/form.rb +71 -0
  73. data/app/concepts/matestack/ui/core/form/inline/inline.haml +6 -0
  74. data/app/concepts/matestack/ui/core/form/inline/inline.rb +9 -0
  75. data/app/concepts/matestack/ui/core/form/input/input.haml +27 -0
  76. data/app/concepts/matestack/ui/core/form/input/input.rb +74 -0
  77. data/app/concepts/matestack/ui/core/form/select/select.haml +76 -0
  78. data/app/concepts/matestack/ui/core/form/select/select.rb +73 -0
  79. data/app/concepts/matestack/ui/core/form/submit/submit.haml +3 -0
  80. data/app/concepts/matestack/ui/core/form/submit/submit.rb +9 -0
  81. data/app/concepts/matestack/ui/core/header/header.haml +3 -0
  82. data/app/concepts/matestack/ui/core/header/header.rb +5 -0
  83. data/app/concepts/matestack/ui/core/heading/heading.haml +50 -0
  84. data/app/concepts/matestack/ui/core/heading/heading.rb +5 -0
  85. data/app/concepts/matestack/ui/core/hr/hr.haml +1 -0
  86. data/app/concepts/matestack/ui/core/hr/hr.rb +5 -0
  87. data/app/concepts/matestack/ui/core/html/html.haml +3 -0
  88. data/app/concepts/matestack/ui/core/html/html.js +10 -0
  89. data/app/concepts/matestack/ui/core/html/html.rb +17 -0
  90. data/app/concepts/matestack/ui/core/icon/icon.haml +5 -0
  91. data/app/concepts/matestack/ui/core/icon/icon.rb +5 -0
  92. data/app/concepts/matestack/ui/core/img/img.haml +1 -0
  93. data/app/concepts/matestack/ui/core/img/img.rb +5 -0
  94. data/app/concepts/matestack/ui/core/input/input.haml +3 -0
  95. data/app/concepts/matestack/ui/core/input/input.rb +5 -0
  96. data/app/concepts/matestack/ui/core/isolate/isolate.haml +2 -0
  97. data/app/concepts/matestack/ui/core/isolate/isolate.rb +11 -0
  98. data/app/concepts/matestack/ui/core/js/core.js +30 -0
  99. data/app/concepts/matestack/ui/core/js/event-hub.js +5 -0
  100. data/app/concepts/matestack/ui/core/js/helpers/query-params-helper.js +56 -0
  101. data/app/concepts/matestack/ui/core/label/label.haml +5 -0
  102. data/app/concepts/matestack/ui/core/label/label.rb +5 -0
  103. data/app/concepts/matestack/ui/core/li/li.haml +5 -0
  104. data/app/concepts/matestack/ui/core/li/li.rb +5 -0
  105. data/app/concepts/matestack/ui/core/link/link.haml +5 -0
  106. data/app/concepts/matestack/ui/core/link/link.rb +26 -0
  107. data/app/concepts/matestack/ui/core/main/main.haml +3 -0
  108. data/app/concepts/matestack/ui/core/main/main.rb +5 -0
  109. data/app/concepts/matestack/ui/core/nav/nav.haml +3 -0
  110. data/app/concepts/matestack/ui/core/nav/nav.rb +5 -0
  111. data/app/concepts/matestack/ui/core/ol/ol.haml +3 -0
  112. data/app/concepts/matestack/ui/core/ol/ol.rb +5 -0
  113. data/app/concepts/matestack/ui/core/onclick/onclick.haml +2 -0
  114. data/app/concepts/matestack/ui/core/onclick/onclick.js +21 -0
  115. data/app/concepts/matestack/ui/core/onclick/onclick.rb +5 -0
  116. data/app/concepts/matestack/ui/core/page/content.haml +7 -0
  117. data/app/concepts/matestack/ui/core/page/content.js +17 -0
  118. data/app/concepts/matestack/ui/core/page/content.rb +5 -0
  119. data/app/concepts/matestack/ui/core/page/page.haml +9 -0
  120. data/app/concepts/matestack/ui/core/page/page.rb +175 -0
  121. data/app/concepts/matestack/ui/core/paragraph/paragraph.haml +5 -0
  122. data/app/concepts/matestack/ui/core/paragraph/paragraph.rb +5 -0
  123. data/app/concepts/matestack/ui/core/partial/partial.haml +2 -0
  124. data/app/concepts/matestack/ui/core/partial/partial.rb +5 -0
  125. data/app/concepts/matestack/ui/core/pg/pg.haml +5 -0
  126. data/app/concepts/matestack/ui/core/pg/pg.rb +5 -0
  127. data/app/concepts/matestack/ui/core/plain/plain.rb +9 -0
  128. data/app/concepts/matestack/ui/core/progress/progress.haml +3 -0
  129. data/app/concepts/matestack/ui/core/progress/progress.rb +14 -0
  130. data/app/concepts/matestack/ui/core/section/section.haml +3 -0
  131. data/app/concepts/matestack/ui/core/section/section.rb +5 -0
  132. data/app/concepts/matestack/ui/core/slot/slot.haml +2 -0
  133. data/app/concepts/matestack/ui/core/slot/slot.rb +5 -0
  134. data/app/concepts/matestack/ui/core/small/small.haml +5 -0
  135. data/app/concepts/matestack/ui/core/small/small.rb +5 -0
  136. data/app/concepts/matestack/ui/core/span/span.haml +5 -0
  137. data/app/concepts/matestack/ui/core/span/span.rb +5 -0
  138. data/app/concepts/matestack/ui/core/strong/strong.haml +5 -0
  139. data/app/concepts/matestack/ui/core/strong/strong.rb +5 -0
  140. data/app/concepts/matestack/ui/core/sub/sub.haml +5 -0
  141. data/app/concepts/matestack/ui/core/sub/sub.rb +5 -0
  142. data/app/concepts/matestack/ui/core/summary/summary.haml +5 -0
  143. data/app/concepts/matestack/ui/core/summary/summary.rb +5 -0
  144. data/app/concepts/matestack/ui/core/table/table.haml +3 -0
  145. data/app/concepts/matestack/ui/core/table/table.rb +5 -0
  146. data/app/concepts/matestack/ui/core/tbody/tbody.haml +3 -0
  147. data/app/concepts/matestack/ui/core/tbody/tbody.rb +5 -0
  148. data/app/concepts/matestack/ui/core/td/td.haml +5 -0
  149. data/app/concepts/matestack/ui/core/td/td.rb +5 -0
  150. data/app/concepts/matestack/ui/core/tfoot/tfoot.haml +3 -0
  151. data/app/concepts/matestack/ui/core/tfoot/tfoot.rb +5 -0
  152. data/app/concepts/matestack/ui/core/th/th.haml +5 -0
  153. data/app/concepts/matestack/ui/core/th/th.rb +5 -0
  154. data/app/concepts/matestack/ui/core/thead/thead.haml +3 -0
  155. data/app/concepts/matestack/ui/core/thead/thead.rb +5 -0
  156. data/app/concepts/matestack/ui/core/time/time.haml +3 -0
  157. data/app/concepts/matestack/ui/core/time/time.rb +11 -0
  158. data/app/concepts/matestack/ui/core/tr/tr.haml +3 -0
  159. data/app/concepts/matestack/ui/core/tr/tr.rb +5 -0
  160. data/app/concepts/matestack/ui/core/transition/transition.haml +5 -0
  161. data/app/concepts/matestack/ui/core/transition/transition.js +26 -0
  162. data/app/concepts/matestack/ui/core/transition/transition.rb +31 -0
  163. data/app/concepts/matestack/ui/core/ul/ul.haml +3 -0
  164. data/app/concepts/matestack/ui/core/ul/ul.rb +5 -0
  165. data/app/concepts/matestack/ui/core/video/video.haml +1 -0
  166. data/app/concepts/matestack/ui/core/video/video.rb +7 -0
  167. data/app/concepts/matestack/ui/core/view/view.haml +2 -0
  168. data/app/concepts/matestack/ui/core/view/view.js +42 -0
  169. data/app/concepts/matestack/ui/core/view/view.rb +5 -0
  170. data/app/concepts/matestack/ui/core/youtube/youtube.haml +1 -0
  171. data/app/concepts/matestack/ui/core/youtube/youtube.rb +26 -0
  172. data/app/helpers/matestack/ui/core/application_helper.rb +35 -0
  173. data/app/lib/matestack/ui/app.rb +1 -0
  174. data/app/lib/matestack/ui/core/app_node.rb +53 -0
  175. data/app/lib/matestack/ui/core/component_node.rb +73 -0
  176. data/app/lib/matestack/ui/core/page_node.rb +96 -0
  177. data/app/lib/matestack/ui/core/to_cell.rb +129 -0
  178. data/app/lib/matestack/ui/dynamic_component.rb +1 -0
  179. data/app/lib/matestack/ui/page.rb +1 -0
  180. data/app/lib/matestack/ui/static_component.rb +1 -0
  181. data/config/routes.rb +3 -0
  182. data/lib/generators/matestack_app/USAGE +21 -0
  183. data/lib/generators/matestack_app/matestack_app_generator.rb +26 -0
  184. data/lib/generators/matestack_app/templates/matestack_app.erb +26 -0
  185. data/lib/generators/matestack_app/templates/matestack_app_controller.erb +7 -0
  186. data/lib/generators/matestack_component/USAGE +20 -0
  187. data/lib/generators/matestack_component/matestack_component_generator.rb +30 -0
  188. data/lib/generators/matestack_component/templates/matestack_component.haml.erb +5 -0
  189. data/lib/generators/matestack_component/templates/matestack_component.js.erb +17 -0
  190. data/lib/generators/matestack_component/templates/matestack_component.rb.erb +13 -0
  191. data/lib/generators/matestack_component/templates/matestack_component.scss.erb +1 -0
  192. data/lib/generators/matestack_page/USAGE +28 -0
  193. data/lib/generators/matestack_page/matestack_page_generator.rb +41 -0
  194. data/lib/generators/matestack_page/templates/matestack_page.erb +15 -0
  195. data/lib/matestack/ui/core.rb +15 -0
  196. data/lib/matestack/ui/core/engine.rb +19 -0
  197. data/lib/matestack/ui/core/version.rb +7 -0
  198. data/lib/tasks/matestack/ui/core_tasks.rake +4 -0
  199. data/vendor/assets/javascripts/manifest.json +4 -0
  200. data/vendor/assets/javascripts/matestack-ui-core.js +15309 -0
  201. data/vendor/assets/javascripts/matestack-ui-core.js.map +1 -0
  202. metadata +350 -0
@@ -0,0 +1 @@
1
+ Matestack::Ui::App = Matestack::Ui::Core::App::App
@@ -0,0 +1,53 @@
1
+ module Matestack::Ui::Core
2
+ class AppNode
3
+
4
+ def self.build(app_instance, &block)
5
+ node = AppNode.new(app_instance)
6
+ node.instance_eval(&block)
7
+ node.hash
8
+ end
9
+
10
+ attr_reader :hash
11
+
12
+ def initialize(app_instance)
13
+ @hash = {}
14
+ @node_start_id = 0
15
+ @app_instance = app_instance
16
+ app_instance.instance_variables.each do |app_instance_var_key|
17
+ self.instance_variable_set(app_instance_var_key, app_instance.instance_variable_get(app_instance_var_key))
18
+ end
19
+ end
20
+
21
+ def method_missing meth, *args, &block
22
+ begin
23
+ @app_instance.send(meth, *args, &block)
24
+ rescue
25
+ node_id = @node_start_id + 1
26
+ @node_start_id = node_id
27
+ current_node = "#{meth}_#{@node_start_id}"
28
+ @hash[current_node] = {}
29
+ @hash[current_node]["component_name"] = meth.to_s
30
+ @hash[current_node]["config"] = {}
31
+ @hash[current_node]["argument"] = nil
32
+
33
+ if meth == :page_content
34
+ @hash[current_node]["components"] = @app_instance.send(:page_nodes)
35
+ elsif meth == :partial
36
+ @hash[current_node]["components"] = @app_instance.send(args.first, *args.drop(1))
37
+ else
38
+ if args.first.is_a?(Hash)
39
+ @hash[current_node]["config"] = args.first
40
+ else
41
+ @hash[current_node]["argument"] = args.first
42
+ end
43
+
44
+ if block_given?
45
+ @hash[current_node]["components"] = AppNode.build(@app_instance, &block)
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,73 @@
1
+ module Matestack::Ui::Core
2
+ class ComponentNode
3
+
4
+ def self.build(component_instance, included_config, &block)
5
+ node = ComponentNode.new(component_instance, included_config)
6
+ node.instance_eval(&block)
7
+ node.hash
8
+ end
9
+
10
+ attr_reader :hash
11
+
12
+ def initialize(component_instance, included_config)
13
+ @hash = {}
14
+ @node_start_id = 0
15
+ @component_instance = component_instance
16
+ @included_config = included_config
17
+ component_instance.instance_variables.each do |component_instance_var_key|
18
+ self.instance_variable_set(component_instance_var_key, component_instance.instance_variable_get(component_instance_var_key))
19
+ end
20
+ end
21
+
22
+ def method_missing meth, *args, &block
23
+ begin
24
+ @component_instance.send(meth, *args, &block)
25
+ rescue
26
+ node_id = @node_start_id + 1
27
+ @node_start_id = node_id
28
+ current_node = "#{meth}_#{@node_start_id}"
29
+ @hash[current_node] = {}
30
+ @hash[current_node]["component_name"] = meth.to_s
31
+ @hash[current_node]["config"] = {}
32
+ @hash[current_node]["argument"] = nil
33
+ @hash[current_node]["included_config"] = @included_config
34
+
35
+ if meth == :isolate
36
+ raise("isolate > only works on page level currently. component support is comming soon!")
37
+ end
38
+
39
+ if meth == :partial
40
+ @hash[current_node]["components"] = @component_instance.send(args.first, *args.drop(1))
41
+ elsif meth == :yield_components
42
+ @hash[current_node]["component_name"] = "partial"
43
+ @hash[current_node]["components"] = @component_instance.send(:get_children)
44
+ else
45
+ if args.first.is_a?(Hash)
46
+ @hash[current_node]["config"] = args.first unless meth == :slot
47
+ else
48
+ @hash[current_node]["argument"] = args.first
49
+ end
50
+
51
+ if args.second == :include
52
+ included = args.first
53
+ else
54
+ unless @included_config.nil?
55
+ included = @included_config
56
+ else
57
+ included = nil
58
+ end
59
+ end
60
+
61
+ if block_given?
62
+ @hash[current_node]["components"] = ComponentNode.build(@component_instance, included, &block)
63
+ elsif meth == :slot
64
+ # @hash[current_node]["components"] = ComponentNode.build(@component_instance, included, &args.first)
65
+ @hash[current_node]["components"] = args.first
66
+ end
67
+ end
68
+ end
69
+
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,96 @@
1
+ module Matestack::Ui::Core
2
+ class PageNode
3
+
4
+ def self.build(page_instance, included_config, url_params, &block)
5
+ node = PageNode.new(page_instance, included_config, url_params)
6
+ node.instance_eval(&block)
7
+ node.hash
8
+ end
9
+
10
+ attr_reader :hash
11
+
12
+ def initialize(page_instance, included_config, url_params)
13
+ @hash = {}
14
+ @node_start_id = 0
15
+ @included_config = included_config
16
+ @url_params = url_params
17
+ @page_instance = page_instance
18
+ page_instance.instance_variables.each do |page_instance_var_key|
19
+ self.instance_variable_set(page_instance_var_key, page_instance.instance_variable_get(page_instance_var_key))
20
+ end
21
+ end
22
+
23
+ def method_missing meth, *args, &block
24
+ begin
25
+ @page_instance.send(meth, *args, &block)
26
+ rescue
27
+ node_id = @node_start_id + 1
28
+ @node_start_id = node_id
29
+ current_node = "#{meth}_#{@node_start_id}"
30
+ @hash[current_node] = {}
31
+ @hash[current_node]["component_name"] = meth.to_s
32
+ @hash[current_node]["config"] = {}
33
+ @hash[current_node]["included_config"] = @included_config
34
+ @hash[current_node]["argument"] = nil
35
+
36
+ if args.second == :include
37
+ included = args.first
38
+ else
39
+ unless @included_config.nil?
40
+ included = @included_config
41
+ else
42
+ included = nil
43
+ end
44
+ end
45
+
46
+ if meth == :isolate
47
+ if args.second.present?
48
+ if args.second.is_a? Hash
49
+ if args.second[:cached_params].nil?
50
+ raise "isolate > you need to pass params within a hash called 'cached_params'"
51
+ else
52
+ isolated_block = @page_instance.send(args.first, args.second[:cached_params])
53
+ end
54
+ else
55
+ raise "isolate > you need to pass params within a hash called 'cached_params'"
56
+ end
57
+ else
58
+ isolated_block = @page_instance.send(args.first)
59
+ end
60
+ @hash[current_node]["components"] = PageNode.build(
61
+ @page_instance, nil, @url_params, &isolated_block
62
+ )
63
+ @hash[current_node]["argument"] = args.first
64
+ @hash[current_node]["cached_params"] = args.second[:cached_params] if args.second.present?
65
+ end
66
+
67
+ if meth == :partial
68
+ partial_block = @page_instance.send(args.first, *args.drop(1))
69
+ @hash[current_node]["components"] = PageNode.build(
70
+ @page_instance, included, @url_params, &partial_block
71
+ )
72
+ else
73
+ if args.first.is_a?(Hash)
74
+ @hash[current_node]["config"] = args.first
75
+ else
76
+ @hash[current_node]["argument"] = args.first
77
+ end
78
+
79
+ if block_given?
80
+ if args.first.is_a?(Hash) && args.first[:defer].present?
81
+ if @url_params.present? && @url_params[:component_key].present?
82
+ @hash[current_node]["components"] = PageNode.build(@page_instance, included, @url_params, &block)
83
+ else
84
+ return
85
+ end
86
+ else
87
+ @hash[current_node]["components"] = PageNode.build(@page_instance, included, @url_params, &block)
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,129 @@
1
+ module Matestack::Ui::Core::ToCell
2
+
3
+ def to_cell(key, component_name, config, argument, children, included_config, cached_params=nil)
4
+ # p cached_params
5
+ request_uri = context[:request].env["REQUEST_URI"]
6
+ query_string = context[:request].env["QUERY_STRING"]
7
+
8
+ config.merge!(component_key: key)
9
+ config.merge!(children: children)
10
+ config.merge!(origin_url: request_uri.gsub("?" + query_string, ""))
11
+ config.merge!(url_params: context[:params])
12
+ config.merge!(included_config: included_config)
13
+ config.merge!(cached_params: cached_params)
14
+
15
+ if component_name.start_with?("custom")
16
+ return resolve_custom_component(component_name, argument, config)
17
+ else
18
+ return resolve_core_component(component_name, argument, config)
19
+ end
20
+
21
+ end
22
+
23
+ private
24
+
25
+ def resolve_custom_component(component_name, argument, config)
26
+ name = component_name.gsub("_", "/")
27
+
28
+ path = name.split("/")[1..-1]
29
+ path_camelized = path.map { |x| x.camelize }
30
+
31
+ if path_camelized.count == 1
32
+ class_name = "#{path_camelized[0]}"
33
+ rewritten_path = [path[0]]
34
+ else
35
+ class_name = path_camelized.join("::")
36
+ rewritten_path = path
37
+ end
38
+
39
+ custom_component_class_name = "Components::" + class_name
40
+
41
+ begin
42
+ begin
43
+ component_class = Object.const_get(custom_component_class_name, false)
44
+ rescue => e
45
+ raise "#{e.message.nil? ? '': 'Got Error: '+e.message}. \
46
+ Make sure to define your custom component class correctly \
47
+ in \"matestack/components/#{rewritten_path.join('/')}.rb\""
48
+ end
49
+ if component_class.is_a?(Class)
50
+ return cell(component_class, argument, config)
51
+ else
52
+ raise "Given component #{component_class} is not a class. \
53
+ You might forget to add the component name to your component call"
54
+ end
55
+ rescue => e
56
+ raise "#{component_name} > #{e.message}"
57
+ end
58
+
59
+ end
60
+
61
+ def resolve_core_component(component_name, argument, config)
62
+ name = component_name.gsub("_", "/")
63
+
64
+ unless name.include?("/")
65
+ name = "#{name}/#{name}"
66
+ end
67
+
68
+ path = name.split("/")
69
+ path_camelized = path.map { |x| x.camelize }
70
+ class_name = path_camelized.join("::")
71
+
72
+ core_component_class_name = "Matestack::Ui::Core::" + class_name
73
+ begin
74
+ begin
75
+ component_class = Object.const_get(core_component_class_name, false)
76
+ unless component_class.is_a?(Class)
77
+ core_component_class_name = core_component_class_name + "::#{name.split("/").last.camelize}"
78
+ component_class = Object.const_get(core_component_class_name, false)
79
+ end
80
+ rescue => e
81
+ begin
82
+ return resolve_namespaced_component(component_name, argument, config)
83
+ rescue => e
84
+ raise "#{e.message.nil? ? '': 'Got Error: '+e.message}. \
85
+ Component '#{component_name}' not found. Looking for Class '#{core_component_class_name}'. \
86
+ Make sure to prefix a custom component with 'custom_'"
87
+ end
88
+ end
89
+ return cell(component_class, argument, config)
90
+ rescue => e
91
+ raise "#{component_name} > #{e.message}"
92
+ end
93
+
94
+ end
95
+
96
+ def resolve_namespaced_component(component_name, argument, config)
97
+ name = component_name.gsub("_", "/")
98
+
99
+ path = name.split("/")[1..-1]
100
+ namespace = name.split("/")[0].camelize
101
+ path_camelized = path.map { |x| x.camelize }
102
+
103
+ if path_camelized.count == 1
104
+ class_name = "#{path_camelized[0]}::#{path_camelized[0]}"
105
+ rewritten_path = [path[0], path[0]]
106
+ else
107
+ class_name = path_camelized[0..-1].join("::")
108
+ rewritten_path = path[0..-1]
109
+ end
110
+
111
+ namespaced_class_name = "Matestack::Ui::" + namespace + "::" + class_name
112
+
113
+ begin
114
+ begin
115
+ component_class = Object.const_get(namespaced_class_name, false)
116
+ unless component_class.is_a?(Class)
117
+ namespaced_class_name = namespaced_class_name + "::#{name.split("/").last.camelize}"
118
+ component_class = Object.const_get(namespaced_class_name, false)
119
+ end
120
+ rescue => e
121
+ raise "#{e.message}"
122
+ end
123
+ return cell(component_class, argument, config)
124
+ rescue => e
125
+ raise "#{e.message}"
126
+ end
127
+ end
128
+
129
+ end
@@ -0,0 +1 @@
1
+ Matestack::Ui::DynamicComponent = Matestack::Ui::Core::Component::Dynamic
@@ -0,0 +1 @@
1
+ Matestack::Ui::Page = Matestack::Ui::Core::Page::Page
@@ -0,0 +1 @@
1
+ Matestack::Ui::StaticComponent = Matestack::Ui::Core::Component::Static
@@ -0,0 +1,3 @@
1
+ Matestack::Ui::Core::Engine.routes.draw do
2
+ get '/div', to: 'docs#div'
3
+ end
@@ -0,0 +1,21 @@
1
+ Description:
2
+ Stubs out a new matestack app. Pass the app name under_scored.
3
+
4
+ If you want so, pass the option '--all_inclusive' to also create
5
+ a corresponding matestack example_page, a controller, its action
6
+ and the route in 'config/routes.rb'.
7
+
8
+ Example 1:
9
+ `rails generate matestack_app example_app`
10
+
11
+ This will create:
12
+ app/matestack/apps/example_app.rb
13
+
14
+ Example 2:
15
+ `rails generate matestack_app example_app --all_inclusive`
16
+
17
+ This will create:
18
+ app/matestack/apps/example_app.rb
19
+ app/matestack/pages/example_app/example_page.rb
20
+ app/controllers/example_app_controller.rb
21
+ route get 'example_app/example_page', to: 'example_app#example_page'
@@ -0,0 +1,26 @@
1
+ class MatestackAppGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('templates', __dir__)
3
+
4
+ class_option :all_inclusive, type: :boolean, default: false
5
+
6
+ def create_matestack_app
7
+
8
+ generator_path = "app/matestack/apps/#{file_name}.rb"
9
+
10
+ template 'matestack_app.erb', generator_path
11
+
12
+ if options[:all_inclusive] == true
13
+ controller_path = "app/controllers/#{file_name}_controller.rb"
14
+ template 'matestack_app_controller.erb', controller_path
15
+
16
+ route %{get '#{file_name}/example_page', to: '#{file_name}\#example_page'}
17
+
18
+ generate "matestack_page example_page --app_name #{file_name} --called_by_app_generator=true"
19
+
20
+ puts "You can visit your new matestack apps' example page under http://localhost:3000/#{file_name}/example_page"
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,26 @@
1
+ class Apps::<%= class_name %> < Matestack::Ui::App
2
+
3
+ # OPTIONAL: Prepare data that gets used on every page of this app
4
+ # def prepare
5
+ # API calls and db queries go here
6
+ # end
7
+
8
+ # MANDATORY: This is where your matestack pages get yielded
9
+ def response
10
+ components {
11
+ page_content
12
+ }
13
+ end
14
+
15
+ # OPTIONAL: Use partials to render stuff like layout components
16
+ # def partial_one
17
+ # partial {
18
+ # # your components go here
19
+ # }
20
+ # end
21
+
22
+ # OPTIONAL: Slots come after partials
23
+ # def slots
24
+ # end
25
+
26
+ end