voom-presenters 0.1.13 → 2.0.3

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 (514) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.github/ISSUE_TEMPLATE/questions-support.md +10 -0
  6. data/.github/workflows/semantic-release.yml +42 -0
  7. data/.gitignore +3 -2
  8. data/.releaserc +15 -0
  9. data/.ruby-version +2 -1
  10. data/CHANGELOG.md +143 -0
  11. data/CONTRIBUTING.md +60 -0
  12. data/Gemfile +14 -4
  13. data/Gemfile.lock +111 -65
  14. data/HISTORY.md +61 -0
  15. data/Procfile +1 -0
  16. data/README.md +55 -24
  17. data/app/demo/components/avatars.pom +40 -0
  18. data/app/demo/components/cards.pom +11 -4
  19. data/app/demo/components/chips.pom +65 -52
  20. data/app/demo/components/content.pom +111 -0
  21. data/app/demo/components/date_fields.pom +1 -1
  22. data/app/demo/components/datetime_fields.pom +6 -0
  23. data/app/demo/components/dialogs.pom +175 -6
  24. data/app/demo/components/drawers.pom +1 -1
  25. data/app/demo/components/file_inputs.pom +52 -0
  26. data/app/demo/components/footers.pom +1 -1
  27. data/app/demo/components/google_maps.pom +22 -0
  28. data/app/demo/components/headers.pom +80 -20
  29. data/app/demo/components/icons.pom +86 -55
  30. data/app/demo/components/image_lists.pom +100 -0
  31. data/app/demo/components/images.pom +45 -0
  32. data/app/demo/components/layouts.pom +15 -5
  33. data/app/demo/components/lists.pom +48 -3
  34. data/app/demo/components/menus.pom +14 -4
  35. data/app/demo/components/nav/menu.pom +40 -2
  36. data/app/demo/components/nav/pattern_drawer.pom +5 -0
  37. data/app/demo/components/nav/pattern_menu.pom +12 -0
  38. data/app/demo/components/number_fields.pom +53 -0
  39. data/app/demo/components/padding.pom +96 -0
  40. data/app/demo/components/progress.pom +71 -0
  41. data/app/demo/components/selects.pom +44 -5
  42. data/app/demo/components/sliders.pom +54 -0
  43. data/app/demo/components/snackbar.pom +10 -0
  44. data/app/demo/components/steppers.pom +178 -0
  45. data/app/demo/components/tab_bars.pom +66 -0
  46. data/app/demo/components/tables.pom +96 -13
  47. data/app/demo/components/text_areas.pom +23 -3
  48. data/app/demo/components/text_fields.pom +75 -17
  49. data/app/demo/components/toggles.pom +83 -16
  50. data/app/demo/components/tooltips.pom +10 -10
  51. data/app/demo/components/unordered_list.pom +81 -0
  52. data/app/demo/custom_css.pom +37 -0
  53. data/app/demo/events/actions/autocomplete.pom +3 -3
  54. data/app/demo/events/actions/clear.pom +25 -0
  55. data/app/demo/events/actions/dialogs/discard.pom +9 -0
  56. data/app/demo/events/actions/dialogs/show_dialog.pom +4 -2
  57. data/app/demo/events/actions/last_response.pom +40 -0
  58. data/app/demo/events/actions/loads.pom +16 -6
  59. data/app/demo/events/actions/posts.pom +1 -1
  60. data/app/demo/events/actions/prompt_if_dirty.pom +54 -0
  61. data/app/demo/events/actions/toggle_visiblity.pom +4 -3
  62. data/app/demo/events/content_as_form.pom +313 -0
  63. data/app/demo/events/nav/drawer.pom +7 -3
  64. data/app/demo/events/parallel.pom +44 -0
  65. data/app/demo/events/tagged_input.pom +37 -0
  66. data/app/demo/hello_world.pom +3 -0
  67. data/app/demo/index.pom +5 -5
  68. data/app/demo/markdown.pom +1 -0
  69. data/app/demo/namespaces.pom +89 -0
  70. data/app/demo/nav/top_nav.pom +22 -4
  71. data/app/demo/patterns.pom +19 -0
  72. data/app/demo/patterns/drag_drop.pom +89 -0
  73. data/app/demo/patterns/floating_card.pom +29 -0
  74. data/app/demo/patterns/search_select.pom +106 -0
  75. data/app/demo/plugins/chart.pom +254 -0
  76. data/app/demo/plugins/image_crop.pom +44 -0
  77. data/app/demo/plugins/index.pom +29 -0
  78. data/app/demo/plugins/nav/drawer.pom +19 -0
  79. data/app/demo/shared/context_list.pom +2 -2
  80. data/app/demo/styles.pom +24 -12
  81. data/bin/console +4 -4
  82. data/component-status.yml +26 -26
  83. data/config.ru +21 -10
  84. data/docs/settings.md +81 -0
  85. data/exe/presenters +3 -0
  86. data/lib/hash_ext/traverse.rb +14 -0
  87. data/lib/voom.rb +25 -0
  88. data/lib/voom/container_methods.rb +2 -2
  89. data/lib/voom/engine.rb +5 -0
  90. data/lib/voom/presenters/api/app.rb +46 -13
  91. data/lib/voom/presenters/api/router.rb +3 -87
  92. data/lib/voom/presenters/app.rb +3 -3
  93. data/lib/voom/presenters/cli.rb +28 -0
  94. data/lib/voom/presenters/demo/dragon_drop.rb +48 -0
  95. data/lib/voom/presenters/demo/echo.rb +7 -0
  96. data/lib/voom/presenters/demo/slow.rb +18 -0
  97. data/lib/voom/presenters/dsl/components/actions/autocomplete.rb +15 -0
  98. data/lib/voom/presenters/dsl/components/actions/base.rb +65 -0
  99. data/lib/voom/presenters/dsl/components/actions/clear.rb +15 -0
  100. data/lib/voom/presenters/dsl/components/actions/close_dialog.rb +17 -0
  101. data/lib/voom/presenters/dsl/components/actions/deletes.rb +15 -0
  102. data/lib/voom/presenters/dsl/components/actions/dialog.rb +15 -0
  103. data/lib/voom/presenters/dsl/components/actions/loads.rb +31 -0
  104. data/lib/voom/presenters/dsl/components/actions/navigates.rb +15 -0
  105. data/lib/voom/presenters/dsl/components/actions/post_message.rb +17 -0
  106. data/lib/voom/presenters/dsl/components/actions/posts.rb +20 -0
  107. data/lib/voom/presenters/dsl/components/actions/prompt_if_dirty.rb +15 -0
  108. data/lib/voom/presenters/dsl/components/actions/remove.rb +15 -0
  109. data/lib/voom/presenters/dsl/components/actions/replaces.rb +25 -0
  110. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +15 -0
  111. data/lib/voom/presenters/dsl/components/actions/stepper.rb +15 -0
  112. data/lib/voom/presenters/dsl/components/actions/toggle_disabled.rb +15 -0
  113. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +15 -0
  114. data/lib/voom/presenters/dsl/components/actions/updates.rb +20 -0
  115. data/lib/voom/presenters/dsl/components/avatar.rb +5 -10
  116. data/lib/voom/presenters/dsl/components/badge.rb +0 -2
  117. data/lib/voom/presenters/dsl/components/base.rb +37 -21
  118. data/lib/voom/presenters/dsl/components/button.rb +23 -17
  119. data/lib/voom/presenters/dsl/components/card.rb +54 -42
  120. data/lib/voom/presenters/dsl/components/checkbox.rb +2 -2
  121. data/lib/voom/presenters/dsl/components/chip.rb +10 -13
  122. data/lib/voom/presenters/dsl/components/chipset.rb +33 -0
  123. data/lib/voom/presenters/dsl/components/content.rb +33 -13
  124. data/lib/voom/presenters/dsl/components/date_field.rb +1 -1
  125. data/lib/voom/presenters/dsl/components/datetime_base.rb +0 -3
  126. data/lib/voom/presenters/dsl/components/datetime_field.rb +0 -2
  127. data/lib/voom/presenters/dsl/components/dialog.rb +41 -13
  128. data/lib/voom/presenters/dsl/components/drawer.rb +13 -8
  129. data/lib/voom/presenters/dsl/components/event.rb +117 -60
  130. data/lib/voom/presenters/dsl/components/event_base.rb +1 -3
  131. data/lib/voom/presenters/dsl/components/expansion_panel.rb +3 -6
  132. data/lib/voom/presenters/dsl/components/file_input.rb +34 -0
  133. data/lib/voom/presenters/dsl/components/footer.rb +2 -2
  134. data/lib/voom/presenters/dsl/components/form.rb +3 -16
  135. data/lib/voom/presenters/dsl/components/grid.rb +64 -22
  136. data/lib/voom/presenters/dsl/components/header.rb +19 -6
  137. data/lib/voom/presenters/dsl/components/hidden_field.rb +1 -3
  138. data/lib/voom/presenters/dsl/components/icon.rb +3 -6
  139. data/lib/voom/presenters/dsl/components/icon_base.rb +6 -8
  140. data/lib/voom/presenters/dsl/components/icon_toggle.rb +3 -5
  141. data/lib/voom/presenters/dsl/components/image.rb +61 -13
  142. data/lib/voom/presenters/dsl/components/image_list.rb +43 -0
  143. data/lib/voom/presenters/dsl/components/input.rb +14 -5
  144. data/lib/voom/presenters/dsl/components/link.rb +33 -0
  145. data/lib/voom/presenters/dsl/components/list.rb +11 -16
  146. data/lib/voom/presenters/dsl/components/lists/action.rb +11 -14
  147. data/lib/voom/presenters/dsl/components/lists/actions.rb +7 -10
  148. data/lib/voom/presenters/dsl/components/lists/header.rb +2 -2
  149. data/lib/voom/presenters/dsl/components/lists/line.rb +34 -25
  150. data/lib/voom/presenters/dsl/components/lists/separator.rb +2 -2
  151. data/lib/voom/presenters/dsl/components/menu.rb +56 -16
  152. data/lib/voom/presenters/dsl/components/mixins/append.rb +2 -2
  153. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +7 -3
  154. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +1 -4
  155. data/lib/voom/presenters/dsl/components/mixins/buttons.rb +1 -1
  156. data/lib/voom/presenters/dsl/components/mixins/chips.rb +0 -3
  157. data/lib/voom/presenters/dsl/components/mixins/chipset.rb +19 -0
  158. data/lib/voom/presenters/dsl/components/mixins/common.rb +21 -16
  159. data/lib/voom/presenters/dsl/components/mixins/content.rb +1 -1
  160. data/lib/voom/presenters/dsl/components/mixins/date_time_fields.rb +0 -3
  161. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +0 -3
  162. data/lib/voom/presenters/dsl/components/mixins/event.rb +2 -4
  163. data/lib/voom/presenters/dsl/components/mixins/expansion_panels.rb +1 -1
  164. data/lib/voom/presenters/dsl/components/mixins/file_inputs.rb +16 -0
  165. data/lib/voom/presenters/dsl/components/mixins/google_maps.rb +15 -0
  166. data/lib/voom/presenters/dsl/components/mixins/grids.rb +1 -1
  167. data/lib/voom/presenters/dsl/components/mixins/icons.rb +0 -1
  168. data/lib/voom/presenters/dsl/components/mixins/image_lists.rb +15 -0
  169. data/lib/voom/presenters/dsl/components/mixins/last_response.rb +48 -0
  170. data/lib/voom/presenters/dsl/components/mixins/menus.rb +1 -1
  171. data/lib/voom/presenters/dsl/components/mixins/padding.rb +42 -0
  172. data/lib/voom/presenters/dsl/components/mixins/progress.rb +16 -0
  173. data/lib/voom/presenters/dsl/components/mixins/selects.rb +0 -1
  174. data/lib/voom/presenters/dsl/components/mixins/sliders.rb +15 -0
  175. data/lib/voom/presenters/dsl/components/mixins/snackbars.rb +0 -1
  176. data/lib/voom/presenters/dsl/components/mixins/steppers.rb +15 -0
  177. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +17 -0
  178. data/lib/voom/presenters/dsl/components/mixins/tables.rb +15 -0
  179. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +10 -3
  180. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +0 -5
  181. data/lib/voom/presenters/dsl/components/mixins/tooltips.rb +0 -1
  182. data/lib/voom/presenters/dsl/components/mixins/typography.rb +91 -14
  183. data/lib/voom/presenters/dsl/components/mixins/yield_to.rb +2 -2
  184. data/lib/voom/presenters/dsl/components/number_field.rb +20 -0
  185. data/lib/voom/presenters/dsl/components/page.rb +0 -1
  186. data/lib/voom/presenters/dsl/components/page_title.rb +31 -0
  187. data/lib/voom/presenters/dsl/components/progress.rb +27 -0
  188. data/lib/voom/presenters/dsl/components/radio_button.rb +0 -1
  189. data/lib/voom/presenters/dsl/components/rich_text_area.rb +20 -0
  190. data/lib/voom/presenters/dsl/components/select.rb +23 -12
  191. data/lib/voom/presenters/dsl/components/separator.rb +21 -0
  192. data/lib/voom/presenters/dsl/components/slider.rb +38 -0
  193. data/lib/voom/presenters/dsl/components/snackbar.rb +2 -2
  194. data/lib/voom/presenters/dsl/components/stepper.rb +96 -0
  195. data/lib/voom/presenters/dsl/components/switch.rb +0 -2
  196. data/lib/voom/presenters/dsl/components/tab_bar.rb +50 -0
  197. data/lib/voom/presenters/dsl/components/table.rb +126 -35
  198. data/lib/voom/presenters/dsl/components/text_area.rb +4 -5
  199. data/lib/voom/presenters/dsl/components/text_field.rb +55 -16
  200. data/lib/voom/presenters/dsl/components/time_field.rb +0 -2
  201. data/lib/voom/presenters/dsl/components/toggle_base.rb +8 -6
  202. data/lib/voom/presenters/dsl/components/tooltip.rb +1 -2
  203. data/lib/voom/presenters/dsl/components/typography.rb +6 -7
  204. data/lib/voom/presenters/dsl/components/unordered_list.rb +50 -0
  205. data/lib/voom/presenters/dsl/definer.rb +0 -4
  206. data/lib/voom/presenters/dsl/definition.rb +9 -6
  207. data/lib/voom/presenters/dsl/protect_from_forgery.rb +43 -0
  208. data/lib/voom/presenters/dsl/user_interface.rb +43 -32
  209. data/lib/voom/presenters/errors.rb +1 -0
  210. data/lib/voom/presenters/errors/invalid_dsl.rb +8 -0
  211. data/lib/voom/presenters/errors/parameter_validation.rb +1 -3
  212. data/lib/voom/presenters/generators/inflectors.rb +59 -0
  213. data/lib/voom/presenters/generators/plugin.rb +115 -0
  214. data/lib/voom/presenters/generators/templates/plugin/.gitignore +12 -0
  215. data/lib/voom/presenters/generators/templates/plugin/Gemfile +6 -0
  216. data/lib/voom/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  217. data/lib/voom/presenters/generators/templates/plugin/README.md +253 -0
  218. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/action.rb.tt +16 -0
  219. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  220. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/component.rb.tt +18 -0
  221. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/dsl.rb.tt +19 -0
  222. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/helpers/helper.rb.tt +15 -0
  223. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/plugin.rb.tt +9 -0
  224. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  225. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/render.rb.tt +23 -0
  226. data/lib/voom/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  227. data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  228. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  229. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  230. data/lib/voom/presenters/generators/templates/plugin/views/components/component.erb.tt +14 -0
  231. data/lib/voom/presenters/generators/templates/plugin/views/components/component_header.erb.tt +20 -0
  232. data/lib/voom/presenters/helpers.rb +2 -8
  233. data/lib/voom/presenters/helpers/date.rb +3 -3
  234. data/lib/voom/presenters/helpers/inflector.rb +1 -1
  235. data/lib/voom/presenters/helpers/rails.rb +18 -6
  236. data/lib/voom/presenters/helpers/rails/model_table.rb +14 -6
  237. data/lib/voom/presenters/helpers/redact.rb +13 -0
  238. data/lib/voom/presenters/helpers/route.rb +15 -2
  239. data/lib/voom/presenters/helpers/time.rb +1 -1
  240. data/lib/voom/presenters/namespace.rb +12 -0
  241. data/lib/voom/presenters/pluggable.rb +37 -0
  242. data/lib/voom/presenters/plugins.rb +7 -0
  243. data/lib/voom/presenters/plugins/google_maps.rb +24 -0
  244. data/lib/voom/presenters/plugins/google_maps/google_map.erb +10 -0
  245. data/lib/voom/presenters/plugins/google_maps/google_map.rb +41 -0
  246. data/lib/voom/presenters/{dsl.rb → registry.rb} +14 -10
  247. data/lib/voom/presenters/router.rb +59 -0
  248. data/lib/voom/presenters/settings.rb +70 -39
  249. data/lib/voom/presenters/version.rb +3 -1
  250. data/lib/voom/presenters/web_client/app.rb +121 -34
  251. data/lib/voom/presenters/web_client/component_decorator_factory.rb +27 -0
  252. data/lib/voom/presenters/web_client/component_html_decorator.rb +50 -0
  253. data/lib/voom/presenters/web_client/component_renderer.rb +49 -0
  254. data/lib/voom/presenters/web_client/custom_css.rb +65 -0
  255. data/lib/voom/presenters/web_client/custom_render.rb +31 -0
  256. data/lib/voom/presenters/web_client/helpers/expand_hash.rb +19 -0
  257. data/lib/voom/presenters/web_client/helpers/form_helpers.rb +14 -0
  258. data/lib/voom/presenters/web_client/helpers/padding_helpers.rb +21 -0
  259. data/lib/voom/presenters/web_client/plugin_headers.rb +37 -0
  260. data/lib/voom/presenters/web_client/router.rb +3 -89
  261. data/lib/voom/railtie.rb +37 -0
  262. data/lib/voom/serializer.rb +2 -2
  263. data/lib/voom/symbol/to_str.rb +3 -3
  264. data/lib/voom/trace.rb +0 -2
  265. data/presenters.gemspec +12 -7
  266. data/public/bundle.css +18221 -0
  267. data/public/bundle.js +59949 -0
  268. data/public/img/demo/avatar.jpg +0 -0
  269. data/public/presenters/custom_css.css +26 -0
  270. data/public/style-bundle.js +2 -2
  271. data/public/wc.js +52704 -0
  272. data/scripts/build.sh +10 -0
  273. data/views/mdc/.babelrc +8 -0
  274. data/views/mdc/.eslintrc.yml +24 -0
  275. data/views/mdc/.nvmrc +1 -0
  276. data/views/mdc/assets/js/app.js +30 -6
  277. data/views/mdc/assets/js/components/base-component.js +160 -2
  278. data/views/mdc/assets/js/components/base-container.js +87 -0
  279. data/views/mdc/assets/js/components/base-toggle.js +56 -0
  280. data/views/mdc/assets/js/components/button.js +71 -9
  281. data/views/mdc/assets/js/components/cards.js +13 -2
  282. data/views/mdc/assets/js/components/checkboxes.js +11 -11
  283. data/views/mdc/assets/js/components/chips.js +104 -7
  284. data/views/mdc/assets/js/components/content.js +14 -0
  285. data/views/mdc/assets/js/components/data-tables.js +15 -0
  286. data/views/mdc/assets/js/components/datetime.js +83 -20
  287. data/views/mdc/assets/js/components/dialogs.js +130 -27
  288. data/views/mdc/assets/js/components/drag_n_drop.js +182 -0
  289. data/views/mdc/assets/js/components/drawer.js +43 -0
  290. data/views/mdc/assets/js/components/events.js +195 -68
  291. data/views/mdc/assets/js/components/events/action_parameter.js +62 -0
  292. data/views/mdc/assets/js/components/events/action_parameter.test.js +62 -0
  293. data/views/mdc/assets/js/components/events/autocomplete.js +15 -17
  294. data/views/mdc/assets/js/components/events/base.js +142 -16
  295. data/views/mdc/assets/js/components/events/clears.js +15 -12
  296. data/views/mdc/assets/js/components/events/close_dialog.js +50 -0
  297. data/views/mdc/assets/js/components/events/dialog.js +32 -14
  298. data/views/mdc/assets/js/components/events/encode.js +8 -0
  299. data/views/mdc/assets/js/components/events/errors.js +175 -92
  300. data/views/mdc/assets/js/components/events/loads.js +50 -11
  301. data/views/mdc/assets/js/components/events/navigates.js +17 -15
  302. data/views/mdc/assets/js/components/events/plugin.js +18 -0
  303. data/views/mdc/assets/js/components/events/post_message.js +21 -0
  304. data/views/mdc/assets/js/components/events/posts.js +169 -47
  305. data/views/mdc/assets/js/components/events/prompt_if_dirty.js +67 -0
  306. data/views/mdc/assets/js/components/events/removes.js +21 -0
  307. data/views/mdc/assets/js/components/events/replaces.js +110 -57
  308. data/views/mdc/assets/js/components/events/snackbar.js +10 -10
  309. data/views/mdc/assets/js/components/events/stepper.js +21 -0
  310. data/views/mdc/assets/js/components/events/toggle_disabled.js +41 -0
  311. data/views/mdc/assets/js/components/events/toggle_visibility.js +62 -16
  312. data/views/mdc/assets/js/components/file-inputs.js +76 -0
  313. data/views/mdc/assets/js/components/form-fields.js +16 -0
  314. data/views/mdc/assets/js/components/forms.js +9 -60
  315. data/views/mdc/assets/js/components/get_event_target.js +15 -0
  316. data/views/mdc/assets/js/components/grid.js +21 -0
  317. data/views/mdc/assets/js/components/header.js +20 -0
  318. data/views/mdc/assets/js/components/hidden-fields.js +44 -0
  319. data/views/mdc/assets/js/components/icon-toggles.js +10 -17
  320. data/views/mdc/assets/js/components/images.js +19 -0
  321. data/views/mdc/assets/js/components/initialize.js +62 -18
  322. data/views/mdc/assets/js/components/lists.js +10 -5
  323. data/views/mdc/assets/js/components/menus.js +66 -20
  324. data/views/mdc/assets/js/components/mixins/dirtyable.js +22 -0
  325. data/views/mdc/assets/js/components/mixins/event-handler.js +7 -7
  326. data/views/mdc/assets/js/components/mixins/visibility-observer.js +35 -0
  327. data/views/mdc/assets/js/components/plugins.js +86 -0
  328. data/views/mdc/assets/js/components/progress.js +31 -0
  329. data/views/mdc/assets/js/components/radios.js +14 -0
  330. data/views/mdc/assets/js/components/rich-text-area.js +227 -0
  331. data/views/mdc/assets/js/components/rich-text-area/horizontal-rule-blot.js +23 -0
  332. data/views/mdc/assets/js/components/root_document.js +5 -0
  333. data/views/mdc/assets/js/components/selects.js +41 -30
  334. data/views/mdc/assets/js/components/sliders.js +67 -0
  335. data/views/mdc/assets/js/components/snackbar.js +17 -23
  336. data/views/mdc/assets/js/components/steppers.js +48 -0
  337. data/views/mdc/assets/js/components/switches.js +10 -32
  338. data/views/mdc/assets/js/components/tab-bars.js +28 -0
  339. data/views/mdc/assets/js/components/text-fields.js +117 -43
  340. data/views/mdc/assets/js/components/tooltip.js +17 -0
  341. data/views/mdc/assets/js/components/typography.js +28 -0
  342. data/views/mdc/assets/js/components/uninitialize.js +7 -0
  343. data/views/mdc/assets/js/config.js +27 -0
  344. data/views/mdc/assets/js/mdl-stepper.js +1108 -0
  345. data/views/mdc/assets/js/utils/compatibility.js +9 -0
  346. data/views/mdc/assets/js/utils/config.js +73 -0
  347. data/views/mdc/assets/js/utils/config.test.js +59 -0
  348. data/views/mdc/assets/js/utils/urls.js +5 -2
  349. data/views/mdc/assets/js/wc.js +111 -0
  350. data/views/mdc/assets/scss/app.scss +20 -5
  351. data/views/mdc/assets/scss/components/avatar.scss +51 -7
  352. data/views/mdc/assets/scss/components/button.scss +20 -7
  353. data/views/mdc/assets/scss/components/card.scss +13 -7
  354. data/views/mdc/assets/scss/components/checkbox.scss +0 -4
  355. data/views/mdc/assets/scss/components/chip.scss +4 -0
  356. data/views/mdc/assets/scss/components/content.scss +36 -0
  357. data/views/mdc/assets/scss/components/data-table.scss +91 -0
  358. data/views/mdc/assets/scss/components/datetime.scss +7 -2
  359. data/views/mdc/assets/scss/components/dialog.scss +7 -2
  360. data/views/mdc/assets/scss/components/drag_n_drop.scss +17 -0
  361. data/views/mdc/assets/scss/components/drawer.scss +82 -0
  362. data/views/mdc/assets/scss/components/expansion-panel.scss +2 -2
  363. data/views/mdc/assets/scss/components/fab.scss +23 -4
  364. data/views/mdc/assets/scss/components/file-input.scss +18 -0
  365. data/views/mdc/assets/scss/components/grid.scss +74 -3
  366. data/views/mdc/assets/scss/components/header.scss +21 -0
  367. data/views/mdc/assets/scss/components/icon-button-toggles.scss +2 -0
  368. data/views/mdc/assets/scss/components/icon.scss +23 -0
  369. data/views/mdc/assets/scss/components/image-list.scss +18 -0
  370. data/views/mdc/assets/scss/components/image.scss +14 -16
  371. data/views/mdc/assets/scss/components/list.scss +19 -0
  372. data/views/mdc/assets/scss/components/menu.scss +14 -3
  373. data/views/mdc/assets/scss/components/progress.scss +1 -0
  374. data/views/mdc/assets/scss/components/radio.scss +4 -0
  375. data/views/mdc/assets/scss/components/rich-text-area.scss +73 -0
  376. data/views/mdc/assets/scss/components/select.scss +6 -3
  377. data/views/mdc/assets/scss/components/separator.scss +3 -0
  378. data/views/mdc/assets/scss/components/slider.scss +1 -0
  379. data/views/mdc/assets/scss/components/snackbar.scss +1 -5
  380. data/views/mdc/assets/scss/components/stepper.scss +235 -0
  381. data/views/mdc/assets/scss/components/switch.scss +13 -4
  382. data/views/mdc/assets/scss/components/tab-bars.scss +4 -0
  383. data/views/mdc/assets/scss/components/textfield.scss +14 -3
  384. data/views/mdc/assets/scss/components/tooltip.scss +3 -0
  385. data/views/mdc/assets/scss/components/typography.scss +10 -0
  386. data/views/mdc/assets/scss/components/unordered-lists.scss +17 -0
  387. data/views/mdc/assets/scss/components/vendor/quill.snow.css +945 -0
  388. data/views/mdc/assets/scss/material.blue_grey-orange.min.css +1 -1
  389. data/views/mdc/assets/scss/media.scss +39 -0
  390. data/views/mdc/assets/scss/palette.scss +16 -0
  391. data/views/mdc/assets/scss/styles.scss +40 -1
  392. data/views/mdc/assets/scss/theme.scss +25 -2
  393. data/views/mdc/body/dismissable-drawer.erb +34 -0
  394. data/views/mdc/body/drawer/divider.erb +1 -0
  395. data/views/mdc/body/drawer/item.erb +13 -0
  396. data/views/mdc/body/drawer/label.erb +1 -0
  397. data/views/mdc/body/drawers/menu.erb +1 -1
  398. data/views/mdc/body/footers/menu_item.erb +2 -2
  399. data/views/mdc/body/header.erb +38 -30
  400. data/views/mdc/body/modal-drawer.erb +35 -0
  401. data/views/mdc/body/snackbar.erb +12 -6
  402. data/views/mdc/components/actions/autocomplete.rb +8 -0
  403. data/views/mdc/components/actions/clear.rb +11 -0
  404. data/views/mdc/components/actions/close_dialog.rb +10 -0
  405. data/views/mdc/components/actions/delete.rb +11 -0
  406. data/views/mdc/components/actions/dialog.rb +11 -0
  407. data/views/mdc/components/actions/loads.rb +17 -0
  408. data/views/mdc/components/actions/navigates.rb +11 -0
  409. data/views/mdc/components/actions/post.rb +14 -0
  410. data/views/mdc/components/actions/post_message.rb +10 -0
  411. data/views/mdc/components/actions/prompt_if_dirty.rb +17 -0
  412. data/views/mdc/components/actions/remove.rb +10 -0
  413. data/views/mdc/components/actions/replaces.rb +16 -0
  414. data/views/mdc/components/actions/resolver.rb +39 -0
  415. data/views/mdc/components/actions/snackbar.rb +12 -0
  416. data/views/mdc/components/actions/stepper.rb +10 -0
  417. data/views/mdc/components/actions/toggle_disabled.rb +10 -0
  418. data/views/mdc/components/actions/toggle_visibility.rb +10 -0
  419. data/views/mdc/components/actions/update.rb +10 -0
  420. data/views/mdc/components/avatar.erb +12 -7
  421. data/views/mdc/components/badge.erb +1 -1
  422. data/views/mdc/components/button.erb +10 -8
  423. data/views/mdc/components/buttons/button.erb +19 -14
  424. data/views/mdc/components/buttons/fab.erb +9 -2
  425. data/views/mdc/components/buttons/icon.erb +12 -5
  426. data/views/mdc/components/buttons/image.erb +11 -5
  427. data/views/mdc/components/{display.erb → caption.erb} +0 -0
  428. data/views/mdc/components/card.erb +67 -41
  429. data/views/mdc/components/checkbox.erb +32 -23
  430. data/views/mdc/components/chip.erb +39 -22
  431. data/views/mdc/components/chipset.erb +18 -0
  432. data/views/mdc/components/content.erb +37 -11
  433. data/views/mdc/components/datetime.erb +12 -17
  434. data/views/mdc/components/dialog.erb +45 -22
  435. data/views/mdc/components/drag_and_drop/drag_and_drop.rb +16 -0
  436. data/views/mdc/components/event.erb +3 -9
  437. data/views/mdc/components/expansion_panel.erb +8 -6
  438. data/views/mdc/components/file_input.erb +17 -0
  439. data/views/mdc/components/form.erb +7 -8
  440. data/views/mdc/components/grid.erb +27 -10
  441. data/views/mdc/components/headline.erb +2 -0
  442. data/views/mdc/components/hidden_field.erb +5 -1
  443. data/views/mdc/components/icon.erb +7 -5
  444. data/views/mdc/components/icon_toggle.erb +9 -8
  445. data/views/mdc/components/image.erb +23 -5
  446. data/views/mdc/components/image_list.erb +38 -0
  447. data/views/mdc/components/link.erb +3 -13
  448. data/views/mdc/components/list.erb +9 -4
  449. data/views/mdc/components/list/actions/switch.erb +1 -1
  450. data/views/mdc/components/list/avatar.erb +2 -1
  451. data/views/mdc/components/list/header.erb +5 -3
  452. data/views/mdc/components/list/hidden_field.erb +3 -0
  453. data/views/mdc/components/list/icon.erb +2 -1
  454. data/views/mdc/components/list/line.erb +24 -13
  455. data/views/mdc/components/list/menu.erb +7 -2
  456. data/views/mdc/components/list/separator.erb +1 -1
  457. data/views/mdc/components/menu.erb +20 -16
  458. data/views/mdc/components/number_field.erb +38 -0
  459. data/views/mdc/components/{subheading.erb → overline.erb} +0 -0
  460. data/views/mdc/components/page_title.erb +2 -2
  461. data/views/mdc/components/progress.erb +11 -0
  462. data/views/mdc/components/radio_button.erb +19 -10
  463. data/views/mdc/components/render.erb +2 -3
  464. data/views/mdc/components/rich_text_area.erb +22 -0
  465. data/views/mdc/components/select.erb +28 -8
  466. data/views/mdc/components/separator.erb +3 -0
  467. data/views/mdc/components/shared/hint_error_display.erb +9 -0
  468. data/views/mdc/components/shared/input_label.erb +7 -0
  469. data/views/mdc/components/slider.erb +43 -0
  470. data/views/mdc/components/snackbar.erb +2 -6
  471. data/views/mdc/components/stepper.erb +47 -0
  472. data/views/mdc/components/stepper/step.erb +33 -0
  473. data/views/mdc/components/{title.erb → subtitle.erb} +0 -0
  474. data/views/mdc/components/switch.erb +28 -12
  475. data/views/mdc/components/tab_bar.erb +35 -0
  476. data/views/mdc/components/table.erb +28 -13
  477. data/views/mdc/components/table/checkbox.erb +20 -0
  478. data/views/mdc/components/table/column.erb +18 -0
  479. data/views/mdc/components/table/footer.erb +8 -0
  480. data/views/mdc/components/table/header.erb +14 -4
  481. data/views/mdc/components/table/pagination.erb +11 -24
  482. data/views/mdc/components/table/row.erb +7 -5
  483. data/views/mdc/components/text_area.erb +15 -7
  484. data/views/mdc/components/text_field.erb +38 -28
  485. data/views/mdc/components/tooltip.erb +2 -2
  486. data/views/mdc/components/typography.erb +7 -5
  487. data/views/mdc/components/unordered_list.erb +10 -0
  488. data/views/mdc/components/unordered_list/icon.erb +3 -0
  489. data/views/mdc/components/unordered_list/list_item.erb +7 -0
  490. data/views/mdc/layout.erb +45 -31
  491. data/views/mdc/package-lock.json +11801 -6869
  492. data/views/mdc/package.json +66 -29
  493. data/views/mdc/web.erb +4 -0
  494. data/views/mdc/webpack.config.js +14 -1
  495. metadata +327 -37
  496. data/app/demo/component_status.pom +0 -76
  497. data/app/demo/components/forms.pom +0 -31
  498. data/lib/voom-presenters.rb +0 -9
  499. data/lib/voom/presenters-engine.rb +0 -41
  500. data/lib/voom/presenters.rb +0 -13
  501. data/lib/voom/presenters/dsl/components/action.rb +0 -35
  502. data/lib/voom/presenters/web_client/markdown_render.rb +0 -16
  503. data/public/.gitignore +0 -2
  504. data/scripts/bump.sh +0 -4
  505. data/scripts/deploy-demo.sh +0 -2
  506. data/scripts/release.sh +0 -5
  507. data/views/mdc/assets/js/dialog-polyfill.js +0 -738
  508. data/views/mdc/assets/js/material.js +0 -3996
  509. data/views/mdc/assets/scss/components/icon-toggles.scss +0 -9
  510. data/views/mdc/assets/scss/components/table-pagination.scss +0 -65
  511. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +0 -13
  512. data/views/mdc/body/drawer.erb +0 -18
  513. data/views/mdc/components/modal.erb +0 -15
  514. data/views/mdc/components/static.erb +0 -7
@@ -0,0 +1,182 @@
1
+ /*
2
+ A drag data store (DragEvent.prototype.dataTransfer.items) can be in one of
3
+ three modes:
4
+
5
+ 1. read/write, during a `dragstart` event: items can be read and added
6
+ 2. read-only, during a `drop` event: items can be read, but not added
7
+ 3. protected, during all other types of DragEvent: items cannot be read
8
+ or added.
9
+
10
+ (see https://html.spec.whatwg.org/multipage/dnd.html#concept-dnd-rw)
11
+
12
+ Thus, attempting to mutate the store during events other than `dragstart`
13
+ fails silently: no error is raised, but items are not added.
14
+
15
+
16
+ To read items in protected mode, serialize data as a string and store it as
17
+ a key instead of as a value. This makes it accessible via
18
+ `dataTransfer.types`:
19
+
20
+ // in a dragstart handler:
21
+ event.dataTransfer.setData(JSON.stringify(foo), '');
22
+
23
+ // in a later read-only or protected DragEvent handler:
24
+ const json = event.dataTransfer.types[someIndex];
25
+ const foo = JSON.stringify(json);
26
+
27
+
28
+ There is no workaround for attempting to mutate a drag data store not in
29
+ read/write mode.
30
+ */
31
+
32
+ import {getRootNode} from './base-component';
33
+
34
+ export const EVENT_DROPPED = 'dropped';
35
+
36
+ const DRAG_DATA_MIME_TYPE = 'application/x.voom-drag-data+json';
37
+ const ELEMENT_ID_MIME_TYPE = 'text/x.voom-element-id';
38
+
39
+ function createDragStartHandler(root, element) {
40
+ return function(event) {
41
+ const dragParamData = event.target.dataset.drag_params;
42
+
43
+ if (dragParamData) {
44
+ event.dataTransfer.setData(DRAG_DATA_MIME_TYPE, dragParamData);
45
+
46
+ const zone = JSON.parse(dragParamData).zone;
47
+
48
+ if (zone) {
49
+ event.dataTransfer.setData(zone, '');
50
+ }
51
+
52
+ event.dataTransfer.effectAllowed = 'move';
53
+ event.target.classList.remove('v-dnd-draggable');
54
+ event.target.classList.add('v-dnd-moving');
55
+
56
+ event.dataTransfer.setData(ELEMENT_ID_MIME_TYPE, element.id);
57
+ }
58
+ };
59
+ }
60
+
61
+ function createDragOverHandler(root, element) {
62
+ return function(event) {
63
+ const dropZone = element.dataset.dropzone;
64
+
65
+ if (dropZone == null || event.dataTransfer.types.includes(dropZone)) {
66
+ if (event.preventDefault) {
67
+ event.preventDefault();
68
+ }
69
+ element.classList.add('v-dnd-over');
70
+ }
71
+ else {
72
+ element.classList.remove('v-dnd-over');
73
+ }
74
+ };
75
+ }
76
+
77
+ function createDragLeaveHandler(root, element) {
78
+ return function(event) {
79
+ element.classList.remove('v-dnd-over');
80
+ };
81
+ }
82
+
83
+ function createDropHandler(root, element) {
84
+ // When an element is upgraded to a Voom component after being replaced via
85
+ // `replaces`, root may refer to the replaced element itself instead of the
86
+ // element's root node.
87
+ // Since a valid drop zone may exist anywhere on the page, it is not
88
+ // guaranteed that root contains the element being dragged.
89
+ // getRootNode will fetch `root`'s actual root node (document or shadow
90
+ // DOM root).
91
+ const trueRoot = getRootNode(root);
92
+
93
+ return function(event) {
94
+ event.stopPropagation();
95
+ event.preventDefault();
96
+
97
+ const id = event.dataTransfer.getData(ELEMENT_ID_MIME_TYPE);
98
+ const draggedElement = id ? trueRoot.querySelector(`#${id}`) : null;
99
+ let dragParams = {};
100
+
101
+ if (draggedElement) {
102
+ dragParams = JSON.parse(draggedElement.dataset.drag_params);
103
+ }
104
+
105
+ element.classList.remove('v-dnd-over', 'v-dnd-moving');
106
+ element.classList.add('v-dnd-draggable');
107
+
108
+ // Emit a "dropped" event for the element being dragged:
109
+ // The drag_params of the dragged element are merged with the
110
+ // drop_params of the drop zone.
111
+ const dropZoneParams = JSON.parse(element.dataset.drop_params);
112
+ const params = Object.assign({}, dragParams, dropZoneParams);
113
+ const droppedEvent = new CustomEvent(EVENT_DROPPED, {detail: params});
114
+
115
+ draggedElement.dispatchEvent(droppedEvent);
116
+
117
+ return false;
118
+ };
119
+ }
120
+
121
+ function createDragEndHandler(root, element) {
122
+ return function(event) {
123
+ element.classList.remove('v-dnd-over', 'v-dnd-moving');
124
+ element.classList.add('v-dnd-draggable');
125
+ };
126
+ }
127
+
128
+ const DRAGGABLE_SELECTOR = '[draggable=true]';
129
+ const DROP_ZONE_SELECTOR = '[data-dropzone]';
130
+
131
+ export function initDragAndDrop(root) {
132
+ const draggables = Array.from(root.querySelectorAll(DRAGGABLE_SELECTOR));
133
+
134
+ if (typeof root.matches === 'function' && root.matches(DRAGGABLE_SELECTOR)) {
135
+ draggables.unshift(root);
136
+ }
137
+
138
+ for (const elem of draggables) {
139
+ elem.addEventListener('dragstart', createDragStartHandler(root, elem));
140
+ elem.addEventListener('dragend', createDragEndHandler(root, elem));
141
+ }
142
+
143
+ const dropZones = Array.from(root.querySelectorAll(DROP_ZONE_SELECTOR));
144
+
145
+ if (typeof root.matches === 'function' && root.matches(DROP_ZONE_SELECTOR)) {
146
+ dropZones.unshift(root);
147
+ }
148
+
149
+ for (const elem of dropZones) {
150
+ elem.addEventListener('dragover', createDragOverHandler(root, elem));
151
+ elem.addEventListener('drop', createDropHandler(root, elem));
152
+ elem.addEventListener('dragleave', createDragLeaveHandler(root, elem));
153
+ }
154
+ }
155
+
156
+ /**
157
+ * hasDragDropData determines whether the provided event has previously-set
158
+ * drag-n-drop data available.
159
+ * @param {Event} event
160
+ * @return {Boolean}
161
+ */
162
+ export function hasDragDropData(event) {
163
+ return event.type === 'drop' && event.dataTransfer
164
+ || event.type === EVENT_DROPPED && event.detail;
165
+ }
166
+
167
+ /**
168
+ * extractDragDropData attempts to extract a payload of drag-n-drop data from
169
+ * the provided event previously set during a `dragstart` event.
170
+ * @param {Event} event
171
+ * @return {Object}
172
+ */
173
+ export function extractDragDropData(event) {
174
+ if (event.type === 'drop' && event.dataTransfer) {
175
+ return JSON.parse(event.dataTransfer.getData(DRAG_DATA_MIME_TYPE));
176
+ }
177
+ else if (event.type === EVENT_DROPPED) {
178
+ return event.detail;
179
+ }
180
+
181
+ return {};
182
+ }
@@ -0,0 +1,43 @@
1
+ import {MDCDrawer} from '@material/drawer';
2
+ import {VBaseComponent} from './base-component';
3
+ import {hookupComponents} from './base-component';
4
+ import {eventHandlerMixin} from './mixins/event-handler';
5
+
6
+ export function initDrawer(e) {
7
+ console.debug('\tDrawer');
8
+ hookupComponents(e, '.v-drawer__modal', VModalDrawer, MDCDrawer);
9
+ hookupComponents(e, '.v-drawer__dismissible', VDismissibleDrawer, MDCDrawer);
10
+ }
11
+
12
+ class VDrawer extends eventHandlerMixin(VBaseComponent) {
13
+ constructor(element, mdcComponent) {
14
+ super(element, mdcComponent);
15
+ const header = this.root.querySelector('.v-header');
16
+ if (header) {
17
+ header.addEventListener('MDCTopAppBar:nav',
18
+ () => {
19
+ if (this.isActive()) {
20
+ this.mdcComponent.open = !this.mdcComponent.open;
21
+ }
22
+ });
23
+ }
24
+ }
25
+
26
+ isActive() {
27
+ return (getComputedStyle(this.element).
28
+ getPropertyValue('--v-drawer-active') !== 'no');
29
+ }
30
+ }
31
+
32
+ export class VModalDrawer extends VDrawer {
33
+ constructor(element, mdcComponent) {
34
+ super(element, mdcComponent);
35
+ this.mdcComponent.open = false;
36
+ }
37
+ }
38
+
39
+ export class VDismissibleDrawer extends VDrawer {
40
+ constructor(element, mdcComponent) {
41
+ super(element, mdcComponent);
42
+ }
43
+ }
@@ -4,147 +4,274 @@ import {VReplaces} from './events/replaces';
4
4
  import {VDialog} from './events/dialog';
5
5
  import {VErrors} from './events/errors';
6
6
  import {VToggleVisibility} from './events/toggle_visibility';
7
- import {VSnackbarEvent} from './events/snackbar';
7
+ import {VToggleDisabled} from './events/toggle_disabled';
8
8
  import {VAutoComplete} from './events/autocomplete';
9
- import {VNavigates} from './events/navigates';
9
+ import {VPromptIfDirty} from './events/prompt_if_dirty';
10
+ import {VSnackbarEvent} from './events/snackbar';
10
11
  import {VClears} from './events/clears';
12
+ import {VCloseDialog} from './events/close_dialog';
13
+ import {VPostMessage} from './events/post_message';
14
+ import {VRemoves} from './events/removes';
15
+ import {VStepperEvent} from './events/stepper';
16
+ import {VNavigates} from './events/navigates';
17
+ import {VPluginEventAction} from './events/plugin';
18
+ import getRoot from './root_document';
19
+ import {hasDragDropData, extractDragDropData} from './drag_n_drop';
20
+ import {getEventTarget} from './get_event_target';
21
+
22
+ const EVENTS_SELECTOR = '[data-events]';
11
23
 
12
24
  export class VEvents {
13
- //[[type, url, target, params]]
14
- constructor(actions, event) {
25
+ // [[type, url, target, params]]
26
+ constructor(actions, event, root, vComponent) {
15
27
  this.event = event;
28
+ this.root = root;
16
29
  this.actions = actions.map((action) => {
17
- return this.constructor.action_class(action, event);
30
+ return this.constructor.action_class(action, event, root);
18
31
  });
32
+ this.vComponent = vComponent;
19
33
  }
20
34
 
21
35
  call() {
36
+ const event = this.event;
37
+ const target = getEventTarget(event);
38
+ let eventParams = {};
39
+
40
+ if (hasDragDropData(event)) {
41
+ eventParams = Object.assign(eventParams, extractDragDropData(event));
42
+ }
43
+ else if (event.detail && event.detail.constructor === Object) {
44
+ eventParams = Object.assign(eventParams, event.detail);
45
+ }
46
+
22
47
  // Adapted from http://www.datchley.name/promise-patterns-anti-patterns/#executingpromisesinseries
23
- var fnlist = this.actions.map((action) => {
24
- return function (results) {
25
- return Promise.resolve(action.call(results));
48
+ const fnlist = this.actions.map((action) => {
49
+ return function(results) {
50
+ return Promise.resolve(action.call(results, eventParams));
26
51
  };
27
52
  });
28
53
 
29
54
  // Execute a list of Promise return functions in series
30
55
  function pseries(list) {
31
- var p = Promise.resolve([]);
32
- return list.reduce(function (pacc, fn) {
56
+ const p = Promise.resolve([]);
57
+ return list.reduce(function(pacc, fn) {
33
58
  return pacc = pacc.then(fn);
34
59
  }, p);
35
60
  }
36
61
 
37
- var event = this.event;
62
+ const ev = new CustomEvent('V:eventsStarted', {
63
+ bubbles: true,
64
+ cancelable: false,
65
+ detail: this,
66
+ });
67
+ target.dispatchEvent(ev);
38
68
 
39
- pseries(fnlist)
40
- .then(function (results) {
41
- var result = results.pop();
42
- var contentType = result.contentType;
43
- var responseURL = result.responseURL;
69
+ if (this.vComponent) {
70
+ this.vComponent.actionsStarted(this);
71
+ }
44
72
 
45
- if (event.target.dialog) {
46
- event.target.dialog.close();
47
- }
48
- if (contentType && contentType.indexOf("text/html") !== -1 && typeof responseURL !== 'undefined') {
49
- window.location = responseURL;
50
- }
51
73
 
52
- }).catch(function (results) {
53
- var result = results.pop();
54
- new VErrors(event).displayErrors(result);
74
+ new VErrors(this.root).clearErrors();
75
+
76
+ pseries(fnlist).then((results) => {
77
+ const result = results.pop();
78
+ const contentType = result.contentType;
79
+ const responseURL = result.responseURL;
80
+
81
+ if (contentType && contentType.indexOf('text/html') !== -1 &&
82
+ typeof responseURL !== 'undefined') {
83
+ window.location = responseURL;
84
+ }
85
+
86
+ const ev = new CustomEvent('V:eventsSucceeded', {
87
+ bubbles: true,
88
+ cancelable: false,
89
+ detail: this,
90
+ });
91
+ target.dispatchEvent(ev);
92
+
93
+ if (this.vComponent) {
94
+ this.vComponent.actionsSucceeded(this);
95
+ }
96
+ }).catch((results) => {
97
+ console.log('If you got here it may not be what you think:',
98
+ results);
99
+
100
+ let result = results;
101
+
102
+ if (typeof results.pop === 'function') {
103
+ result = results.pop();
104
+ }
105
+
106
+ if (!result.squelch) {
107
+ new VErrors(this.root, target).displayErrors(result);
108
+ }
109
+
110
+ const ev = new CustomEvent('V:eventsHalted', {
111
+ bubbles: true,
112
+ cancelable: false,
113
+ detail: this,
114
+ });
115
+ target.dispatchEvent(ev);
116
+
117
+ if (this.vComponent) {
118
+ this.vComponent.actionsHalted(this);
119
+ }
120
+ }).finally(() => {
121
+ const ev = new CustomEvent('V:eventsFinished', {
122
+ bubbles: true,
123
+ cancelable: false,
124
+ detail: this,
125
+ });
126
+ target.dispatchEvent(ev);
127
+
128
+ if (this.vComponent) {
129
+ this.vComponent.actionsFinished(this);
130
+ }
55
131
  });
56
132
  }
57
133
 
58
- static action_class(action, event) {
59
- var action_type = action[0];
60
- var url = action[1];
61
- var options = action[2];
62
- var params = action[3];
134
+ static action_class(action, event, root) {
135
+ const action_type = action[0];
136
+ const url = action[1];
137
+ const options = action[2];
138
+ const params = action[3];
63
139
 
64
140
  switch (action_type) {
65
141
  case 'loads':
66
- return new VLoads(options, url, params, event);
142
+ return new VLoads(options, url, params, event, root);
67
143
  case 'replaces':
68
- return new VReplaces(options, url, params, event);
144
+ return new VReplaces(options, url, params, event, root);
69
145
  case 'post':
70
- return new VPosts(options, url, params, 'POST', event);
146
+ return new VPosts(options, url, params, 'POST', event, root);
71
147
  case 'update':
72
- return new VPosts(options, url, params, 'PUT', event);
148
+ return new VPosts(options, url, params, 'PUT', event, root);
73
149
  case 'delete':
74
- return new VPosts(options, url, params, 'DELETE', event);
150
+ return new VPosts(options, url, params, 'DELETE', event, root);
75
151
  case 'dialog':
76
- return new VDialog(options, params, event);
152
+ return new VDialog(options, params, event, root);
77
153
  case 'toggle_visibility':
78
- return new VToggleVisibility(options, params, event);
154
+ return new VToggleVisibility(options, params, event, root);
155
+ case 'toggle_disabled':
156
+ return new VToggleDisabled(options, params, event, root);
157
+ case 'prompt_if_dirty':
158
+ return new VPromptIfDirty(options, params, event, root);
159
+ case 'remove':
160
+ return new VRemoves(options, params, event, root);
79
161
  case 'snackbar':
80
- return new VSnackbarEvent(options, params, event);
162
+ return new VSnackbarEvent(options, params, event, root);
81
163
  case 'autocomplete':
82
- return new VAutoComplete(options, url, params, event);
83
- case 'navigates':
84
- return new VNavigates(options, params, event);
164
+ return new VAutoComplete(options, url, params, event, root);
85
165
  case 'clear':
86
- return new VClears(options, params, event);
166
+ return new VClears(options, params, event, root);
167
+ case 'close_dialog':
168
+ return new VCloseDialog(options, params, event, root);
169
+ case 'post_message':
170
+ return new VPostMessage(options, params, event, root);
171
+ case 'stepper':
172
+ return new VStepperEvent(options, params, event, root);
173
+ case 'navigates':
174
+ return new VNavigates(options, params, event, root);
87
175
  default:
88
- throw action_type + ' is not supported.';
176
+ return new VPluginEventAction(action_type, options, params,
177
+ event, root);
89
178
  }
90
179
  }
91
-
92
180
  }
93
181
 
94
182
  // This is used to get a proper binding of the actionData
95
183
  // https://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example
96
- function createEventHandler(actionsData) {
97
- return function (event) {
98
- new VEvents(actionsData, event).call();
184
+ function createEventHandler(actionsData, root, vComponent) {
185
+ return function(event) {
186
+ event.stopPropagation();
187
+ new VEvents(actionsData, event, root, vComponent).call();
99
188
  };
100
189
  }
101
190
 
102
- export function initEvents() {
103
- console.log('\tEvents');
191
+ function getEventElements(root) {
192
+ const elements = Array.from(root.querySelectorAll(EVENTS_SELECTOR));
104
193
 
105
- var events = document.querySelectorAll('[data-events]');
106
- for (var i = 0; i < events.length; i++) {
107
- var eventElem = events[i];
194
+ // Include `root` if it has events:
195
+ if (typeof root.matches === 'function' && root.matches(EVENTS_SELECTOR)) {
196
+ elements.unshift(root);
197
+ }
198
+
199
+ return elements;
200
+ }
201
+
202
+ export function initEvents(e) {
203
+ console.debug('\tEvents');
204
+
205
+ for (const eventElem of getEventElements(e)) {
108
206
  var eventsData = JSON.parse(eventElem.dataset.events);
109
207
  for (var j = 0; j < eventsData.length; j++) {
110
208
  var eventData = eventsData[j];
111
209
  var eventName = eventData[0];
112
210
  var eventOptions = eventData[2];
211
+ eventOptions.passive = true;
113
212
  var actionsData = eventData[1];
114
- var eventHandler = createEventHandler(actionsData);
213
+ const vComponent = eventElem.vComponent;
214
+ var eventHandler = createEventHandler(actionsData, getRoot(e),
215
+ vComponent);
216
+ // allow override of event handler by component
217
+ if (vComponent && vComponent.createEventHandler) {
218
+ eventHandler = vComponent.createEventHandler(
219
+ actionsData, getRoot(e), vComponent);
220
+ }
115
221
  // Delegate to the component if possible
116
- if (eventElem.vComponent && eventElem.vComponent.initEventListener) {
117
- eventElem.vComponent.initEventListener(eventName, eventHandler);
118
- } else {
222
+ if (vComponent &&
223
+ vComponent.initEventListener) {
224
+ vComponent.initEventListener(eventName, eventHandler,
225
+ eventOptions);
226
+ }
227
+ else {
119
228
  if (typeof eventElem.eventsHandler === 'undefined') {
120
229
  eventElem.eventsHandler = {};
121
230
  }
122
- if (!eventElem.eventsHandler[eventName]) {
123
- // Delegate to the component if possible
124
- eventElem.eventsHandler[eventName] = eventHandler;
125
- eventElem.addEventListener(eventName, eventHandler, eventOptions);
231
+ if (typeof eventElem.eventsHandler[eventName] === 'undefined') {
232
+ eventElem.eventsHandler[eventName] = [];
126
233
  }
234
+ eventElem.eventsHandler[eventName].push(eventHandler);
235
+ eventElem.addEventListener(eventName, eventHandler,
236
+ eventOptions);
237
+ }
238
+
239
+ if (vComponent) {
240
+ vComponent.afterInit();
241
+ }
242
+ }
243
+ }
244
+ fireAfterLoad(e);
245
+ }
246
+
247
+ export function removeEvents(elem) {
248
+ console.debug('\tuninitEvents');
249
+
250
+ for (const eventElem of getEventElements(elem)) {
251
+ let eventsData = JSON.parse(eventElem.dataset.events);
252
+ for (var j = 0; j < eventsData.length; j++) {
253
+ let eventData = eventsData[j];
254
+ let eventName = eventData[0];
255
+ let eventOptions = eventData[2];
256
+ eventOptions.passive = true;
257
+ for (const handler of eventElem.eventsHandler[eventName]) {
258
+ eventElem.removeEventListener(eventName, handler, eventOptions);
127
259
  }
128
260
  }
129
261
  }
130
- fireAfterLoad();
131
262
  }
132
263
 
133
- function fireAfterLoad() {
134
- var events = document.querySelectorAll('[data-events]');
135
- for (var i = 0; i < events.length; i++) {
136
- var eventElem = events[i];
264
+ function fireAfterLoad(e) {
265
+ for (const eventElem of getEventElements(e)) {
137
266
  var eventsData = JSON.parse(eventElem.dataset.events);
138
267
  for (var j = 0; j < eventsData.length; j++) {
139
268
  var eventData = eventsData[j];
140
269
  var eventName = eventData[0];
141
270
  if (eventName === 'after_init') {
142
- var event = new Event('after_init');
271
+ var event = new Event('after_init', { composed: true });
143
272
  // Dispatch the event.
144
273
  eventElem.dispatchEvent(event);
145
274
  }
146
275
  }
147
276
  }
148
277
  }
149
-
150
-