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
@@ -0,0 +1,21 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "<%= name %>_presenter_plugin"
6
+ spec.version = '0.0.1'
7
+ spec.authors = ["<%= `git config user.name`.strip %>"]
8
+ spec.email = ["<%= `git config user.email`.strip %>"]
9
+
10
+ spec.summary = %q{<%= name %> presenter plugin.}
11
+ spec.homepage = 'http://github.com/<%= `git config user.name`.strip %>/<%= name %>_presenters_plugin'
12
+ spec.license = "MIT"
13
+
14
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
15
+ f.match(%r{^(test|spec|features)/})
16
+ end
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_development_dependency "bundler", "~> 1.16"
20
+ spec.add_development_dependency "rake", "~> 10.0"
21
+ end
@@ -0,0 +1,21 @@
1
+ /* Custom CSS for this component - defines a fade in animation*/
2
+ #random_fact {
3
+ opacity: 0;
4
+ }
5
+
6
+ #random_fact.load {
7
+ opacity: 1;
8
+ animation-name: fadeInOpacity;
9
+ animation-iteration-count: 1;
10
+ animation-timing-function: ease-in;
11
+ animation-duration: 2s;
12
+ }
13
+
14
+ @keyframes fadeInOpacity {
15
+ 0% {
16
+ opacity: 0;
17
+ }
18
+ 100% {
19
+ opacity: 1;
20
+ }
21
+ }
@@ -0,0 +1,15 @@
1
+ // This event callback pushes its results into the results array and returns a promise.
2
+ function <%=underscore(name)%>_action(_options, params, _event, results) {
3
+ var promiseObj = new Promise(function(resolve) {
4
+ console.log('<%= classify(name) %> called');
5
+ // Reload iFrame: https://stackoverflow.com/questions/86428/what-s-the-best-way-to-reload-refresh-an-iframe
6
+ document.getElementById('random_fact').src += '';
7
+ results.push({
8
+ action: 'action',
9
+ content: JSON.stringify({data: params.text}),
10
+ statusCode: 200,
11
+ });
12
+ resolve(results);
13
+ });
14
+ return promiseObj;
15
+ }
@@ -0,0 +1,39 @@
1
+ // Optional Javascript callback class. You typically need to define this when you have data to submit, or special
2
+ // event handling to bind to.
3
+ // To hook this up you need to provide the `v-plugin` class and
4
+ // data-plugin-callback='RandomFacts' on the element.
5
+ class RandomFacts {
6
+ // passed the DOM element that has the .v-plugin class on it.
7
+ constructor(element) {
8
+ // This is where you might pull data elements into your
9
+ // component from the markup. Like so:
10
+ // this.data = element.dataset.someDataICareAbout;
11
+ }
12
+
13
+ // Optional
14
+ // Called before the component is submitted via post/put. Allows the component to add its key/value pairs to the
15
+ // submitted data.
16
+ // If you provide this you need to add the v-input class to your DOM element to get called.
17
+ // Containers iterate their elements that have the v-input class defined on them and invoke the prepareSubmit
18
+ // function for each.
19
+ prepareSubmit(params) {
20
+ // params is a key,value pair. Add name/value like so:
21
+ // params.push(['some_name', 'some_value']);
22
+ }
23
+
24
+ // Optional
25
+ // Called whenever a container is about to be submitted, before prepareSubmit.
26
+ // returns true on success
27
+ // returns on failure return an error object that can be processed by VErrors:
28
+ // { email: ["email must be filled", "email must be from your domain"] }
29
+ // { page: ["must be filled"] }
30
+ // Returning an error stops the submission.
31
+ validate(formData) {
32
+ return true;
33
+ }
34
+
35
+ // Optional
36
+ // Clear's the control
37
+ clear() {
38
+ }
39
+ }
@@ -0,0 +1,14 @@
1
+ <!--Custom markup.
2
+ If the plugin defines a component then it should set v-plugin and data-plugin-callback to the class of the component
3
+
4
+ If the plugin posts data then it should define the v-input class.
5
+ That will cause its validate and prepareSubmit methods in the component to be called
6
+
7
+ If the plugin has events it publishes then the erb :"components/event" needs to be invoked to
8
+ hookup the event handling markup
9
+
10
+ Any additional data you want to pass to your component javascript should be setup here as data attributes.
11
+ -->
12
+ <iframe id="random_fact" class='v-plugin v-input' data-plugin-callback='RandomFacts'
13
+ src="<%%= comp.random_fact %>" height=512
14
+ <%%= erb :"components/event", :locals => {comp: comp, events: comp.events, parent_id: comp.id} %>></iframe>
@@ -0,0 +1,20 @@
1
+ <style>
2
+ <%%= File.read(File.expand_path('../assets/css/components/<%= underscore(name) %>.css', __dir__) ) %>
3
+ </style>
4
+
5
+ <script>
6
+ // This file is defining the callback method that will be invoked when the custom plugin actionJs `actionJs` is encountered
7
+ <%%= File.read(File.expand_path('../assets/js/components/actions/<%= underscore(name) %>.js', __dir__) ) %>
8
+ // This file is defining the plugin component that will be delegated to by the WebClient.
9
+ <%%= File.read(File.expand_path('../assets/js/components/<%= underscore(name) %>.js', __dir__) ) %>
10
+
11
+ // Custom javascript specific to this sample plugin - sets the class name that causes the initial load to
12
+ // animate a transition (defined in the component.css.tt file)
13
+ function load() {
14
+ document.getElementById('random_fact').className = ' load';
15
+ }
16
+
17
+ window.onload = load;
18
+ </script>
19
+
20
+
@@ -1,16 +1,10 @@
1
- require 'voom/presenters/helpers/date'
2
- require 'voom/presenters/helpers/time'
3
- require 'voom/presenters/helpers/inflector'
4
- require 'voom/presenters/helpers/errors'
5
-
6
1
  module Voom
7
2
  module Presenters
8
3
  module Helpers
9
4
  include Helpers::Time
10
5
  include Helpers::Date
11
- include Helpers::Errors
12
- if defined?(Rails)
13
- require 'voom/presenters/helpers/rails'
6
+ include Helpers::Redact
7
+ if defined?(::Rails)
14
8
  include Voom::Presenters::Helpers::Rails
15
9
  end
16
10
  end
@@ -3,7 +3,7 @@ module Voom
3
3
  module Helpers
4
4
  module Inflector
5
5
  def inflector
6
- @inflector ||= Dry::Inflector.new
6
+ @_inflector_ ||= Dry::Inflector.new
7
7
  end
8
8
 
9
9
  def humanize(text)
@@ -1,8 +1,4 @@
1
1
  if defined?(Rails)
2
- require 'voom/presenters/helpers/rails/currency'
3
- require 'voom/presenters/helpers/rails/model_table'
4
- require 'voom/presenters/namespace'
5
-
6
2
  module Voom
7
3
  module Presenters
8
4
  module Helpers
@@ -11,15 +7,18 @@ if defined?(Rails)
11
7
  include Voom::Presenters::Helpers::Rails::Currency
12
8
  include Voom::Presenters::Helpers::Rails::ModelTable
13
9
  include Namespace
10
+
14
11
  def default_url_options
15
12
  {}
16
13
  end
17
14
 
18
- def presenters_path(presenter, **params)
15
+ def presenters_path(presenter, host: false, **params)
19
16
  presenter = _expand_namespace_(presenter, namespace)
20
- presenter = presenter.gsub(':','/')
17
+ presenter = presenter.gsub(':', '/')
18
+
19
+ path = host ? voom_presenters_web_client_app_url(params, host: router.base_url) :
20
+ voom_presenters_web_client_app_path(params)
21
21
 
22
- path = voom_presenters_web_client_app_path(params)
23
22
  if path.include?('?')
24
23
  path = path.sub('?', "#{presenter}?")
25
24
  else
@@ -29,8 +28,16 @@ if defined?(Rails)
29
28
  end
30
29
  path
31
30
  end
31
+
32
+ alias presenter_path presenters_path
33
+
34
+ def presenters_url(presenter, host: true, **params)
35
+ presenters_path(presenter, host: host, **params)
36
+ end
37
+
38
+ alias presenter_url presenters_url
32
39
  end
33
40
  end
34
41
  end
35
42
  end
36
- end
43
+ end
@@ -0,0 +1,13 @@
1
+ module Voom
2
+ module Presenters
3
+ module Helpers
4
+ module Redact
5
+ # https://material.io/guidelines/patterns/data-formats.html#data-formats-data-redaction-truncation
6
+ def redact(string, last_chars = 4)
7
+ return "" unless string
8
+ "• • • #{string.split(//).last(last_chars).join}"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,16 +1,23 @@
1
- require 'voom/presenters/namespace'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module Helpers
6
4
  module Route
7
5
  include Namespace
8
6
 
9
- def presenters_path(presenter, **params)
7
+ def presenters_path(presenter, host: false, **params)
10
8
  presenter = _expand_namespace_(presenter, namespace)
11
- presenter = presenter.gsub(':','/')
12
- router.url(render: presenter, context: params)
9
+ presenter = presenter.gsub(':', '/')
10
+ router.url(render: presenter, host: host, context: params)
13
11
  end
12
+
13
+ alias presenter_path presenters_path
14
+
15
+ # Full qualified URL
16
+ def presenters_url(presenter, **params)
17
+ presenters_path(presenter, host: true, **params)
18
+ end
19
+
20
+ alias presenter_url presenters_url
14
21
  end
15
22
  end
16
23
  end
@@ -0,0 +1,37 @@
1
+ include Voom::Trace
2
+
3
+ module Voom
4
+ module Presenters
5
+ module Pluggable
6
+ def include_plugins(*layers, plugins: [],
7
+ plugin_method: method(:include))
8
+ plugins = Array(plugins) + Array(Voom::Presenters::Settings.config.presenters.plugins)
9
+ plugins.uniq.each do |plugin|
10
+ plugin(plugin, *layers, plugin_method: plugin_method)
11
+ end
12
+ end
13
+
14
+
15
+ # Returns the module for the specified plugin. If the module is not
16
+ # defined, the corresponding plugin required.
17
+ def plugin_module(plugin)
18
+ module_name = plugin.to_s.gsub(/(^|_)(.)/) {|x| x[-1..-1].upcase}
19
+ unless Voom::Presenters::Plugins.const_defined?(module_name, false)
20
+ trace {"Method plugin loading plugin: #{plugin}"}
21
+ load "voom/presenters/plugins/#{plugin}.rb"
22
+ end
23
+ Voom::Presenters::Plugins.const_get(module_name)
24
+ end
25
+
26
+ def plugin(plugin, *layers, plugin_method: method(:include))
27
+ m = plugin.is_a?(Module) ? plugin : plugin_module(plugin)
28
+ layers.each do |layer|
29
+ if m.const_defined?(layer, false) && !self.const_defined?(layer, false)
30
+ trace {"Injecting plugin(#{m.const_get(layer).inspect}) into #{self.inspect}!"}
31
+ plugin_method.call(m.const_get(layer))
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,7 @@
1
+ module Voom
2
+ module Presenters
3
+ module Plugins
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,24 @@
1
+ module Voom
2
+ module Presenters
3
+ module Plugins
4
+ module GoogleMaps
5
+ module DSLComponents
6
+ def google_map(**attributes, &block)
7
+ self << GoogleMap.new(parent: self, **attributes, &block)
8
+ end
9
+ end
10
+ module WebClientComponents
11
+ def render_google_map(comp,
12
+ render:,
13
+ components:,
14
+ index:)
15
+ view_dir = File.join(__dir__, 'google_maps')
16
+ render.call :erb, :google_map, views: view_dir,
17
+ locals: {comp: comp,
18
+ components: components, index: index}
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,10 @@
1
+ <% if comp %>
2
+ <img id="<%= comp.id %>"
3
+ class="v-image v-google-map-image <%= comp.events ? 'v-actionable' : nil%>"
4
+ src="<%= comp.url %>"
5
+ border="0"
6
+ height="<%= comp.height %>"
7
+ width="<%= comp.width %>"
8
+ alt=""
9
+ <%= erb :"components/event", :locals => {comp: comp, events: comp.events, parent_id: comp.id} %>>
10
+ <% end %>
@@ -2,9 +2,9 @@ require 'uri'
2
2
 
3
3
  module Voom
4
4
  module Presenters
5
- module DSL
6
- module Components
7
- class GoogleMap < Base
5
+ module Plugins
6
+ module GoogleMaps
7
+ class GoogleMap < DSL::Components::EventBase
8
8
 
9
9
  attr_reader :url, :google_api_key, :height, :width
10
10
 
@@ -19,6 +19,7 @@ module Voom
19
19
  @scale = attribs.delete(:scale) { 1 }
20
20
  @google_api_key = attribs.delete(:google_api_key) { ENV['GOOGLE_API_KEY'] }
21
21
  @url = build_static_map_image_url
22
+ expand!
22
23
  end
23
24
 
24
25
  private
@@ -1,16 +1,6 @@
1
- require 'voom/trace'
2
-
3
1
  module Voom
4
2
  module Presenters
5
- def self.define(name, namespace: nil, &block)
6
- unless namespace
7
- namespace = name.to_s.split(':')
8
- name = namespace.pop
9
- end
10
- DSL.define(name, namespace, &block)
11
- end
12
-
13
- module DSL
3
+ class Registry
14
4
  class << self
15
5
  include Voom::Trace
16
6
  end
@@ -21,10 +11,10 @@ module Voom
21
11
  @registry
22
12
  end
23
13
 
24
- def self.define(name, namespace, &block)
14
+ def self.define(name, namespace, options, &block)
25
15
  namespace = Array(namespace).map(&:to_s)
26
- fq_name = namespace.any? ? namespace.join(':') + ':'+name.to_s : name.to_s
27
- registry[fq_name] = Voom::Presenters::DSL::Definition.new(namespace, &block)
16
+ fq_name = namespace.any? ? namespace.join(':') + ':' + name.to_s : name.to_s
17
+ registry[fq_name] = Voom::Presenters::DSL::Definition.new(name, namespace, options, &block)
28
18
  end
29
19
 
30
20
  def self.load(directory)
@@ -55,12 +45,20 @@ module Voom
55
45
 
56
46
  def self.register(name, definition)
57
47
  return Voom::Presenters::App.register(name: name, presenter: definition) unless Voom::Presenters::App.registered?(name)
58
- logger.warn {"Warning attempted to redefine the presenter: #{name}!"}
59
48
  end
60
49
 
61
50
  def self.build(definition)
62
51
  definition.build
63
52
  end
64
53
  end
54
+
55
+ def self.define(name, namespace: nil, options: {}, &block)
56
+ unless namespace
57
+ namespace = name.to_s.split(':')
58
+ name = namespace.pop
59
+ end
60
+ Registry.define(name, namespace, options, &block)
61
+ end
62
+
65
63
  end
66
64
  end
@@ -0,0 +1,59 @@
1
+ require 'rack'
2
+
3
+ module Voom
4
+ module Presenters
5
+ class Router
6
+
7
+ attr_reader :base_url
8
+
9
+ def initialize(base_url: nil)
10
+ @base_url = base_url
11
+ end
12
+
13
+ def url(command: nil, render: nil, host: false, context:)
14
+ _params_ = context.dup
15
+ return build_render_url(render, _params_, host: host) unless command
16
+ _params_[:redirect]=build_render_url(render, _params_) if render
17
+ build_command_url(command, _params_)
18
+ end
19
+
20
+ def scrub_params(_params_)
21
+ _params_.delete('captures')
22
+ _params_.delete('presenter')
23
+ _params_.delete('action')
24
+ _params_.delete('errors')
25
+ _params_
26
+ end
27
+
28
+ private
29
+
30
+ def build_command_url(command, params)
31
+ return '' unless command
32
+ add_query_params(command, params)
33
+ end
34
+
35
+ def build_render_url(render_, params, host:)
36
+ return '#' unless render_
37
+ render = render_.to_s
38
+ return render if render.start_with?('http')
39
+ render = render.gsub(':', '/')
40
+ seperator = render.start_with?('/') ? '' : '/'
41
+ url = "#{host ? base_url : nil}#{seperator}#{render}"
42
+ add_query_params(url, params)
43
+ end
44
+
45
+ def add_query_params(url, params)
46
+ query_params = build_params(params)
47
+ if (!query_params.nil? && !query_params.empty?)
48
+ query_seperator = url.include?('?') ? '&' : '?'
49
+ url = "#{url}#{query_seperator}#{query_params}"
50
+ end
51
+ url
52
+ end
53
+
54
+ def build_params(params)
55
+ Rack::Utils.build_nested_query(scrub_params(params))
56
+ end
57
+ end
58
+ end
59
+ end