voom-presenters 0.2.0 → 2.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 (447) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.github/ISSUE_TEMPLATE/questions-support.md +10 -0
  6. data/.github/workflows/semantic-release.yml +42 -0
  7. data/.gitignore +3 -2
  8. data/.releaserc +15 -0
  9. data/.ruby-version +2 -1
  10. data/CHANGELOG.md +71 -108
  11. data/CONTRIBUTING.md +60 -0
  12. data/Gemfile +14 -4
  13. data/Gemfile.lock +93 -46
  14. data/Procfile +1 -0
  15. data/README.md +48 -39
  16. data/app/demo/components/avatars.pom +40 -0
  17. data/app/demo/components/cards.pom +11 -4
  18. data/app/demo/components/chips.pom +61 -54
  19. data/app/demo/components/content.pom +96 -16
  20. data/app/demo/components/dialogs.pom +175 -6
  21. data/app/demo/components/file_inputs.pom +38 -2
  22. data/app/demo/components/google_maps.pom +6 -1
  23. data/app/demo/components/headers.pom +80 -20
  24. data/app/demo/components/icons.pom +86 -55
  25. data/app/demo/components/image_lists.pom +100 -0
  26. data/app/demo/components/images.pom +45 -0
  27. data/app/demo/components/layouts.pom +3 -25
  28. data/app/demo/components/lists.pom +24 -4
  29. data/app/demo/components/menus.pom +14 -4
  30. data/app/demo/components/multi_selects.pom +29 -0
  31. data/app/demo/components/nav/menu.pom +39 -7
  32. data/app/demo/components/nav/pattern_menu.pom +2 -2
  33. data/app/demo/components/number_fields.pom +53 -0
  34. data/app/demo/components/padding.pom +96 -0
  35. data/app/demo/components/progress.pom +71 -0
  36. data/app/demo/components/selects.pom +45 -5
  37. data/app/demo/components/sliders.pom +5 -0
  38. data/app/demo/components/tab_bars.pom +15 -0
  39. data/app/demo/components/tables.pom +51 -40
  40. data/app/demo/components/text_areas.pom +23 -16
  41. data/app/demo/components/text_fields.pom +61 -15
  42. data/app/demo/components/toggles.pom +35 -4
  43. data/app/demo/components/tooltips.pom +8 -4
  44. data/app/demo/components/unordered_list.pom +81 -0
  45. data/app/demo/custom_css.pom +37 -0
  46. data/app/demo/events/actions/autocomplete.pom +32 -0
  47. data/app/demo/events/actions/clear.pom +5 -3
  48. data/app/demo/events/actions/dialogs/discard.pom +9 -0
  49. data/app/demo/events/actions/dialogs/show_dialog.pom +4 -2
  50. data/app/demo/events/actions/last_response.pom +40 -0
  51. data/app/demo/events/actions/prompt_if_dirty.pom +54 -0
  52. data/app/demo/events/content_as_form.pom +313 -0
  53. data/app/demo/events/nav/drawer.pom +7 -3
  54. data/app/demo/events/parallel.pom +44 -0
  55. data/app/demo/index.pom +5 -5
  56. data/app/demo/nav/top_nav.pom +10 -4
  57. data/app/demo/patterns/drag_drop.pom +89 -0
  58. data/app/demo/patterns/floating_card.pom +29 -0
  59. data/app/demo/patterns/search_select.pom +9 -7
  60. data/app/demo/plugins/chart.pom +254 -0
  61. data/app/demo/plugins/image_crop.pom +44 -0
  62. data/app/demo/plugins/index.pom +29 -0
  63. data/app/demo/plugins/nav/drawer.pom +19 -0
  64. data/app/demo/shared/context_list.pom +1 -1
  65. data/app/demo/styles.pom +3 -1
  66. data/bin/console +4 -4
  67. data/component-status.yml +15 -15
  68. data/config.ru +20 -10
  69. data/docs/settings.md +81 -0
  70. data/exe/presenters +3 -0
  71. data/lib/hash_ext/traverse.rb +14 -0
  72. data/lib/voom.rb +25 -0
  73. data/lib/voom/container_methods.rb +2 -2
  74. data/lib/voom/engine.rb +5 -0
  75. data/lib/voom/presenters/api/app.rb +31 -11
  76. data/lib/voom/presenters/api/router.rb +3 -49
  77. data/lib/voom/presenters/app.rb +3 -3
  78. data/lib/voom/presenters/cli.rb +28 -0
  79. data/lib/voom/presenters/demo/dragon_drop.rb +48 -0
  80. data/lib/voom/presenters/demo/echo.rb +2 -0
  81. data/lib/voom/presenters/demo/slow.rb +18 -0
  82. data/lib/voom/presenters/dsl/components/actions/autocomplete.rb +15 -0
  83. data/lib/voom/presenters/dsl/components/actions/base.rb +36 -8
  84. data/lib/voom/presenters/dsl/components/actions/clear.rb +0 -2
  85. data/lib/voom/presenters/dsl/components/actions/close_dialog.rb +17 -0
  86. data/lib/voom/presenters/dsl/components/actions/deletes.rb +0 -2
  87. data/lib/voom/presenters/dsl/components/actions/dialog.rb +0 -2
  88. data/lib/voom/presenters/dsl/components/actions/loads.rb +5 -6
  89. data/lib/voom/presenters/dsl/components/actions/navigates.rb +0 -2
  90. data/lib/voom/presenters/dsl/components/actions/post_message.rb +17 -0
  91. data/lib/voom/presenters/dsl/components/actions/posts.rb +5 -2
  92. data/lib/voom/presenters/dsl/components/actions/prompt_if_dirty.rb +15 -0
  93. data/lib/voom/presenters/dsl/components/actions/remove.rb +0 -2
  94. data/lib/voom/presenters/dsl/components/actions/replaces.rb +4 -4
  95. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +0 -2
  96. data/lib/voom/presenters/dsl/components/actions/stepper.rb +0 -2
  97. data/lib/voom/presenters/dsl/components/actions/toggle_disabled.rb +15 -0
  98. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +0 -2
  99. data/lib/voom/presenters/dsl/components/actions/updates.rb +5 -2
  100. data/lib/voom/presenters/dsl/components/avatar.rb +4 -8
  101. data/lib/voom/presenters/dsl/components/badge.rb +0 -2
  102. data/lib/voom/presenters/dsl/components/base.rb +25 -18
  103. data/lib/voom/presenters/dsl/components/button.rb +15 -11
  104. data/lib/voom/presenters/dsl/components/card.rb +49 -36
  105. data/lib/voom/presenters/dsl/components/checkbox.rb +0 -2
  106. data/lib/voom/presenters/dsl/components/chip.rb +5 -7
  107. data/lib/voom/presenters/dsl/components/chipset.rb +33 -0
  108. data/lib/voom/presenters/dsl/components/content.rb +28 -18
  109. data/lib/voom/presenters/dsl/components/datetime_base.rb +0 -2
  110. data/lib/voom/presenters/dsl/components/datetime_field.rb +0 -2
  111. data/lib/voom/presenters/dsl/components/dialog.rb +36 -12
  112. data/lib/voom/presenters/dsl/components/drawer.rb +9 -6
  113. data/lib/voom/presenters/dsl/components/event.rb +106 -65
  114. data/lib/voom/presenters/dsl/components/event_base.rb +1 -3
  115. data/lib/voom/presenters/dsl/components/expansion_panel.rb +0 -3
  116. data/lib/voom/presenters/dsl/components/file_input.rb +18 -6
  117. data/lib/voom/presenters/dsl/components/footer.rb +2 -2
  118. data/lib/voom/presenters/dsl/components/form.rb +2 -17
  119. data/lib/voom/presenters/dsl/components/grid.rb +52 -50
  120. data/lib/voom/presenters/dsl/components/header.rb +17 -1
  121. data/lib/voom/presenters/dsl/components/hidden_field.rb +0 -2
  122. data/lib/voom/presenters/dsl/components/icon.rb +2 -4
  123. data/lib/voom/presenters/dsl/components/icon_base.rb +5 -7
  124. data/lib/voom/presenters/dsl/components/icon_toggle.rb +2 -4
  125. data/lib/voom/presenters/dsl/components/image.rb +61 -13
  126. data/lib/voom/presenters/dsl/components/image_list.rb +43 -0
  127. data/lib/voom/presenters/dsl/components/input.rb +14 -5
  128. data/lib/voom/presenters/dsl/components/link.rb +33 -0
  129. data/lib/voom/presenters/dsl/components/list.rb +6 -13
  130. data/lib/voom/presenters/dsl/components/lists/action.rb +9 -11
  131. data/lib/voom/presenters/dsl/components/lists/actions.rb +0 -3
  132. data/lib/voom/presenters/dsl/components/lists/line.rb +27 -15
  133. data/lib/voom/presenters/dsl/components/menu.rb +51 -9
  134. data/lib/voom/presenters/dsl/components/mixins/append.rb +2 -2
  135. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +0 -2
  136. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +1 -3
  137. data/lib/voom/presenters/dsl/components/mixins/chips.rb +0 -2
  138. data/lib/voom/presenters/dsl/components/mixins/chipset.rb +19 -0
  139. data/lib/voom/presenters/dsl/components/mixins/common.rb +13 -14
  140. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +0 -2
  141. data/lib/voom/presenters/dsl/components/mixins/event.rb +0 -2
  142. data/lib/voom/presenters/dsl/components/mixins/image_lists.rb +15 -0
  143. data/lib/voom/presenters/dsl/components/mixins/last_response.rb +48 -0
  144. data/lib/voom/presenters/dsl/components/mixins/padding.rb +42 -0
  145. data/lib/voom/presenters/dsl/components/mixins/progress.rb +16 -0
  146. data/lib/voom/presenters/dsl/components/mixins/selects.rb +6 -0
  147. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +2 -0
  148. data/lib/voom/presenters/dsl/components/mixins/tables.rb +15 -0
  149. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +5 -0
  150. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +0 -2
  151. data/lib/voom/presenters/dsl/components/mixins/typography.rb +55 -8
  152. data/lib/voom/presenters/dsl/components/mixins/yield_to.rb +2 -2
  153. data/lib/voom/presenters/dsl/components/multi_select.rb +56 -0
  154. data/lib/voom/presenters/dsl/components/number_field.rb +20 -0
  155. data/lib/voom/presenters/dsl/components/page_title.rb +31 -0
  156. data/lib/voom/presenters/dsl/components/progress.rb +27 -0
  157. data/lib/voom/presenters/dsl/components/radio_button.rb +0 -1
  158. data/lib/voom/presenters/dsl/components/rich_text_area.rb +5 -11
  159. data/lib/voom/presenters/dsl/components/select.rb +18 -9
  160. data/lib/voom/presenters/dsl/components/separator.rb +21 -0
  161. data/lib/voom/presenters/dsl/components/slider.rb +6 -7
  162. data/lib/voom/presenters/dsl/components/stepper.rb +0 -10
  163. data/lib/voom/presenters/dsl/components/switch.rb +0 -2
  164. data/lib/voom/presenters/dsl/components/tab_bar.rb +0 -3
  165. data/lib/voom/presenters/dsl/components/table.rb +39 -20
  166. data/lib/voom/presenters/dsl/components/text_area.rb +1 -3
  167. data/lib/voom/presenters/dsl/components/text_field.rb +54 -11
  168. data/lib/voom/presenters/dsl/components/time_field.rb +0 -2
  169. data/lib/voom/presenters/dsl/components/toggle_base.rb +8 -6
  170. data/lib/voom/presenters/dsl/components/typography.rb +4 -4
  171. data/lib/voom/presenters/dsl/components/unordered_list.rb +50 -0
  172. data/lib/voom/presenters/dsl/definer.rb +0 -4
  173. data/lib/voom/presenters/dsl/definition.rb +6 -5
  174. data/lib/voom/presenters/dsl/protect_from_forgery.rb +43 -0
  175. data/lib/voom/presenters/dsl/user_interface.rb +37 -22
  176. data/lib/voom/presenters/errors.rb +1 -0
  177. data/lib/voom/presenters/errors/invalid_dsl.rb +8 -0
  178. data/lib/voom/presenters/errors/parameter_validation.rb +1 -3
  179. data/lib/voom/presenters/generators/inflectors.rb +59 -0
  180. data/lib/voom/presenters/generators/plugin.rb +115 -0
  181. data/lib/voom/presenters/generators/templates/plugin/.gitignore +12 -0
  182. data/lib/voom/presenters/generators/templates/plugin/Gemfile +6 -0
  183. data/lib/voom/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  184. data/lib/voom/presenters/generators/templates/plugin/README.md +253 -0
  185. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/action.rb.tt +16 -0
  186. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  187. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/component.rb.tt +18 -0
  188. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/dsl.rb.tt +19 -0
  189. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/helpers/helper.rb.tt +15 -0
  190. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/plugin.rb.tt +9 -0
  191. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  192. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/render.rb.tt +23 -0
  193. data/lib/voom/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  194. data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  195. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  196. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  197. data/lib/voom/presenters/generators/templates/plugin/views/components/component.erb.tt +14 -0
  198. data/lib/voom/presenters/generators/templates/plugin/views/components/component_header.erb.tt +20 -0
  199. data/lib/voom/presenters/helpers.rb +2 -8
  200. data/lib/voom/presenters/helpers/inflector.rb +1 -1
  201. data/lib/voom/presenters/helpers/rails.rb +15 -8
  202. data/lib/voom/presenters/helpers/redact.rb +13 -0
  203. data/lib/voom/presenters/helpers/route.rb +12 -5
  204. data/lib/voom/presenters/pluggable.rb +37 -0
  205. data/lib/voom/presenters/plugins.rb +7 -0
  206. data/lib/voom/presenters/plugins/google_maps.rb +24 -0
  207. data/lib/voom/presenters/plugins/google_maps/google_map.erb +10 -0
  208. data/lib/voom/presenters/{dsl/components → plugins/google_maps}/google_map.rb +4 -3
  209. data/lib/voom/presenters/{dsl.rb → registry.rb} +13 -15
  210. data/lib/voom/presenters/router.rb +59 -0
  211. data/lib/voom/presenters/settings.rb +18 -8
  212. data/lib/voom/presenters/version.rb +3 -1
  213. data/lib/voom/presenters/web_client/app.rb +86 -29
  214. data/lib/voom/presenters/web_client/component_decorator_factory.rb +27 -0
  215. data/lib/voom/presenters/web_client/component_html_decorator.rb +50 -0
  216. data/lib/voom/presenters/web_client/component_renderer.rb +49 -0
  217. data/lib/voom/presenters/web_client/custom_css.rb +65 -0
  218. data/lib/voom/presenters/web_client/{markdown_render.rb → custom_render.rb} +5 -3
  219. data/lib/voom/presenters/web_client/helpers/expand_hash.rb +19 -0
  220. data/lib/voom/presenters/web_client/helpers/form_helpers.rb +14 -0
  221. data/lib/voom/presenters/web_client/helpers/padding_helpers.rb +21 -0
  222. data/lib/voom/presenters/web_client/plugin_headers.rb +37 -0
  223. data/lib/voom/presenters/web_client/router.rb +3 -54
  224. data/lib/voom/railtie.rb +37 -0
  225. data/lib/voom/symbol/to_str.rb +3 -3
  226. data/lib/voom/trace.rb +0 -2
  227. data/presenters.gemspec +10 -6
  228. data/public/bundle.css +18256 -0
  229. data/public/bundle.js +60106 -0
  230. data/public/img/demo/avatar.jpg +0 -0
  231. data/public/presenters/custom_css.css +26 -0
  232. data/public/wc.js +52861 -0
  233. data/scripts/build.sh +10 -0
  234. data/views/mdc/.eslintrc.yml +1 -0
  235. data/views/mdc/.nvmrc +1 -0
  236. data/views/mdc/assets/js/app.js +13 -2
  237. data/views/mdc/assets/js/components/base-component.js +147 -12
  238. data/views/mdc/assets/js/components/base-container.js +54 -14
  239. data/views/mdc/assets/js/components/base-toggle.js +56 -0
  240. data/views/mdc/assets/js/components/button.js +74 -5
  241. data/views/mdc/assets/js/components/cards.js +3 -3
  242. data/views/mdc/assets/js/components/checkboxes.js +7 -30
  243. data/views/mdc/assets/js/components/chips.js +76 -12
  244. data/views/mdc/assets/js/components/content.js +5 -4
  245. data/views/mdc/assets/js/components/data-tables.js +11 -34
  246. data/views/mdc/assets/js/components/datetime.js +29 -6
  247. data/views/mdc/assets/js/components/dialogs.js +128 -31
  248. data/views/mdc/assets/js/components/drag_n_drop.js +182 -0
  249. data/views/mdc/assets/js/components/drawer.js +43 -0
  250. data/views/mdc/assets/js/components/events.js +190 -73
  251. data/views/mdc/assets/js/components/events/action_parameter.js +62 -0
  252. data/views/mdc/assets/js/components/events/action_parameter.test.js +62 -0
  253. data/views/mdc/assets/js/components/events/autocomplete.js +94 -0
  254. data/views/mdc/assets/js/components/events/base.js +139 -23
  255. data/views/mdc/assets/js/components/events/clears.js +15 -12
  256. data/views/mdc/assets/js/components/events/close_dialog.js +50 -0
  257. data/views/mdc/assets/js/components/events/dialog.js +32 -14
  258. data/views/mdc/assets/js/components/events/encode.js +8 -0
  259. data/views/mdc/assets/js/components/events/errors.js +175 -92
  260. data/views/mdc/assets/js/components/events/loads.js +50 -11
  261. data/views/mdc/assets/js/components/events/navigates.js +17 -15
  262. data/views/mdc/assets/js/components/events/plugin.js +18 -0
  263. data/views/mdc/assets/js/components/events/post_message.js +21 -0
  264. data/views/mdc/assets/js/components/events/posts.js +147 -65
  265. data/views/mdc/assets/js/components/events/prompt_if_dirty.js +67 -0
  266. data/views/mdc/assets/js/components/events/removes.js +7 -6
  267. data/views/mdc/assets/js/components/events/replaces.js +87 -33
  268. data/views/mdc/assets/js/components/events/snackbar.js +10 -10
  269. data/views/mdc/assets/js/components/events/stepper.js +8 -10
  270. data/views/mdc/assets/js/components/events/toggle_disabled.js +41 -0
  271. data/views/mdc/assets/js/components/events/toggle_visibility.js +57 -15
  272. data/views/mdc/assets/js/components/file-inputs.js +68 -21
  273. data/views/mdc/assets/js/components/form-fields.js +16 -0
  274. data/views/mdc/assets/js/components/forms.js +3 -3
  275. data/views/mdc/assets/js/components/get_event_target.js +15 -0
  276. data/views/mdc/assets/js/components/grid.js +7 -6
  277. data/views/mdc/assets/js/components/header.js +20 -0
  278. data/views/mdc/assets/js/components/hidden-fields.js +19 -8
  279. data/views/mdc/assets/js/components/icon-toggles.js +7 -7
  280. data/views/mdc/assets/js/components/images.js +19 -0
  281. data/views/mdc/assets/js/components/initialize.js +54 -27
  282. data/views/mdc/assets/js/components/lists.js +9 -4
  283. data/views/mdc/assets/js/components/menus.js +60 -13
  284. data/views/mdc/assets/js/components/mixins/dirtyable.js +22 -0
  285. data/views/mdc/assets/js/components/mixins/event-handler.js +7 -7
  286. data/views/mdc/assets/js/components/mixins/visibility-observer.js +22 -21
  287. data/views/mdc/assets/js/components/multi-select.js +75 -0
  288. data/views/mdc/assets/js/components/plugins.js +86 -0
  289. data/views/mdc/assets/js/components/progress.js +31 -0
  290. data/views/mdc/assets/js/components/radios.js +6 -31
  291. data/views/mdc/assets/js/components/rich-text-area.js +217 -33
  292. data/views/mdc/assets/js/components/rich-text-area/horizontal-rule-blot.js +23 -0
  293. data/views/mdc/assets/js/components/root_document.js +5 -0
  294. data/views/mdc/assets/js/components/selects.js +18 -8
  295. data/views/mdc/assets/js/components/sliders.js +23 -12
  296. data/views/mdc/assets/js/components/snackbar.js +11 -8
  297. data/views/mdc/assets/js/components/steppers.js +3 -3
  298. data/views/mdc/assets/js/components/switches.js +6 -29
  299. data/views/mdc/assets/js/components/tab-bars.js +18 -4
  300. data/views/mdc/assets/js/components/text-fields.js +94 -22
  301. data/views/mdc/assets/js/components/tooltip.js +17 -0
  302. data/views/mdc/assets/js/components/typography.js +28 -0
  303. data/views/mdc/assets/js/components/uninitialize.js +7 -0
  304. data/views/mdc/assets/js/wc.js +111 -0
  305. data/views/mdc/assets/scss/app.scss +13 -5
  306. data/views/mdc/assets/scss/components/avatar.scss +51 -7
  307. data/views/mdc/assets/scss/components/button.scss +7 -9
  308. data/views/mdc/assets/scss/components/card.scss +6 -5
  309. data/views/mdc/assets/scss/components/chip.scss +4 -0
  310. data/views/mdc/assets/scss/components/content.scss +25 -0
  311. data/views/mdc/assets/scss/components/data-table.scss +12 -1
  312. data/views/mdc/assets/scss/components/datetime.scss +1 -2
  313. data/views/mdc/assets/scss/components/dialog.scss +7 -2
  314. data/views/mdc/assets/scss/components/drag_n_drop.scss +17 -0
  315. data/views/mdc/assets/scss/components/drawer.scss +82 -0
  316. data/views/mdc/assets/scss/components/expansion-panel.scss +2 -2
  317. data/views/mdc/assets/scss/components/fab.scss +23 -5
  318. data/views/mdc/assets/scss/components/file-input.scss +10 -14
  319. data/views/mdc/assets/scss/components/grid.scss +32 -17
  320. data/views/mdc/assets/scss/components/header.scss +21 -0
  321. data/views/mdc/assets/scss/components/icon-button-toggles.scss +2 -0
  322. data/views/mdc/assets/scss/components/icon.scss +23 -0
  323. data/views/mdc/assets/scss/components/image-list.scss +18 -0
  324. data/views/mdc/assets/scss/components/image.scss +13 -21
  325. data/views/mdc/assets/scss/components/list.scss +9 -3
  326. data/views/mdc/assets/scss/components/menu.scss +13 -3
  327. data/views/mdc/assets/scss/components/multi-select.scss +44 -0
  328. data/views/mdc/assets/scss/components/progress.scss +1 -0
  329. data/views/mdc/assets/scss/components/rich-text-area.scss +38 -2
  330. data/views/mdc/assets/scss/components/select.scss +6 -3
  331. data/views/mdc/assets/scss/components/separator.scss +3 -0
  332. data/views/mdc/assets/scss/components/switch.scss +10 -0
  333. data/views/mdc/assets/scss/components/textfield.scss +8 -4
  334. data/views/mdc/assets/scss/components/tooltip.scss +3 -0
  335. data/views/mdc/assets/scss/components/typography.scss +6 -0
  336. data/views/mdc/assets/scss/components/unordered-lists.scss +17 -0
  337. data/views/mdc/assets/scss/material.blue_grey-orange.min.css +1 -1
  338. data/views/mdc/assets/scss/media.scss +39 -0
  339. data/views/mdc/assets/scss/palette.scss +16 -0
  340. data/views/mdc/assets/scss/styles.scss +39 -1
  341. data/views/mdc/assets/scss/theme.scss +19 -2
  342. data/views/mdc/body/dismissable-drawer.erb +34 -0
  343. data/views/mdc/body/drawer/divider.erb +1 -0
  344. data/views/mdc/body/drawer/item.erb +13 -0
  345. data/views/mdc/body/drawer/label.erb +1 -0
  346. data/views/mdc/body/drawers/menu.erb +1 -1
  347. data/views/mdc/body/footers/menu_item.erb +2 -2
  348. data/views/mdc/body/header.erb +38 -31
  349. data/views/mdc/body/modal-drawer.erb +35 -0
  350. data/views/mdc/body/snackbar.erb +11 -5
  351. data/views/mdc/components/actions/autocomplete.rb +8 -0
  352. data/views/mdc/components/actions/close_dialog.rb +10 -0
  353. data/views/mdc/components/actions/loads.rb +7 -1
  354. data/views/mdc/components/actions/navigates.rb +1 -1
  355. data/views/mdc/components/actions/post.rb +4 -7
  356. data/views/mdc/components/actions/post_message.rb +10 -0
  357. data/views/mdc/components/actions/prompt_if_dirty.rb +17 -0
  358. data/views/mdc/components/actions/replaces.rb +5 -1
  359. data/views/mdc/components/actions/resolver.rb +39 -0
  360. data/views/mdc/components/actions/snackbar.rb +3 -1
  361. data/views/mdc/components/actions/toggle_disabled.rb +10 -0
  362. data/views/mdc/components/avatar.erb +12 -7
  363. data/views/mdc/components/badge.erb +1 -1
  364. data/views/mdc/components/button.erb +2 -3
  365. data/views/mdc/components/buttons/button.erb +12 -12
  366. data/views/mdc/components/buttons/fab.erb +3 -2
  367. data/views/mdc/components/buttons/icon.erb +5 -5
  368. data/views/mdc/components/buttons/image.erb +4 -3
  369. data/views/mdc/components/card.erb +67 -44
  370. data/views/mdc/components/checkbox.erb +32 -35
  371. data/views/mdc/components/chip.erb +38 -30
  372. data/views/mdc/components/chipset.erb +18 -0
  373. data/views/mdc/components/content.erb +35 -14
  374. data/views/mdc/components/datetime.erb +6 -19
  375. data/views/mdc/components/dialog.erb +45 -25
  376. data/views/mdc/components/drag_and_drop/drag_and_drop.rb +16 -0
  377. data/views/mdc/components/event.erb +3 -5
  378. data/views/mdc/components/expansion_panel.erb +8 -6
  379. data/views/mdc/components/file_input.erb +14 -10
  380. data/views/mdc/components/form.erb +4 -19
  381. data/views/mdc/components/grid.erb +20 -17
  382. data/views/mdc/components/hidden_field.erb +3 -4
  383. data/views/mdc/components/icon.erb +7 -5
  384. data/views/mdc/components/icon_toggle.erb +9 -8
  385. data/views/mdc/components/image.erb +23 -5
  386. data/views/mdc/components/image_list.erb +38 -0
  387. data/views/mdc/components/link.erb +3 -13
  388. data/views/mdc/components/list.erb +4 -2
  389. data/views/mdc/components/list/avatar.erb +2 -1
  390. data/views/mdc/components/list/header.erb +5 -3
  391. data/views/mdc/components/list/hidden_field.erb +3 -0
  392. data/views/mdc/components/list/icon.erb +2 -1
  393. data/views/mdc/components/list/line.erb +19 -9
  394. data/views/mdc/components/list/menu.erb +7 -2
  395. data/views/mdc/components/list/separator.erb +1 -1
  396. data/views/mdc/components/menu.erb +14 -6
  397. data/views/mdc/components/multi_select.erb +33 -0
  398. data/views/mdc/components/number_field.erb +38 -0
  399. data/views/mdc/components/page_title.erb +2 -2
  400. data/views/mdc/components/progress.erb +11 -0
  401. data/views/mdc/components/radio_button.erb +5 -6
  402. data/views/mdc/components/render.erb +2 -3
  403. data/views/mdc/components/rich_text_area.erb +13 -10
  404. data/views/mdc/components/select.erb +28 -12
  405. data/views/mdc/components/separator.erb +3 -0
  406. data/views/mdc/components/shared/hint_error_display.erb +9 -0
  407. data/views/mdc/components/shared/input_label.erb +7 -0
  408. data/views/mdc/components/slider.erb +3 -1
  409. data/views/mdc/components/stepper.erb +1 -1
  410. data/views/mdc/components/stepper/step.erb +1 -1
  411. data/views/mdc/components/switch.erb +8 -7
  412. data/views/mdc/components/tab_bar.erb +7 -1
  413. data/views/mdc/components/table.erb +26 -13
  414. data/views/mdc/components/table/checkbox.erb +6 -3
  415. data/views/mdc/components/table/column.erb +18 -0
  416. data/views/mdc/components/table/footer.erb +8 -0
  417. data/views/mdc/components/table/header.erb +5 -4
  418. data/views/mdc/components/table/pagination.erb +2 -6
  419. data/views/mdc/components/table/row.erb +5 -5
  420. data/views/mdc/components/text_area.erb +9 -11
  421. data/views/mdc/components/text_field.erb +29 -37
  422. data/views/mdc/components/tooltip.erb +2 -2
  423. data/views/mdc/components/typography.erb +7 -5
  424. data/views/mdc/components/unordered_list.erb +10 -0
  425. data/views/mdc/components/unordered_list/icon.erb +3 -0
  426. data/views/mdc/components/unordered_list/list_item.erb +7 -0
  427. data/views/mdc/layout.erb +41 -29
  428. data/views/mdc/package-lock.json +2241 -1332
  429. data/views/mdc/package.json +47 -29
  430. data/views/mdc/web.erb +4 -0
  431. data/views/mdc/webpack.config.js +13 -1
  432. metadata +228 -32
  433. data/app/demo/component_status.pom +0 -76
  434. data/lib/voom-presenters.rb +0 -9
  435. data/lib/voom/presenters-engine.rb +0 -44
  436. data/lib/voom/presenters.rb +0 -19
  437. data/public/.gitignore +0 -2
  438. data/scripts/bump.sh +0 -5
  439. data/scripts/changelog.sh +0 -5
  440. data/scripts/deploy-demo.sh +0 -3
  441. data/scripts/release.sh +0 -5
  442. data/scripts/tag.sh +0 -5
  443. data/views/mdc/assets/js/dialog-polyfill.js +0 -738
  444. data/views/mdc/assets/scss/components/icon-toggles.scss +0 -9
  445. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +0 -13
  446. data/views/mdc/body/drawer.erb +0 -18
  447. data/views/mdc/components/google_map.erb +0 -9
@@ -0,0 +1,44 @@
1
+ Voom::Presenters.define(:image_crop, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :image_crop
6
+
7
+ page_title 'Image Crop'
8
+
9
+ indented_grid do
10
+ title 'Drag and drop with cropper preview'
11
+ grid do
12
+ column 6 do
13
+ image_crop id: :event_image,
14
+ aspect_ratio: 1.0,
15
+ image: 'https://cdn.mos.cms.futurecdn.net/4f6d31c116fdada59a5cb16d136e3068-970-80.jpg' do
16
+ end
17
+ end
18
+ column 6 do
19
+ file_input name: :event_file_name, preview: :event_image, accept: 'image/png, image/jpeg, image/gif, image/svg+xml' do
20
+ grid do
21
+ column 12 do
22
+ card do
23
+ text 'Drop it here'
24
+ button icon: :cloud_upload
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ event :change do
31
+ replaces :context_list, ':context_list'
32
+ end
33
+ end
34
+ end
35
+
36
+ # image_crop do
37
+ # event :change do
38
+ # replaces :context_list, ':context_list'
39
+ # end
40
+ # end
41
+ attach 'context_list'
42
+ attach :code, file: __FILE__
43
+ end
44
+
@@ -0,0 +1,29 @@
1
+ Voom::Presenters.define(:index, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :foo
6
+
7
+ indented_grid do
8
+ display 'Sample Plugin'
9
+ body 'You can extend the presenters by writing a plugin.'
10
+ body 'Plugins can fully extend and override built in presenter behavior.'
11
+ blank
12
+ icon 'fa-hand-point-left', position: :left
13
+ subheading 'Select a plugin to get started'
14
+ blank
15
+ body 'The plugin generator is the easiest way to get started.'
16
+ body 'presenters generate plugin <your plugin name>'
17
+ blank
18
+ body 'For a complete example checkout the sample '\
19
+ '[foo_presenter_plugin](https://github.com/rx/foo_presenter_plugin).'
20
+ foo(random_fact)
21
+ button 'New Random Fact' do
22
+ event :click do
23
+ bar 'Showing new random fact!'
24
+ snackbar last_response.data
25
+ end
26
+ end
27
+ end
28
+ attach :code, file: __FILE__
29
+ end
@@ -0,0 +1,19 @@
1
+ Voom::Presenters.define(:plugin_drawer, namespace: :plugins) do
2
+ helpers Voom::Presenters::Helpers::Inflector
3
+ drawer 'Plugins' do
4
+ menu do
5
+ item 'Sample Plugin' do
6
+ event :click do
7
+ loads :index
8
+ end
9
+ end
10
+ %i(image_crop chart).sort.each do |comp|
11
+ item titleize(comp) do
12
+ event :click do
13
+ loads comp
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -9,7 +9,7 @@ Voom::Presenters.define(:context_list) do
9
9
  end
10
10
 
11
11
  def scrubbed_context
12
- scrubbed_keys = context.fetch(:exclude) {%w{title file hide_time}}
12
+ scrubbed_keys = context.fetch(:exclude) {%w{title file hide_time _presenter_ _namespace1_ session}}
13
13
  context.select {|k, _| !scrubbed_keys.include?(k.to_s)}
14
14
  end
15
15
  end
data/app/demo/styles.pom CHANGED
@@ -34,7 +34,9 @@ Voom::Presenters.define(:styles) do
34
34
  separator
35
35
  body 'Line above me is a separator'
36
36
  link 'You can have a link', 'https://www.google.com/search?q=link&source=lnms&tbm=isch&sa=X&ved=0ahUKEwipr4zY_JXdAhVNXK0KHWFNCdYQ_AUICigB&biw=1651&bih=932'
37
+ blank
38
+ link 'I open in a new tab or window', 'https://example.com', target: :blank
37
39
 
38
40
  end
39
41
  attach :code, file: __FILE__
40
- end
42
+ end
data/bin/console CHANGED
@@ -15,8 +15,8 @@ Voom::Presenters::App.boot!
15
15
  # with your gem easier. You can also use a different console, if you like.
16
16
 
17
17
  # (If you use this, don't forget to add pry to your Gemfile!)
18
- # require "pry"
19
- # Pry.start
18
+ require "pry"
19
+ Pry.start
20
20
 
21
- require 'irb'
22
- IRB.start
21
+ # require 'irb'
22
+ # IRB.start
data/component-status.yml CHANGED
@@ -49,20 +49,20 @@
49
49
  Notes:
50
50
  -
51
51
  Components: Data tables
52
- Implementation: MDL
52
+ Implementation: MDC
53
53
  MDL:
54
- MDC: N
54
+ MDC: Y
55
55
  Priority:
56
56
  Completeness: 2
57
57
  Notes:
58
58
  -
59
59
  Components: Dialogs
60
- Implementation: MDL
60
+ Implementation: MDC
61
61
  MDL:
62
62
  MDC: Y
63
63
  Priority: High
64
- Completeness: 1
65
- Notes: Current implementation from MDL and polyfil does not work on iOS/Safari. Port to MDC.
64
+ Completeness: 2
65
+ Notes:
66
66
  -
67
67
  Components: Dividers
68
68
  Implementation: N
@@ -121,11 +121,11 @@
121
121
  Notes: Date, time, datetime are supported.
122
122
  -
123
123
  Components: Progress & activity
124
- Implementation: N
124
+ Implementation: MDC
125
125
  MDL:
126
126
  MDC: Y
127
- Priority: medium
128
- Completeness:
127
+ Priority:
128
+ Completeness: 1
129
129
  Notes:
130
130
  -
131
131
  Components: Selection controls/switches
@@ -210,10 +210,10 @@
210
210
  The list icons are not displaying tooltips.
211
211
  **Help wanted**
212
212
  -
213
- Components: Widgets
214
- Implementation: N
215
- MDL: N
216
- MDC: N
217
- Priority: medium
218
- Completeness:
219
- Notes: Need extension/plugin design with ace editor and charts as available plugins.
213
+ Components: Widgets/Plugins
214
+ Implementation: Various
215
+ MDL: N/A
216
+ MDC: N/A
217
+ Priority:
218
+ Completeness: 2
219
+ Notes: Handled by presenter plugins.
data/config.ru CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- if ENV['VOOM_ENV']=='integration_testing'
2
+ if ENV['VOOM_ENV'] == 'integration_testing'
3
3
  require 'simplecov'
4
4
  if ENV['CIRCLE_ARTIFACTS']
5
5
  dir = File.join(ENV['CIRCLE_ARTIFACTS'], "coverage")
@@ -10,22 +10,32 @@ end
10
10
 
11
11
  ENV['VOOM_ROOT'] = File.expand_path(__dir__)
12
12
  ENV['GOOGLE_API_KEY'] = 'AIzaSyDhSgj9XSBLY5E9Rx5pP2ILQ7IXnD4uX2Q'
13
- libdir = File.join(ENV['VOOM_ROOT'], 'lib')
14
- $:.unshift(libdir) unless $:.include?(libdir)
15
- require 'voom/presenters/api/app'
16
- require 'voom/presenters/web_client/app'
17
- require 'voom/presenters/demo/search'
18
- require 'voom/presenters/demo/echo'
13
+ require 'voom'
14
+
15
+ require 'rack/cors'
16
+ use Rack::Cors do
17
+ allow do
18
+ origins '*'
19
+ resource '*', headers: :any, methods: [:get, :post, :options]
20
+ end
21
+ end
22
+
23
+ Voom::Presenters::Settings.configure do |config|
24
+ config.presenters.root = File.join(ENV['VOOM_ROOT'], 'app')
25
+ config.presenters.web_client.prepare_context << ->(context, session, _env) {
26
+ context.merge(session: session)
27
+ }
28
+ end
19
29
 
20
30
  use Voom::Presenters::Demo::Search
21
31
  use Voom::Presenters::Demo::Echo
32
+ use Voom::Presenters::Demo::Slow
33
+ use Voom::Presenters::Demo::DragonDrop
22
34
 
23
35
  use Voom::Presenters::WebClient::App
24
36
  run Voom::Presenters::Api::App
25
37
 
26
- Voom::Presenters::Settings.configure do |config|
27
- config.presenters.root = File.join(ENV['VOOM_ROOT'], 'app')
28
- end
38
+
29
39
  Voom::Presenters::App.boot!
30
40
 
31
41
 
data/docs/settings.md ADDED
@@ -0,0 +1,81 @@
1
+ # Configuration
2
+ Presenters can be configured via settings set in e.g. Rails initializers.
3
+
4
+ ## Overview
5
+ Configuration is handled via [dry-configurable](https://github.com/dry-rb/dry-configurable).
6
+
7
+ ```ruby
8
+ Voom::Presenters::Settings.configure do |config|
9
+ config.presenters.helpers << SomeHelperClass
10
+ end
11
+ ```
12
+
13
+ ## Table of Contents
14
+ * [`before_render`](#before_render)
15
+
16
+ ## Settings
17
+ ### `before_render`
18
+ `before_render` is an array of things which respond to `#call/1`. The items in
19
+ the array are lazily invoked with the current request prior to a Presenter
20
+ being rendered.
21
+
22
+ If an item returns a non-`nil` Presenter name, this Presenter will be rendered
23
+ instead of the Presenter that was about to be rendered. In this case, subsequent
24
+ `before_render` items will not be invoked.
25
+
26
+ ```ruby
27
+ # request: /foos/foo?id=1
28
+
29
+ Voom::Presenters::Settings.configure do |config|
30
+ config.presenters.before_render << lambda do |req|
31
+ if some_predicate?
32
+ return :render_me_instead
33
+ # /render_me_instead?id=1 will be rendered instead of /foos/foo?id=1.
34
+ end
35
+
36
+ # return nil will not intercept rendering and the next lambda will be
37
+ # invoked.
38
+ end
39
+
40
+ # this lambda will be invoked only if all previous lambdas returned nil.
41
+ config.presenters.before_render << lambda do |req|
42
+ puts 'if you see me, some_predicate? returned true'
43
+
44
+ # return nil will not intercept rendering and the next lambda will be
45
+ # invoked.
46
+ end
47
+ end
48
+ ```
49
+
50
+ If all items return `nil`, the original Presenter is rendered unintercepted.
51
+
52
+ #### Returning context
53
+
54
+ A `before_render` item may optionally return a context hash. This hash will be
55
+ passed to the rendered presenter and merged with existing context at render
56
+ time. **Key names in a returned context hash will overwrite the request's
57
+ context, so use with caution.**
58
+
59
+ ```ruby
60
+ # request: /foos/foo?id=1
61
+
62
+ class AuthenticationCheck
63
+ def initialize; end
64
+
65
+ def call(req)
66
+ unless authenticated?(req)
67
+ return ['auth:login', { timestamp: Time.current.to_i }]
68
+ # /auth/login?id=1&timestamp=1579535489 will be rendered instead of
69
+ # /foos/foo?id=1.
70
+ # /auth/login will have context { id: 1, timestamp: 1579535489 }
71
+ end
72
+
73
+ # return nil will not intercept rendering and the next lambda will be
74
+ # invoked.
75
+ end
76
+ end
77
+
78
+ Voom::Presenters::Settings.configure do |config|
79
+ config.presenters.before_render << AuthenticationCheck.new
80
+ end
81
+ ```
data/exe/presenters ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/voom/presenters/cli'
3
+ Voom::Presenters::Cli.start(ARGV)
@@ -0,0 +1,14 @@
1
+ module HashExt
2
+ module Traverse
3
+ def self.traverse(hash, &block)
4
+ hash.inject({}) do |h,(k,v)|
5
+ if Hash === v
6
+ v = traverse(v,&block)
7
+ end
8
+ nk, nv = block.call(k,v)
9
+ h[nk] = nv unless nk.nil?
10
+ h
11
+ end
12
+ end
13
+ end
14
+ end
data/lib/voom.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'zeitwerk'
2
+
3
+ class MyInflector < Zeitwerk::GemInflector
4
+ def camelize(basename, _abspath)
5
+ case basename
6
+ when "dsl"
7
+ "DSL"
8
+ else
9
+ super
10
+ end
11
+ end
12
+ end
13
+
14
+ loader = Zeitwerk::Loader.for_gem
15
+ loader.inflector = MyInflector.new(__FILE__)
16
+ #loader.logger = Logger.new($stderr)
17
+ loader.setup
18
+
19
+ module Voom
20
+ end
21
+
22
+ if defined?(::Rails)
23
+ # We need this class's file to be parsed, but we want to let Zeitwerk load it
24
+ Voom::Railtie
25
+ end
@@ -1,8 +1,8 @@
1
- require 'voom/symbol/to_str'
1
+ require 'dry-container'
2
2
 
3
3
  module Voom
4
4
  module ContainerMethods
5
- include Voom::Symbol
5
+ include Voom::Symbol::ToStr
6
6
 
7
7
  def registered_keys
8
8
  @registered_keys ||= []
@@ -0,0 +1,5 @@
1
+ module Voom
2
+ class Engine < ::Rails::Engine
3
+ config.eager_load_paths += Dir["#{config.root}/lib"]
4
+ end
5
+ end
@@ -1,7 +1,6 @@
1
1
  require 'sinatra'
2
+ require 'honeybadger' if ENV.fetch('HONEYBADGER_API_KEY'){false}
2
3
  require 'json'
3
- require 'voom/presenters'
4
- require 'voom/presenters/api/router'
5
4
 
6
5
  module Voom
7
6
  module Presenters
@@ -31,23 +30,44 @@ module Voom
31
30
 
32
31
  private
33
32
 
33
+ # analogous to Voom::Presenters::WebClient::App#render_presenter
34
34
  def render_presenter(presenter)
35
- # puts "/presenters/api/#{params[:version]}/#{params[:presenter]}/"
36
- # puts "Parameters: #{params.inspect}"
37
- presenter = Voom::Presenters::App[presenter].call
38
- pom = presenter.expand(router: router, context: prepare_context)
39
- content_type :json
40
- JSON.dump(pom.to_hash)
35
+ begin
36
+ before_render = Presenters::Settings.config.presenters.before_render
37
+ render_instead, ctx = before_render
38
+ .lazy
39
+ .map { |p| p.call(request) }
40
+ .detect(&:itself)
41
+
42
+ if Presenters::App.registered?(render_instead)
43
+ presenter = render_instead
44
+ end
45
+
46
+ p = params.merge(ctx || {})
47
+ presenter = Voom::Presenters::App[presenter].call
48
+ pom = presenter.expand(router: router, context: prepare_context(p))
49
+ content_type :json
50
+ JSON.dump(pom.to_hash)
51
+ rescue StandardError => e
52
+ presenter_name = presenter.respond_to?(:name) ? presenter.name : '(unknown)'
53
+ Presenters::Settings.config.presenters.error_logger.call(
54
+ @env['rack.errors'],
55
+ e,
56
+ params,
57
+ presenter_name
58
+ )
59
+ raise e
60
+ end
41
61
  end
42
62
 
43
63
  def router
44
64
  settings.router_.new(base_url: "#{request.base_url}#{env['SCRIPT_NAME']}")
45
65
  end
46
66
 
47
- def prepare_context
67
+ def prepare_context(base_params = params)
48
68
  prepare_context = Presenters::Settings.config.presenters.web_client.prepare_context.dup
49
69
  prepare_context.push(method(:scrub_context))
50
- context = params.dup
70
+ context = base_params.dup
51
71
  prepare_context.reduce(context) do |params, context_proc|
52
72
  context_proc.call(params, session, env)
53
73
  end
@@ -63,4 +83,4 @@ module Voom
63
83
  end
64
84
  end
65
85
  end
66
- end
86
+ end