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
@@ -1,25 +1,43 @@
1
1
  export class VDialog {
2
- constructor(options, params, event) {
2
+ constructor(options, params, event, root) {
3
3
  this.dialogId = options.target;
4
4
  this.params = params;
5
5
  this.event = event;
6
+ this.root = root;
6
7
  }
7
8
 
8
9
  call(results) {
9
- var dialog = document.querySelector('#' + this.dialogId);
10
- if(dialog) {
11
- if (!dialog.showModal) {
12
- dialogPolyfill.registerDialog(dialog);
13
- }
14
-
15
- dialog.showModal();
16
- }else {
17
- console.error("Unable to find dialog with id: "+this.dialogId+". Usually this means you forgot to attach it to the currently rendered page.");
10
+ const dialog = this.root.querySelector('#' + this.dialogId);
11
+
12
+ if (!(dialog && dialog.vComponent)) {
13
+ const err = new Error(
14
+ `Unable to find dialog ${this.dialogId}. `
15
+ + 'Did you forget to attach it?'
16
+ );
17
+
18
+ results.push({
19
+ action: 'dialog',
20
+ contentType: 'v/errors',
21
+ content: {exception: err.message},
22
+ });
23
+
24
+ return new Promise((_, reject) => reject(results));
18
25
  }
19
- var promiseObj = new Promise(function (resolve) {
20
- results.push({action:'dialog', statusCode: 200});
21
- resolve(results);
26
+
27
+ return new Promise(function(resolve, reject) {
28
+ const comp = dialog.vComponent.mdcComponent;
29
+
30
+ comp.listen('MDCDialog:closed', (event) => {
31
+ results.push({
32
+ action: 'dialog',
33
+ statusCode: 200,
34
+ dialogAction: event.detail.action,
35
+ });
36
+
37
+ resolve(results);
38
+ });
39
+
40
+ dialog.vComponent.open();
22
41
  });
23
- return promiseObj;
24
42
  }
25
43
  }
@@ -0,0 +1,8 @@
1
+ export function encode(value) {
2
+ if (value === Object(value)) {
3
+ return JSON.stringify(value);
4
+ }
5
+ else {
6
+ return value;
7
+ }
8
+ }
@@ -1,142 +1,225 @@
1
+ import 'core-js/features/array/flat';
2
+
3
+ /**
4
+ * mapObject transforms an object's key-value pairs via the provided function.
5
+ * @param {Object} object
6
+ * @param {Function} fn A mapping function suitable for use with Array.map
7
+ * @return {Object}
8
+ */
9
+ function mapObject(object, fn) {
10
+ return Object.entries(object)
11
+ .map(fn)
12
+ .reduce((obj, [k, v]) => Object.assign(obj, {[[k]]: v}), {});
13
+ }
14
+
15
+ /*
16
+ Attempt to interpret and serialize the following cases for display:
17
+
18
+ A: Rails errors:
19
+ 1. { "name": ["Requires name"] }
20
+
21
+ B: Validation errors:
22
+ 1. { :email => ["must be filled"] }
23
+ 2. { :fees => 0 => { :fee => ["must be filled", "must be greater than zero"] } }
24
+
25
+ C: Custom errors and client-side exceptions:
26
+ 1. { :email => "must be filled" }
27
+ 2. { exception: 'Something bad happened' }
28
+
29
+ D: Logical errors:
30
+ 1. "undefined method `map' for nil:NilClass"
31
+ */
32
+
1
33
  export class VErrors {
2
- constructor(event) {
3
- this.event = event;
34
+ constructor(root, target) {
35
+ this.root = root;
36
+ this.target = target;
4
37
  }
5
38
 
6
39
  clearErrors() {
7
- var errorMessages = document.querySelectorAll('.v-error-message');
40
+ const errorMessages = this.root.querySelectorAll('.v-error-message');
8
41
 
9
- for (var i = 0; i < errorMessages.length; i++) {
42
+ for (let i = 0; i < errorMessages.length; i++) {
10
43
  errorMessages[i].remove();
11
44
  }
12
45
  }
13
46
 
14
- // Rails errors
15
- // {
16
- // "name": [
17
- // "Requires name"
18
- // ]
19
- // }
47
+ /**
48
+ * normalize attempts to convert the various error structures described
49
+ * above into a single consistent structure by replacing error arrays
50
+ * with joined strings.
51
+ * @param {Object} errors
52
+ * @return {Object}
53
+ */
54
+ normalize(errors) {
55
+ if (!errors) {
56
+ return {};
57
+ }
58
+
59
+ // Normalize case D into case C-1:
60
+ if (typeof errors === 'string') {
61
+ errors = {error: errors};
62
+ }
63
+
64
+ return mapObject(errors, ([k, v]) => {
65
+ let result = null;
20
66
 
21
- // Validation errors
22
- // { :email => ["must be filled"] }
67
+ // Case C, a single key-value pair:
68
+ if (typeof v === 'string') {
69
+ // Normalize case C into case A/B-1:
70
+ v = [v];
71
+ }
23
72
 
24
- // Custom errors
25
- // { :email => "must be filled" }
73
+ if (Array.isArray(v)) {
74
+ // Case A and B-1: an array of error messages:
75
+ result = v.join(', ');
76
+ } else if (v.constructor === Object) {
77
+ // Case B-2: a nested structure:
78
+ result = this.normalize(v);
79
+ } else {
80
+ throw new Error(`Cannot normalize value of type ${typeof v}`);
81
+ }
26
82
 
27
- // Exceptions
28
- // {exception: 'Something bad happened' }
83
+ return [k, result];
84
+ });
85
+ }
29
86
 
30
- stringsToArrays(value) {
31
- if (Array.isArray(value) || value.constructor === Object) {
32
- return value;
87
+ /**
88
+ * flatten attempts to extract all human-readable error messages from an
89
+ * arbitrary error structure, yielding a flat array of strings.
90
+ * @param {Object} errors
91
+ * @return {Array<String>}
92
+ */
93
+ flatten(errors) {
94
+ if (!errors) {
95
+ return [];
33
96
  }
34
- return new Array(value);
35
- }
36
97
 
37
- normalizeErrors(errors) {
38
- if (errors && errors.constructor === Object) {
39
- return Object.keys(errors).reduce((previous, key) => {
40
- previous[key] = this.stringsToArrays(errors[key]);
41
- return previous;
42
- }, {});
98
+ // Normalize case D into case C-1:
99
+ if (typeof errors === 'string') {
100
+ errors = {error: errors};
43
101
  }
44
- return [];
102
+
103
+ const object = mapObject(errors, ([k, v]) => {
104
+ let result = null;
105
+
106
+ if (typeof v === 'string') {
107
+ result = v;
108
+ }
109
+ else if (v.constructor === Object) {
110
+ result = this.flatten(v);
111
+ }
112
+ else {
113
+ throw new Error(`Cannot flatten value of type ${typeof v}`);
114
+ }
115
+
116
+ return [k, result];
117
+ });
118
+
119
+ return Object.values(object).flat();
45
120
  }
46
121
 
47
- // [http_status, content_type, resultText]
48
122
  displayErrors(result) {
49
- var httpStatus = result.statusCode;
50
- var contentType = result.contentType;
51
- var resultText = result.content;
123
+ const {statusCode, contentType, content} = result;
52
124
 
53
- var responseErrors = null;
125
+ let responseErrors = null;
54
126
 
55
- if (contentType && contentType.indexOf("application/json") !== -1) {
56
- responseErrors = JSON.parse(resultText);
57
- } else if (contentType && contentType.indexOf("v/errors") !== -1) {
58
- responseErrors = resultText;
127
+ if (contentType && contentType.includes('application/json')) {
128
+ responseErrors = JSON.parse(content);
129
+ }
130
+ else if (contentType && contentType.includes('v/errors')) {
131
+ responseErrors = content;
59
132
  }
60
133
 
61
134
  if (responseErrors) {
62
135
  if (!Array.isArray(responseErrors)) {
63
136
  responseErrors = [responseErrors];
64
137
  }
65
- for (var response of responseErrors) {
66
- var pageErrors = Object.values(this.normalizeErrors(response)).reduce(function (previous, value) {
67
- if (Array.isArray(value)) {
68
- previous.push(value.join('<br/>'));
69
- }
70
- return previous;
71
- }, []);
72
- var fieldErrors = this.normalizeErrors(response.errors);
73
-
74
- for (var field in fieldErrors) {
75
- if (!this.displayInputError(field, fieldErrors[field])) {
76
- // Collect errors that can't be displayed at the field level
77
- pageErrors.push(fieldErrors[field]);
138
+
139
+ for (const response of responseErrors) {
140
+ const normalizedResponse = this.normalize(response);
141
+ const errors = normalizedResponse.errors ? normalizedResponse.errors : normalizedResponse;
142
+ if (errors.constructor === String) {
143
+ this.prependErrors([errors]);
144
+ }
145
+ else {
146
+ for (const key in errors) {
147
+ if (!this.displayInputError(key, errors[key])) {
148
+ // If not handled at the field level, display at the page level
149
+ if (errors[key].length > 0) {
150
+ this.prependErrors([errors[key]]);
151
+ }
152
+ }
78
153
  }
79
154
  }
80
- this.prependErrors(pageErrors);
81
155
  }
82
- } else if (httpStatus === 0) {
83
- this.prependErrors(["Unable to contact server. Please check that you are online and retry."]);
84
- } else {
85
- this.prependErrors(["The server returned an unexpected response! Status:" + httpStatus]);
156
+ }
157
+ else if (statusCode === 0) {
158
+ this.prependErrors(
159
+ ['Unable to contact server. Please check that you are online and retry.']
160
+ );
161
+ }
162
+ else {
163
+ this.prependErrors(
164
+ [`The server returned an unexpected response! Status: ${statusCode}`]
165
+ );
86
166
  }
87
167
  }
88
168
 
89
169
  // Sets the helper text on the field
90
170
  // Returns true if it was able to set the error on the control
91
- displayInputError(divId, messages) {
92
- var currentEl = document.getElementById(divId);
93
- if (currentEl && currentEl.mdcComponent) {
94
- currentEl.mdcComponent.helperTextContent = messages.join(', ');
95
- var helperText = document.getElementById(divId + '-input-helper-text');
96
- helperText.classList.add('mdc-text-field--invalid',
97
- 'mdc-text-field-helper-text--validation-msg',
98
- 'mdc-text-field-helper-text--persistent');
99
- currentEl.mdcComponent.valid = false;
100
- return true;
171
+ displayInputError(id, message) {
172
+ const currentEl = this.root.getElementById(id) || this.root.getElementsByName(id)[0];
173
+
174
+ if (!currentEl) {
175
+ return false;
176
+ }
177
+
178
+ const helperText = this.root.getElementById(`${currentEl.id}-helper-text`);
179
+ if (!helperText) {
180
+ return false;
101
181
  }
102
- return false;
182
+
183
+ helperText.innerHTML = message;
184
+ currentEl.classList.add('mdc-text-field--invalid');
185
+ helperText.classList.add('mdc-text-field-helper-text--validation-msg');
186
+ helperText.classList.remove('v-hidden');
187
+
188
+ return true;
103
189
  }
104
190
 
105
191
  // Creates a div before the element with the same id as the error
106
- // Used to display an error message without their being an input field to attach the error to
192
+ // Used to display an error message without their being an input field to
193
+ // attach the error to
107
194
  prependErrors(messages) {
108
- var errorsDiv = this.findNearestErrorDiv();
109
- // create a new div element
110
- var newDiv = document.createElement("div");
111
- newDiv.className = 'v-error-message';
112
- // and give it some content
113
-
114
- for (var message of messages) {
115
- var newContent = document.createTextNode(message);
116
- newDiv.appendChild(newContent);
117
- let br = document.createElement('br');
118
- // add the text node to the newly created div
119
- newDiv.appendChild(br);
195
+ const errorsDiv = this.findNearestErrorDiv();
196
+
197
+ if (!errorsDiv) {
198
+ console.error('Unable to display Errors! ', messages);
199
+
200
+ return false;
120
201
  }
121
202
 
203
+ const newDiv = document.createElement('div');
204
+
205
+ newDiv.classList.add('v-error-message');
206
+ newDiv.insertAdjacentHTML('beforeend', messages.join('<br>'));
207
+
122
208
  // add the newly created element and its content into the DOM
123
- if (errorsDiv) {
124
- errorsDiv.parentElement.insertBefore(newDiv, errorsDiv);
125
- return true;
126
- } else {
127
- console.error("Unable to display Errors! ", messages);
209
+ if (errorsDiv.clientTop < 10) {
210
+ errorsDiv.scrollIntoView();
128
211
  }
129
- return false;
212
+
213
+ errorsDiv.insertAdjacentElement('beforebegin', newDiv);
214
+
215
+ return true;
130
216
  }
131
217
 
132
218
  findNearestErrorDiv() {
133
- let errorsDiv = null;
134
- const currentDiv = this.event.target;
135
- if(currentDiv) {
136
- errorsDiv = currentDiv.closest('.v-errors')
137
- }else{
138
- errorsDiv = document.querySelector('.v-errors');
219
+ if (this.target) {
220
+ return this.target.closest('.v-errors');
139
221
  }
140
- return errorsDiv;
222
+
223
+ return this.root.querySelector('.v-errors');
141
224
  }
142
225
  }
@@ -1,23 +1,62 @@
1
- import {VUrls} from '../../utils/urls';
1
+ import {expandParams} from './action_parameter';
2
+ import {VBase} from './base';
2
3
 
3
- export class VLoads extends VUrls{
4
- constructor(options, url, params, event) {
4
+ export class VLoads extends VBase {
5
+ constructor(options, url, params, event, root) {
5
6
  super();
7
+ this.root = root;
6
8
  this.options = options;
7
9
  this.params = params;
8
10
  this.url = url;
9
11
  this.event = event;
10
12
  }
11
13
 
14
+
15
+ waitForDownload(downloadID, f) {
16
+ // Now, we need to start watching the local Cookies to
17
+ // see when the download ID has been updated by the
18
+ // response headers.
19
+ const cookieTimer = setInterval(() => {
20
+ // The local cookie cache is defined in the browser
21
+ // as one large string; we need to search for the
22
+ // name-value pattern with the above ID.
23
+ const cookiePattern = new RegExp(('downloadID=' + downloadID), 'i');
24
+
25
+ if (!downloadID) {
26
+ clearInterval(cookieTimer);
27
+ return f();
28
+ }
29
+ // I check the local cookies for an update.
30
+ // If the local cookies have been updated, clear
31
+ // the timer and call the promise!
32
+ else if (document.cookie.search(cookiePattern) >= 0) {
33
+ clearInterval(cookieTimer);
34
+ return f();
35
+ }
36
+ console.debug(
37
+ 'File still downloading (Make sure you set the downloadID in your cookie?)...',
38
+ new Date().getTime());
39
+ }, downloadID ? 500 : 0);
40
+ }
41
+
42
+
12
43
  call(results) {
13
- var url = this.buildURL(this.url, this.params);
14
- var newWindow = this.options['target'] === '_blank';
15
- var promiseObj = new Promise(function (resolve) {
16
- console.log("Loading page: " + url);
17
- results.push({action:'loads', statusCode: 200});
18
- resolve(results);
19
- newWindow ? window.open(url) : window.location = url;
44
+ const expandedParams = expandParams(results, this.params);
45
+ return new Promise((resolve) => {
46
+ let downloadID = null;
47
+ if (this.options['wait_for_download']) {
48
+ downloadID = (new Date()).getTime();
49
+ }
50
+ const url = this.buildURL(this.url, expandedParams,
51
+ this.inputValues(),
52
+ downloadID ? {download_id: downloadID} : null);
53
+ this.waitForDownload(downloadID, () => {
54
+ results.push({action: 'loads', statusCode: 200});
55
+ resolve(results);
56
+ });
57
+ this.options['target'] === '_blank' ?
58
+ document.defaultView.open(url) :
59
+ document.defaultView.location = url;
20
60
  });
21
- return promiseObj;
22
61
  }
23
62
  }