voom-presenters 0.1.10 → 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 (515) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.gem_release.yml +1 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  6. data/.github/ISSUE_TEMPLATE/questions-support.md +10 -0
  7. data/.github/workflows/semantic-release.yml +39 -0
  8. data/.gitignore +4 -2
  9. data/.releaserc +8 -0
  10. data/.ruby-version +2 -1
  11. data/CHANGELOG.md +136 -0
  12. data/CODE-OF-CONDUCT.md +73 -0
  13. data/CONTRIBUTING.md +60 -0
  14. data/Gemfile +12 -3
  15. data/Gemfile.lock +106 -64
  16. data/HISTORY.md +61 -0
  17. data/Procfile +1 -0
  18. data/README.md +75 -22
  19. data/app/demo/component_status.pom +1 -1
  20. data/app/demo/components/avatars.pom +40 -0
  21. data/app/demo/components/cards.pom +11 -4
  22. data/app/demo/components/chips.pom +65 -52
  23. data/app/demo/components/content.pom +111 -0
  24. data/app/demo/components/date_fields.pom +1 -1
  25. data/app/demo/components/datetime_fields.pom +6 -0
  26. data/app/demo/components/dialogs.pom +175 -6
  27. data/app/demo/components/drawers.pom +1 -1
  28. data/app/demo/components/file_inputs.pom +52 -0
  29. data/app/demo/components/footers.pom +1 -1
  30. data/app/demo/components/google_maps.pom +22 -0
  31. data/app/demo/components/headers.pom +80 -20
  32. data/app/demo/components/icons.pom +86 -55
  33. data/app/demo/components/image_lists.pom +100 -0
  34. data/app/demo/components/images.pom +45 -0
  35. data/app/demo/components/layouts.pom +15 -5
  36. data/app/demo/components/lists.pom +51 -17
  37. data/app/demo/components/menus.pom +14 -4
  38. data/app/demo/components/nav/menu.pom +40 -2
  39. data/app/demo/components/nav/pattern_drawer.pom +5 -0
  40. data/app/demo/components/nav/pattern_menu.pom +12 -0
  41. data/app/demo/components/number_fields.pom +53 -0
  42. data/app/demo/components/padding.pom +96 -0
  43. data/app/demo/components/progress.pom +71 -0
  44. data/app/demo/components/selects.pom +44 -5
  45. data/app/demo/components/sliders.pom +54 -0
  46. data/app/demo/components/snackbar.pom +10 -0
  47. data/app/demo/components/steppers.pom +178 -0
  48. data/app/demo/components/tab_bars.pom +66 -0
  49. data/app/demo/components/tables.pom +96 -13
  50. data/app/demo/components/text_areas.pom +23 -3
  51. data/app/demo/components/text_fields.pom +75 -17
  52. data/app/demo/components/toggles.pom +83 -16
  53. data/app/demo/components/tooltips.pom +10 -10
  54. data/app/demo/components/unordered_list.pom +81 -0
  55. data/app/demo/custom_css.pom +37 -0
  56. data/app/demo/events/actions/autocomplete.pom +3 -3
  57. data/app/demo/events/actions/clear.pom +25 -0
  58. data/app/demo/events/actions/dialogs/discard.pom +9 -0
  59. data/app/demo/events/actions/dialogs/show_dialog.pom +4 -2
  60. data/app/demo/events/actions/last_response.pom +40 -0
  61. data/app/demo/events/actions/loads.pom +16 -6
  62. data/app/demo/events/actions/posts.pom +1 -1
  63. data/app/demo/events/actions/prompt_if_dirty.pom +54 -0
  64. data/app/demo/events/actions/toggle_visiblity.pom +4 -3
  65. data/app/demo/events/content_as_form.pom +313 -0
  66. data/app/demo/events/nav/drawer.pom +7 -3
  67. data/app/demo/events/parallel.pom +44 -0
  68. data/app/demo/events/tagged_input.pom +37 -0
  69. data/app/demo/hello_world.pom +3 -0
  70. data/app/demo/markdown.pom +1 -0
  71. data/app/demo/namespaces.pom +89 -0
  72. data/app/demo/nav/top_nav.pom +24 -0
  73. data/app/demo/patterns.pom +19 -0
  74. data/app/demo/patterns/drag_drop.pom +89 -0
  75. data/app/demo/patterns/floating_card.pom +29 -0
  76. data/app/demo/patterns/search_select.pom +106 -0
  77. data/app/demo/plugins/chart.pom +254 -0
  78. data/app/demo/plugins/image_crop.pom +44 -0
  79. data/app/demo/plugins/index.pom +29 -0
  80. data/app/demo/plugins/nav/drawer.pom +19 -0
  81. data/app/demo/shared/context_list.pom +2 -2
  82. data/app/demo/styles.pom +24 -12
  83. data/bin/console +4 -4
  84. data/bin/presenters +3 -0
  85. data/component-status.yml +26 -26
  86. data/config.ru +21 -10
  87. data/docs/settings.md +81 -0
  88. data/lib/hash_ext/traverse.rb +14 -0
  89. data/lib/voom.rb +25 -0
  90. data/lib/voom/container_methods.rb +2 -2
  91. data/lib/voom/engine.rb +5 -0
  92. data/lib/voom/presenters/api/app.rb +46 -13
  93. data/lib/voom/presenters/api/router.rb +3 -87
  94. data/lib/voom/presenters/app.rb +3 -3
  95. data/lib/voom/presenters/cli.rb +28 -0
  96. data/lib/voom/presenters/demo/dragon_drop.rb +48 -0
  97. data/lib/voom/presenters/demo/echo.rb +7 -0
  98. data/lib/voom/presenters/demo/slow.rb +18 -0
  99. data/lib/voom/presenters/dsl/components/actions/autocomplete.rb +15 -0
  100. data/lib/voom/presenters/dsl/components/actions/base.rb +65 -0
  101. data/lib/voom/presenters/dsl/components/actions/clear.rb +15 -0
  102. data/lib/voom/presenters/dsl/components/actions/close_dialog.rb +17 -0
  103. data/lib/voom/presenters/dsl/components/actions/deletes.rb +15 -0
  104. data/lib/voom/presenters/dsl/components/actions/dialog.rb +15 -0
  105. data/lib/voom/presenters/dsl/components/actions/loads.rb +31 -0
  106. data/lib/voom/presenters/dsl/components/actions/navigates.rb +15 -0
  107. data/lib/voom/presenters/dsl/components/actions/post_message.rb +17 -0
  108. data/lib/voom/presenters/dsl/components/actions/posts.rb +20 -0
  109. data/lib/voom/presenters/dsl/components/actions/prompt_if_dirty.rb +15 -0
  110. data/lib/voom/presenters/dsl/components/actions/remove.rb +15 -0
  111. data/lib/voom/presenters/dsl/components/actions/replaces.rb +25 -0
  112. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +15 -0
  113. data/lib/voom/presenters/dsl/components/actions/stepper.rb +15 -0
  114. data/lib/voom/presenters/dsl/components/actions/toggle_disabled.rb +15 -0
  115. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +15 -0
  116. data/lib/voom/presenters/dsl/components/actions/updates.rb +20 -0
  117. data/lib/voom/presenters/dsl/components/avatar.rb +5 -10
  118. data/lib/voom/presenters/dsl/components/badge.rb +0 -2
  119. data/lib/voom/presenters/dsl/components/base.rb +37 -21
  120. data/lib/voom/presenters/dsl/components/button.rb +23 -17
  121. data/lib/voom/presenters/dsl/components/card.rb +54 -42
  122. data/lib/voom/presenters/dsl/components/checkbox.rb +2 -2
  123. data/lib/voom/presenters/dsl/components/chip.rb +10 -13
  124. data/lib/voom/presenters/dsl/components/chipset.rb +33 -0
  125. data/lib/voom/presenters/dsl/components/content.rb +33 -13
  126. data/lib/voom/presenters/dsl/components/date_field.rb +1 -1
  127. data/lib/voom/presenters/dsl/components/datetime_base.rb +0 -3
  128. data/lib/voom/presenters/dsl/components/datetime_field.rb +0 -2
  129. data/lib/voom/presenters/dsl/components/dialog.rb +41 -13
  130. data/lib/voom/presenters/dsl/components/drawer.rb +13 -8
  131. data/lib/voom/presenters/dsl/components/event.rb +117 -59
  132. data/lib/voom/presenters/dsl/components/event_base.rb +1 -3
  133. data/lib/voom/presenters/dsl/components/expansion_panel.rb +3 -6
  134. data/lib/voom/presenters/dsl/components/file_input.rb +34 -0
  135. data/lib/voom/presenters/dsl/components/footer.rb +2 -2
  136. data/lib/voom/presenters/dsl/components/form.rb +3 -16
  137. data/lib/voom/presenters/dsl/components/grid.rb +64 -22
  138. data/lib/voom/presenters/dsl/components/header.rb +19 -6
  139. data/lib/voom/presenters/dsl/components/hidden_field.rb +1 -3
  140. data/lib/voom/presenters/dsl/components/icon.rb +3 -6
  141. data/lib/voom/presenters/dsl/components/icon_base.rb +6 -8
  142. data/lib/voom/presenters/dsl/components/icon_toggle.rb +3 -5
  143. data/lib/voom/presenters/dsl/components/image.rb +61 -13
  144. data/lib/voom/presenters/dsl/components/image_list.rb +43 -0
  145. data/lib/voom/presenters/dsl/components/input.rb +14 -5
  146. data/lib/voom/presenters/dsl/components/link.rb +33 -0
  147. data/lib/voom/presenters/dsl/components/list.rb +11 -16
  148. data/lib/voom/presenters/dsl/components/lists/action.rb +11 -14
  149. data/lib/voom/presenters/dsl/components/lists/actions.rb +60 -0
  150. data/lib/voom/presenters/dsl/components/lists/header.rb +2 -2
  151. data/lib/voom/presenters/dsl/components/lists/line.rb +40 -29
  152. data/lib/voom/presenters/dsl/components/lists/separator.rb +2 -2
  153. data/lib/voom/presenters/dsl/components/menu.rb +56 -16
  154. data/lib/voom/presenters/dsl/components/mixins/append.rb +2 -2
  155. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +7 -3
  156. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +1 -4
  157. data/lib/voom/presenters/dsl/components/mixins/buttons.rb +1 -1
  158. data/lib/voom/presenters/dsl/components/mixins/chips.rb +0 -3
  159. data/lib/voom/presenters/dsl/components/mixins/chipset.rb +19 -0
  160. data/lib/voom/presenters/dsl/components/mixins/common.rb +21 -16
  161. data/lib/voom/presenters/dsl/components/mixins/content.rb +1 -1
  162. data/lib/voom/presenters/dsl/components/mixins/date_time_fields.rb +0 -3
  163. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +0 -3
  164. data/lib/voom/presenters/dsl/components/mixins/event.rb +2 -4
  165. data/lib/voom/presenters/dsl/components/mixins/expansion_panels.rb +1 -1
  166. data/lib/voom/presenters/dsl/components/mixins/file_inputs.rb +16 -0
  167. data/lib/voom/presenters/dsl/components/mixins/google_maps.rb +15 -0
  168. data/lib/voom/presenters/dsl/components/mixins/grids.rb +1 -1
  169. data/lib/voom/presenters/dsl/components/mixins/icons.rb +0 -1
  170. data/lib/voom/presenters/dsl/components/mixins/image_lists.rb +15 -0
  171. data/lib/voom/presenters/dsl/components/mixins/last_response.rb +48 -0
  172. data/lib/voom/presenters/dsl/components/mixins/menus.rb +1 -1
  173. data/lib/voom/presenters/dsl/components/mixins/padding.rb +42 -0
  174. data/lib/voom/presenters/dsl/components/mixins/progress.rb +16 -0
  175. data/lib/voom/presenters/dsl/components/mixins/selects.rb +0 -1
  176. data/lib/voom/presenters/dsl/components/mixins/sliders.rb +15 -0
  177. data/lib/voom/presenters/dsl/components/mixins/snackbars.rb +0 -1
  178. data/lib/voom/presenters/dsl/components/mixins/steppers.rb +15 -0
  179. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +17 -0
  180. data/lib/voom/presenters/dsl/components/mixins/tables.rb +15 -0
  181. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +10 -3
  182. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +0 -5
  183. data/lib/voom/presenters/dsl/components/mixins/tooltips.rb +0 -1
  184. data/lib/voom/presenters/dsl/components/mixins/typography.rb +91 -14
  185. data/lib/voom/presenters/dsl/components/mixins/yield_to.rb +2 -2
  186. data/lib/voom/presenters/dsl/components/number_field.rb +20 -0
  187. data/lib/voom/presenters/dsl/components/page.rb +0 -1
  188. data/lib/voom/presenters/dsl/components/page_title.rb +31 -0
  189. data/lib/voom/presenters/dsl/components/progress.rb +27 -0
  190. data/lib/voom/presenters/dsl/components/radio_button.rb +0 -1
  191. data/lib/voom/presenters/dsl/components/rich_text_area.rb +20 -0
  192. data/lib/voom/presenters/dsl/components/select.rb +23 -12
  193. data/lib/voom/presenters/dsl/components/separator.rb +21 -0
  194. data/lib/voom/presenters/dsl/components/slider.rb +38 -0
  195. data/lib/voom/presenters/dsl/components/snackbar.rb +2 -2
  196. data/lib/voom/presenters/dsl/components/stepper.rb +96 -0
  197. data/lib/voom/presenters/dsl/components/switch.rb +0 -2
  198. data/lib/voom/presenters/dsl/components/tab_bar.rb +50 -0
  199. data/lib/voom/presenters/dsl/components/table.rb +126 -35
  200. data/lib/voom/presenters/dsl/components/text_area.rb +4 -5
  201. data/lib/voom/presenters/dsl/components/text_field.rb +55 -16
  202. data/lib/voom/presenters/dsl/components/time_field.rb +0 -2
  203. data/lib/voom/presenters/dsl/components/toggle_base.rb +8 -6
  204. data/lib/voom/presenters/dsl/components/tooltip.rb +1 -2
  205. data/lib/voom/presenters/dsl/components/typography.rb +6 -7
  206. data/lib/voom/presenters/dsl/components/unordered_list.rb +50 -0
  207. data/lib/voom/presenters/dsl/definer.rb +0 -4
  208. data/lib/voom/presenters/dsl/definition.rb +9 -6
  209. data/lib/voom/presenters/dsl/lockable.rb +1 -5
  210. data/lib/voom/presenters/dsl/protect_from_forgery.rb +43 -0
  211. data/lib/voom/presenters/dsl/user_interface.rb +50 -33
  212. data/lib/voom/presenters/errors.rb +1 -0
  213. data/lib/voom/presenters/errors/invalid_dsl.rb +8 -0
  214. data/lib/voom/presenters/errors/parameter_validation.rb +1 -3
  215. data/lib/voom/presenters/generators/inflectors.rb +59 -0
  216. data/lib/voom/presenters/generators/plugin.rb +115 -0
  217. data/lib/voom/presenters/generators/templates/plugin/.gitignore +12 -0
  218. data/lib/voom/presenters/generators/templates/plugin/Gemfile +6 -0
  219. data/lib/voom/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  220. data/lib/voom/presenters/generators/templates/plugin/README.md +253 -0
  221. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/action.rb.tt +16 -0
  222. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  223. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/component.rb.tt +18 -0
  224. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/dsl.rb.tt +19 -0
  225. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/helpers/helper.rb.tt +15 -0
  226. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/plugin.rb.tt +9 -0
  227. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  228. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/render.rb.tt +23 -0
  229. data/lib/voom/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  230. data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  231. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  232. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  233. data/lib/voom/presenters/generators/templates/plugin/views/components/component.erb.tt +14 -0
  234. data/lib/voom/presenters/generators/templates/plugin/views/components/component_header.erb.tt +20 -0
  235. data/lib/voom/presenters/helpers.rb +2 -8
  236. data/lib/voom/presenters/helpers/date.rb +3 -3
  237. data/lib/voom/presenters/helpers/inflector.rb +1 -1
  238. data/lib/voom/presenters/helpers/rails.rb +18 -6
  239. data/lib/voom/presenters/helpers/rails/model_table.rb +14 -6
  240. data/lib/voom/presenters/helpers/redact.rb +13 -0
  241. data/lib/voom/presenters/helpers/route.rb +15 -2
  242. data/lib/voom/presenters/helpers/time.rb +1 -1
  243. data/lib/voom/presenters/namespace.rb +12 -0
  244. data/lib/voom/presenters/pluggable.rb +37 -0
  245. data/lib/voom/presenters/plugins.rb +7 -0
  246. data/lib/voom/presenters/plugins/google_maps.rb +24 -0
  247. data/lib/voom/presenters/plugins/google_maps/google_map.erb +10 -0
  248. data/lib/voom/presenters/plugins/google_maps/google_map.rb +41 -0
  249. data/lib/voom/presenters/{dsl.rb → registry.rb} +14 -10
  250. data/lib/voom/presenters/router.rb +59 -0
  251. data/lib/voom/presenters/settings.rb +70 -39
  252. data/lib/voom/presenters/version.rb +1 -1
  253. data/lib/voom/presenters/web_client/app.rb +125 -38
  254. data/lib/voom/presenters/web_client/component_decorator_factory.rb +27 -0
  255. data/lib/voom/presenters/web_client/component_html_decorator.rb +50 -0
  256. data/lib/voom/presenters/web_client/component_renderer.rb +49 -0
  257. data/lib/voom/presenters/web_client/custom_css.rb +65 -0
  258. data/lib/voom/presenters/web_client/custom_render.rb +31 -0
  259. data/lib/voom/presenters/web_client/helpers/expand_hash.rb +19 -0
  260. data/lib/voom/presenters/web_client/helpers/form_helpers.rb +14 -0
  261. data/lib/voom/presenters/web_client/helpers/padding_helpers.rb +21 -0
  262. data/lib/voom/presenters/web_client/plugin_headers.rb +37 -0
  263. data/lib/voom/presenters/web_client/router.rb +3 -89
  264. data/lib/voom/railtie.rb +37 -0
  265. data/lib/voom/serializer.rb +2 -2
  266. data/lib/voom/symbol/to_str.rb +3 -3
  267. data/lib/voom/trace.rb +0 -2
  268. data/presenters.gemspec +12 -5
  269. data/public/bundle.css +18221 -0
  270. data/public/bundle.js +59949 -0
  271. data/public/img/demo/avatar.jpg +0 -0
  272. data/public/presenters/custom_css.css +26 -0
  273. data/public/wc.js +52704 -0
  274. data/scripts/build.sh +10 -0
  275. data/views/mdc/.babelrc +8 -0
  276. data/views/mdc/.eslintrc.yml +24 -0
  277. data/views/mdc/.nvmrc +1 -0
  278. data/views/mdc/assets/js/app.js +30 -6
  279. data/views/mdc/assets/js/components/base-component.js +160 -2
  280. data/views/mdc/assets/js/components/base-container.js +87 -0
  281. data/views/mdc/assets/js/components/base-toggle.js +56 -0
  282. data/views/mdc/assets/js/components/button.js +71 -9
  283. data/views/mdc/assets/js/components/cards.js +13 -2
  284. data/views/mdc/assets/js/components/checkboxes.js +11 -11
  285. data/views/mdc/assets/js/components/chips.js +104 -7
  286. data/views/mdc/assets/js/components/content.js +14 -0
  287. data/views/mdc/assets/js/components/data-tables.js +15 -0
  288. data/views/mdc/assets/js/components/datetime.js +83 -20
  289. data/views/mdc/assets/js/components/dialogs.js +130 -27
  290. data/views/mdc/assets/js/components/drag_n_drop.js +182 -0
  291. data/views/mdc/assets/js/components/drawer.js +43 -0
  292. data/views/mdc/assets/js/components/events.js +195 -68
  293. data/views/mdc/assets/js/components/events/action_parameter.js +62 -0
  294. data/views/mdc/assets/js/components/events/action_parameter.test.js +62 -0
  295. data/views/mdc/assets/js/components/events/autocomplete.js +15 -17
  296. data/views/mdc/assets/js/components/events/base.js +142 -16
  297. data/views/mdc/assets/js/components/events/clears.js +15 -12
  298. data/views/mdc/assets/js/components/events/close_dialog.js +50 -0
  299. data/views/mdc/assets/js/components/events/dialog.js +32 -14
  300. data/views/mdc/assets/js/components/events/encode.js +8 -0
  301. data/views/mdc/assets/js/components/events/errors.js +175 -92
  302. data/views/mdc/assets/js/components/events/loads.js +50 -10
  303. data/views/mdc/assets/js/components/events/navigates.js +17 -15
  304. data/views/mdc/assets/js/components/events/plugin.js +18 -0
  305. data/views/mdc/assets/js/components/events/post_message.js +21 -0
  306. data/views/mdc/assets/js/components/events/posts.js +169 -47
  307. data/views/mdc/assets/js/components/events/prompt_if_dirty.js +67 -0
  308. data/views/mdc/assets/js/components/events/removes.js +21 -0
  309. data/views/mdc/assets/js/components/events/replaces.js +110 -57
  310. data/views/mdc/assets/js/components/events/snackbar.js +10 -10
  311. data/views/mdc/assets/js/components/events/stepper.js +21 -0
  312. data/views/mdc/assets/js/components/events/toggle_disabled.js +41 -0
  313. data/views/mdc/assets/js/components/events/toggle_visibility.js +62 -16
  314. data/views/mdc/assets/js/components/file-inputs.js +76 -0
  315. data/views/mdc/assets/js/components/form-fields.js +16 -0
  316. data/views/mdc/assets/js/components/forms.js +9 -60
  317. data/views/mdc/assets/js/components/get_event_target.js +15 -0
  318. data/views/mdc/assets/js/components/grid.js +21 -0
  319. data/views/mdc/assets/js/components/header.js +20 -0
  320. data/views/mdc/assets/js/components/hidden-fields.js +44 -0
  321. data/views/mdc/assets/js/components/icon-toggles.js +10 -17
  322. data/views/mdc/assets/js/components/images.js +19 -0
  323. data/views/mdc/assets/js/components/initialize.js +62 -18
  324. data/views/mdc/assets/js/components/lists.js +10 -5
  325. data/views/mdc/assets/js/components/menus.js +66 -20
  326. data/views/mdc/assets/js/components/mixins/dirtyable.js +22 -0
  327. data/views/mdc/assets/js/components/mixins/event-handler.js +7 -7
  328. data/views/mdc/assets/js/components/mixins/visibility-observer.js +35 -0
  329. data/views/mdc/assets/js/components/plugins.js +86 -0
  330. data/views/mdc/assets/js/components/progress.js +31 -0
  331. data/views/mdc/assets/js/components/radios.js +14 -0
  332. data/views/mdc/assets/js/components/rich-text-area.js +227 -0
  333. data/views/mdc/assets/js/components/rich-text-area/horizontal-rule-blot.js +23 -0
  334. data/views/mdc/assets/js/components/root_document.js +5 -0
  335. data/views/mdc/assets/js/components/selects.js +41 -30
  336. data/views/mdc/assets/js/components/sliders.js +67 -0
  337. data/views/mdc/assets/js/components/snackbar.js +17 -23
  338. data/views/mdc/assets/js/components/steppers.js +48 -0
  339. data/views/mdc/assets/js/components/switches.js +10 -32
  340. data/views/mdc/assets/js/components/tab-bars.js +28 -0
  341. data/views/mdc/assets/js/components/text-fields.js +117 -43
  342. data/views/mdc/assets/js/components/tooltip.js +17 -0
  343. data/views/mdc/assets/js/components/typography.js +28 -0
  344. data/views/mdc/assets/js/components/uninitialize.js +7 -0
  345. data/views/mdc/assets/js/config.js +27 -0
  346. data/views/mdc/assets/js/mdl-stepper.js +1108 -0
  347. data/views/mdc/assets/js/utils/compatibility.js +9 -0
  348. data/views/mdc/assets/js/utils/config.js +73 -0
  349. data/views/mdc/assets/js/utils/config.test.js +59 -0
  350. data/views/mdc/assets/js/utils/urls.js +5 -2
  351. data/views/mdc/assets/js/wc.js +111 -0
  352. data/views/mdc/assets/scss/app.scss +20 -5
  353. data/views/mdc/assets/scss/components/avatar.scss +51 -7
  354. data/views/mdc/assets/scss/components/button.scss +20 -7
  355. data/views/mdc/assets/scss/components/card.scss +13 -7
  356. data/views/mdc/assets/scss/components/checkbox.scss +0 -4
  357. data/views/mdc/assets/scss/components/chip.scss +4 -0
  358. data/views/mdc/assets/scss/components/content.scss +36 -0
  359. data/views/mdc/assets/scss/components/data-table.scss +91 -0
  360. data/views/mdc/assets/scss/components/datetime.scss +7 -2
  361. data/views/mdc/assets/scss/components/dialog.scss +7 -2
  362. data/views/mdc/assets/scss/components/drag_n_drop.scss +17 -0
  363. data/views/mdc/assets/scss/components/drawer.scss +82 -0
  364. data/views/mdc/assets/scss/components/expansion-panel.scss +2 -2
  365. data/views/mdc/assets/scss/components/fab.scss +23 -4
  366. data/views/mdc/assets/scss/components/file-input.scss +18 -0
  367. data/views/mdc/assets/scss/components/grid.scss +74 -3
  368. data/views/mdc/assets/scss/components/header.scss +21 -0
  369. data/views/mdc/assets/scss/components/icon-button-toggles.scss +2 -0
  370. data/views/mdc/assets/scss/components/icon.scss +23 -0
  371. data/views/mdc/assets/scss/components/image-list.scss +18 -0
  372. data/views/mdc/assets/scss/components/image.scss +14 -16
  373. data/views/mdc/assets/scss/components/list.scss +23 -0
  374. data/views/mdc/assets/scss/components/menu.scss +14 -3
  375. data/views/mdc/assets/scss/components/progress.scss +1 -0
  376. data/views/mdc/assets/scss/components/radio.scss +4 -0
  377. data/views/mdc/assets/scss/components/rich-text-area.scss +73 -0
  378. data/views/mdc/assets/scss/components/select.scss +10 -3
  379. data/views/mdc/assets/scss/components/separator.scss +3 -0
  380. data/views/mdc/assets/scss/components/slider.scss +1 -0
  381. data/views/mdc/assets/scss/components/snackbar.scss +2 -2
  382. data/views/mdc/assets/scss/components/stepper.scss +235 -0
  383. data/views/mdc/assets/scss/components/switch.scss +13 -4
  384. data/views/mdc/assets/scss/components/tab-bars.scss +4 -0
  385. data/views/mdc/assets/scss/components/textfield.scss +14 -3
  386. data/views/mdc/assets/scss/components/tooltip.scss +3 -0
  387. data/views/mdc/assets/scss/components/typography.scss +10 -0
  388. data/views/mdc/assets/scss/components/unordered-lists.scss +17 -0
  389. data/views/mdc/assets/scss/components/vendor/quill.snow.css +945 -0
  390. data/views/mdc/assets/scss/material.blue_grey-orange.min.css +1 -1
  391. data/views/mdc/assets/scss/media.scss +39 -0
  392. data/views/mdc/assets/scss/palette.scss +16 -0
  393. data/views/mdc/assets/scss/styles.scss +43 -0
  394. data/views/mdc/assets/scss/theme.scss +25 -2
  395. data/views/mdc/body/dismissable-drawer.erb +34 -0
  396. data/views/mdc/body/drawer/divider.erb +1 -0
  397. data/views/mdc/body/drawer/item.erb +13 -0
  398. data/views/mdc/body/drawer/label.erb +1 -0
  399. data/views/mdc/body/drawers/menu.erb +1 -1
  400. data/views/mdc/body/footers/menu_item.erb +2 -2
  401. data/views/mdc/body/header.erb +38 -30
  402. data/views/mdc/body/modal-drawer.erb +35 -0
  403. data/views/mdc/body/snackbar.erb +12 -6
  404. data/views/mdc/components/actions/autocomplete.rb +8 -0
  405. data/views/mdc/components/actions/clear.rb +11 -0
  406. data/views/mdc/components/actions/close_dialog.rb +10 -0
  407. data/views/mdc/components/actions/delete.rb +11 -0
  408. data/views/mdc/components/actions/dialog.rb +11 -0
  409. data/views/mdc/components/actions/loads.rb +17 -0
  410. data/views/mdc/components/actions/navigates.rb +11 -0
  411. data/views/mdc/components/actions/post.rb +14 -0
  412. data/views/mdc/components/actions/post_message.rb +10 -0
  413. data/views/mdc/components/actions/prompt_if_dirty.rb +17 -0
  414. data/views/mdc/components/actions/remove.rb +10 -0
  415. data/views/mdc/components/actions/replaces.rb +16 -0
  416. data/views/mdc/components/actions/resolver.rb +39 -0
  417. data/views/mdc/components/actions/snackbar.rb +12 -0
  418. data/views/mdc/components/actions/stepper.rb +10 -0
  419. data/views/mdc/components/actions/toggle_disabled.rb +10 -0
  420. data/views/mdc/components/actions/toggle_visibility.rb +10 -0
  421. data/views/mdc/components/actions/update.rb +10 -0
  422. data/views/mdc/components/avatar.erb +12 -7
  423. data/views/mdc/components/badge.erb +1 -1
  424. data/views/mdc/components/button.erb +10 -8
  425. data/views/mdc/components/buttons/button.erb +19 -14
  426. data/views/mdc/components/buttons/fab.erb +9 -2
  427. data/views/mdc/components/buttons/icon.erb +12 -5
  428. data/views/mdc/components/buttons/image.erb +11 -5
  429. data/views/mdc/components/{display.erb → caption.erb} +0 -0
  430. data/views/mdc/components/card.erb +67 -41
  431. data/views/mdc/components/checkbox.erb +32 -23
  432. data/views/mdc/components/chip.erb +39 -22
  433. data/views/mdc/components/chipset.erb +18 -0
  434. data/views/mdc/components/content.erb +37 -11
  435. data/views/mdc/components/datetime.erb +12 -17
  436. data/views/mdc/components/dialog.erb +45 -22
  437. data/views/mdc/components/drag_and_drop/drag_and_drop.rb +16 -0
  438. data/views/mdc/components/event.erb +3 -9
  439. data/views/mdc/components/expansion_panel.erb +8 -6
  440. data/views/mdc/components/file_input.erb +17 -0
  441. data/views/mdc/components/form.erb +7 -8
  442. data/views/mdc/components/grid.erb +27 -10
  443. data/views/mdc/components/headline.erb +2 -0
  444. data/views/mdc/components/hidden_field.erb +5 -1
  445. data/views/mdc/components/icon.erb +7 -5
  446. data/views/mdc/components/icon_toggle.erb +9 -8
  447. data/views/mdc/components/image.erb +23 -5
  448. data/views/mdc/components/image_list.erb +38 -0
  449. data/views/mdc/components/link.erb +3 -13
  450. data/views/mdc/components/list.erb +9 -4
  451. data/views/mdc/components/list/actions/switch.erb +1 -1
  452. data/views/mdc/components/list/avatar.erb +2 -1
  453. data/views/mdc/components/list/header.erb +5 -3
  454. data/views/mdc/components/list/hidden_field.erb +3 -0
  455. data/views/mdc/components/list/icon.erb +2 -1
  456. data/views/mdc/components/list/line.erb +24 -13
  457. data/views/mdc/components/list/menu.erb +7 -2
  458. data/views/mdc/components/list/separator.erb +1 -1
  459. data/views/mdc/components/menu.erb +20 -16
  460. data/views/mdc/components/number_field.erb +38 -0
  461. data/views/mdc/components/{subheading.erb → overline.erb} +0 -0
  462. data/views/mdc/components/page_title.erb +2 -2
  463. data/views/mdc/components/progress.erb +11 -0
  464. data/views/mdc/components/radio_button.erb +19 -10
  465. data/views/mdc/components/render.erb +2 -3
  466. data/views/mdc/components/rich_text_area.erb +22 -0
  467. data/views/mdc/components/select.erb +28 -8
  468. data/views/mdc/components/separator.erb +3 -0
  469. data/views/mdc/components/shared/hint_error_display.erb +9 -0
  470. data/views/mdc/components/shared/input_label.erb +7 -0
  471. data/views/mdc/components/slider.erb +43 -0
  472. data/views/mdc/components/snackbar.erb +2 -6
  473. data/views/mdc/components/stepper.erb +47 -0
  474. data/views/mdc/components/stepper/step.erb +33 -0
  475. data/views/mdc/components/{title.erb → subtitle.erb} +0 -0
  476. data/views/mdc/components/switch.erb +28 -12
  477. data/views/mdc/components/tab_bar.erb +35 -0
  478. data/views/mdc/components/table.erb +28 -13
  479. data/views/mdc/components/table/checkbox.erb +20 -0
  480. data/views/mdc/components/table/column.erb +18 -0
  481. data/views/mdc/components/table/footer.erb +8 -0
  482. data/views/mdc/components/table/header.erb +14 -4
  483. data/views/mdc/components/table/pagination.erb +11 -24
  484. data/views/mdc/components/table/row.erb +7 -5
  485. data/views/mdc/components/text_area.erb +15 -7
  486. data/views/mdc/components/text_field.erb +38 -28
  487. data/views/mdc/components/tooltip.erb +2 -2
  488. data/views/mdc/components/typography.erb +7 -5
  489. data/views/mdc/components/unordered_list.erb +10 -0
  490. data/views/mdc/components/unordered_list/icon.erb +3 -0
  491. data/views/mdc/components/unordered_list/list_item.erb +7 -0
  492. data/views/mdc/layout.erb +45 -31
  493. data/views/mdc/package-lock.json +11786 -6868
  494. data/views/mdc/package.json +66 -29
  495. data/views/mdc/web.erb +4 -0
  496. data/views/mdc/webpack.config.js +14 -1
  497. metadata +353 -31
  498. data/app/demo/components/forms.pom +0 -31
  499. data/lib/voom-presenters.rb +0 -9
  500. data/lib/voom/presenters-engine.rb +0 -40
  501. data/lib/voom/presenters.rb +0 -13
  502. data/lib/voom/presenters/dsl/components/action.rb +0 -35
  503. data/lib/voom/presenters/web_client/markdown_render.rb +0 -16
  504. data/public/.gitignore +0 -2
  505. data/scripts/bump.sh +0 -3
  506. data/scripts/deploy-demo.sh +0 -2
  507. data/scripts/release.sh +0 -4
  508. data/views/mdc/assets/js/dialog-polyfill.js +0 -738
  509. data/views/mdc/assets/js/material.js +0 -3996
  510. data/views/mdc/assets/scss/components/icon-toggles.scss +0 -9
  511. data/views/mdc/assets/scss/components/table-pagination.scss +0 -65
  512. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +0 -13
  513. data/views/mdc/body/drawer.erb +0 -18
  514. data/views/mdc/components/modal.erb +0 -15
  515. data/views/mdc/components/static.erb +0 -7
@@ -0,0 +1,16 @@
1
+ require 'voom/presenters/dsl/components/actions/base'
2
+
3
+
4
+ module Voom
5
+ module Presenters
6
+ module Plugins
7
+ module <%= classify(name) %>
8
+ class <%= classify(name) %>Action < DSL::Components::Actions::Base
9
+ def initialize(**attribs_, &block)
10
+ super(type: :<%= underscore(name) %>_action, **attribs_, &block)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '<%= classify(name) %>_action'
2
+
3
+ module Voom
4
+ module Presenters
5
+ module Plugins
6
+ module <%= classify(name) %>
7
+ # Event Actions are methods that appear inside an event block.
8
+ # They do something on the (web) client and require code written for the client.
9
+ # Name this actionJs method whatever you want
10
+ # The data for this actionJs is rendered into the DOM using the file:
11
+ # web_client/components/actions/<%= classify(name) %>_data.rb
12
+ # The javascript that performs the actionJs is defined in the file:
13
+ # views/js/components/actions/<%= classify(name) %>_action.js
14
+ module DSLEventActions
15
+ def <%= underscore(name) %>_action(text, **attributes, &block)
16
+ self << <%= classify(name) %>::<%= classify(name) %>Action.new(text: text, parent: self, **attributes, &block)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ require 'voom/presenters/dsl/components/event_base'
2
+
3
+ module Voom
4
+ module Presenters
5
+ module Plugins
6
+ module <%= classify(name) %>
7
+ class <%= classify(name) %>Component < DSL::Components::EventBase
8
+ attr_reader :random_fact
9
+ def initialize(random_fact, **attribs_, &block)
10
+ @random_fact = random_fact
11
+ super(type: :<%= underscore(name) %>, **attribs_, &block)
12
+ expand!
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '<%= underscore(name) %>_component'
2
+
3
+ module Voom
4
+ module Presenters
5
+ module Plugins
6
+ module <%= classify(name) %>
7
+ # Components add new methods to the POM component hierarchy. They should add a component object to the
8
+ # POM component stream. These components are the declarative instructions that are used to render a client.
9
+ # POM components require corresponding views templates and JS that render them.
10
+ # Name this method whatever you want.
11
+ module DSLComponents
12
+ def <%= underscore(name) %>(random_fact, **attributes, &block)
13
+ self << <%= classify(name) %>::<%= classify(name) %>Component.new(random_fact, parent: self, **attributes, &block)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module Voom
2
+ module Presenters
3
+ module Plugins
4
+ module <%= classify(name) %>
5
+ # Helpers are added to all POM in the system automatically when the plugin is included on the POM or globally.
6
+ module DSLHelpers
7
+ # Add your methods here
8
+ def random_fact
9
+ "http://en.wikipedia.org/wiki/Special:Randompage"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ # Loads the plugin features
2
+ # Helpers
3
+ require_relative '<%= underscore(name) %>/helpers/<%= underscore(name) %>_helper'
4
+ # Components
5
+ require_relative '<%= underscore(name) %>/components/<%= underscore(name) %>_dsl'
6
+ require_relative '<%= underscore(name) %>/web_client/components/<%= underscore(name) %>_render'
7
+ # Actions
8
+ require_relative '<%= underscore(name) %>/components/actions/<%= underscore(name) %>_dsl'
9
+ require_relative '<%= underscore(name) %>/web_client/components/actions/<%= underscore(name) %>_data'
@@ -0,0 +1,17 @@
1
+ module Voom
2
+ module Presenters
3
+ module Plugins
4
+ module <%= classify(name) %>
5
+ # Web Client Actions set up the the event handler data that will be consumed by a javascript class
6
+ # This data will be stored on the DOM as a data attribute defined in the
7
+ # file: views/components/assets/<%= underscore(name) %>.erb
8
+ module WebClientActions
9
+ def action_data_<%= underscore(name) %>_action(action, _parent_id, *)
10
+ # Type, URL, Options, Params (passed into javascript event/action classes)
11
+ [action.type, action.url, action.options.to_h, action.attributes.to_h]
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module Voom
2
+ module Presenters
3
+ module Plugins
4
+ module <%= classify(name) %>
5
+ module WebClientComponents
6
+ def render_<%= underscore(name) %>(comp,render:, components:, index:)
7
+ view_dir = File.join(__dir__, '../../../../../../..', 'views', 'components')
8
+ render.call :erb, :<%= underscore(name) %>, views: view_dir,
9
+ locals: {comp: comp,
10
+ components: components, index: index}
11
+ end
12
+ # The string returned from this method will be added to the HTML header section of the page layout
13
+ # It will be called once for the page.
14
+ # The pom is passed along with the sinatra render method.
15
+ def render_header_<%= underscore(name) %>(_pom, render:)
16
+ view_dir = File.join(__dir__, '../../../../../../..', 'views', 'components')
17
+ render.call :erb, :<%= underscore(name) %>_header, views: view_dir
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -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_relative 'helpers/date'
2
- require_relative 'helpers/time'
3
- require_relative 'helpers/inflector'
4
- require_relative '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_relative 'helpers/rails'
6
+ include Helpers::Redact
7
+ if defined?(::Rails)
14
8
  include Voom::Presenters::Helpers::Rails
15
9
  end
16
10
  end
@@ -2,10 +2,10 @@ module Voom
2
2
  module Presenters
3
3
  module Helpers
4
4
  module Date
5
- LONG_FORMAT='%m/%d/%Y'
6
- SHORT_FORMAT='%d %b %Y'
5
+ LONG_FORMAT='%B %e, %Y'
6
+ SHORT_FORMAT='%e %b'
7
7
 
8
- def format_date(date, format: '%m/%d/%Y')
8
+ def format_date(date, format: LONG_FORMAT)
9
9
  date ? date.strftime(format) : ''
10
10
  end
11
11
 
@@ -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,7 +1,4 @@
1
1
  if defined?(Rails)
2
- require_relative 'rails/currency'
3
- require_relative 'rails/model_table'
4
-
5
2
  module Voom
6
3
  module Presenters
7
4
  module Helpers
@@ -9,12 +6,19 @@ if defined?(Rails)
9
6
  include ActionView::Helpers::AssetUrlHelper
10
7
  include Voom::Presenters::Helpers::Rails::Currency
11
8
  include Voom::Presenters::Helpers::Rails::ModelTable
9
+ include Namespace
10
+
12
11
  def default_url_options
13
12
  {}
14
13
  end
15
14
 
16
- def presenters_path(presenter, **params)
17
- path = voom_presenters_web_client_app_path(params)
15
+ def presenters_path(presenter, host: false, **params)
16
+ presenter = _expand_namespace_(presenter, namespace)
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
+
18
22
  if path.include?('?')
19
23
  path = path.sub('?', "#{presenter}?")
20
24
  else
@@ -24,8 +28,16 @@ if defined?(Rails)
24
28
  end
25
29
  path
26
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
27
39
  end
28
40
  end
29
41
  end
30
42
  end
31
- end
43
+ end
@@ -5,8 +5,9 @@ module Voom
5
5
  module ModelTable
6
6
  # Build a a table from a Rails model
7
7
  def table_for(query_,
8
- empty_icon: nil,
8
+ empty_icon: 'far fa-folder-open fa-rotate-180',
9
9
  except: [:id, :created_at, :updated_at],
10
+ timezone: nil, # The timezone to covnert _at and _on values
10
11
  selectable: false, &block)
11
12
  row1 = query_.first
12
13
  if row1
@@ -16,27 +17,34 @@ module Voom
16
17
 
17
18
  query_.each do |item_|
18
19
  row do
19
- _table_row_(__columns__, block, except, item_)
20
+ _table_row_(__columns__, block, except, item_, timezone: timezone)
20
21
  end
21
22
  end
22
23
  end
23
24
  else
24
- body "You have no #{query_.arel_table.name.pluralize}", level: 2
25
- icon empty_icon, size: '10rem' if empty_icon
25
+ icon empty_icon, size: '6rem' if empty_icon
26
+ body "You have no #{query_.arel_table.name.pluralize.humanize}"
26
27
  end
27
28
  end
28
29
 
29
30
 
30
31
  private
31
- def _table_row_(__columns__, block, except, item_)
32
+ def _table_row_(__columns__, block, except, item_, timezone: nil)
32
33
  __columns__.each do |col|
33
34
  next if except.include?(col.name.to_sym)
34
- column item_.send(col.name.to_sym) do
35
+ value = format_value(col.name,item_.send(col.name.to_sym), timezone: timezone)
36
+ column value do
35
37
  self.instance_exec(item_, col.name.to_sym, &block) if block
36
38
  end
37
39
  end
38
40
  end
39
41
 
42
+ def format_value(col_name, value, timezone:)
43
+ return format_time_long(value, timezone: timezone) if timezone &&
44
+ col_name.ends_with?('_at') || col_name.ends_with?('_on')
45
+ value
46
+ end
47
+
40
48
  def _table_header_(__columns__, except)
41
49
  header do
42
50
  __columns__.each do |col|
@@ -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