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
@@ -1,15 +1,14 @@
1
- require_relative '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
- attr_reader :rows
9
-
6
+ attr_reader :rows, :cols
7
+
10
8
  def initialize(**attribs_, &block)
11
9
  super(type: :text_area, **attribs_, &block)
12
- @rows = attribs.delete(:rows) || 3
10
+ @rows = attribs.delete(:rows) || default(:rows)
11
+ @cols = attribs.delete(:cols) || default(:cols) unless full_width
13
12
  expand!
14
13
  end
15
14
  end
@@ -1,18 +1,26 @@
1
- require_relative '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
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
- @required = attribs.delete(:required)
17
+ @required = attribs.delete(:required){ false }
14
18
  @full_width = attribs.delete(:full_width){ true }
15
- @password = attribs.delete(:password)
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)
16
24
  expand!
17
25
  end
18
26
 
@@ -23,8 +31,7 @@ module Voom
23
31
 
24
32
  def icon(icon=nil, **attribs, &block)
25
33
  return @icon if locked?
26
- @icon = Components::Icon.new(parent: self, icon: icon,
27
- context: context,
34
+ @icon = Components::Icon.new(parent: self, icon: icon, position: attribs.delete(:position){:right},
28
35
  **attribs, &block)
29
36
  end
30
37
 
@@ -43,17 +50,13 @@ module Voom
43
50
  @hint = hint
44
51
  end
45
52
 
46
- def error(error=nil)
47
- return @error if locked?
48
- @error = error
49
- end
50
-
51
- def readonly(readonly=nil)
52
- return @readonly if locked?
53
- @readonly = readonly
53
+ def behavior
54
+ return "type=\"#{@behavior}\"" unless @behavior == 'currency'
55
+ return 'type="number" min="0.00" max="10000000000.00" step="0.01"'
54
56
  end
55
57
 
56
58
  private
59
+
57
60
  def json_regexp(regexp)
58
61
  str = regexp.inspect.
59
62
  sub('\\A', '^').
@@ -66,9 +69,45 @@ module Voom
66
69
  gsub(/\s/, '')
67
70
  Regexp.new(str).source
68
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
69
109
  end
70
110
  end
71
111
  end
72
112
  end
73
113
  end
74
-
@@ -1,5 +1,3 @@
1
- require_relative 'datetime_base'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -1,20 +1,22 @@
1
- require_relative 'mixins/event'
2
- require_relative '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
@@ -7,7 +7,6 @@ module Voom
7
7
 
8
8
  def initialize(**attribs_, &block)
9
9
  super(type: :tooltip,
10
- context: context,
11
10
  **attribs_, &block)
12
11
  @position = attribs.delete(:position){ :left }
13
12
  self.text(attribs.delete(:text)) if attribs.key?(:text)
@@ -16,7 +15,7 @@ module Voom
16
15
 
17
16
  def text(*text, **attribs, &block)
18
17
  return @text if locked?
19
- @text = Components::Typography.new(parent: self, type: :text, text: text, context: context, **attribs, &block)
18
+ @text = Components::Typography.new(parent: self, type: :text, text: text, **attribs, &block)
20
19
  end
21
20
  end
22
21
  end
@@ -1,6 +1,3 @@
1
- require_relative 'mixins/event'
2
- require_relative 'mixins/tooltips'
3
-
4
1
  module Voom
5
2
  module Presenters
6
3
  module DSL
@@ -8,23 +5,25 @@ module Voom
8
5
  class Typography < EventBase
9
6
  include Mixins::Tooltips
10
7
 
11
- attr_accessor :text, :level, :color, :position
8
+ attr_accessor :text, :level, :color, :position, :inline, :markdown
12
9
 
13
- def initialize(parent:, **attribs_, &block)
10
+ def initialize(parent:, level: nil, **attribs_, &block)
14
11
  super(type: :text, parent: parent, **attribs_, &block)
15
12
  @text = Array(attribs.delete(:text)||'').flatten.join("\n\n").split("\n\n")
16
- @level = attribs.delete(:level){1}
13
+ @level = level
17
14
  @color = attribs.delete(:color)
15
+ @inline = attribs.delete(:inline) { false }
18
16
  @position = Array(attribs.delete(:position)).compact
17
+ @markdown = attribs.delete(:markdown) { true }
19
18
  expand!
20
19
  end
21
20
 
22
21
  def icon(icon=nil, **attribs, &block)
23
22
  return @icon if locked?
24
23
  @icon = Components::Icon.new(parent: self, icon: icon,
25
- context: context,
26
24
  **attribs, &block)
27
25
  end
26
+
28
27
  end
29
28
  end
30
29
  end
@@ -0,0 +1,50 @@
1
+ module Voom
2
+ module Presenters
3
+ module DSL
4
+ module Components
5
+ class UnorderedList < Base
6
+
7
+ attr_reader :list_items, :list_style
8
+
9
+ def initialize(**attribs_, &block)
10
+ super(type: :unordered_list, **attribs_, &block)
11
+ @list_style = attribs.delete(:list_style){ :disc }
12
+ @list_items = []
13
+ expand!
14
+ end
15
+
16
+ def list_item(text=nil, **attribs_, &block)
17
+ @list_items << ListItem.new(parent: self, text: text, **attribs_, &block)
18
+ end
19
+
20
+ class ListItem < Base
21
+
22
+ def initialize(**attribs_, &block)
23
+ super(type: :list_item, **attribs_, &block)
24
+ self.text(attribs.delete(:text)) if attribs.key?(:text)
25
+ self.icon(attribs.delete(:icon)) if attribs.key?(:icon)
26
+ self.unordered_list(attribs.delete(:unordered_list)) if attribs.key?(:unordered_list)
27
+ expand!
28
+ end
29
+
30
+ def text(*text, **attribs, &block)
31
+ return @text if locked?
32
+ @text = Components::Typography.new(parent: self, type: :text, text: text, **attribs, &block)
33
+ end
34
+
35
+ def icon(icon=nil, **attribs, &block)
36
+ return @icon if locked?
37
+ @icon = Components::Icon.new(parent: self, icon: icon, **attribs, &block)
38
+ end
39
+
40
+ def unordered_list(**attribs, &block)
41
+ return @unordered_list if locked?
42
+ @unordered_list = UnorderedList.new(parent: self, **attribs, &block)
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,7 +1,3 @@
1
- require_relative 'components/base'
2
- require_relative 'components/event_base'
3
- Dir[__dir__ + "/components/*.rb"].each {|file| require file }
4
-
5
1
  module Voom
6
2
  module Presenters
7
3
  module DSL
@@ -1,5 +1,3 @@
1
- require_relative 'user_interface'
2
-
3
1
  module Voom
4
2
  module Presenters
5
3
  module DSL
@@ -7,8 +5,12 @@ module Voom
7
5
  # This class is held in the container. When a request to render a UI comes in
8
6
  # It creates a new UserInterface instance, binding it to the router and context of the request
9
7
  class Definition
10
- def initialize(&block)
8
+ attr_reader :name, :namespace, :options
9
+ def initialize(name, namespace, options, &block)
11
10
  @block = block
11
+ @name = name
12
+ @namespace = namespace
13
+ @options = options
12
14
  end
13
15
 
14
16
  def build
@@ -16,16 +18,17 @@ module Voom
16
18
  end
17
19
 
18
20
  def expand(router: , context:{}, &block)
19
- presenter = UserInterface.new(router: router, context: context, &@block)
21
+ presenter = UserInterface.new(router: router, context: context, name: @name, namespace: @namespace, &@block)
20
22
  yield(presenter) if block
21
23
  presenter.expand_instance
22
24
  end
23
25
 
26
+ # Used by attach
24
27
  def expand_child(parent:, context: {})
25
- presenter = UserInterface.new(parent: parent, context: context, &@block)
28
+ presenter = UserInterface.new(parent: parent, context: context, namespace: @namespace, &@block)
26
29
  presenter.expand_instance(freeze: false)
27
30
  end
28
31
  end
29
32
  end
30
33
  end
31
- end
34
+ end
@@ -2,12 +2,8 @@ module Voom
2
2
  module Presenters
3
3
  module DSL
4
4
  module Lockable
5
- def lock!
6
- @locked = true
7
- end
8
-
9
5
  def locked?
10
- @locked || frozen?
6
+ @parent.send(:locked?)
11
7
  end
12
8
  end
13
9
  end
@@ -0,0 +1,43 @@
1
+ require 'base64'
2
+
3
+ module Voom
4
+ module Presenters
5
+ module DSL
6
+ module ProtectFromForgery
7
+ include Base64
8
+
9
+ AUTHENTICITY_TOKEN_LENGTH = 32
10
+
11
+ def authenticity_token_meta_tags(session)
12
+ return unless Presenters::Settings.config.presenters.web_client.protect_from_forgery && session
13
+ [
14
+ '<meta name="csrf-param" content="authenticity_token">',
15
+ "<meta name=\"csrf-token\" content=\"#{form_authenticity_token(session)}\">"
16
+ ].join("\n").html_safe
17
+ end
18
+
19
+ def form_authenticity_token(session)
20
+ session[:_csrf_token] ||= SecureRandom.base64(AUTHENTICITY_TOKEN_LENGTH)
21
+ raw_token = Base64.strict_decode64(session[:_csrf_token])
22
+ one_time_pad = SecureRandom.random_bytes(AUTHENTICITY_TOKEN_LENGTH)
23
+ encrypted_csrf_token = xor_byte_strings(one_time_pad, raw_token)
24
+ masked_token = one_time_pad + encrypted_csrf_token
25
+ Base64.strict_encode64(masked_token)
26
+ end
27
+
28
+
29
+ def xor_byte_strings(s1, s2) # :doc:
30
+ s2 = s2.dup
31
+ size = s1.bytesize
32
+ i = 0
33
+ while i < size
34
+ s2.setbyte(i, s1.getbyte(i) ^ s2.getbyte(i))
35
+ i += 1
36
+ end
37
+ s2
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,23 +1,11 @@
1
1
  require 'ice_nine'
2
- require_relative 'definer'
3
- require_relative 'components/mixins/common'
4
- require_relative 'components/mixins/helpers'
5
- require_relative 'components/mixins/dialogs'
6
- require_relative 'components/mixins/snackbars'
7
- require_relative 'components/mixins/text_fields'
8
- require_relative 'components/mixins/date_time_fields'
9
- require_relative 'invalid_presenter'
10
-
11
- require 'voom/serializer'
12
- require 'voom/trace'
13
-
14
2
 
15
3
  module Voom
16
4
  module Presenters
17
5
  module DSL
18
6
  class UserInterface
19
7
  include DSL::Definer
20
- include Lockable
8
+ include DSL::ProtectFromForgery
21
9
  include Components::Mixins::Common
22
10
  include Components::Mixins::Helpers
23
11
  include Components::Mixins::Dialogs
@@ -25,63 +13,68 @@ module Voom
25
13
  include Components::Mixins::Icons
26
14
  include Components::Mixins::TextFields
27
15
  include Components::Mixins::DateTimeFields
28
-
16
+ include Components::Mixins::Attaches
17
+ include Components::Mixins::Event
18
+ extend Pluggable
19
+ include_plugins(:DSLComponents, :DSLHelpers)
29
20
 
30
21
  include Voom::Serializer
31
22
  include Voom::Trace
32
23
 
33
- attr_reader :router, :context, :components
34
- private :context, :router
24
+ attr_reader :router, :context, :components, :name, :namespace
25
+ private :context, :router, :namespace
35
26
  alias params context
36
27
 
37
- def initialize(parent: nil, router: nil, context:, &block)
28
+ def initialize(context:, parent: nil, router: nil, name: nil, namespace: [], &block)
38
29
  @parent = parent
39
30
  @router = router || @parent&.send(:router)
40
- @context = context
31
+ @context = context || {}
41
32
  @block = block
42
33
  @header = nil
43
34
  @drawer = nil
44
35
  @components = []
45
36
  @footer = nil
37
+ @name = name
38
+ @namespace = namespace
39
+ @plugins = []
40
+ @csrf_meta_tags = authenticity_token_meta_tags(@context.fetch(:session, nil))
46
41
  add_global_helpers
42
+ initialize_plugins
47
43
  end
48
44
 
49
- def page(title=nil, **attribs, &block)
45
+ def page(title = nil, **attribs, &block)
50
46
  return @page if locked?
51
- @page = Components::Page.new(parent: self, context: context,
52
- **attribs, &block)
47
+ @page = Components::Page.new(parent: self, **attribs, &block)
53
48
  end
54
49
 
55
- def header(title=nil, **attribs, &block)
50
+ def header(title = nil, **attribs, &block)
56
51
  return @header if locked?
57
52
  @header = Components::Header.new(parent: self, title: title,
58
- context: context,
59
53
  **attribs, &block)
60
54
  end
61
55
 
62
- def drawer(name=nil, **attribs, &block)
56
+ def drawer(name = nil, **attribs, &block)
63
57
  return @drawer if locked?
64
58
  @drawer = Components::Drawer.new(parent: self, title: name,
65
- context: context,
66
59
  **attribs, &block)
67
60
  end
68
61
 
69
62
 
70
-
71
63
  def footer(**attribs, &block)
72
64
  return @footer if locked?
73
65
  @footer = Components::Footer.new(parent: self,
74
- context: context,
75
66
  **attribs, &block)
76
67
  end
77
68
 
78
- def attach(presenter, **context_, &yield_block)
79
- @_yield_block_ = yield_block
80
- pom = Voom::Presenters::App[presenter].call.expand_child(parent: self, context: context.merge(context_))
69
+ def progress(**attributes, &block)
70
+ self << Components::Progress.new(parent: self, **attributes, &block)
71
+ end
72
+
73
+ def attach(presenter, **params, &yield_block)
74
+ pom = super
81
75
  @header ||= pom.header
82
76
  @drawer ||= pom.drawer
83
77
  @footer ||= pom.footer
84
- @components += pom.components
85
78
  end
86
79
 
87
80
  # Called by the definition.expand method to evaluate a user interface with a different context
@@ -105,6 +98,21 @@ module Voom
105
98
  :presenter
106
99
  end
107
100
 
101
+ def plugin(*plugin_names)
102
+ @plugins.push(*plugin_names)
103
+ self.class.include_plugins(:DSLComponents, :DSLHelpers, plugins: plugin_names)
104
+ end
105
+
106
+ def plugins
107
+ return @plugins if locked?
108
+ return @plugins if @plugins
109
+ end
110
+ alias _plugins_ plugins
111
+
112
+ def csrf_meta_tags
113
+ Presenters::Settings.config.presenters.web_client.protect_from_forgery ? @csrf_meta_tags : nil
114
+ end
115
+
108
116
  private
109
117
 
110
118
  def deep_freeze
@@ -112,8 +120,6 @@ module Voom
112
120
  self
113
121
  end
114
122
 
115
- private
116
-
117
123
  def parent(for_type)
118
124
  nil
119
125
  end
@@ -133,6 +139,17 @@ module Voom
133
139
  end
134
140
  end
135
141
 
142
+ def initialize_plugins
143
+ self.class.include_plugins(:DSLComponents, :DSLHelpers, plugins: @plugins)
144
+ end
145
+
146
+ def lock!
147
+ @locked = true
148
+ end
149
+
150
+ def locked?
151
+ @locked
152
+ end
136
153
  end
137
154
  end
138
155
  end