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,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -8,13 +6,15 @@ module Voom
8
6
  class Base < Components::Base
9
7
  # Options are used by the actions
10
8
  # Params are passed by the user
11
- attr_reader :params, :options
9
+ attr_reader :params, :dynamic_params, :options
12
10
 
13
11
  def initialize(type:, **attribs_, &block)
14
12
  super(type: type, **attribs_, &block)
15
13
  @options = {}
16
14
  extract_options!
17
- @params = attribs.delete(:params) {{}}
15
+ _params_ = attribs.delete(:params) {{}}
16
+ @dynamic_params = extract_dynamic_params(_params_)
17
+ @params = extract_params(_params_)
18
18
  @url = nil
19
19
  end
20
20
 
@@ -23,10 +23,38 @@ module Voom
23
23
  end
24
24
 
25
25
  private
26
+
26
27
  def extract_options!
27
- %i(path presenter target input_tag).each do |option|
28
- optionValue = attribs.delete(option)
29
- @options.merge!({option => optionValue}) if optionValue
28
+ %i(path presenter target input_tag headers).each do |option|
29
+ option_value = attribs.delete(option){:not_found}
30
+ @options.merge!({option => option_value}) unless option_value==:not_found
31
+ end
32
+ end
33
+
34
+ def extract_dynamic_params(hash)
35
+ HashExt::Traverse.traverse(hash) do |k, v|
36
+ if v.respond_to?(:to_hash) || v.respond_to?(:dynamic_parameter)
37
+ [k, clean_dynamic_values(v.to_hash)]
38
+ else
39
+ [nil, nil]
40
+ end
41
+ end
42
+ end
43
+
44
+ # This is an attempt to fix an intermittent bug where "params" would end up in the list of
45
+ # values when using `last_response`.
46
+ def clean_dynamic_values(hash)
47
+ hash[:value].delete(:params) if hash.has_key?(:value) && hash[:value].is_a?(Array)
48
+ hash
49
+ end
50
+
51
+ def extract_params(hash)
52
+ HashExt::Traverse.traverse(hash) do |k, v|
53
+ if v.respond_to?(:dynamic_parameter)
54
+ [nil, nil]
55
+ else
56
+ [k, v]
57
+ end
30
58
  end
31
59
  end
32
60
  end
@@ -34,4 +62,4 @@ module Voom
34
62
  end
35
63
  end
36
64
  end
37
- end
65
+ end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -0,0 +1,17 @@
1
+ require 'voom/presenters/dsl/components/actions/base'
2
+
3
+ module Voom
4
+ module Presenters
5
+ module DSL
6
+ module Components
7
+ module Actions
8
+ class CloseDialog < Actions::Base
9
+ def initialize(**attribs_, &block)
10
+ super(type: :close_dialog, **attribs_, &block)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,7 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
- require 'voom/presenters/namespace'
3
-
4
-
5
1
  module Voom
6
2
  module Presenters
7
3
  module DSL
@@ -12,17 +8,20 @@ module Voom
12
8
 
13
9
  def initialize(**attribs_, &block)
14
10
  super(type: :loads, **attribs_, &block)
11
+ option_value = attribs.delete(:wait_for_download){:not_found}
12
+ @options.merge!(wait_for_download: option_value) unless option_value==:not_found
13
+ @host = @params.fetch(:host, false)
15
14
  end
16
15
 
17
16
  def url
18
- @parent.router.url(render: parse_presenter, command: options[:path], context: params)
17
+ @parent.router.url(render: parse_presenter, command: options[:path], context: params, host: @host)
19
18
  end
20
19
 
21
20
  private
22
21
 
23
22
  def parse_presenter
24
23
  return options[:presenter] if options[:presenter].match(/^https?\:\/\//)
25
- _expand_namespace_(options[:presenter], namespace).gsub(':','/')
24
+ _expand_namespace_(options[:presenter], namespace).gsub(':', '/')
26
25
  end
27
26
  end
28
27
  end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -0,0 +1,17 @@
1
+ require 'voom/presenters/dsl/components/actions/base'
2
+
3
+ module Voom
4
+ module Presenters
5
+ module DSL
6
+ module Components
7
+ module Actions
8
+ class PostMessage < Actions::Base
9
+ def initialize(**attribs_, &block)
10
+ super(type: :post_message, **attribs_, &block)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -9,6 +7,11 @@ module Voom
9
7
  def initialize(**attribs_, &block)
10
8
  super(type: :post, **attribs_, &block)
11
9
  end
10
+
11
+ # Posts posts its parameters as form data, so context should be empty
12
+ # def url
13
+ # @parent.router.url(render: options[:presenter], command: options[:path], context:{})
14
+ # end
12
15
  end
13
16
  end
14
17
  end
@@ -0,0 +1,15 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ module Actions
6
+ class PromptIfDirty < Actions::Base
7
+ def initialize(**attribs_, &block)
8
+ super(type: :prompt_if_dirty, **attribs_, &block)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,6 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
- require'voom/presenters/namespace'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
@@ -11,11 +8,14 @@ module Voom
11
8
 
12
9
  def initialize(**attribs_, &block)
13
10
  super(type: :replaces, **attribs_, &block)
11
+ option_value = attribs.delete(:ignore_input_values) { :not_found }
12
+ @options.merge!(ignore_input_values: option_value) unless option_value == :not_found
13
+ @host = @params.fetch(:host, false)
14
14
  end
15
15
 
16
16
  def url
17
17
  presenter = _expand_namespace_(options[:presenter], namespace)
18
- @parent.router.url(render: presenter, command: options[:path], context: params)
18
+ @parent.router.url(render: presenter, command: options[:path], context: params, host: @host)
19
19
  end
20
20
  end
21
21
  end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -0,0 +1,15 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ module Actions
6
+ class ToggleDisabled < Actions::Base
7
+ def initialize(**attribs_, &block)
8
+ super(type: :toggle_disabled, **attribs_, &block)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/actions/base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -9,6 +7,11 @@ module Voom
9
7
  def initialize(**attribs_, &block)
10
8
  super(type: :update, **attribs_, &block)
11
9
  end
10
+
11
+ # Updates posts its parameters as form data, so context should be empty
12
+ # def url
13
+ # @parent.router.url(render: options[:presenter], command: options[:path], context:{})
14
+ # end
12
15
  end
13
16
  end
14
17
  end
@@ -1,7 +1,3 @@
1
- require 'voom/presenters/dsl/components/event_base'
2
- require 'voom/presenters/dsl/components/mixins/event'
3
- require 'voom/presenters/dsl/components/mixins/tooltips'
4
-
5
1
  module Voom
6
2
  module Presenters
7
3
  module DSL
@@ -13,10 +9,10 @@ module Voom
13
9
 
14
10
  def initialize(**attribs_, &block)
15
11
  super(type: :avatar, **attribs_, &block)
16
- @avatar = attribs.delete(:avatar)
17
- @color = attribs.delete(:color)
18
- @size = attribs.delete(:size)
19
- @position = Array(attribs.delete(:position)).compact
12
+ @avatar = attribs.delete(:avatar)
13
+ @color = attribs.delete(:color)
14
+ @size = attribs.delete(:size){ :default }
15
+ @position = Array(attribs.delete(:position)).compact
20
16
  expand!
21
17
  end
22
18
  end
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/mixins/event'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,10 +1,5 @@
1
1
  require 'securerandom'
2
2
 
3
- require 'voom/serializer'
4
- require 'voom/trace'
5
- require 'voom/presenters/dsl/lockable'
6
- require 'voom/presenters/dsl/components/mixins/yield_to'
7
-
8
3
  module Voom
9
4
  module Presenters
10
5
  module DSL
@@ -18,18 +13,23 @@ module Voom
18
13
  include LoggerMethods
19
14
  include Trace
20
15
  include Mixins::YieldTo
16
+ extend Pluggable
17
+
18
+ attr_reader :type, :id, :tag, :attributes, :draggable, :drop_zone, :css_class
21
19
 
22
- attr_reader :type, :id, :tag, :attributes
23
-
24
20
  alias attribs attributes
25
21
 
26
22
  def initialize(type:, parent:, id: nil, tag: nil, **attributes, &block)
27
- @id = h(id) || generate_id
23
+ @draggable = attributes.delete(:draggable) {nil}
24
+ @drop_zone = attributes.delete(:drop_zone) {nil}
25
+ @css_class = Array(attributes.delete(:class) {nil})
26
+ @id = id || generate_id
28
27
  @tag = tag
29
- @type = h(type)
28
+ @type = type
30
29
  @parent = parent
31
- @attributes = escape(attributes)
30
+ @attributes = attributes
32
31
  @block = block
32
+ initialize_plugins
33
33
  end
34
34
 
35
35
  def expand!
@@ -39,19 +39,14 @@ module Voom
39
39
 
40
40
  private
41
41
 
42
- def h(text)
43
- return text unless text.is_a? String
44
- CGI::escapeHTML(text)
45
- end
46
-
47
- def escape(attributes)
48
- attributes.map {|k, v| [k, h(v)]}.to_h
42
+ def initialize_plugins
43
+ self.class.include_plugins(:DSLComponents, :DSLHelpers, plugins: _plugins_)
49
44
  end
50
45
 
51
46
  def generate_id
52
47
  Voom::Presenters::Settings.config.presenters.id_generator.call(self)
53
48
  end
54
-
49
+
55
50
  protected
56
51
 
57
52
  def parent(for_type)
@@ -63,6 +58,10 @@ module Voom
63
58
  @parent.send(:router)
64
59
  end
65
60
 
61
+ def name
62
+ @parent.send(:name)
63
+ end
64
+
66
65
  def namespace
67
66
  @parent.send(:namespace)
68
67
  end
@@ -70,6 +69,7 @@ module Voom
70
69
  def context
71
70
  @parent.send(:context)
72
71
  end
72
+
73
73
  alias params context
74
74
 
75
75
 
@@ -82,6 +82,13 @@ module Voom
82
82
  @parent.send(:_helpers_) if @parent
83
83
  end
84
84
 
85
+ def plugin(*plugin_names)
86
+ @parent.send(:plugin, *plugin_names) if @parent
87
+ end
88
+
89
+ def _plugins_
90
+ @parent.send(:_plugins_) if @parent
91
+ end
85
92
 
86
93
  def default(key)
87
94
  Settings.default(type, key)
@@ -1,37 +1,37 @@
1
- require 'voom/presenters/dsl/components/mixins/common'
2
- require 'voom/presenters/dsl/components/mixins/tooltips'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
7
4
  module Components
8
5
  class Button < EventBase
9
6
  include Mixins::Tooltips
7
+ include Mixins::Padding
10
8
 
11
9
  BUTTON_TYPES = %i(raised flat fab icon)
12
10
 
13
- attr_accessor :text, :icon, :button_type, :color, :disabled, :size, :position, :full_width, :hidden
11
+ attr_accessor :text, :icon, :button_type, :color, :background_color, :disabled,
12
+ :size, :position, :full_width, :hidden, :wrap_text, :disabled_on_post_finished
14
13
 
15
14
  def initialize(type: nil, **attribs_, &block)
16
- @button_type = h(type) || ((attribs_[:icon] && !attribs_[:text]) ? :icon : nil) || :flat
15
+ @button_type = type || ((attribs_[:icon] && !attribs_[:text]) ? :icon : nil) || :flat
17
16
  super(type: :button, **attribs_, &block)
18
- self.icon(attribs.delete(:icon)) if attribs.key?(:icon)
19
- @text = attribs.delete(:text)
20
17
  @color = attribs.delete(:color)
18
+ @background_color = attribs.delete(:background_color)
19
+ self.icon(attribs.delete(:icon), color: color) if attribs.key?(:icon)
20
+ @text = attribs.delete(:text)
21
21
  @disabled = attribs.delete(:disabled) {false}
22
22
  @hidden = attribs.delete(:hidden) {false}
23
23
  @size = attribs.delete(:size)
24
24
  @full_width = attribs.delete(:full_width) {false}
25
- @position = Array(attribs.delete(:position)).compact
25
+ @wrap_text = attribs.delete(:wrap_text) {true}
26
+ @position = Array(default_position).compact
27
+ @disabled_on_post_finished = attribs.delete(:disabled_on_post_finished) {false}
26
28
  expand!
27
29
  @event_parent_id = self.parent(:form)&.id || id
28
30
  end
29
31
 
30
32
  def icon(icon = nil, **attribs, &block)
31
33
  return @icon if locked?
32
- @icon = Components::Icon.new(parent: self, icon: icon,
33
- **attribs, &block)
34
-
34
+ @icon = Components::Icon.new(parent: self, icon: icon, **attribs, &block)
35
35
  end
36
36
 
37
37
  def image(image = nil, **attribs, &block)
@@ -46,6 +46,10 @@ module Voom
46
46
 
47
47
  private
48
48
 
49
+ def default_position
50
+ attribs.delete(:position){button_type == :fab ? %i(top right) : nil}
51
+ end
52
+
49
53
  def menu_position
50
54
  position.include?(:right) ? :right : nil
51
55
  end