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,4 +1,3 @@
1
- require 'voom/presenters/dsl/components/toggle_base'
2
1
  module Voom
3
2
  module Presenters
4
3
  module DSL
@@ -1,26 +1,20 @@
1
- require 'voom/presenters/dsl/components/text_field'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
6
4
  module Components
7
5
  class RichTextArea < TextField
8
- attr_reader :placeholder
6
+ attr_reader :placeholder, :height, :resizable
9
7
 
10
8
  def initialize(**attribs_, &block)
11
9
  super(type: :rich_text_area, **attribs_, &block)
12
- @rows = attribs.delete(:rows) || default(:rows)
13
10
  @placeholder = attribs.delete(:placeholder)
11
+ @rows = attribs.delete(:rows) || default(:rows)
12
+ @height = "#{@rows * 24}px"
13
+ @resizable = attribs.delete(:resizable) { false }
14
14
  expand!
15
15
  end
16
-
17
- def height
18
- return @height if locked?
19
- @height = "#{@rows * 12}px"
20
- end
21
-
22
16
  end
23
17
  end
24
18
  end
25
19
  end
26
- end
20
+ end
@@ -1,17 +1,16 @@
1
- require 'voom/presenters/dsl/components/input'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
6
4
  module Components
7
5
  class Select < Input
8
6
 
9
- attr_reader :required, :full_width, :options
7
+ attr_reader :required, :full_width, :options, :outlined
10
8
 
11
9
  def initialize(**attribs_, &block)
12
10
  super(type: :select, **attribs_, &block)
13
11
  @required = attribs.delete(:required)
14
12
  @full_width = attribs.delete(:full_width){ true }
13
+ @outlined = attribs.delete(:outlined){ true }
15
14
  @options = []
16
15
  expand!
17
16
  end
@@ -21,18 +20,27 @@ module Voom
21
20
  @label = text
22
21
  end
23
22
 
24
- def icon(icon=nil, **attribs, &block)
25
- return @icon if locked?
26
- @icon = Components::Icon.new(parent: self, icon: icon,
27
- **attribs, &block)
28
- end
29
-
30
23
  def option(text=nil, **attribs, &block)
31
24
  @options << Option.new(parent: self,
32
25
  text: text,
33
26
  **attribs, &block)
34
27
  end
35
28
 
29
+ def value
30
+ @options.select(&:_selected?).first&.value
31
+ end
32
+
33
+ def hint(hint=nil)
34
+ return @hint if locked?
35
+ @hint = hint
36
+ end
37
+
38
+ def icon(icon=nil, **attribs, &block)
39
+ return @icon if locked?
40
+ @icon = Components::Icon.new(parent: self, icon: icon, position: attribs.delete(:position){:right},
41
+ **attribs, &block)
42
+ end
43
+
36
44
  class Option < Base
37
45
  attr_reader :selected, :disabled
38
46
 
@@ -54,6 +62,10 @@ module Voom
54
62
  return @text if locked?
55
63
  @text = text
56
64
  end
65
+
66
+ def _selected?
67
+ @selected
68
+ end
57
69
  end
58
70
  end
59
71
  end
@@ -0,0 +1,21 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class Separator < Base
6
+ attr_reader :padding
7
+
8
+ def initialize(**attribs_, &block)
9
+ super(type: :separator, **attribs_, &block)
10
+ padding = attribs.delete(:padding) {:full}
11
+ @padding = validate_padding(coerce_padding(padding)).uniq if padding != nil
12
+ expand!
13
+ end
14
+
15
+ private
16
+ include Mixins::Padding
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,17 +1,16 @@
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
7
4
  module Components
8
- class Slider < EventBase
9
- include Mixins::Tooltips
10
- attr_reader :name, :value_min, :value_max, :step, :show_tracker_marks, :discrete
5
+ class Slider < Input
6
+ attr_reader :value_min,
7
+ :value_max,
8
+ :step,
9
+ :show_tracker_marks,
10
+ :discrete
11
11
 
12
12
  def initialize(**attribs_, &block)
13
13
  super(type: :slider, **attribs_, &block)
14
- @name = attribs.delete(:name)
15
14
  @value_min = attribs.delete(:value_min){0}
16
15
  @value_max = attribs.delete(:value_max){100}
17
16
  @step = attribs.delete(:step){nil}
@@ -1,7 +1,3 @@
1
- require 'voom/presenters/helpers/errors'
2
- require 'voom/presenters/dsl/components/button'
3
- require 'voom/presenters/dsl/components/content'
4
-
5
1
  module Voom
6
2
  module Presenters
7
3
  module DSL
@@ -77,12 +73,6 @@ module Voom
77
73
  def button(text = nil, stepper_type, **options, &block)
78
74
  btn = StepperButton.new(stepper_type, parent: self, text: text,
79
75
  **options, &block)
80
-
81
- btn.instance_eval do
82
- event :click do
83
- stepper stepper_type
84
- end
85
- end
86
76
  @buttons << btn
87
77
  end
88
78
 
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/toggle_base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,6 +1,3 @@
1
- require 'voom/presenters/helpers/errors'
2
- require 'voom/presenters/dsl/components/mixins/common'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
@@ -1,20 +1,17 @@
1
- require 'voom/presenters/dsl/components/mixins/common'
2
- require 'voom/presenters/dsl/components/mixins/event'
3
- require 'voom/presenters/dsl/components/mixins/tooltips'
4
- require 'voom/presenters/dsl/components/mixins/chips'
5
- require 'voom/presenters/dsl/components/mixins/selects'
6
- require 'voom/presenters/dsl/components/mixins/icons'
7
-
8
1
  module Voom
9
2
  module Presenters
10
3
  module DSL
11
4
  module Components
12
5
  class Table < Base
13
- attr_accessor :header, :rows, :selectable
6
+ include Mixins::Common
7
+ include Mixins::Event
8
+ attr_accessor :header, :rows, :selectable, :width, :border
14
9
 
15
10
  def initialize(**attribs_, &block)
16
11
  super(type: :table, **attribs_, &block)
17
12
  @selectable = attribs.delete(:selectable)
13
+ @border = attribs.delete(:border){ true }
14
+ @width = attribs.delete(:width)
18
15
  @rows = []
19
16
  expand!
20
17
  end
@@ -25,6 +22,12 @@ module Voom
25
22
  **attribs, &block)
26
23
  end
27
24
 
25
+ def footer(**attribs, &block)
26
+ return @footer if locked?
27
+ @footer = Row.new(parent: self, type: :footer,
28
+ **attribs, &block)
29
+ end
30
+
28
31
  def row(**attribs, &block)
29
32
  @rows << Row.new(parent: self, type: :row,
30
33
  **attribs, &block)
@@ -55,41 +58,57 @@ module Voom
55
58
  def checkbox(**attributes, &block)
56
59
  return @checkbox if locked?
57
60
  field_name = @type == :header ? 'all' : "#{attributes.delete(:name)}[]"
61
+ tag = @type == :header ? '' : @parent.tag
58
62
  @checkbox = Components::Checkbox.new(parent: self,
59
63
  name: field_name,
64
+ tag: tag,
60
65
  **attributes,
61
66
  &block)
62
67
  end
63
68
 
64
69
  class Column < EventBase
65
70
  include Mixins::Tooltips
66
- include Mixins::Chips
71
+ include Mixins::Chipset
67
72
  include Mixins::Selects
68
73
  include Mixins::Icons
74
+ include Mixins::Typography
75
+ include Mixins::Content
69
76
 
70
- attr_accessor :numeric, :color, :components
77
+ attr_accessor :align, :color, :components, :colspan
71
78
 
72
79
  def initialize(**attribs_, &block)
73
80
  super(type: :column, **attribs_, &block)
74
81
  value = attribs.delete(:value)
75
- @numeric = attribs.delete(:numeric){numeric?(value)}
76
- self.value(value) if value
82
+ @align = validate_alignment(attribs.delete(:align){numeric?(value) ? :right : :left})
83
+ self.value(value, **attribs.slice(:markdown)) if value
77
84
  @color = attribs.delete(:color)
85
+ @colspan = attribs.delete(:colspan)
78
86
  @components = []
79
87
  expand!
80
88
  end
81
89
 
82
90
  def value(*value, **attribs, &block)
83
91
  return @value if locked?
84
- @numeric = numeric?(*value) if value.size ==1
85
92
  @value = Components::Typography.new(parent: self, type: :text, text: value, **attribs, &block)
86
93
  end
87
94
 
95
+ def numeric?(_value = value&.text)
96
+ return true if _value.is_a? Numeric
97
+ (_value.to_s.strip.sub(/\D/, '') =~ /^[\$]?[-+]?(,?[0-9])*\.?[0-9]+$/) != nil
98
+ end
99
+
88
100
  private
89
- def numeric?(value)
90
- return true if value.is_a? Numeric
91
- (value.to_s.strip.sub(/\D/, '') =~ /^[\$]?[-+]?(,?[0-9])*\.?[0-9]+$/) != nil
101
+ VALID_ALIGNMENTS = %i[left center right].freeze
102
+
103
+ def validate_alignment(value)
104
+ return :left if value.nil?
105
+ unless VALID_ALIGNMENTS.include?(value.to_sym)
106
+ raise Errors::ParameterValidation,
107
+ "Invalid column alignment! Valid alignements include #{VALID_ALIGNMENTS.join(', ')}"
108
+ end
109
+ value
92
110
  end
111
+
93
112
  end
94
113
 
95
114
  end
@@ -141,16 +160,16 @@ module Voom
141
160
  end
142
161
 
143
162
  def button(icon_name, page, replace_id = @replace_id, replace_presenter = @replace_presenter)
144
- __attribs__ = attribs.merge({page: page, page_size: @page_size})
145
- Components::Icon.new(parent: self, icon: icon_name) do
163
+ __attribs__ = attribs.merge({ page: page, page_size: @page_size })
164
+ Components::Button.new(parent: self, type: :icon, icon: icon_name) do
146
165
  event :click do
147
- replaces replace_id, replace_presenter, __attribs__
166
+ replaces replace_id, replace_presenter, __attribs__
148
167
  end
149
168
  end
150
169
  end
151
170
 
152
171
  def select(options, current_option, total_records, replace_id = @replace_id, replace_presenter = @replace_presenter)
153
- __attribs__ = attribs.reject{|key,val| [:page_size, :page].include? key }
172
+ __attribs__ = attribs.reject{ |key,val| [:page_size, :page].include? key }
154
173
  Components::Select.new(parent: self, name: :page_size, full_width: false) do
155
174
  options.each do |num|
156
175
  option selected: (num == current_option) do
@@ -1,12 +1,10 @@
1
- require 'voom/presenters/dsl/components/text_field'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
6
4
  module Components
7
5
  class TextArea < TextField
8
6
  attr_reader :rows, :cols
9
-
7
+
10
8
  def initialize(**attribs_, &block)
11
9
  super(type: :text_area, **attribs_, &block)
12
10
  @rows = attribs.delete(:rows) || default(:rows)
@@ -1,20 +1,26 @@
1
- require 'voom/presenters/dsl/components/input'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
6
4
  module Components
7
5
  class TextField < Input
8
6
 
9
- attr_reader :required, :full_width, :password, :disabled, :auto_complete
7
+ attr_reader :required,
8
+ :full_width,
9
+ :auto_complete,
10
+ :case_type,
11
+ :behavior
12
+
13
+ VALID_CASE_TYPES = %i[mixed upper lower].freeze
10
14
 
11
15
  def initialize(**attribs_, &block)
12
16
  super(type: :text_field, **attribs_, &block)
13
17
  @required = attribs.delete(:required){ false }
14
18
  @full_width = attribs.delete(:full_width){ true }
15
- @password = attribs.delete(:password){ false }
16
- @disabled = attribs.delete(:disabled){ false }
17
- @auto_complete = attribs.delete(:auto_complete){ true }
19
+ @case_type = validate_case_type(attribs.delete(:case_type) { :mixed })
20
+ @auto_complete = validate_auto_complete(attribs.delete(:auto_complete) { :off })
21
+ @behavior = determine_behavior(attribs.delete(:password), attribs.delete(:behavior))
22
+ label(attribs.delete(:label))if attribs.key?(:label)
23
+ value(attribs.delete(:value))if attribs.key?(:value)
18
24
  expand!
19
25
  end
20
26
 
@@ -44,12 +50,13 @@ module Voom
44
50
  @hint = hint
45
51
  end
46
52
 
47
- def error(error=nil)
48
- return @error if locked?
49
- @error = error
53
+ def behavior
54
+ return "type=\"#{@behavior}\"" unless @behavior == 'currency'
55
+ return 'type="number" min="0.00" max="10000000000.00" step="0.01"'
50
56
  end
51
-
57
+
52
58
  private
59
+
53
60
  def json_regexp(regexp)
54
61
  str = regexp.inspect.
55
62
  sub('\\A', '^').
@@ -62,9 +69,45 @@ module Voom
62
69
  gsub(/\s/, '')
63
70
  Regexp.new(str).source
64
71
  end
72
+
73
+ def validate_auto_complete(value)
74
+ case value
75
+ when false, :disabled, 'disabled', 'off', nil
76
+ :off
77
+ when true, :enabled, 'enabled', 'on'
78
+ :on
79
+ else # :on, :off, client-specific values
80
+ value
81
+ end
82
+ end
83
+
84
+ def validate_case_type(case_type)
85
+ return unless case_type
86
+ case_type = case_type.to_sym
87
+
88
+ raise Errors::ParameterValidation, "Invalid case type specified: #{case_type}" unless VALID_CASE_TYPES.include?(case_type)
89
+ case_type
90
+ end
91
+
92
+ def determine_behavior(password, behavior)
93
+ unless password.nil?
94
+ logger.warn(
95
+ 'The `password` attribute of text_field is deprecated. ' \
96
+ 'Use `text_field behavior: :password` instead.'
97
+ )
98
+ end
99
+
100
+ case password
101
+ when nil
102
+ behavior
103
+ when true
104
+ :password
105
+ when false
106
+ :text
107
+ end
108
+ end
65
109
  end
66
110
  end
67
111
  end
68
112
  end
69
113
  end
70
-
@@ -1,5 +1,3 @@
1
- require 'voom/presenters/dsl/components/datetime_base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,20 +1,22 @@
1
- require 'voom/presenters/dsl/components/mixins/event'
2
- require 'voom/presenters/dsl/components/input'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
7
4
  module Components
8
5
  # Base class used by toggle classes
9
6
  class ToggleBase < Input
10
- attr_accessor :text, :checked, :value, :disabled
11
-
7
+ attr_accessor :text,
8
+ :text_color,
9
+ :checked,
10
+ :value,
11
+ :off_value
12
+
12
13
  def initialize(**attribs_, &block)
13
14
  super(**attribs_, &block)
14
15
  @text = attribs.delete(:text)
16
+ @text_color = attribs.delete(:text_color)
15
17
  @checked = attribs.delete(:checked) { false }
16
18
  @value = attribs.delete(:value)
17
- @disabled = attribs.delete(:disabled) { false }
19
+ @off_value = attribs.delete(:off_value)
18
20
  end
19
21
  end
20
22
  end