voom-presenters 0.2.0 → 2.0.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 (440) 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 +39 -0
  7. data/.gitignore +3 -2
  8. data/.releaserc +8 -0
  9. data/.ruby-version +2 -1
  10. data/CHANGELOG.md +64 -114
  11. data/CONTRIBUTING.md +60 -0
  12. data/Gemfile +12 -3
  13. data/Gemfile.lock +83 -45
  14. data/Procfile +1 -0
  15. data/README.md +41 -39
  16. data/app/demo/component_status.pom +1 -1
  17. data/app/demo/components/avatars.pom +40 -0
  18. data/app/demo/components/cards.pom +11 -4
  19. data/app/demo/components/chips.pom +61 -54
  20. data/app/demo/components/content.pom +96 -16
  21. data/app/demo/components/dialogs.pom +175 -6
  22. data/app/demo/components/file_inputs.pom +38 -2
  23. data/app/demo/components/google_maps.pom +6 -1
  24. data/app/demo/components/headers.pom +80 -20
  25. data/app/demo/components/icons.pom +86 -55
  26. data/app/demo/components/image_lists.pom +100 -0
  27. data/app/demo/components/images.pom +45 -0
  28. data/app/demo/components/layouts.pom +3 -25
  29. data/app/demo/components/lists.pom +24 -4
  30. data/app/demo/components/menus.pom +14 -4
  31. data/app/demo/components/nav/menu.pom +38 -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 +44 -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/nav/top_nav.pom +12 -0
  56. data/app/demo/patterns/drag_drop.pom +89 -0
  57. data/app/demo/patterns/floating_card.pom +29 -0
  58. data/app/demo/patterns/search_select.pom +9 -7
  59. data/app/demo/plugins/chart.pom +254 -0
  60. data/app/demo/plugins/image_crop.pom +44 -0
  61. data/app/demo/plugins/index.pom +29 -0
  62. data/app/demo/plugins/nav/drawer.pom +19 -0
  63. data/app/demo/shared/context_list.pom +1 -1
  64. data/app/demo/styles.pom +3 -1
  65. data/bin/console +4 -4
  66. data/bin/presenters +3 -0
  67. data/component-status.yml +15 -15
  68. data/config.ru +20 -10
  69. data/docs/settings.md +81 -0
  70. data/lib/hash_ext/traverse.rb +14 -0
  71. data/lib/voom.rb +25 -0
  72. data/lib/voom/container_methods.rb +2 -2
  73. data/lib/voom/engine.rb +5 -0
  74. data/lib/voom/presenters/api/app.rb +31 -11
  75. data/lib/voom/presenters/api/router.rb +3 -49
  76. data/lib/voom/presenters/app.rb +3 -3
  77. data/lib/voom/presenters/cli.rb +28 -0
  78. data/lib/voom/presenters/demo/dragon_drop.rb +48 -0
  79. data/lib/voom/presenters/demo/echo.rb +2 -0
  80. data/lib/voom/presenters/demo/slow.rb +18 -0
  81. data/lib/voom/presenters/dsl/components/actions/autocomplete.rb +15 -0
  82. data/lib/voom/presenters/dsl/components/actions/base.rb +36 -8
  83. data/lib/voom/presenters/dsl/components/actions/clear.rb +0 -2
  84. data/lib/voom/presenters/dsl/components/actions/close_dialog.rb +17 -0
  85. data/lib/voom/presenters/dsl/components/actions/deletes.rb +0 -2
  86. data/lib/voom/presenters/dsl/components/actions/dialog.rb +0 -2
  87. data/lib/voom/presenters/dsl/components/actions/loads.rb +5 -6
  88. data/lib/voom/presenters/dsl/components/actions/navigates.rb +0 -2
  89. data/lib/voom/presenters/dsl/components/actions/post_message.rb +17 -0
  90. data/lib/voom/presenters/dsl/components/actions/posts.rb +5 -2
  91. data/lib/voom/presenters/dsl/components/actions/prompt_if_dirty.rb +15 -0
  92. data/lib/voom/presenters/dsl/components/actions/remove.rb +0 -2
  93. data/lib/voom/presenters/dsl/components/actions/replaces.rb +4 -4
  94. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +0 -2
  95. data/lib/voom/presenters/dsl/components/actions/stepper.rb +0 -2
  96. data/lib/voom/presenters/dsl/components/actions/toggle_disabled.rb +15 -0
  97. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +0 -2
  98. data/lib/voom/presenters/dsl/components/actions/updates.rb +5 -2
  99. data/lib/voom/presenters/dsl/components/avatar.rb +4 -8
  100. data/lib/voom/presenters/dsl/components/badge.rb +0 -2
  101. data/lib/voom/presenters/dsl/components/base.rb +25 -18
  102. data/lib/voom/presenters/dsl/components/button.rb +15 -11
  103. data/lib/voom/presenters/dsl/components/card.rb +49 -36
  104. data/lib/voom/presenters/dsl/components/checkbox.rb +0 -2
  105. data/lib/voom/presenters/dsl/components/chip.rb +5 -7
  106. data/lib/voom/presenters/dsl/components/chipset.rb +33 -0
  107. data/lib/voom/presenters/dsl/components/content.rb +28 -18
  108. data/lib/voom/presenters/dsl/components/datetime_base.rb +0 -2
  109. data/lib/voom/presenters/dsl/components/datetime_field.rb +0 -2
  110. data/lib/voom/presenters/dsl/components/dialog.rb +36 -12
  111. data/lib/voom/presenters/dsl/components/drawer.rb +9 -6
  112. data/lib/voom/presenters/dsl/components/event.rb +106 -65
  113. data/lib/voom/presenters/dsl/components/event_base.rb +1 -3
  114. data/lib/voom/presenters/dsl/components/expansion_panel.rb +0 -3
  115. data/lib/voom/presenters/dsl/components/file_input.rb +18 -6
  116. data/lib/voom/presenters/dsl/components/footer.rb +2 -2
  117. data/lib/voom/presenters/dsl/components/form.rb +2 -17
  118. data/lib/voom/presenters/dsl/components/grid.rb +52 -50
  119. data/lib/voom/presenters/dsl/components/header.rb +17 -1
  120. data/lib/voom/presenters/dsl/components/hidden_field.rb +0 -2
  121. data/lib/voom/presenters/dsl/components/icon.rb +2 -4
  122. data/lib/voom/presenters/dsl/components/icon_base.rb +5 -7
  123. data/lib/voom/presenters/dsl/components/icon_toggle.rb +2 -4
  124. data/lib/voom/presenters/dsl/components/image.rb +61 -13
  125. data/lib/voom/presenters/dsl/components/image_list.rb +43 -0
  126. data/lib/voom/presenters/dsl/components/input.rb +14 -5
  127. data/lib/voom/presenters/dsl/components/link.rb +33 -0
  128. data/lib/voom/presenters/dsl/components/list.rb +6 -13
  129. data/lib/voom/presenters/dsl/components/lists/action.rb +9 -11
  130. data/lib/voom/presenters/dsl/components/lists/actions.rb +0 -3
  131. data/lib/voom/presenters/dsl/components/lists/line.rb +27 -15
  132. data/lib/voom/presenters/dsl/components/menu.rb +51 -9
  133. data/lib/voom/presenters/dsl/components/mixins/append.rb +2 -2
  134. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +0 -2
  135. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +1 -3
  136. data/lib/voom/presenters/dsl/components/mixins/chips.rb +0 -2
  137. data/lib/voom/presenters/dsl/components/mixins/chipset.rb +19 -0
  138. data/lib/voom/presenters/dsl/components/mixins/common.rb +13 -14
  139. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +0 -2
  140. data/lib/voom/presenters/dsl/components/mixins/event.rb +0 -2
  141. data/lib/voom/presenters/dsl/components/mixins/image_lists.rb +15 -0
  142. data/lib/voom/presenters/dsl/components/mixins/last_response.rb +48 -0
  143. data/lib/voom/presenters/dsl/components/mixins/padding.rb +42 -0
  144. data/lib/voom/presenters/dsl/components/mixins/progress.rb +16 -0
  145. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +2 -0
  146. data/lib/voom/presenters/dsl/components/mixins/tables.rb +15 -0
  147. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +5 -0
  148. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +0 -2
  149. data/lib/voom/presenters/dsl/components/mixins/typography.rb +55 -8
  150. data/lib/voom/presenters/dsl/components/mixins/yield_to.rb +2 -2
  151. data/lib/voom/presenters/dsl/components/number_field.rb +20 -0
  152. data/lib/voom/presenters/dsl/components/page_title.rb +31 -0
  153. data/lib/voom/presenters/dsl/components/progress.rb +27 -0
  154. data/lib/voom/presenters/dsl/components/radio_button.rb +0 -1
  155. data/lib/voom/presenters/dsl/components/rich_text_area.rb +5 -11
  156. data/lib/voom/presenters/dsl/components/select.rb +21 -9
  157. data/lib/voom/presenters/dsl/components/separator.rb +21 -0
  158. data/lib/voom/presenters/dsl/components/slider.rb +6 -7
  159. data/lib/voom/presenters/dsl/components/stepper.rb +0 -10
  160. data/lib/voom/presenters/dsl/components/switch.rb +0 -2
  161. data/lib/voom/presenters/dsl/components/tab_bar.rb +0 -3
  162. data/lib/voom/presenters/dsl/components/table.rb +39 -20
  163. data/lib/voom/presenters/dsl/components/text_area.rb +1 -3
  164. data/lib/voom/presenters/dsl/components/text_field.rb +54 -11
  165. data/lib/voom/presenters/dsl/components/time_field.rb +0 -2
  166. data/lib/voom/presenters/dsl/components/toggle_base.rb +8 -6
  167. data/lib/voom/presenters/dsl/components/typography.rb +4 -4
  168. data/lib/voom/presenters/dsl/components/unordered_list.rb +50 -0
  169. data/lib/voom/presenters/dsl/definer.rb +0 -4
  170. data/lib/voom/presenters/dsl/definition.rb +6 -5
  171. data/lib/voom/presenters/dsl/protect_from_forgery.rb +43 -0
  172. data/lib/voom/presenters/dsl/user_interface.rb +37 -22
  173. data/lib/voom/presenters/errors.rb +1 -0
  174. data/lib/voom/presenters/errors/invalid_dsl.rb +8 -0
  175. data/lib/voom/presenters/errors/parameter_validation.rb +1 -3
  176. data/lib/voom/presenters/generators/inflectors.rb +59 -0
  177. data/lib/voom/presenters/generators/plugin.rb +115 -0
  178. data/lib/voom/presenters/generators/templates/plugin/.gitignore +12 -0
  179. data/lib/voom/presenters/generators/templates/plugin/Gemfile +6 -0
  180. data/lib/voom/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  181. data/lib/voom/presenters/generators/templates/plugin/README.md +253 -0
  182. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/action.rb.tt +16 -0
  183. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  184. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/component.rb.tt +18 -0
  185. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/dsl.rb.tt +19 -0
  186. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/helpers/helper.rb.tt +15 -0
  187. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/plugin.rb.tt +9 -0
  188. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  189. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/render.rb.tt +23 -0
  190. data/lib/voom/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  191. data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  192. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  193. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  194. data/lib/voom/presenters/generators/templates/plugin/views/components/component.erb.tt +14 -0
  195. data/lib/voom/presenters/generators/templates/plugin/views/components/component_header.erb.tt +20 -0
  196. data/lib/voom/presenters/helpers.rb +2 -8
  197. data/lib/voom/presenters/helpers/inflector.rb +1 -1
  198. data/lib/voom/presenters/helpers/rails.rb +15 -8
  199. data/lib/voom/presenters/helpers/redact.rb +13 -0
  200. data/lib/voom/presenters/helpers/route.rb +12 -5
  201. data/lib/voom/presenters/pluggable.rb +37 -0
  202. data/lib/voom/presenters/plugins.rb +7 -0
  203. data/lib/voom/presenters/plugins/google_maps.rb +24 -0
  204. data/lib/voom/presenters/plugins/google_maps/google_map.erb +10 -0
  205. data/lib/voom/presenters/{dsl/components → plugins/google_maps}/google_map.rb +4 -3
  206. data/lib/voom/presenters/{dsl.rb → registry.rb} +13 -15
  207. data/lib/voom/presenters/router.rb +59 -0
  208. data/lib/voom/presenters/settings.rb +18 -8
  209. data/lib/voom/presenters/version.rb +1 -1
  210. data/lib/voom/presenters/web_client/app.rb +86 -29
  211. data/lib/voom/presenters/web_client/component_decorator_factory.rb +27 -0
  212. data/lib/voom/presenters/web_client/component_html_decorator.rb +50 -0
  213. data/lib/voom/presenters/web_client/component_renderer.rb +49 -0
  214. data/lib/voom/presenters/web_client/custom_css.rb +65 -0
  215. data/lib/voom/presenters/web_client/{markdown_render.rb → custom_render.rb} +5 -3
  216. data/lib/voom/presenters/web_client/helpers/expand_hash.rb +19 -0
  217. data/lib/voom/presenters/web_client/helpers/form_helpers.rb +14 -0
  218. data/lib/voom/presenters/web_client/helpers/padding_helpers.rb +21 -0
  219. data/lib/voom/presenters/web_client/plugin_headers.rb +37 -0
  220. data/lib/voom/presenters/web_client/router.rb +3 -54
  221. data/lib/voom/railtie.rb +37 -0
  222. data/lib/voom/symbol/to_str.rb +3 -3
  223. data/lib/voom/trace.rb +0 -2
  224. data/presenters.gemspec +8 -4
  225. data/public/bundle.css +18221 -0
  226. data/public/bundle.js +59949 -0
  227. data/public/img/demo/avatar.jpg +0 -0
  228. data/public/presenters/custom_css.css +26 -0
  229. data/public/wc.js +52704 -0
  230. data/scripts/build.sh +10 -0
  231. data/views/mdc/.eslintrc.yml +1 -0
  232. data/views/mdc/.nvmrc +1 -0
  233. data/views/mdc/assets/js/app.js +13 -2
  234. data/views/mdc/assets/js/components/base-component.js +147 -12
  235. data/views/mdc/assets/js/components/base-container.js +54 -14
  236. data/views/mdc/assets/js/components/base-toggle.js +56 -0
  237. data/views/mdc/assets/js/components/button.js +74 -5
  238. data/views/mdc/assets/js/components/cards.js +3 -3
  239. data/views/mdc/assets/js/components/checkboxes.js +7 -30
  240. data/views/mdc/assets/js/components/chips.js +76 -12
  241. data/views/mdc/assets/js/components/content.js +5 -4
  242. data/views/mdc/assets/js/components/data-tables.js +11 -34
  243. data/views/mdc/assets/js/components/datetime.js +29 -6
  244. data/views/mdc/assets/js/components/dialogs.js +128 -31
  245. data/views/mdc/assets/js/components/drag_n_drop.js +182 -0
  246. data/views/mdc/assets/js/components/drawer.js +43 -0
  247. data/views/mdc/assets/js/components/events.js +190 -73
  248. data/views/mdc/assets/js/components/events/action_parameter.js +62 -0
  249. data/views/mdc/assets/js/components/events/action_parameter.test.js +62 -0
  250. data/views/mdc/assets/js/components/events/autocomplete.js +94 -0
  251. data/views/mdc/assets/js/components/events/base.js +139 -23
  252. data/views/mdc/assets/js/components/events/clears.js +15 -12
  253. data/views/mdc/assets/js/components/events/close_dialog.js +50 -0
  254. data/views/mdc/assets/js/components/events/dialog.js +32 -14
  255. data/views/mdc/assets/js/components/events/encode.js +8 -0
  256. data/views/mdc/assets/js/components/events/errors.js +175 -92
  257. data/views/mdc/assets/js/components/events/loads.js +50 -11
  258. data/views/mdc/assets/js/components/events/navigates.js +17 -15
  259. data/views/mdc/assets/js/components/events/plugin.js +18 -0
  260. data/views/mdc/assets/js/components/events/post_message.js +21 -0
  261. data/views/mdc/assets/js/components/events/posts.js +147 -65
  262. data/views/mdc/assets/js/components/events/prompt_if_dirty.js +67 -0
  263. data/views/mdc/assets/js/components/events/removes.js +7 -6
  264. data/views/mdc/assets/js/components/events/replaces.js +87 -33
  265. data/views/mdc/assets/js/components/events/snackbar.js +10 -10
  266. data/views/mdc/assets/js/components/events/stepper.js +8 -10
  267. data/views/mdc/assets/js/components/events/toggle_disabled.js +41 -0
  268. data/views/mdc/assets/js/components/events/toggle_visibility.js +57 -15
  269. data/views/mdc/assets/js/components/file-inputs.js +68 -21
  270. data/views/mdc/assets/js/components/form-fields.js +16 -0
  271. data/views/mdc/assets/js/components/forms.js +3 -3
  272. data/views/mdc/assets/js/components/get_event_target.js +15 -0
  273. data/views/mdc/assets/js/components/grid.js +7 -6
  274. data/views/mdc/assets/js/components/header.js +20 -0
  275. data/views/mdc/assets/js/components/hidden-fields.js +19 -8
  276. data/views/mdc/assets/js/components/icon-toggles.js +7 -7
  277. data/views/mdc/assets/js/components/images.js +19 -0
  278. data/views/mdc/assets/js/components/initialize.js +52 -27
  279. data/views/mdc/assets/js/components/lists.js +9 -4
  280. data/views/mdc/assets/js/components/menus.js +60 -13
  281. data/views/mdc/assets/js/components/mixins/dirtyable.js +22 -0
  282. data/views/mdc/assets/js/components/mixins/event-handler.js +7 -7
  283. data/views/mdc/assets/js/components/mixins/visibility-observer.js +22 -21
  284. data/views/mdc/assets/js/components/plugins.js +86 -0
  285. data/views/mdc/assets/js/components/progress.js +31 -0
  286. data/views/mdc/assets/js/components/radios.js +6 -31
  287. data/views/mdc/assets/js/components/rich-text-area.js +217 -33
  288. data/views/mdc/assets/js/components/rich-text-area/horizontal-rule-blot.js +23 -0
  289. data/views/mdc/assets/js/components/root_document.js +5 -0
  290. data/views/mdc/assets/js/components/selects.js +18 -8
  291. data/views/mdc/assets/js/components/sliders.js +23 -12
  292. data/views/mdc/assets/js/components/snackbar.js +11 -8
  293. data/views/mdc/assets/js/components/steppers.js +3 -3
  294. data/views/mdc/assets/js/components/switches.js +6 -29
  295. data/views/mdc/assets/js/components/tab-bars.js +18 -4
  296. data/views/mdc/assets/js/components/text-fields.js +94 -22
  297. data/views/mdc/assets/js/components/tooltip.js +17 -0
  298. data/views/mdc/assets/js/components/typography.js +28 -0
  299. data/views/mdc/assets/js/components/uninitialize.js +7 -0
  300. data/views/mdc/assets/js/wc.js +111 -0
  301. data/views/mdc/assets/scss/app.scss +12 -5
  302. data/views/mdc/assets/scss/components/avatar.scss +51 -7
  303. data/views/mdc/assets/scss/components/button.scss +7 -9
  304. data/views/mdc/assets/scss/components/card.scss +6 -5
  305. data/views/mdc/assets/scss/components/chip.scss +4 -0
  306. data/views/mdc/assets/scss/components/content.scss +25 -0
  307. data/views/mdc/assets/scss/components/data-table.scss +12 -1
  308. data/views/mdc/assets/scss/components/datetime.scss +1 -2
  309. data/views/mdc/assets/scss/components/dialog.scss +7 -2
  310. data/views/mdc/assets/scss/components/drag_n_drop.scss +17 -0
  311. data/views/mdc/assets/scss/components/drawer.scss +82 -0
  312. data/views/mdc/assets/scss/components/expansion-panel.scss +2 -2
  313. data/views/mdc/assets/scss/components/fab.scss +23 -5
  314. data/views/mdc/assets/scss/components/file-input.scss +10 -14
  315. data/views/mdc/assets/scss/components/grid.scss +32 -17
  316. data/views/mdc/assets/scss/components/header.scss +21 -0
  317. data/views/mdc/assets/scss/components/icon-button-toggles.scss +2 -0
  318. data/views/mdc/assets/scss/components/icon.scss +23 -0
  319. data/views/mdc/assets/scss/components/image-list.scss +18 -0
  320. data/views/mdc/assets/scss/components/image.scss +13 -21
  321. data/views/mdc/assets/scss/components/list.scss +9 -3
  322. data/views/mdc/assets/scss/components/menu.scss +13 -3
  323. data/views/mdc/assets/scss/components/progress.scss +1 -0
  324. data/views/mdc/assets/scss/components/rich-text-area.scss +38 -2
  325. data/views/mdc/assets/scss/components/select.scss +6 -3
  326. data/views/mdc/assets/scss/components/separator.scss +3 -0
  327. data/views/mdc/assets/scss/components/switch.scss +10 -0
  328. data/views/mdc/assets/scss/components/textfield.scss +8 -4
  329. data/views/mdc/assets/scss/components/tooltip.scss +3 -0
  330. data/views/mdc/assets/scss/components/typography.scss +6 -0
  331. data/views/mdc/assets/scss/components/unordered-lists.scss +17 -0
  332. data/views/mdc/assets/scss/material.blue_grey-orange.min.css +1 -1
  333. data/views/mdc/assets/scss/media.scss +39 -0
  334. data/views/mdc/assets/scss/palette.scss +16 -0
  335. data/views/mdc/assets/scss/styles.scss +39 -1
  336. data/views/mdc/assets/scss/theme.scss +19 -2
  337. data/views/mdc/body/dismissable-drawer.erb +34 -0
  338. data/views/mdc/body/drawer/divider.erb +1 -0
  339. data/views/mdc/body/drawer/item.erb +13 -0
  340. data/views/mdc/body/drawer/label.erb +1 -0
  341. data/views/mdc/body/drawers/menu.erb +1 -1
  342. data/views/mdc/body/footers/menu_item.erb +2 -2
  343. data/views/mdc/body/header.erb +38 -31
  344. data/views/mdc/body/modal-drawer.erb +35 -0
  345. data/views/mdc/body/snackbar.erb +11 -5
  346. data/views/mdc/components/actions/autocomplete.rb +8 -0
  347. data/views/mdc/components/actions/close_dialog.rb +10 -0
  348. data/views/mdc/components/actions/loads.rb +7 -1
  349. data/views/mdc/components/actions/navigates.rb +1 -1
  350. data/views/mdc/components/actions/post.rb +4 -7
  351. data/views/mdc/components/actions/post_message.rb +10 -0
  352. data/views/mdc/components/actions/prompt_if_dirty.rb +17 -0
  353. data/views/mdc/components/actions/replaces.rb +5 -1
  354. data/views/mdc/components/actions/resolver.rb +39 -0
  355. data/views/mdc/components/actions/snackbar.rb +3 -1
  356. data/views/mdc/components/actions/toggle_disabled.rb +10 -0
  357. data/views/mdc/components/avatar.erb +12 -7
  358. data/views/mdc/components/badge.erb +1 -1
  359. data/views/mdc/components/button.erb +2 -3
  360. data/views/mdc/components/buttons/button.erb +12 -12
  361. data/views/mdc/components/buttons/fab.erb +3 -2
  362. data/views/mdc/components/buttons/icon.erb +5 -5
  363. data/views/mdc/components/buttons/image.erb +4 -3
  364. data/views/mdc/components/card.erb +67 -44
  365. data/views/mdc/components/checkbox.erb +32 -35
  366. data/views/mdc/components/chip.erb +38 -30
  367. data/views/mdc/components/chipset.erb +18 -0
  368. data/views/mdc/components/content.erb +35 -14
  369. data/views/mdc/components/datetime.erb +6 -19
  370. data/views/mdc/components/dialog.erb +45 -25
  371. data/views/mdc/components/drag_and_drop/drag_and_drop.rb +16 -0
  372. data/views/mdc/components/event.erb +3 -5
  373. data/views/mdc/components/expansion_panel.erb +8 -6
  374. data/views/mdc/components/file_input.erb +14 -10
  375. data/views/mdc/components/form.erb +4 -19
  376. data/views/mdc/components/grid.erb +20 -17
  377. data/views/mdc/components/hidden_field.erb +3 -4
  378. data/views/mdc/components/icon.erb +7 -5
  379. data/views/mdc/components/icon_toggle.erb +9 -8
  380. data/views/mdc/components/image.erb +23 -5
  381. data/views/mdc/components/image_list.erb +38 -0
  382. data/views/mdc/components/link.erb +3 -13
  383. data/views/mdc/components/list.erb +4 -2
  384. data/views/mdc/components/list/avatar.erb +2 -1
  385. data/views/mdc/components/list/header.erb +5 -3
  386. data/views/mdc/components/list/hidden_field.erb +3 -0
  387. data/views/mdc/components/list/icon.erb +2 -1
  388. data/views/mdc/components/list/line.erb +19 -9
  389. data/views/mdc/components/list/menu.erb +7 -2
  390. data/views/mdc/components/list/separator.erb +1 -1
  391. data/views/mdc/components/menu.erb +14 -6
  392. data/views/mdc/components/number_field.erb +38 -0
  393. data/views/mdc/components/page_title.erb +2 -2
  394. data/views/mdc/components/progress.erb +11 -0
  395. data/views/mdc/components/radio_button.erb +5 -6
  396. data/views/mdc/components/render.erb +2 -3
  397. data/views/mdc/components/rich_text_area.erb +13 -10
  398. data/views/mdc/components/select.erb +28 -12
  399. data/views/mdc/components/separator.erb +3 -0
  400. data/views/mdc/components/shared/hint_error_display.erb +9 -0
  401. data/views/mdc/components/shared/input_label.erb +7 -0
  402. data/views/mdc/components/slider.erb +3 -1
  403. data/views/mdc/components/stepper.erb +1 -1
  404. data/views/mdc/components/stepper/step.erb +1 -1
  405. data/views/mdc/components/switch.erb +8 -7
  406. data/views/mdc/components/tab_bar.erb +7 -1
  407. data/views/mdc/components/table.erb +26 -13
  408. data/views/mdc/components/table/checkbox.erb +6 -3
  409. data/views/mdc/components/table/column.erb +18 -0
  410. data/views/mdc/components/table/footer.erb +8 -0
  411. data/views/mdc/components/table/header.erb +5 -4
  412. data/views/mdc/components/table/pagination.erb +2 -6
  413. data/views/mdc/components/table/row.erb +5 -5
  414. data/views/mdc/components/text_area.erb +9 -11
  415. data/views/mdc/components/text_field.erb +29 -37
  416. data/views/mdc/components/tooltip.erb +2 -2
  417. data/views/mdc/components/typography.erb +7 -5
  418. data/views/mdc/components/unordered_list.erb +10 -0
  419. data/views/mdc/components/unordered_list/icon.erb +3 -0
  420. data/views/mdc/components/unordered_list/list_item.erb +7 -0
  421. data/views/mdc/layout.erb +41 -29
  422. data/views/mdc/package-lock.json +2222 -1327
  423. data/views/mdc/package.json +47 -29
  424. data/views/mdc/web.erb +4 -0
  425. data/views/mdc/webpack.config.js +13 -1
  426. metadata +218 -26
  427. data/lib/voom-presenters.rb +0 -9
  428. data/lib/voom/presenters-engine.rb +0 -44
  429. data/lib/voom/presenters.rb +0 -19
  430. data/public/.gitignore +0 -2
  431. data/scripts/bump.sh +0 -5
  432. data/scripts/changelog.sh +0 -5
  433. data/scripts/deploy-demo.sh +0 -3
  434. data/scripts/release.sh +0 -5
  435. data/scripts/tag.sh +0 -5
  436. data/views/mdc/assets/js/dialog-polyfill.js +0 -738
  437. data/views/mdc/assets/scss/components/icon-toggles.scss +0 -9
  438. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +0 -13
  439. data/views/mdc/body/drawer.erb +0 -18
  440. data/views/mdc/components/google_map.erb +0 -9
@@ -1,6 +1,3 @@
1
- require 'voom/presenters/dsl/components/mixins/event'
2
- require 'voom/presenters/dsl/components/mixins/tooltips'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
@@ -8,14 +5,16 @@ module Voom
8
5
  class Typography < EventBase
9
6
  include Mixins::Tooltips
10
7
 
11
- attr_accessor :text, :level, :color, :position
8
+ attr_accessor :text, :level, :color, :position, :inline, :markdown
12
9
 
13
10
  def initialize(parent:, level: nil, **attribs_, &block)
14
11
  super(type: :text, parent: parent, **attribs_, &block)
15
12
  @text = Array(attribs.delete(:text)||'').flatten.join("\n\n").split("\n\n")
16
13
  @level = level
17
14
  @color = attribs.delete(:color)
15
+ @inline = attribs.delete(:inline) { false }
18
16
  @position = Array(attribs.delete(:position)).compact
17
+ @markdown = attribs.delete(:markdown) { true }
19
18
  expand!
20
19
  end
21
20
 
@@ -24,6 +23,7 @@ module Voom
24
23
  @icon = Components::Icon.new(parent: self, icon: icon,
25
24
  **attribs, &block)
26
25
  end
26
+
27
27
  end
28
28
  end
29
29
  end
@@ -0,0 +1,50 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class UnorderedList < Base
6
+
7
+ attr_reader :list_items, :list_style
8
+
9
+ def initialize(**attribs_, &block)
10
+ super(type: :unordered_list, **attribs_, &block)
11
+ @list_style = attribs.delete(:list_style){ :disc }
12
+ @list_items = []
13
+ expand!
14
+ end
15
+
16
+ def list_item(text=nil, **attribs_, &block)
17
+ @list_items << ListItem.new(parent: self, text: text, **attribs_, &block)
18
+ end
19
+
20
+ class ListItem < Base
21
+
22
+ def initialize(**attribs_, &block)
23
+ super(type: :list_item, **attribs_, &block)
24
+ self.text(attribs.delete(:text)) if attribs.key?(:text)
25
+ self.icon(attribs.delete(:icon)) if attribs.key?(:icon)
26
+ self.unordered_list(attribs.delete(:unordered_list)) if attribs.key?(:unordered_list)
27
+ expand!
28
+ end
29
+
30
+ def text(*text, **attribs, &block)
31
+ return @text if locked?
32
+ @text = Components::Typography.new(parent: self, type: :text, text: text, **attribs, &block)
33
+ end
34
+
35
+ def icon(icon=nil, **attribs, &block)
36
+ return @icon if locked?
37
+ @icon = Components::Icon.new(parent: self, icon: icon, **attribs, &block)
38
+ end
39
+
40
+ def unordered_list(**attribs, &block)
41
+ return @unordered_list if locked?
42
+ @unordered_list = UnorderedList.new(parent: self, **attribs, &block)
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,7 +1,3 @@
1
- require 'voom/presenters/dsl/components/base'
2
- require 'voom/presenters/dsl/components/event_base'
3
- Dir[__dir__ + "/components/*.rb"].each {|file| require file }
4
-
5
1
  module Voom
6
2
  module Presenters
7
3
  module DSL
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/user_interface'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -7,9 +5,12 @@ module Voom
7
5
  # This class is held in the container. When a request to render a UI comes in
8
6
  # It creates a new UserInterface instance, binding it to the router and context of the request
9
7
  class Definition
10
- def initialize(namespace, &block)
8
+ attr_reader :name, :namespace, :options
9
+ def initialize(name, namespace, options, &block)
11
10
  @block = block
11
+ @name = name
12
12
  @namespace = namespace
13
+ @options = options
13
14
  end
14
15
 
15
16
  def build
@@ -17,7 +18,7 @@ module Voom
17
18
  end
18
19
 
19
20
  def expand(router: , context:{}, &block)
20
- presenter = UserInterface.new(router: router, context: context, namespace: @namespace, &@block)
21
+ presenter = UserInterface.new(router: router, context: context, name: @name, namespace: @namespace, &@block)
21
22
  yield(presenter) if block
22
23
  presenter.expand_instance
23
24
  end
@@ -30,4 +31,4 @@ module Voom
30
31
  end
31
32
  end
32
33
  end
33
- end
34
+ end
@@ -0,0 +1,43 @@
1
+ require 'base64'
2
+
3
+ module Voom
4
+ module Presenters
5
+ module DSL
6
+ module ProtectFromForgery
7
+ include Base64
8
+
9
+ AUTHENTICITY_TOKEN_LENGTH = 32
10
+
11
+ def authenticity_token_meta_tags(session)
12
+ return unless Presenters::Settings.config.presenters.web_client.protect_from_forgery && session
13
+ [
14
+ '<meta name="csrf-param" content="authenticity_token">',
15
+ "<meta name=\"csrf-token\" content=\"#{form_authenticity_token(session)}\">"
16
+ ].join("\n").html_safe
17
+ end
18
+
19
+ def form_authenticity_token(session)
20
+ session[:_csrf_token] ||= SecureRandom.base64(AUTHENTICITY_TOKEN_LENGTH)
21
+ raw_token = Base64.strict_decode64(session[:_csrf_token])
22
+ one_time_pad = SecureRandom.random_bytes(AUTHENTICITY_TOKEN_LENGTH)
23
+ encrypted_csrf_token = xor_byte_strings(one_time_pad, raw_token)
24
+ masked_token = one_time_pad + encrypted_csrf_token
25
+ Base64.strict_encode64(masked_token)
26
+ end
27
+
28
+
29
+ def xor_byte_strings(s1, s2) # :doc:
30
+ s2 = s2.dup
31
+ size = s1.bytesize
32
+ i = 0
33
+ while i < size
34
+ s2.setbyte(i, s1.getbyte(i) ^ s2.getbyte(i))
35
+ i += 1
36
+ end
37
+ s2
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,23 +1,11 @@
1
1
  require 'ice_nine'
2
- require 'voom/presenters/dsl/definer'
3
- require 'voom/presenters/dsl/components/mixins/common'
4
- require 'voom/presenters/dsl/components/mixins/helpers'
5
- require 'voom/presenters/dsl/components/mixins/dialogs'
6
- require 'voom/presenters/dsl/components/mixins/snackbars'
7
- require 'voom/presenters/dsl/components/mixins/text_fields'
8
- require 'voom/presenters/dsl/components/mixins/date_time_fields'
9
- require 'voom/presenters/dsl/components/mixins/attaches'
10
- require 'voom/presenters/dsl/invalid_presenter'
11
-
12
- require 'voom/serializer'
13
- require 'voom/trace'
14
-
15
2
 
16
3
  module Voom
17
4
  module Presenters
18
5
  module DSL
19
6
  class UserInterface
20
7
  include DSL::Definer
8
+ include DSL::ProtectFromForgery
21
9
  include Components::Mixins::Common
22
10
  include Components::Mixins::Helpers
23
11
  include Components::Mixins::Dialogs
@@ -26,52 +14,62 @@ module Voom
26
14
  include Components::Mixins::TextFields
27
15
  include Components::Mixins::DateTimeFields
28
16
  include Components::Mixins::Attaches
17
+ include Components::Mixins::Event
18
+ extend Pluggable
19
+ include_plugins(:DSLComponents, :DSLHelpers)
29
20
 
30
21
  include Voom::Serializer
31
22
  include Voom::Trace
32
23
 
33
- attr_reader :router, :context, :components, :namespace
24
+ attr_reader :router, :context, :components, :name, :namespace
34
25
  private :context, :router, :namespace
35
26
  alias params context
36
27
 
37
- def initialize(context:, parent: nil, router: nil, namespace: [], &block)
28
+ def initialize(context:, parent: nil, router: nil, name: nil, namespace: [], &block)
38
29
  @parent = parent
39
30
  @router = router || @parent&.send(:router)
40
- @context = context
31
+ @context = context || {}
41
32
  @block = block
42
33
  @header = nil
43
34
  @drawer = nil
44
35
  @components = []
45
36
  @footer = nil
37
+ @name = name
46
38
  @namespace = namespace
39
+ @plugins = []
40
+ @csrf_meta_tags = authenticity_token_meta_tags(@context.fetch(:session, nil))
47
41
  add_global_helpers
42
+ initialize_plugins
48
43
  end
49
44
 
50
- def page(title=nil, **attribs, &block)
45
+ def page(title = nil, **attribs, &block)
51
46
  return @page if locked?
52
47
  @page = Components::Page.new(parent: self, **attribs, &block)
53
48
  end
54
49
 
55
- def header(title=nil, **attribs, &block)
50
+ def header(title = nil, **attribs, &block)
56
51
  return @header if locked?
57
52
  @header = Components::Header.new(parent: self, title: title,
58
53
  **attribs, &block)
59
54
  end
60
55
 
61
- def drawer(name=nil, **attribs, &block)
56
+ def drawer(name = nil, **attribs, &block)
62
57
  return @drawer if locked?
63
58
  @drawer = Components::Drawer.new(parent: self, title: name,
64
59
  **attribs, &block)
65
60
  end
66
61
 
67
62
 
68
-
69
63
  def footer(**attribs, &block)
70
64
  return @footer if locked?
71
65
  @footer = Components::Footer.new(parent: self,
72
66
  **attribs, &block)
73
67
  end
74
68
 
69
+ def progress(**attributes, &block)
70
+ self << Components::Progress.new(parent: self, **attributes, &block)
71
+ end
72
+
75
73
  def attach(presenter, **params, &yield_block)
76
74
  pom = super
77
75
  @header ||= pom.header
@@ -100,6 +98,21 @@ module Voom
100
98
  :presenter
101
99
  end
102
100
 
101
+ def plugin(*plugin_names)
102
+ @plugins.push(*plugin_names)
103
+ self.class.include_plugins(:DSLComponents, :DSLHelpers, plugins: plugin_names)
104
+ end
105
+
106
+ def plugins
107
+ return @plugins if locked?
108
+ return @plugins if @plugins
109
+ end
110
+ alias _plugins_ plugins
111
+
112
+ def csrf_meta_tags
113
+ Presenters::Settings.config.presenters.web_client.protect_from_forgery ? @csrf_meta_tags : nil
114
+ end
115
+
103
116
  private
104
117
 
105
118
  def deep_freeze
@@ -107,8 +120,6 @@ module Voom
107
120
  self
108
121
  end
109
122
 
110
- private
111
-
112
123
  def parent(for_type)
113
124
  nil
114
125
  end
@@ -128,6 +139,10 @@ module Voom
128
139
  end
129
140
  end
130
141
 
142
+ def initialize_plugins
143
+ self.class.include_plugins(:DSLComponents, :DSLHelpers, plugins: @plugins)
144
+ end
145
+
131
146
  def lock!
132
147
  @locked = true
133
148
  end
@@ -0,0 +1 @@
1
+ Dir[File.join(__dir__, 'errors', '*.rb')].each { |file| require file }
@@ -0,0 +1,8 @@
1
+ module Voom
2
+ module Presenters
3
+ module Errors
4
+ class InvalidDsl < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/errors/unprocessable'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module Errors
@@ -7,4 +5,4 @@ module Voom
7
5
  end
8
6
  end
9
7
  end
10
- end
8
+ end
@@ -0,0 +1,59 @@
1
+ module Voom
2
+ module Presenters
3
+ module Generators
4
+ module Inflectors
5
+ def classify(input)
6
+ # "books" => "Book"
7
+ @inflector.classify(input)
8
+ end
9
+
10
+ def pluralize(input)
11
+ #book" => "books"
12
+ @inflector.pluralize(input)
13
+ end
14
+
15
+ def singularize(input)
16
+ #"books" => "book"
17
+ @inflector.singularize(input)
18
+ end
19
+
20
+ def camelize(input)
21
+ # "dry/inflector" => "Dry::Inflector"
22
+ @inflector.camelize(input)
23
+ end
24
+
25
+ def tableize(input)
26
+ # "Book" => "books"
27
+ @inflector.tableize(input)
28
+ end
29
+
30
+ def dasherize(input)
31
+ # "dry_inflector" => "dry-inflector"
32
+ @inflector.dasherize(input)
33
+ end
34
+
35
+ def underscore(input)
36
+ # "dry-inflector" => "dry_inflector"
37
+ @inflector.underscore(input)
38
+ end
39
+
40
+ def demodulize(input)
41
+ # "Dry::Inflector" => "Inflector"
42
+ @inflector.demodulize(input)
43
+ end
44
+
45
+ def humanize(input)
46
+ # "dry_inflector" => "Dry inflector", "author_id" => "Author"
47
+ @inflector.humanize(input)
48
+ end
49
+
50
+ def ordinalize(input)
51
+ # 1 => "1st
52
+ @inflector.ordinalize(input)
53
+ end
54
+
55
+ end
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,115 @@
1
+ require "dry/inflector"
2
+ require_relative 'inflectors'
3
+
4
+ module Voom
5
+ module Presenters
6
+ module Generators
7
+ class Plugin < ::Thor::Group
8
+ TEMPLATES_ROOT = File.join('templates','plugin')
9
+ LIB_ROOT = File.join('lib','voom','presenters','plugins')
10
+ include Thor::Actions
11
+ argument :name
12
+
13
+ def initialize(args = [], local_options = {}, config = {})
14
+ @inflector = Dry::Inflector.new
15
+ super
16
+ end
17
+
18
+ def self.source_root
19
+ File.dirname(__FILE__)
20
+ end
21
+
22
+ no_tasks do
23
+ include Voom::Presenters::Generators::Inflectors
24
+
25
+ def join_path(*parts)
26
+ File.join(*parts.compact)
27
+ end
28
+
29
+ def template_file(template, target_filename=template, source_path=nil, target_path=source_path)
30
+ underscore_name = underscored_name
31
+ source = join_path(TEMPLATES_ROOT, source_path, "#{template}.tt")
32
+ destination = join_path(underscore_name, target_path, target_filename)
33
+ template source, destination
34
+ end
35
+
36
+ def file(file, target_filename=file, source_path=nil, target_path=nil)
37
+ underscore_name = underscored_name
38
+ source = join_path(TEMPLATES_ROOT, source_path, file)
39
+ destination = join_path(underscore_name, target_path, target_filename)
40
+
41
+ copy_file source, destination
42
+ end
43
+
44
+ def lib_dir(*args)
45
+ dir(LIB_ROOT, *args)
46
+ end
47
+
48
+ def dir(*args)
49
+ join_path(*args)
50
+ end
51
+
52
+ def named_dir(*args)
53
+ lib_dir(underscored_name, *args)
54
+ end
55
+
56
+ def underscored_name
57
+ underscore(name)
58
+ end
59
+ end
60
+
61
+ def create_root_files
62
+ file('.gitignore')
63
+ file('Gemfile')
64
+ template_file('LICENSE.txt')
65
+ template_file('presenter_plugin.gemspec', "#{underscored_name}_presenter_plugin.gemspec")
66
+ file 'README.md'
67
+ end
68
+
69
+ def create_plugin
70
+ template_file('plugin.rb', "#{underscored_name}.rb", LIB_ROOT)
71
+ end
72
+
73
+ def create_component_files
74
+ template_file('component.rb', "#{underscored_name}_component.rb",
75
+ lib_dir('components'),
76
+ named_dir('components'))
77
+ template_file('dsl.rb', "#{underscored_name}_dsl.rb",
78
+ lib_dir('components'),
79
+ named_dir('components'))
80
+ template_file('render.rb', "#{underscored_name}_render.rb",
81
+ lib_dir('web_client', 'components'),
82
+ named_dir('web_client', 'components'))
83
+ template_file('component.css', "#{underscored_name}.css",
84
+ dir('views', 'assets', 'css', 'components'))
85
+ template_file('component.js', "#{underscored_name}.js",
86
+ dir('views', 'assets', 'js', 'components'))
87
+ template_file('component.erb', "#{underscored_name}.erb",
88
+ dir('views', 'components'))
89
+ template_file('component_header.erb', "#{underscored_name}_header.erb",
90
+ dir('views', 'components'))
91
+ end
92
+
93
+ def create_action_files
94
+ template_file('action.rb', "#{underscored_name}_action.rb",
95
+ lib_dir('components', 'actions'),
96
+ named_dir('components', 'actions'))
97
+ template_file('dsl.rb', "#{underscored_name}_dsl.rb",
98
+ lib_dir('components', 'actions'),
99
+ named_dir('components', 'actions'))
100
+ template_file('data.rb', "#{underscored_name}_data.rb",
101
+ lib_dir('web_client', 'components', 'actions'),
102
+ named_dir('web_client', 'components', 'actions'))
103
+ template_file('action.js', "#{underscored_name}.js",
104
+ dir('views', 'assets', 'js', 'components', 'actions'))
105
+ end
106
+
107
+ def create_helper_files
108
+ template_file('helper.rb', "#{underscored_name}_helper.rb",
109
+ lib_dir('helpers'),
110
+ named_dir('helpers'))
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end