voom-presenters 0.1.12 → 2.0.2

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 +42 -0
  8. data/.gitignore +4 -2
  9. data/.releaserc +15 -0
  10. data/.ruby-version +2 -1
  11. data/CHANGELOG.md +143 -0
  12. data/CODE-OF-CONDUCT.md +73 -0
  13. data/CONTRIBUTING.md +60 -0
  14. data/Gemfile +12 -3
  15. data/Gemfile.lock +104 -64
  16. data/HISTORY.md +61 -0
  17. data/Procfile +1 -0
  18. data/README.md +48 -24
  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/component-status.yml +26 -26
  85. data/config.ru +21 -10
  86. data/docs/settings.md +81 -0
  87. data/exe/presenters +3 -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 -60
  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/protect_from_forgery.rb +43 -0
  210. data/lib/voom/presenters/dsl/user_interface.rb +43 -32
  211. data/lib/voom/presenters/errors.rb +1 -0
  212. data/lib/voom/presenters/errors/invalid_dsl.rb +8 -0
  213. data/lib/voom/presenters/errors/parameter_validation.rb +1 -3
  214. data/lib/voom/presenters/generators/inflectors.rb +59 -0
  215. data/lib/voom/presenters/generators/plugin.rb +115 -0
  216. data/lib/voom/presenters/generators/templates/plugin/.gitignore +12 -0
  217. data/lib/voom/presenters/generators/templates/plugin/Gemfile +6 -0
  218. data/lib/voom/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  219. data/lib/voom/presenters/generators/templates/plugin/README.md +253 -0
  220. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/action.rb.tt +16 -0
  221. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  222. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/component.rb.tt +18 -0
  223. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/dsl.rb.tt +19 -0
  224. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/helpers/helper.rb.tt +15 -0
  225. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/plugin.rb.tt +9 -0
  226. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  227. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/render.rb.tt +23 -0
  228. data/lib/voom/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  229. data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  230. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  231. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  232. data/lib/voom/presenters/generators/templates/plugin/views/components/component.erb.tt +14 -0
  233. data/lib/voom/presenters/generators/templates/plugin/views/components/component_header.erb.tt +20 -0
  234. data/lib/voom/presenters/helpers.rb +2 -8
  235. data/lib/voom/presenters/helpers/date.rb +3 -3
  236. data/lib/voom/presenters/helpers/inflector.rb +1 -1
  237. data/lib/voom/presenters/helpers/rails.rb +18 -6
  238. data/lib/voom/presenters/helpers/rails/model_table.rb +14 -6
  239. data/lib/voom/presenters/helpers/redact.rb +13 -0
  240. data/lib/voom/presenters/helpers/route.rb +15 -2
  241. data/lib/voom/presenters/helpers/time.rb +1 -1
  242. data/lib/voom/presenters/namespace.rb +12 -0
  243. data/lib/voom/presenters/pluggable.rb +37 -0
  244. data/lib/voom/presenters/plugins.rb +7 -0
  245. data/lib/voom/presenters/plugins/google_maps.rb +24 -0
  246. data/lib/voom/presenters/plugins/google_maps/google_map.erb +10 -0
  247. data/lib/voom/presenters/plugins/google_maps/google_map.rb +41 -0
  248. data/lib/voom/presenters/{dsl.rb → registry.rb} +14 -10
  249. data/lib/voom/presenters/router.rb +59 -0
  250. data/lib/voom/presenters/settings.rb +70 -39
  251. data/lib/voom/presenters/version.rb +3 -1
  252. data/lib/voom/presenters/web_client/app.rb +121 -34
  253. data/lib/voom/presenters/web_client/component_decorator_factory.rb +27 -0
  254. data/lib/voom/presenters/web_client/component_html_decorator.rb +50 -0
  255. data/lib/voom/presenters/web_client/component_renderer.rb +49 -0
  256. data/lib/voom/presenters/web_client/custom_css.rb +65 -0
  257. data/lib/voom/presenters/web_client/custom_render.rb +31 -0
  258. data/lib/voom/presenters/web_client/helpers/expand_hash.rb +19 -0
  259. data/lib/voom/presenters/web_client/helpers/form_helpers.rb +14 -0
  260. data/lib/voom/presenters/web_client/helpers/padding_helpers.rb +21 -0
  261. data/lib/voom/presenters/web_client/plugin_headers.rb +37 -0
  262. data/lib/voom/presenters/web_client/router.rb +3 -89
  263. data/lib/voom/railtie.rb +37 -0
  264. data/lib/voom/serializer.rb +2 -2
  265. data/lib/voom/symbol/to_str.rb +3 -3
  266. data/lib/voom/trace.rb +0 -2
  267. data/presenters.gemspec +11 -6
  268. data/public/bundle.css +18221 -0
  269. data/public/bundle.js +59949 -0
  270. data/public/img/demo/avatar.jpg +0 -0
  271. data/public/presenters/custom_css.css +26 -0
  272. data/public/style-bundle.js +2 -2
  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 -11
  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 +19 -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 +6 -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 +1 -5
  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 +40 -1
  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 +341 -32
  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 -41
  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 -4
  506. data/scripts/deploy-demo.sh +0 -2
  507. data/scripts/release.sh +0 -5
  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
@@ -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,22 +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
8
+ include DSL::ProtectFromForgery
20
9
  include Components::Mixins::Common
21
10
  include Components::Mixins::Helpers
22
11
  include Components::Mixins::Dialogs
@@ -24,63 +13,68 @@ module Voom
24
13
  include Components::Mixins::Icons
25
14
  include Components::Mixins::TextFields
26
15
  include Components::Mixins::DateTimeFields
27
-
16
+ include Components::Mixins::Attaches
17
+ include Components::Mixins::Event
18
+ extend Pluggable
19
+ include_plugins(:DSLComponents, :DSLHelpers)
28
20
 
29
21
  include Voom::Serializer
30
22
  include Voom::Trace
31
23
 
32
- attr_reader :router, :context, :components
33
- private :context, :router
24
+ attr_reader :router, :context, :components, :name, :namespace
25
+ private :context, :router, :namespace
34
26
  alias params context
35
27
 
36
- def initialize(parent: nil, router: nil, context:, &block)
28
+ def initialize(context:, parent: nil, router: nil, name: nil, namespace: [], &block)
37
29
  @parent = parent
38
30
  @router = router || @parent&.send(:router)
39
- @context = context
31
+ @context = context || {}
40
32
  @block = block
41
33
  @header = nil
42
34
  @drawer = nil
43
35
  @components = []
44
36
  @footer = nil
37
+ @name = name
38
+ @namespace = namespace
39
+ @plugins = []
40
+ @csrf_meta_tags = authenticity_token_meta_tags(@context.fetch(:session, nil))
45
41
  add_global_helpers
42
+ initialize_plugins
46
43
  end
47
44
 
48
- def page(title=nil, **attribs, &block)
45
+ def page(title = nil, **attribs, &block)
49
46
  return @page if locked?
50
- @page = Components::Page.new(parent: self, context: context,
51
- **attribs, &block)
47
+ @page = Components::Page.new(parent: self, **attribs, &block)
52
48
  end
53
49
 
54
- def header(title=nil, **attribs, &block)
50
+ def header(title = nil, **attribs, &block)
55
51
  return @header if locked?
56
52
  @header = Components::Header.new(parent: self, title: title,
57
- context: context,
58
53
  **attribs, &block)
59
54
  end
60
55
 
61
- def drawer(name=nil, **attribs, &block)
56
+ def drawer(name = nil, **attribs, &block)
62
57
  return @drawer if locked?
63
58
  @drawer = Components::Drawer.new(parent: self, title: name,
64
- context: context,
65
59
  **attribs, &block)
66
60
  end
67
61
 
68
62
 
69
-
70
63
  def footer(**attribs, &block)
71
64
  return @footer if locked?
72
65
  @footer = Components::Footer.new(parent: self,
73
- context: context,
74
66
  **attribs, &block)
75
67
  end
76
68
 
77
- def attach(presenter, **context_, &yield_block)
78
- @_yield_block_ = yield_block
79
- 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
80
75
  @header ||= pom.header
81
76
  @drawer ||= pom.drawer
82
77
  @footer ||= pom.footer
83
- @components += pom.components
84
78
  end
85
79
 
86
80
  # Called by the definition.expand method to evaluate a user interface with a different context
@@ -104,6 +98,21 @@ module Voom
104
98
  :presenter
105
99
  end
106
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
+
107
116
  private
108
117
 
109
118
  def deep_freeze
@@ -111,8 +120,6 @@ module Voom
111
120
  self
112
121
  end
113
122
 
114
- private
115
-
116
123
  def parent(for_type)
117
124
  nil
118
125
  end
@@ -132,6 +139,10 @@ module Voom
132
139
  end
133
140
  end
134
141
 
142
+ def initialize_plugins
143
+ self.class.include_plugins(:DSLComponents, :DSLHelpers, plugins: @plugins)
144
+ end
145
+
135
146
  def lock!
136
147
  @locked = true
137
148
  end