voom-presenters 0.1.12 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.gem_release.yml +1 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  6. data/.github/ISSUE_TEMPLATE/questions-support.md +10 -0
  7. data/.github/workflows/semantic-release.yml +42 -0
  8. data/.gitignore +4 -2
  9. data/.releaserc +15 -0
  10. data/.ruby-version +2 -1
  11. data/CHANGELOG.md +143 -0
  12. data/CODE-OF-CONDUCT.md +73 -0
  13. data/CONTRIBUTING.md +60 -0
  14. data/Gemfile +12 -3
  15. data/Gemfile.lock +104 -64
  16. data/HISTORY.md +61 -0
  17. data/Procfile +1 -0
  18. data/README.md +48 -24
  19. data/app/demo/component_status.pom +1 -1
  20. data/app/demo/components/avatars.pom +40 -0
  21. data/app/demo/components/cards.pom +11 -4
  22. data/app/demo/components/chips.pom +65 -52
  23. data/app/demo/components/content.pom +111 -0
  24. data/app/demo/components/date_fields.pom +1 -1
  25. data/app/demo/components/datetime_fields.pom +6 -0
  26. data/app/demo/components/dialogs.pom +175 -6
  27. data/app/demo/components/drawers.pom +1 -1
  28. data/app/demo/components/file_inputs.pom +52 -0
  29. data/app/demo/components/footers.pom +1 -1
  30. data/app/demo/components/google_maps.pom +22 -0
  31. data/app/demo/components/headers.pom +80 -20
  32. data/app/demo/components/icons.pom +86 -55
  33. data/app/demo/components/image_lists.pom +100 -0
  34. data/app/demo/components/images.pom +45 -0
  35. data/app/demo/components/layouts.pom +15 -5
  36. data/app/demo/components/lists.pom +51 -17
  37. data/app/demo/components/menus.pom +14 -4
  38. data/app/demo/components/nav/menu.pom +40 -2
  39. data/app/demo/components/nav/pattern_drawer.pom +5 -0
  40. data/app/demo/components/nav/pattern_menu.pom +12 -0
  41. data/app/demo/components/number_fields.pom +53 -0
  42. data/app/demo/components/padding.pom +96 -0
  43. data/app/demo/components/progress.pom +71 -0
  44. data/app/demo/components/selects.pom +44 -5
  45. data/app/demo/components/sliders.pom +54 -0
  46. data/app/demo/components/snackbar.pom +10 -0
  47. data/app/demo/components/steppers.pom +178 -0
  48. data/app/demo/components/tab_bars.pom +66 -0
  49. data/app/demo/components/tables.pom +96 -13
  50. data/app/demo/components/text_areas.pom +23 -3
  51. data/app/demo/components/text_fields.pom +75 -17
  52. data/app/demo/components/toggles.pom +83 -16
  53. data/app/demo/components/tooltips.pom +10 -10
  54. data/app/demo/components/unordered_list.pom +81 -0
  55. data/app/demo/custom_css.pom +37 -0
  56. data/app/demo/events/actions/autocomplete.pom +3 -3
  57. data/app/demo/events/actions/clear.pom +25 -0
  58. data/app/demo/events/actions/dialogs/discard.pom +9 -0
  59. data/app/demo/events/actions/dialogs/show_dialog.pom +4 -2
  60. data/app/demo/events/actions/last_response.pom +40 -0
  61. data/app/demo/events/actions/loads.pom +16 -6
  62. data/app/demo/events/actions/posts.pom +1 -1
  63. data/app/demo/events/actions/prompt_if_dirty.pom +54 -0
  64. data/app/demo/events/actions/toggle_visiblity.pom +4 -3
  65. data/app/demo/events/content_as_form.pom +313 -0
  66. data/app/demo/events/nav/drawer.pom +7 -3
  67. data/app/demo/events/parallel.pom +44 -0
  68. data/app/demo/events/tagged_input.pom +37 -0
  69. data/app/demo/hello_world.pom +3 -0
  70. data/app/demo/markdown.pom +1 -0
  71. data/app/demo/namespaces.pom +89 -0
  72. data/app/demo/nav/top_nav.pom +24 -0
  73. data/app/demo/patterns.pom +19 -0
  74. data/app/demo/patterns/drag_drop.pom +89 -0
  75. data/app/demo/patterns/floating_card.pom +29 -0
  76. data/app/demo/patterns/search_select.pom +106 -0
  77. data/app/demo/plugins/chart.pom +254 -0
  78. data/app/demo/plugins/image_crop.pom +44 -0
  79. data/app/demo/plugins/index.pom +29 -0
  80. data/app/demo/plugins/nav/drawer.pom +19 -0
  81. data/app/demo/shared/context_list.pom +2 -2
  82. data/app/demo/styles.pom +24 -12
  83. data/bin/console +4 -4
  84. data/component-status.yml +26 -26
  85. data/config.ru +21 -10
  86. data/docs/settings.md +81 -0
  87. data/exe/presenters +3 -0
  88. data/lib/hash_ext/traverse.rb +14 -0
  89. data/lib/voom.rb +25 -0
  90. data/lib/voom/container_methods.rb +2 -2
  91. data/lib/voom/engine.rb +5 -0
  92. data/lib/voom/presenters/api/app.rb +46 -13
  93. data/lib/voom/presenters/api/router.rb +3 -87
  94. data/lib/voom/presenters/app.rb +3 -3
  95. data/lib/voom/presenters/cli.rb +28 -0
  96. data/lib/voom/presenters/demo/dragon_drop.rb +48 -0
  97. data/lib/voom/presenters/demo/echo.rb +7 -0
  98. data/lib/voom/presenters/demo/slow.rb +18 -0
  99. data/lib/voom/presenters/dsl/components/actions/autocomplete.rb +15 -0
  100. data/lib/voom/presenters/dsl/components/actions/base.rb +65 -0
  101. data/lib/voom/presenters/dsl/components/actions/clear.rb +15 -0
  102. data/lib/voom/presenters/dsl/components/actions/close_dialog.rb +17 -0
  103. data/lib/voom/presenters/dsl/components/actions/deletes.rb +15 -0
  104. data/lib/voom/presenters/dsl/components/actions/dialog.rb +15 -0
  105. data/lib/voom/presenters/dsl/components/actions/loads.rb +31 -0
  106. data/lib/voom/presenters/dsl/components/actions/navigates.rb +15 -0
  107. data/lib/voom/presenters/dsl/components/actions/post_message.rb +17 -0
  108. data/lib/voom/presenters/dsl/components/actions/posts.rb +20 -0
  109. data/lib/voom/presenters/dsl/components/actions/prompt_if_dirty.rb +15 -0
  110. data/lib/voom/presenters/dsl/components/actions/remove.rb +15 -0
  111. data/lib/voom/presenters/dsl/components/actions/replaces.rb +25 -0
  112. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +15 -0
  113. data/lib/voom/presenters/dsl/components/actions/stepper.rb +15 -0
  114. data/lib/voom/presenters/dsl/components/actions/toggle_disabled.rb +15 -0
  115. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +15 -0
  116. data/lib/voom/presenters/dsl/components/actions/updates.rb +20 -0
  117. data/lib/voom/presenters/dsl/components/avatar.rb +5 -10
  118. data/lib/voom/presenters/dsl/components/badge.rb +0 -2
  119. data/lib/voom/presenters/dsl/components/base.rb +37 -21
  120. data/lib/voom/presenters/dsl/components/button.rb +23 -17
  121. data/lib/voom/presenters/dsl/components/card.rb +54 -42
  122. data/lib/voom/presenters/dsl/components/checkbox.rb +2 -2
  123. data/lib/voom/presenters/dsl/components/chip.rb +10 -13
  124. data/lib/voom/presenters/dsl/components/chipset.rb +33 -0
  125. data/lib/voom/presenters/dsl/components/content.rb +33 -13
  126. data/lib/voom/presenters/dsl/components/date_field.rb +1 -1
  127. data/lib/voom/presenters/dsl/components/datetime_base.rb +0 -3
  128. data/lib/voom/presenters/dsl/components/datetime_field.rb +0 -2
  129. data/lib/voom/presenters/dsl/components/dialog.rb +41 -13
  130. data/lib/voom/presenters/dsl/components/drawer.rb +13 -8
  131. data/lib/voom/presenters/dsl/components/event.rb +117 -60
  132. data/lib/voom/presenters/dsl/components/event_base.rb +1 -3
  133. data/lib/voom/presenters/dsl/components/expansion_panel.rb +3 -6
  134. data/lib/voom/presenters/dsl/components/file_input.rb +34 -0
  135. data/lib/voom/presenters/dsl/components/footer.rb +2 -2
  136. data/lib/voom/presenters/dsl/components/form.rb +3 -16
  137. data/lib/voom/presenters/dsl/components/grid.rb +64 -22
  138. data/lib/voom/presenters/dsl/components/header.rb +19 -6
  139. data/lib/voom/presenters/dsl/components/hidden_field.rb +1 -3
  140. data/lib/voom/presenters/dsl/components/icon.rb +3 -6
  141. data/lib/voom/presenters/dsl/components/icon_base.rb +6 -8
  142. data/lib/voom/presenters/dsl/components/icon_toggle.rb +3 -5
  143. data/lib/voom/presenters/dsl/components/image.rb +61 -13
  144. data/lib/voom/presenters/dsl/components/image_list.rb +43 -0
  145. data/lib/voom/presenters/dsl/components/input.rb +14 -5
  146. data/lib/voom/presenters/dsl/components/link.rb +33 -0
  147. data/lib/voom/presenters/dsl/components/list.rb +11 -16
  148. data/lib/voom/presenters/dsl/components/lists/action.rb +11 -14
  149. data/lib/voom/presenters/dsl/components/lists/actions.rb +60 -0
  150. data/lib/voom/presenters/dsl/components/lists/header.rb +2 -2
  151. data/lib/voom/presenters/dsl/components/lists/line.rb +40 -29
  152. data/lib/voom/presenters/dsl/components/lists/separator.rb +2 -2
  153. data/lib/voom/presenters/dsl/components/menu.rb +56 -16
  154. data/lib/voom/presenters/dsl/components/mixins/append.rb +2 -2
  155. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +7 -3
  156. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +1 -4
  157. data/lib/voom/presenters/dsl/components/mixins/buttons.rb +1 -1
  158. data/lib/voom/presenters/dsl/components/mixins/chips.rb +0 -3
  159. data/lib/voom/presenters/dsl/components/mixins/chipset.rb +19 -0
  160. data/lib/voom/presenters/dsl/components/mixins/common.rb +21 -16
  161. data/lib/voom/presenters/dsl/components/mixins/content.rb +1 -1
  162. data/lib/voom/presenters/dsl/components/mixins/date_time_fields.rb +0 -3
  163. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +0 -3
  164. data/lib/voom/presenters/dsl/components/mixins/event.rb +2 -4
  165. data/lib/voom/presenters/dsl/components/mixins/expansion_panels.rb +1 -1
  166. data/lib/voom/presenters/dsl/components/mixins/file_inputs.rb +16 -0
  167. data/lib/voom/presenters/dsl/components/mixins/google_maps.rb +15 -0
  168. data/lib/voom/presenters/dsl/components/mixins/grids.rb +1 -1
  169. data/lib/voom/presenters/dsl/components/mixins/icons.rb +0 -1
  170. data/lib/voom/presenters/dsl/components/mixins/image_lists.rb +15 -0
  171. data/lib/voom/presenters/dsl/components/mixins/last_response.rb +48 -0
  172. data/lib/voom/presenters/dsl/components/mixins/menus.rb +1 -1
  173. data/lib/voom/presenters/dsl/components/mixins/padding.rb +42 -0
  174. data/lib/voom/presenters/dsl/components/mixins/progress.rb +16 -0
  175. data/lib/voom/presenters/dsl/components/mixins/selects.rb +0 -1
  176. data/lib/voom/presenters/dsl/components/mixins/sliders.rb +15 -0
  177. data/lib/voom/presenters/dsl/components/mixins/snackbars.rb +0 -1
  178. data/lib/voom/presenters/dsl/components/mixins/steppers.rb +15 -0
  179. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +17 -0
  180. data/lib/voom/presenters/dsl/components/mixins/tables.rb +15 -0
  181. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +10 -3
  182. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +0 -5
  183. data/lib/voom/presenters/dsl/components/mixins/tooltips.rb +0 -1
  184. data/lib/voom/presenters/dsl/components/mixins/typography.rb +91 -14
  185. data/lib/voom/presenters/dsl/components/mixins/yield_to.rb +2 -2
  186. data/lib/voom/presenters/dsl/components/number_field.rb +20 -0
  187. data/lib/voom/presenters/dsl/components/page.rb +0 -1
  188. data/lib/voom/presenters/dsl/components/page_title.rb +31 -0
  189. data/lib/voom/presenters/dsl/components/progress.rb +27 -0
  190. data/lib/voom/presenters/dsl/components/radio_button.rb +0 -1
  191. data/lib/voom/presenters/dsl/components/rich_text_area.rb +20 -0
  192. data/lib/voom/presenters/dsl/components/select.rb +23 -12
  193. data/lib/voom/presenters/dsl/components/separator.rb +21 -0
  194. data/lib/voom/presenters/dsl/components/slider.rb +38 -0
  195. data/lib/voom/presenters/dsl/components/snackbar.rb +2 -2
  196. data/lib/voom/presenters/dsl/components/stepper.rb +96 -0
  197. data/lib/voom/presenters/dsl/components/switch.rb +0 -2
  198. data/lib/voom/presenters/dsl/components/tab_bar.rb +50 -0
  199. data/lib/voom/presenters/dsl/components/table.rb +126 -35
  200. data/lib/voom/presenters/dsl/components/text_area.rb +4 -5
  201. data/lib/voom/presenters/dsl/components/text_field.rb +55 -16
  202. data/lib/voom/presenters/dsl/components/time_field.rb +0 -2
  203. data/lib/voom/presenters/dsl/components/toggle_base.rb +8 -6
  204. data/lib/voom/presenters/dsl/components/tooltip.rb +1 -2
  205. data/lib/voom/presenters/dsl/components/typography.rb +6 -7
  206. data/lib/voom/presenters/dsl/components/unordered_list.rb +50 -0
  207. data/lib/voom/presenters/dsl/definer.rb +0 -4
  208. data/lib/voom/presenters/dsl/definition.rb +9 -6
  209. data/lib/voom/presenters/dsl/protect_from_forgery.rb +43 -0
  210. data/lib/voom/presenters/dsl/user_interface.rb +43 -32
  211. data/lib/voom/presenters/errors.rb +1 -0
  212. data/lib/voom/presenters/errors/invalid_dsl.rb +8 -0
  213. data/lib/voom/presenters/errors/parameter_validation.rb +1 -3
  214. data/lib/voom/presenters/generators/inflectors.rb +59 -0
  215. data/lib/voom/presenters/generators/plugin.rb +115 -0
  216. data/lib/voom/presenters/generators/templates/plugin/.gitignore +12 -0
  217. data/lib/voom/presenters/generators/templates/plugin/Gemfile +6 -0
  218. data/lib/voom/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  219. data/lib/voom/presenters/generators/templates/plugin/README.md +253 -0
  220. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/action.rb.tt +16 -0
  221. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  222. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/component.rb.tt +18 -0
  223. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/components/dsl.rb.tt +19 -0
  224. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/helpers/helper.rb.tt +15 -0
  225. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/plugin.rb.tt +9 -0
  226. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  227. data/lib/voom/presenters/generators/templates/plugin/lib/voom/presenters/plugins/web_client/components/render.rb.tt +23 -0
  228. data/lib/voom/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  229. data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  230. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  231. data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  232. data/lib/voom/presenters/generators/templates/plugin/views/components/component.erb.tt +14 -0
  233. data/lib/voom/presenters/generators/templates/plugin/views/components/component_header.erb.tt +20 -0
  234. data/lib/voom/presenters/helpers.rb +2 -8
  235. data/lib/voom/presenters/helpers/date.rb +3 -3
  236. data/lib/voom/presenters/helpers/inflector.rb +1 -1
  237. data/lib/voom/presenters/helpers/rails.rb +18 -6
  238. data/lib/voom/presenters/helpers/rails/model_table.rb +14 -6
  239. data/lib/voom/presenters/helpers/redact.rb +13 -0
  240. data/lib/voom/presenters/helpers/route.rb +15 -2
  241. data/lib/voom/presenters/helpers/time.rb +1 -1
  242. data/lib/voom/presenters/namespace.rb +12 -0
  243. data/lib/voom/presenters/pluggable.rb +37 -0
  244. data/lib/voom/presenters/plugins.rb +7 -0
  245. data/lib/voom/presenters/plugins/google_maps.rb +24 -0
  246. data/lib/voom/presenters/plugins/google_maps/google_map.erb +10 -0
  247. data/lib/voom/presenters/plugins/google_maps/google_map.rb +41 -0
  248. data/lib/voom/presenters/{dsl.rb → registry.rb} +14 -10
  249. data/lib/voom/presenters/router.rb +59 -0
  250. data/lib/voom/presenters/settings.rb +70 -39
  251. data/lib/voom/presenters/version.rb +3 -1
  252. data/lib/voom/presenters/web_client/app.rb +121 -34
  253. data/lib/voom/presenters/web_client/component_decorator_factory.rb +27 -0
  254. data/lib/voom/presenters/web_client/component_html_decorator.rb +50 -0
  255. data/lib/voom/presenters/web_client/component_renderer.rb +49 -0
  256. data/lib/voom/presenters/web_client/custom_css.rb +65 -0
  257. data/lib/voom/presenters/web_client/custom_render.rb +31 -0
  258. data/lib/voom/presenters/web_client/helpers/expand_hash.rb +19 -0
  259. data/lib/voom/presenters/web_client/helpers/form_helpers.rb +14 -0
  260. data/lib/voom/presenters/web_client/helpers/padding_helpers.rb +21 -0
  261. data/lib/voom/presenters/web_client/plugin_headers.rb +37 -0
  262. data/lib/voom/presenters/web_client/router.rb +3 -89
  263. data/lib/voom/railtie.rb +37 -0
  264. data/lib/voom/serializer.rb +2 -2
  265. data/lib/voom/symbol/to_str.rb +3 -3
  266. data/lib/voom/trace.rb +0 -2
  267. data/presenters.gemspec +11 -6
  268. data/public/bundle.css +18221 -0
  269. data/public/bundle.js +59949 -0
  270. data/public/img/demo/avatar.jpg +0 -0
  271. data/public/presenters/custom_css.css +26 -0
  272. data/public/style-bundle.js +2 -2
  273. data/public/wc.js +52704 -0
  274. data/scripts/build.sh +10 -0
  275. data/views/mdc/.babelrc +8 -0
  276. data/views/mdc/.eslintrc.yml +24 -0
  277. data/views/mdc/.nvmrc +1 -0
  278. data/views/mdc/assets/js/app.js +30 -6
  279. data/views/mdc/assets/js/components/base-component.js +160 -2
  280. data/views/mdc/assets/js/components/base-container.js +87 -0
  281. data/views/mdc/assets/js/components/base-toggle.js +56 -0
  282. data/views/mdc/assets/js/components/button.js +71 -9
  283. data/views/mdc/assets/js/components/cards.js +13 -2
  284. data/views/mdc/assets/js/components/checkboxes.js +11 -11
  285. data/views/mdc/assets/js/components/chips.js +104 -7
  286. data/views/mdc/assets/js/components/content.js +14 -0
  287. data/views/mdc/assets/js/components/data-tables.js +15 -0
  288. data/views/mdc/assets/js/components/datetime.js +83 -20
  289. data/views/mdc/assets/js/components/dialogs.js +130 -27
  290. data/views/mdc/assets/js/components/drag_n_drop.js +182 -0
  291. data/views/mdc/assets/js/components/drawer.js +43 -0
  292. data/views/mdc/assets/js/components/events.js +195 -68
  293. data/views/mdc/assets/js/components/events/action_parameter.js +62 -0
  294. data/views/mdc/assets/js/components/events/action_parameter.test.js +62 -0
  295. data/views/mdc/assets/js/components/events/autocomplete.js +15 -17
  296. data/views/mdc/assets/js/components/events/base.js +142 -16
  297. data/views/mdc/assets/js/components/events/clears.js +15 -12
  298. data/views/mdc/assets/js/components/events/close_dialog.js +50 -0
  299. data/views/mdc/assets/js/components/events/dialog.js +32 -14
  300. data/views/mdc/assets/js/components/events/encode.js +8 -0
  301. data/views/mdc/assets/js/components/events/errors.js +175 -92
  302. data/views/mdc/assets/js/components/events/loads.js +50 -11
  303. data/views/mdc/assets/js/components/events/navigates.js +17 -15
  304. data/views/mdc/assets/js/components/events/plugin.js +18 -0
  305. data/views/mdc/assets/js/components/events/post_message.js +21 -0
  306. data/views/mdc/assets/js/components/events/posts.js +169 -47
  307. data/views/mdc/assets/js/components/events/prompt_if_dirty.js +67 -0
  308. data/views/mdc/assets/js/components/events/removes.js +21 -0
  309. data/views/mdc/assets/js/components/events/replaces.js +110 -57
  310. data/views/mdc/assets/js/components/events/snackbar.js +10 -10
  311. data/views/mdc/assets/js/components/events/stepper.js +21 -0
  312. data/views/mdc/assets/js/components/events/toggle_disabled.js +41 -0
  313. data/views/mdc/assets/js/components/events/toggle_visibility.js +62 -16
  314. data/views/mdc/assets/js/components/file-inputs.js +76 -0
  315. data/views/mdc/assets/js/components/form-fields.js +16 -0
  316. data/views/mdc/assets/js/components/forms.js +9 -60
  317. data/views/mdc/assets/js/components/get_event_target.js +15 -0
  318. data/views/mdc/assets/js/components/grid.js +21 -0
  319. data/views/mdc/assets/js/components/header.js +20 -0
  320. data/views/mdc/assets/js/components/hidden-fields.js +44 -0
  321. data/views/mdc/assets/js/components/icon-toggles.js +10 -17
  322. data/views/mdc/assets/js/components/images.js +19 -0
  323. data/views/mdc/assets/js/components/initialize.js +62 -18
  324. data/views/mdc/assets/js/components/lists.js +10 -5
  325. data/views/mdc/assets/js/components/menus.js +66 -20
  326. data/views/mdc/assets/js/components/mixins/dirtyable.js +22 -0
  327. data/views/mdc/assets/js/components/mixins/event-handler.js +7 -7
  328. data/views/mdc/assets/js/components/mixins/visibility-observer.js +35 -0
  329. data/views/mdc/assets/js/components/plugins.js +86 -0
  330. data/views/mdc/assets/js/components/progress.js +31 -0
  331. data/views/mdc/assets/js/components/radios.js +14 -0
  332. data/views/mdc/assets/js/components/rich-text-area.js +227 -0
  333. data/views/mdc/assets/js/components/rich-text-area/horizontal-rule-blot.js +23 -0
  334. data/views/mdc/assets/js/components/root_document.js +5 -0
  335. data/views/mdc/assets/js/components/selects.js +41 -30
  336. data/views/mdc/assets/js/components/sliders.js +67 -0
  337. data/views/mdc/assets/js/components/snackbar.js +17 -23
  338. data/views/mdc/assets/js/components/steppers.js +48 -0
  339. data/views/mdc/assets/js/components/switches.js +10 -32
  340. data/views/mdc/assets/js/components/tab-bars.js +28 -0
  341. data/views/mdc/assets/js/components/text-fields.js +117 -43
  342. data/views/mdc/assets/js/components/tooltip.js +17 -0
  343. data/views/mdc/assets/js/components/typography.js +28 -0
  344. data/views/mdc/assets/js/components/uninitialize.js +7 -0
  345. data/views/mdc/assets/js/config.js +27 -0
  346. data/views/mdc/assets/js/mdl-stepper.js +1108 -0
  347. data/views/mdc/assets/js/utils/compatibility.js +9 -0
  348. data/views/mdc/assets/js/utils/config.js +73 -0
  349. data/views/mdc/assets/js/utils/config.test.js +59 -0
  350. data/views/mdc/assets/js/utils/urls.js +5 -2
  351. data/views/mdc/assets/js/wc.js +111 -0
  352. data/views/mdc/assets/scss/app.scss +20 -5
  353. data/views/mdc/assets/scss/components/avatar.scss +51 -7
  354. data/views/mdc/assets/scss/components/button.scss +20 -7
  355. data/views/mdc/assets/scss/components/card.scss +13 -7
  356. data/views/mdc/assets/scss/components/checkbox.scss +0 -4
  357. data/views/mdc/assets/scss/components/chip.scss +4 -0
  358. data/views/mdc/assets/scss/components/content.scss +36 -0
  359. data/views/mdc/assets/scss/components/data-table.scss +91 -0
  360. data/views/mdc/assets/scss/components/datetime.scss +7 -2
  361. data/views/mdc/assets/scss/components/dialog.scss +7 -2
  362. data/views/mdc/assets/scss/components/drag_n_drop.scss +17 -0
  363. data/views/mdc/assets/scss/components/drawer.scss +82 -0
  364. data/views/mdc/assets/scss/components/expansion-panel.scss +2 -2
  365. data/views/mdc/assets/scss/components/fab.scss +23 -4
  366. data/views/mdc/assets/scss/components/file-input.scss +18 -0
  367. data/views/mdc/assets/scss/components/grid.scss +74 -3
  368. data/views/mdc/assets/scss/components/header.scss +21 -0
  369. data/views/mdc/assets/scss/components/icon-button-toggles.scss +2 -0
  370. data/views/mdc/assets/scss/components/icon.scss +23 -0
  371. data/views/mdc/assets/scss/components/image-list.scss +18 -0
  372. data/views/mdc/assets/scss/components/image.scss +14 -16
  373. data/views/mdc/assets/scss/components/list.scss +19 -0
  374. data/views/mdc/assets/scss/components/menu.scss +14 -3
  375. data/views/mdc/assets/scss/components/progress.scss +1 -0
  376. data/views/mdc/assets/scss/components/radio.scss +4 -0
  377. data/views/mdc/assets/scss/components/rich-text-area.scss +73 -0
  378. data/views/mdc/assets/scss/components/select.scss +6 -3
  379. data/views/mdc/assets/scss/components/separator.scss +3 -0
  380. data/views/mdc/assets/scss/components/slider.scss +1 -0
  381. data/views/mdc/assets/scss/components/snackbar.scss +1 -5
  382. data/views/mdc/assets/scss/components/stepper.scss +235 -0
  383. data/views/mdc/assets/scss/components/switch.scss +13 -4
  384. data/views/mdc/assets/scss/components/tab-bars.scss +4 -0
  385. data/views/mdc/assets/scss/components/textfield.scss +14 -3
  386. data/views/mdc/assets/scss/components/tooltip.scss +3 -0
  387. data/views/mdc/assets/scss/components/typography.scss +10 -0
  388. data/views/mdc/assets/scss/components/unordered-lists.scss +17 -0
  389. data/views/mdc/assets/scss/components/vendor/quill.snow.css +945 -0
  390. data/views/mdc/assets/scss/material.blue_grey-orange.min.css +1 -1
  391. data/views/mdc/assets/scss/media.scss +39 -0
  392. data/views/mdc/assets/scss/palette.scss +16 -0
  393. data/views/mdc/assets/scss/styles.scss +40 -1
  394. data/views/mdc/assets/scss/theme.scss +25 -2
  395. data/views/mdc/body/dismissable-drawer.erb +34 -0
  396. data/views/mdc/body/drawer/divider.erb +1 -0
  397. data/views/mdc/body/drawer/item.erb +13 -0
  398. data/views/mdc/body/drawer/label.erb +1 -0
  399. data/views/mdc/body/drawers/menu.erb +1 -1
  400. data/views/mdc/body/footers/menu_item.erb +2 -2
  401. data/views/mdc/body/header.erb +38 -30
  402. data/views/mdc/body/modal-drawer.erb +35 -0
  403. data/views/mdc/body/snackbar.erb +12 -6
  404. data/views/mdc/components/actions/autocomplete.rb +8 -0
  405. data/views/mdc/components/actions/clear.rb +11 -0
  406. data/views/mdc/components/actions/close_dialog.rb +10 -0
  407. data/views/mdc/components/actions/delete.rb +11 -0
  408. data/views/mdc/components/actions/dialog.rb +11 -0
  409. data/views/mdc/components/actions/loads.rb +17 -0
  410. data/views/mdc/components/actions/navigates.rb +11 -0
  411. data/views/mdc/components/actions/post.rb +14 -0
  412. data/views/mdc/components/actions/post_message.rb +10 -0
  413. data/views/mdc/components/actions/prompt_if_dirty.rb +17 -0
  414. data/views/mdc/components/actions/remove.rb +10 -0
  415. data/views/mdc/components/actions/replaces.rb +16 -0
  416. data/views/mdc/components/actions/resolver.rb +39 -0
  417. data/views/mdc/components/actions/snackbar.rb +12 -0
  418. data/views/mdc/components/actions/stepper.rb +10 -0
  419. data/views/mdc/components/actions/toggle_disabled.rb +10 -0
  420. data/views/mdc/components/actions/toggle_visibility.rb +10 -0
  421. data/views/mdc/components/actions/update.rb +10 -0
  422. data/views/mdc/components/avatar.erb +12 -7
  423. data/views/mdc/components/badge.erb +1 -1
  424. data/views/mdc/components/button.erb +10 -8
  425. data/views/mdc/components/buttons/button.erb +19 -14
  426. data/views/mdc/components/buttons/fab.erb +9 -2
  427. data/views/mdc/components/buttons/icon.erb +12 -5
  428. data/views/mdc/components/buttons/image.erb +11 -5
  429. data/views/mdc/components/{display.erb → caption.erb} +0 -0
  430. data/views/mdc/components/card.erb +67 -41
  431. data/views/mdc/components/checkbox.erb +32 -23
  432. data/views/mdc/components/chip.erb +39 -22
  433. data/views/mdc/components/chipset.erb +18 -0
  434. data/views/mdc/components/content.erb +37 -11
  435. data/views/mdc/components/datetime.erb +12 -17
  436. data/views/mdc/components/dialog.erb +45 -22
  437. data/views/mdc/components/drag_and_drop/drag_and_drop.rb +16 -0
  438. data/views/mdc/components/event.erb +3 -9
  439. data/views/mdc/components/expansion_panel.erb +8 -6
  440. data/views/mdc/components/file_input.erb +17 -0
  441. data/views/mdc/components/form.erb +7 -8
  442. data/views/mdc/components/grid.erb +27 -10
  443. data/views/mdc/components/headline.erb +2 -0
  444. data/views/mdc/components/hidden_field.erb +5 -1
  445. data/views/mdc/components/icon.erb +7 -5
  446. data/views/mdc/components/icon_toggle.erb +9 -8
  447. data/views/mdc/components/image.erb +23 -5
  448. data/views/mdc/components/image_list.erb +38 -0
  449. data/views/mdc/components/link.erb +3 -13
  450. data/views/mdc/components/list.erb +9 -4
  451. data/views/mdc/components/list/actions/switch.erb +1 -1
  452. data/views/mdc/components/list/avatar.erb +2 -1
  453. data/views/mdc/components/list/header.erb +5 -3
  454. data/views/mdc/components/list/hidden_field.erb +3 -0
  455. data/views/mdc/components/list/icon.erb +2 -1
  456. data/views/mdc/components/list/line.erb +24 -13
  457. data/views/mdc/components/list/menu.erb +7 -2
  458. data/views/mdc/components/list/separator.erb +1 -1
  459. data/views/mdc/components/menu.erb +20 -16
  460. data/views/mdc/components/number_field.erb +38 -0
  461. data/views/mdc/components/{subheading.erb → overline.erb} +0 -0
  462. data/views/mdc/components/page_title.erb +2 -2
  463. data/views/mdc/components/progress.erb +11 -0
  464. data/views/mdc/components/radio_button.erb +19 -10
  465. data/views/mdc/components/render.erb +2 -3
  466. data/views/mdc/components/rich_text_area.erb +22 -0
  467. data/views/mdc/components/select.erb +28 -8
  468. data/views/mdc/components/separator.erb +3 -0
  469. data/views/mdc/components/shared/hint_error_display.erb +9 -0
  470. data/views/mdc/components/shared/input_label.erb +7 -0
  471. data/views/mdc/components/slider.erb +43 -0
  472. data/views/mdc/components/snackbar.erb +2 -6
  473. data/views/mdc/components/stepper.erb +47 -0
  474. data/views/mdc/components/stepper/step.erb +33 -0
  475. data/views/mdc/components/{title.erb → subtitle.erb} +0 -0
  476. data/views/mdc/components/switch.erb +28 -12
  477. data/views/mdc/components/tab_bar.erb +35 -0
  478. data/views/mdc/components/table.erb +28 -13
  479. data/views/mdc/components/table/checkbox.erb +20 -0
  480. data/views/mdc/components/table/column.erb +18 -0
  481. data/views/mdc/components/table/footer.erb +8 -0
  482. data/views/mdc/components/table/header.erb +14 -4
  483. data/views/mdc/components/table/pagination.erb +11 -24
  484. data/views/mdc/components/table/row.erb +7 -5
  485. data/views/mdc/components/text_area.erb +15 -7
  486. data/views/mdc/components/text_field.erb +38 -28
  487. data/views/mdc/components/tooltip.erb +2 -2
  488. data/views/mdc/components/typography.erb +7 -5
  489. data/views/mdc/components/unordered_list.erb +10 -0
  490. data/views/mdc/components/unordered_list/icon.erb +3 -0
  491. data/views/mdc/components/unordered_list/list_item.erb +7 -0
  492. data/views/mdc/layout.erb +45 -31
  493. data/views/mdc/package-lock.json +11786 -6868
  494. data/views/mdc/package.json +66 -29
  495. data/views/mdc/web.erb +4 -0
  496. data/views/mdc/webpack.config.js +14 -1
  497. metadata +341 -32
  498. data/app/demo/components/forms.pom +0 -31
  499. data/lib/voom-presenters.rb +0 -9
  500. data/lib/voom/presenters-engine.rb +0 -41
  501. data/lib/voom/presenters.rb +0 -13
  502. data/lib/voom/presenters/dsl/components/action.rb +0 -35
  503. data/lib/voom/presenters/web_client/markdown_render.rb +0 -16
  504. data/public/.gitignore +0 -2
  505. data/scripts/bump.sh +0 -4
  506. data/scripts/deploy-demo.sh +0 -2
  507. data/scripts/release.sh +0 -5
  508. data/views/mdc/assets/js/dialog-polyfill.js +0 -738
  509. data/views/mdc/assets/js/material.js +0 -3996
  510. data/views/mdc/assets/scss/components/icon-toggles.scss +0 -9
  511. data/views/mdc/assets/scss/components/table-pagination.scss +0 -65
  512. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +0 -13
  513. data/views/mdc/body/drawer.erb +0 -18
  514. data/views/mdc/components/modal.erb +0 -15
  515. data/views/mdc/components/static.erb +0 -7
@@ -0,0 +1,1108 @@
1
+ /*
2
+ This file was copied from the MDL Stepper Polyfill at https://ahlechandre.github.io/mdl-stepper/component/
3
+ The stepper looks and behaves failry well but we wanted some specific behavior changes so pulled in a copy here.
4
+ */
5
+
6
+
7
+ /******/ (function(modules) { // webpackBootstrap
8
+ /******/ // The module cache
9
+ /******/ var installedModules = {};
10
+
11
+ /******/ // The require function
12
+ /******/ function __webpack_require__(moduleId) {
13
+
14
+ /******/ // Check if module is in cache
15
+ /******/ if(installedModules[moduleId])
16
+ /******/ return installedModules[moduleId].exports;
17
+
18
+ /******/ // Create a new module (and put it into the cache)
19
+ /******/ var module = installedModules[moduleId] = {
20
+ /******/ exports: {},
21
+ /******/ id: moduleId,
22
+ /******/ loaded: false
23
+ /******/ };
24
+
25
+ /******/ // Execute the module function
26
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
27
+
28
+ /******/ // Flag the module as loaded
29
+ /******/ module.loaded = true;
30
+
31
+ /******/ // Return the exports of the module
32
+ /******/ return module.exports;
33
+ /******/ }
34
+
35
+
36
+ /******/ // expose the modules object (__webpack_modules__)
37
+ /******/ __webpack_require__.m = modules;
38
+
39
+ /******/ // expose the module cache
40
+ /******/ __webpack_require__.c = installedModules;
41
+
42
+ /******/ // __webpack_public_path__
43
+ /******/ __webpack_require__.p = "";
44
+
45
+ /******/ // Load entry module and return exports
46
+ /******/ return __webpack_require__(0);
47
+ /******/ })
48
+ /************************************************************************/
49
+ /******/ ([
50
+ /* 0 */
51
+ /***/ function(module, exports) {
52
+
53
+ 'use strict';
54
+
55
+ /**
56
+ * MDL Stepper - A library that implements to the Material Design Lite (MDL) a polyfill for stepper
57
+ * component specified by Material Design.
58
+ * @version v1.1.6
59
+ * @author Alexandre Thebaldi <ahlechandre@gmail.com>.
60
+ * @link https://github.com/ahlechandre/mdl-stepper
61
+ */
62
+
63
+ (function () {
64
+ 'use strict';
65
+
66
+ /**
67
+ * Class constructor for Stepper MDL component.
68
+ * Implements MDL component design pattern defined at:
69
+ * https://github.com/jasonmayes/mdl-component-design-pattern
70
+ *
71
+ * @constructor
72
+ * @param {HTMLElement} element The element that will be upgraded.
73
+ */
74
+
75
+ function MaterialStepper(element) {
76
+ this.element_ = element;
77
+
78
+ // initialize instance.
79
+ this.init();
80
+ }
81
+
82
+ window.MaterialStepper = MaterialStepper;
83
+
84
+ /**
85
+ * Store properties of stepper.
86
+ * @private
87
+ */
88
+ MaterialStepper.prototype.Stepper_ = {};
89
+
90
+ /**
91
+ * Get properties of stepper.
92
+ * @return {Object}
93
+ * @private
94
+ */
95
+ MaterialStepper.prototype.getStepper_ = function () {
96
+ return {
97
+ isLinear: this.element_.classList.contains(this.CssClasses_.STEPPER_LINEAR),
98
+ hasFeedback: this.element_.classList.contains(this.CssClasses_.STEPPER_FEEDBACK)
99
+ };
100
+ };
101
+
102
+ /**
103
+ * Store strings for steps states.
104
+ * @enum {string}
105
+ * @private
106
+ */
107
+ MaterialStepper.prototype.StepState_ = {
108
+ COMPLETED: 'completed',
109
+ ERROR: 'error',
110
+ NORMAL: 'normal'
111
+ };
112
+
113
+ /**
114
+ * Store strings for dataset attributes defined by this component that are used for
115
+ * JavaScript custom events.
116
+ *
117
+ * @enum {string}
118
+ * @private
119
+ */
120
+ MaterialStepper.prototype.DatasetAttributes_ = {
121
+ CONTINUE: 'stepper-next',
122
+ CANCEL: 'stepper-cancel',
123
+ SKIP: 'stepper-skip',
124
+ BACK: 'stepper-back'
125
+ };
126
+
127
+ /**
128
+ * Issue: https://github.com/ahlechandre/mdl-stepper/issues/14
129
+ * Returns a custom event object
130
+ * @param {string} evtName The name/type of custom event to create.
131
+ * @param {bool} bubble If event is bubbleable.
132
+ * @param {bool} cancel If event is cancelable.
133
+ * @returns {Event}
134
+ */
135
+ MaterialStepper.prototype.defineCustomEvent = function (evtName, bubble, cancel) {
136
+ var ev;
137
+ if ('CustomEvent' in window && typeof window.CustomEvent === 'function') {
138
+ ev = new Event(evtName, {
139
+ bubbles: bubble,
140
+ cancelable: cancel
141
+ });
142
+ } else {
143
+ ev = document.createEvent('Events');
144
+ ev.initEvent(evtName, bubble, cancel);
145
+ }
146
+ return ev;
147
+ };
148
+
149
+ /**
150
+ * Store the custom events applieds to the steps and stepper.
151
+ *
152
+ * @private
153
+ */
154
+ MaterialStepper.prototype.CustomEvents_ = {
155
+ onstepnext: MaterialStepper.prototype.defineCustomEvent('onstepnext', true, true),
156
+ onstepcancel: MaterialStepper.prototype.defineCustomEvent('onstepcancel', true, true),
157
+ onstepskip: MaterialStepper.prototype.defineCustomEvent('onstepskip', true, true),
158
+ onstepback: MaterialStepper.prototype.defineCustomEvent('onstepback', true, true),
159
+ onstepcomplete: MaterialStepper.prototype.defineCustomEvent('onstepcomplete', true, true),
160
+ onsteperror: MaterialStepper.prototype.defineCustomEvent('onsteperror', true, true),
161
+ onsteppercomplete: MaterialStepper.prototype.defineCustomEvent('onsteppercomplete', true, true)
162
+ };
163
+
164
+ /**
165
+ * Store strings for class names defined by this component that are used in
166
+ * JavaScript. This allows us to simply change it in one place should we
167
+ * decide to modify at a later date.
168
+ *
169
+ * @enum {string}
170
+ * @private
171
+ */
172
+ MaterialStepper.prototype.CssClasses_ = {
173
+ BUTTON_JS: 'mdl-js-button',
174
+ STEPPER_LINEAR: 'mdl-stepper--linear',
175
+ STEPPER_FEEDBACK: 'mdl-stepper--feedback',
176
+ STEP_COMPLETED: 'mdl-step--completed',
177
+ STEP_ERROR: 'mdl-step--error',
178
+ STEP_TRANSIENT: 'mdl-step--transient',
179
+ STEP_OPTIONAL: 'mdl-step--optional',
180
+ STEP_EDITABLE: 'mdl-step--editable',
181
+ IS_ACTIVE: 'is-active',
182
+ TRANSIENT: 'mdl-step__transient',
183
+ TRANSIENT_OVERLAY: 'mdl-step__transient-overlay',
184
+ TRANSIENT_LOADER: 'mdl-step__transient-loader',
185
+ SPINNER: 'mdl-spinner',
186
+ SPINNER_JS: 'mdl-js-spinner',
187
+ SPINNER_IS_ACTIVE: 'is-active',
188
+ STEPPER: 'mdl-stepper',
189
+ STEP: 'mdl-step',
190
+ STEP_LABEL: 'mdl-step__label',
191
+ STEP_LABEL_INDICATOR: 'mdl-step__label-indicator',
192
+ STEP_LABEL_INDICATOR_CONTENT: 'mdl-step__label-indicator-content',
193
+ STEP_TITLE: 'mdl-step__title',
194
+ STEP_TITLE_TEXT: 'mdl-step__title-text',
195
+ STEP_TITLE_MESSAGE: 'mdl-step__title-message',
196
+ STEP_CONTENT: 'mdl-step__content',
197
+ STEP_ACTIONS: 'mdl-step__actions',
198
+ V_STEP_ACTIONS: 'v-step__actions',
199
+ V_STEP_CONTENT: 'v-step__content',
200
+ };
201
+
202
+ /**
203
+ * Store collection of steps and important data about them
204
+ * @private
205
+ */
206
+ MaterialStepper.prototype.Steps_ = {};
207
+
208
+ /**
209
+ * Returns the label indicator for referred to the passed step.
210
+ * @param {MaterialStepper.Steps_.collection.<step>} step The step that will get
211
+ * the label indicator.
212
+ * @return {HTMLElement}
213
+ * @private
214
+ */
215
+ MaterialStepper.prototype.getIndicatorElement_ = function (step) {
216
+ /** @type {HTMLElement} */
217
+ var indicatorElement;
218
+ /** @type {HTMLElement} */
219
+ var indicatorContent;
220
+ indicatorElement = document.createElement('span');
221
+ indicatorContent = this.getIndicatorContentNormal_(step.labelndicatorText);
222
+ indicatorElement.classList.add(this.CssClasses_.STEP_LABEL_INDICATOR);
223
+ indicatorElement.appendChild(indicatorContent);
224
+ return indicatorElement;
225
+ };
226
+
227
+ /**
228
+ * Create a new element that's represent "normal" label indicator.
229
+ * @param {string} text The text content of indicator (e.g. 1, 2..N).
230
+ * @return {HTMLElement}
231
+ * @private
232
+ */
233
+ MaterialStepper.prototype.getIndicatorContentNormal_ = function (text) {
234
+ /** @type {HTMLElement} */
235
+ var normal;
236
+ normal = document.createElement('span');
237
+ normal.classList.add(this.CssClasses_.STEP_LABEL_INDICATOR_CONTENT);
238
+ normal.textContent = text;
239
+ return normal;
240
+ };
241
+
242
+ /**
243
+ * Create a new element that's represent "completed" label indicator.
244
+ * @param {boolean} isEditable Flag to check if step is of editable type.
245
+ * @return {HTMLElement}
246
+ * @private
247
+ */
248
+ MaterialStepper.prototype.getIndicatorContentCompleted_ = function (isEditable) {
249
+ // Creates a new material icon to represent the completed step.
250
+ /** @type {HTMLElement} */
251
+ var completed;
252
+ completed = document.createElement('i');
253
+ completed.classList.add('material-icons', this.CssClasses_.STEP_LABEL_INDICATOR_CONTENT);
254
+ // If step is editable the icon used will be "edit",
255
+ // else the icon will be "check".
256
+ completed.textContent = isEditable ? 'edit' : 'check';
257
+ return completed;
258
+ };
259
+
260
+ /**
261
+ * Create a new element that's represent "error" label indicator.
262
+ * @return {HTMLElement}
263
+ * @private
264
+ */
265
+ MaterialStepper.prototype.getIndicatorContentError_ = function () {
266
+ /** @type {HTMLElement} */
267
+ var error;
268
+ error = document.createElement('span');
269
+ error.classList.add(this.CssClasses_.STEP_LABEL_INDICATOR_CONTENT);
270
+ error.textContent = '!';
271
+ return error;
272
+ };
273
+
274
+ /**
275
+ * Defines a new step model.
276
+ * @param {HTMLElement} step The step element.
277
+ * @param {number} id The unique number for each step.
278
+ * @return {Object}
279
+ * @private
280
+ */
281
+ MaterialStepper.prototype.getStepModel_ = function (step, id) {
282
+ /** @type {Object} */
283
+ var model;
284
+ /** @type {string} */
285
+ var selectorActionsBack;
286
+ /** @type {string} */
287
+ var selectorActionsCancel;
288
+ /** @type {string} */
289
+ var selectorActionsNext;
290
+ /** @type {string} */
291
+ var selectorActionsSkip;
292
+ selectorActionsBack = '[data-' + this.DatasetAttributes_.BACK + ']';
293
+ selectorActionsCancel = '[data-' + this.DatasetAttributes_.CANCEL + ']';
294
+ selectorActionsNext = '[data-' + this.DatasetAttributes_.CONTINUE + ']';
295
+ selectorActionsSkip = '[data-' + this.DatasetAttributes_.SKIP + ']';
296
+ model = {};
297
+ model.container = step;
298
+ model.id = id;
299
+ model.label = step.querySelector('.' + this.CssClasses_.STEP_LABEL);
300
+ model.labelndicatorText = id;
301
+ model.labelTitle = step.querySelector('.' + this.CssClasses_.STEP_TITLE);
302
+ model.labelTitleText = step.querySelector('.' + this.CssClasses_.STEP_TITLE_TEXT).textContent;
303
+ model.labelTitleMessage = step.querySelector('.' + this.CssClasses_.STEP_TITLE_MESSAGE);
304
+ model.labelTitleMessageText = model.labelTitleMessage ? model.labelTitleMessage.textContent : '';
305
+ // model.content = step.querySelector('.' + this.CssClasses_.STEP_CONTENT);
306
+ // model.actions = step.querySelector('.' + this.CssClasses_.STEP_ACTIONS);
307
+
308
+ // I made this mod as the step contents are no longer children of the steps themselves
309
+ model.content = document.querySelector('.' + this.CssClasses_.V_STEP_CONTENT + '-' + step.id);
310
+ model.actions = document.querySelector('.' + this.CssClasses_.V_STEP_ACTIONS + '-' + step.id);
311
+
312
+ model.actionsBack = model.actions.querySelector(selectorActionsBack) || null;
313
+ model.actionsCancel = model.actions.querySelector(selectorActionsCancel) || null;
314
+ model.actionsNext = model.actions.querySelector(selectorActionsNext) || null;
315
+ model.actionsSkip = model.actions.querySelector(selectorActionsSkip) || null;
316
+ model.labelIndicator = model.label.querySelector('.' + this.CssClasses_.STEP_LABEL_INDICATOR);
317
+
318
+ if (!model.labelIndicator) {
319
+ // Creates a new indicator for the label if not exists
320
+ model.labelIndicator = this.getIndicatorElement_(model);
321
+ model.label.appendChild(model.labelIndicator);
322
+ }
323
+
324
+ if (step.classList.contains(this.CssClasses_.STEP_COMPLETED)) {
325
+ model.state = this.StepState_.COMPLETED;
326
+ } else if (step.classList.contains(this.CssClasses_.STEP_ERROR)) {
327
+ model.state = this.StepState_.ERROR;
328
+ } else {
329
+ model.state = this.StepState_.NORMAL;
330
+ }
331
+ model.isActive = step.classList.contains(this.CssClasses_.IS_ACTIVE);
332
+ model.isOptional = step.classList.contains(this.CssClasses_.STEP_OPTIONAL);
333
+ model.isEditable = step.classList.contains(this.CssClasses_.STEP_EDITABLE);
334
+ return model;
335
+ };
336
+
337
+ /**
338
+ * Get the active step element.
339
+ * @return {HTMLElement}
340
+ */
341
+ MaterialStepper.prototype.getActive = function () {
342
+ return this.Steps_.collection[this.Steps_.active - 1].container;
343
+ };
344
+
345
+ /**
346
+ * Get the active step id.
347
+ * @return {number}
348
+ */
349
+ MaterialStepper.prototype.getActiveId = function () {
350
+ return this.Steps_.collection[this.Steps_.active - 1].id;
351
+ };
352
+
353
+ /**
354
+ * Load the model of all steps and store inside a collection.
355
+ * @return {Object}
356
+ * @private
357
+ */
358
+ MaterialStepper.prototype.getSteps_ = function () {
359
+ /** @type {array} */
360
+ var collection;
361
+ /** @type {number} */
362
+ var total;
363
+ /** @type {number} */
364
+ var completed;
365
+ /** @type {number} */
366
+ var optional;
367
+ /** @type {number} */
368
+ var active;
369
+ /** @type {HTMLElement} */
370
+ var stepElements;
371
+ /** @type {number} */
372
+ var i;
373
+ collection = [];
374
+ total = 0;
375
+ completed = 0;
376
+ optional = 0;
377
+ active = 0;
378
+ stepElements = this.element_.querySelectorAll('.' + this.CssClasses_.STEP);
379
+
380
+ for (i = 0; i < stepElements.length; i++) {
381
+ collection[i] = this.getStepModel_(stepElements[i], i + 1);
382
+
383
+ if (collection[i].isOptional) {
384
+ optional += 1;
385
+ }
386
+
387
+ if (collection[i].isActive) {
388
+ active = collection[i].id;
389
+ }
390
+
391
+ // Prevents the step label to scrolling out of user view on Google Chrome.
392
+ // More details here: <https://github.com/ahlechandre/mdl-stepper/issues/11 />.
393
+ stepElements[i].addEventListener('scroll', function (event) {
394
+ event.target.scrollTop = 0;
395
+ });
396
+ }
397
+ total = collection.length;
398
+ return {
399
+ collection: collection,
400
+ total: total,
401
+ completed: completed,
402
+ optional: optional,
403
+ active: active
404
+ };
405
+ };
406
+
407
+ /**
408
+ * Defines a specific step as "active".
409
+ * @param {MaterialStepper.Steps_.collection<step>} step A model of step.
410
+ * @return {boolean}
411
+ * @private
412
+ */
413
+ MaterialStepper.prototype.setStepActive_ = function (step) {
414
+ /** @type {function} */
415
+ var stepsDeactivator;
416
+
417
+ // The transient effect blocks the stepper to move
418
+ if (this.hasTransient()) return false;
419
+
420
+ stepsDeactivator = function stepsDeactivator(step) {
421
+ step.container.classList.remove(this.CssClasses_.IS_ACTIVE);
422
+ step.content.classList.remove(this.CssClasses_.IS_ACTIVE);
423
+
424
+ if (step.isActive) {
425
+ step.isActive = false;
426
+ }
427
+ };
428
+ this.Steps_.collection.forEach(stepsDeactivator.bind(this));
429
+ // remove if step was in transient (feedback) effect
430
+ step.container.classList.remove(this.CssClasses_.STEP_TRANSIENT);
431
+ step.container.classList.add(this.CssClasses_.IS_ACTIVE);
432
+ step.content.classList.add(this.CssClasses_.IS_ACTIVE);
433
+ step.isActive = true;
434
+ this.Steps_.active = step.id;
435
+ return true;
436
+ };
437
+
438
+ /**
439
+ * Defines as "active" the first step or a specific id.
440
+ * @param {number | undefined} id Unique number of a step.
441
+ * @return {boolean}
442
+ * @private
443
+ */
444
+ MaterialStepper.prototype.setActive_ = function (id) {
445
+ /** @type {HTMLElement | null} */
446
+ var active;
447
+ /** MaterialStepper.Steps_.collection<step> */
448
+ var first;
449
+ /** @type {number} */
450
+ var i;
451
+ /** @type {boolean} */
452
+ var moved;
453
+ /** MaterialStepper.Steps_.collection<step> */
454
+ var step;
455
+
456
+ // Return false if specified id is less or equal 0 and bigger than the last step
457
+ if (!isNaN(id) && (id > this.Steps_.total || id <= 0)) return false;
458
+
459
+ moved = false;
460
+
461
+ if (id) {
462
+ for (i = 0; i < this.Steps_.total; i++) {
463
+ step = this.Steps_.collection[i];
464
+
465
+ if (step.id === id) {
466
+ moved = this.setStepActive_(step);
467
+ break;
468
+ }
469
+ }
470
+ } else {
471
+ active = this.element_.querySelector('.' + this.CssClasses_.IS_ACTIVE);
472
+
473
+ if (!active) {
474
+ // Set the first step as "active" if none id was specified and
475
+ // no "active" step was found at the DOM.
476
+ first = this.Steps_.collection[0];
477
+ moved = this.setStepActive_(first);
478
+ }
479
+ }
480
+
481
+ if (this.Stepper_.isLinear) {
482
+ // We know that all steps previous the "active" are "completed"
483
+ // case the stepper is linear
484
+ this.updateLinearStates_();
485
+ }
486
+ return moved;
487
+ };
488
+
489
+ /**
490
+ * Change the state of a step
491
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to be updated.
492
+ * @param {string} state The step state ("completed", "error" or "normal").
493
+ * @return {boolean}
494
+ * @private
495
+ */
496
+ MaterialStepper.prototype.updateStepState_ = function (step, state) {
497
+ /** @type {string} */
498
+ var stateClass;
499
+ /** @type {HTMLElement} */
500
+ var indicatorContent;
501
+ /** @type {HTMLElement} */
502
+ var currentIndicatorContent;
503
+ /** @type {boolean} */
504
+ var stepperCompleted;
505
+ /** @type {boolean} */
506
+ var hasRequired;
507
+ /** @type {MaterialStepper.Steps_.collection<stepItem>} */
508
+ var stepItem;
509
+ /** @type {number} */
510
+ var item;
511
+ /** @type {string} */
512
+ var selectorIndicator;
513
+ selectorIndicator = '.' + this.CssClasses_.STEP_LABEL_INDICATOR_CONTENT;
514
+
515
+ // Can't update the state for the same.
516
+ if (step.state === state) return false;
517
+
518
+ // Case the current step state to change is "completed",
519
+ // we can decrement the total number of completed.
520
+ if (step.state === this.StepState_.COMPLETED) {
521
+ this.Steps_.completed -= 1;
522
+ }
523
+ currentIndicatorContent = step.labelIndicator.querySelector(selectorIndicator);
524
+
525
+ switch (state) {
526
+ case this.StepState_.COMPLETED:
527
+ {
528
+ // Case changing the current step state to "completed",
529
+ // we can increment the total number of completed.
530
+ this.Steps_.completed += 1;
531
+ step.container.classList.remove(this.CssClasses_.STEP_ERROR);
532
+ indicatorContent = this.getIndicatorContentCompleted_(step.isEditable);
533
+ stateClass = this.CssClasses_.STEP_COMPLETED;
534
+ break;
535
+ }
536
+ case this.StepState_.ERROR:
537
+ {
538
+ step.container.classList.remove(this.CssClasses_.STEP_COMPLETED);
539
+ indicatorContent = this.getIndicatorContentError_();
540
+ stateClass = this.CssClasses_.STEP_ERROR;
541
+ break;
542
+ }
543
+ case this.StepState_.NORMAL:
544
+ {
545
+ step.container.classList.remove(this.CssClasses_.STEP_COMPLETED);
546
+ step.container.classList.remove(this.CssClasses_.STEP_ERROR);
547
+ indicatorContent = this.getIndicatorContentNormal_(step.labelndicatorText);
548
+ break;
549
+ }
550
+ default:
551
+ {
552
+ break;
553
+ }
554
+ }
555
+
556
+ // "normal" is the default state and don't have specific css class.
557
+ if (stateClass) {
558
+ step.container.classList.add(stateClass);
559
+ }
560
+ step.labelIndicator.replaceChild(indicatorContent, currentIndicatorContent);
561
+ step.state = state;
562
+
563
+ // Case the total number of completed steps
564
+ // are equal the total number of steps less the optionals
565
+ // or total number of completed steps are equal the total number of steps,
566
+ // we can consider that the stepper are successfully complete and
567
+ // dispatch the custom event.
568
+ stepperCompleted = false;
569
+
570
+ if (this.Steps_.completed === this.Steps_.total) {
571
+ stepperCompleted = true;
572
+ } else if (this.Steps_.completed === this.Steps_.total - this.Steps_.optional) {
573
+ for (item in this.Steps_.collection) {
574
+ // eslint guard-for-in.
575
+ if (this.Steps_.collection.hasOwnProperty(item)) {
576
+ stepItem = this.Steps_.collection[item];
577
+ hasRequired = !stepItem.isOptional && stepItem.state !== this.StepState_.COMPLETED;
578
+
579
+ if (hasRequired) break;
580
+ }
581
+ }
582
+ stepperCompleted = !hasRequired;
583
+ }
584
+
585
+ if (stepperCompleted) {
586
+ this.dispatchEventOnStepperComplete_();
587
+ }
588
+
589
+ return true;
590
+ };
591
+
592
+ /**
593
+ * Change to "completed" the state of all steps previous the "active"
594
+ * except the optionals.
595
+ * @return {undefined}
596
+ * @private
597
+ */
598
+ MaterialStepper.prototype.updateLinearStates_ = function () {
599
+ /** @type {number} */
600
+ var i;
601
+
602
+ for (i = 0; i < this.Steps_.total; i++) {
603
+ if (this.Steps_.collection[i].isActive) {
604
+ break;
605
+ } else {
606
+ if (this.Steps_.collection[i].isOptional) continue;
607
+
608
+ this.updateStepState_(this.Steps_.collection[i], this.StepState_.COMPLETED);
609
+ }
610
+ }
611
+ };
612
+
613
+ /**
614
+ * Move "active" to the previous step. This operation can returns false
615
+ * if it does not regress the step.
616
+ * @return {boolean}
617
+ */
618
+ MaterialStepper.prototype.back = function () {
619
+ /** @type {boolean} */
620
+ var moved;
621
+ /** @type {function} */
622
+ var moveStep;
623
+ /** @type {string} */
624
+ var model;
625
+ /** @type {MaterialStepper.Steps_.collection<step>} */
626
+ var step;
627
+ /** @type {MaterialStepper.Steps_.collection<step>} */
628
+ var previous;
629
+ moved = false;
630
+ moveStep = function moveStep(step) {
631
+ /** @type {boolean} */
632
+ var stepActivated;
633
+ stepActivated = this.setActive_(step.id);
634
+
635
+ if (stepActivated) {
636
+ if (stepActivated && this.Stepper_.hasFeedback) {
637
+ // Remove the (feedback) transient effect before move.
638
+ this.removeTransientEffect_(step);
639
+ }
640
+ }
641
+ return stepActivated;
642
+ };
643
+
644
+ for (model in this.Steps_.collection) {
645
+ // Rule eslint guard-for-in.
646
+ if (this.Steps_.collection.hasOwnProperty(model)) {
647
+ step = this.Steps_.collection[model];
648
+
649
+ if (step.isActive) {
650
+ previous = this.Steps_.collection[step.id - 2];
651
+
652
+ if (!previous) return false;
653
+
654
+ if (this.Stepper_.isLinear) {
655
+ if (previous.isEditable) {
656
+ moved = moveStep.bind(this)(previous);
657
+ }
658
+ } else {
659
+ moved = moveStep.bind(this)(previous);
660
+ }
661
+ break;
662
+ }
663
+ }
664
+ }
665
+ return moved;
666
+ };
667
+
668
+ /**
669
+ * Move "active" to the next if the current step is optional. This operation can returns false
670
+ * if it does not advances the step.
671
+ * @return {boolean}
672
+ */
673
+ MaterialStepper.prototype.skip = function () {
674
+ /** @type {boolean} */
675
+ var moved;
676
+ /** @type {string} */
677
+ var model;
678
+ /** @type {MaterialStepper.Steps_.collection<step>} */
679
+ var step;
680
+ moved = false;
681
+
682
+ for (model in this.Steps_.collection) {
683
+ // Rule eslint guard-for-in.
684
+ if (this.Steps_.collection.hasOwnProperty(model)) {
685
+ step = this.Steps_.collection[model];
686
+
687
+ if (step.isActive) {
688
+ if (step.isOptional) {
689
+ moved = this.setActive_(step.id + 1);
690
+
691
+ if (moved && this.Stepper_.hasFeedback) {
692
+ // Remove the (feedback) transient effect before move
693
+ this.removeTransientEffect_(step);
694
+ }
695
+ }
696
+ break;
697
+ }
698
+ }
699
+ }
700
+ return moved;
701
+ };
702
+
703
+ /**
704
+ * Move "active" to specified step id.
705
+ * This operation is similar to the MaterialStepper.setActive_(<number>).
706
+ * @param {number} id Unique number for step.
707
+ * @return {boolean}
708
+ */
709
+ MaterialStepper.prototype.goto = function (id) {
710
+ return this.setActive_(id);
711
+ };
712
+
713
+ /**
714
+ * Defines the current state of step to "error" and display
715
+ * an alert message instead of default title message.
716
+ * @param {string} message The text content to show with error state.
717
+ * @return {undefined}
718
+ */
719
+ MaterialStepper.prototype.error = function (message) {
720
+ /** @type {string} */
721
+ var model;
722
+ /** @type {MaterialStepper.Steps_.collection<step>} */
723
+ var step;
724
+
725
+ for (model in this.Steps_.collection) {
726
+ // Rule eslint guard-for-in.
727
+ if (this.Steps_.collection.hasOwnProperty(model)) {
728
+ step = this.Steps_.collection[model];
729
+
730
+ if (step.isActive) {
731
+ if (this.Stepper_.hasFeedback) {
732
+ // Remove the (feedback) transient effect before move.
733
+ this.removeTransientEffect_(step);
734
+ }
735
+ this.updateStepState_(step, this.StepState_.ERROR);
736
+
737
+ if (message) {
738
+ this.updateTitleMessage_(step, message);
739
+ }
740
+ // Now dispatch on step the custom event "onsteperror".
741
+ this.dispatchEventOnStepError_(step);
742
+ break;
743
+ }
744
+ }
745
+ }
746
+ };
747
+
748
+ /**
749
+ * Defines current step state to "completed" and move active to the next.
750
+ * This operation can returns false if it does not advance the step.
751
+ * @return {boolean}
752
+ */
753
+ MaterialStepper.prototype.next = function () {
754
+ /** @type {boolean} */
755
+ var moved;
756
+ /** @type {MaterialStepper.Steps_.collection<step>} */
757
+ var step;
758
+ /** @type {number} */
759
+ var activate;
760
+ /** @type {string} */
761
+ var model;
762
+ /** @type {string} */
763
+ var item;
764
+ /** @type {MaterialStepper.Steps_.collection<stepItem>} */
765
+ var stepItem;
766
+ moved = false;
767
+
768
+ for (model in this.Steps_.collection) {
769
+ // Rule eslint guard-for-in.
770
+ if (this.Steps_.collection.hasOwnProperty(model)) {
771
+ step = this.Steps_.collection[model];
772
+
773
+ if (step.isActive) {
774
+ activate = step.id + 1;
775
+
776
+ if (this.Stepper_.hasFeedback) {
777
+ // Remove the (feedback) transient effect before move
778
+ this.removeTransientEffect_(step);
779
+ }
780
+
781
+ if (step.state === this.StepState_.ERROR) {
782
+ // Case the current state of step is "error", update the error message
783
+ // to the original title message or just remove it.
784
+ if (step.labelTitleMessageText) {
785
+ this.updateTitleMessage_(step, step.labelTitleMessageText);
786
+ } else {
787
+ this.removeTitleMessage_(step);
788
+ }
789
+ }
790
+
791
+ if (step.isEditable && this.Stepper_.isLinear) {
792
+ // In linear steppers if the current step is editable the stepper needs to find
793
+ // the next step without "completed" state
794
+ for (item in this.Steps_.collection) {
795
+ // Rule eslint guard-for-in.
796
+ if (this.Steps_.collection.hasOwnProperty(item)) {
797
+ stepItem = this.Steps_.collection[item];
798
+
799
+ if (stepItem.id > step.id && stepItem.state !== this.StepState_.COMPLETED) {
800
+ activate = stepItem.id;
801
+ break;
802
+ }
803
+ }
804
+ }
805
+ }
806
+ moved = this.setActive_(activate);
807
+
808
+ // Update "manually" the state of current step to "completed" because
809
+ // MaterialStepper.setActive_(<number>) can't change the state of non-linears steppers
810
+ // and can't change the state of optional or last step in linears steppers.
811
+ if (this.Stepper_.isLinear) {
812
+ if (step.isOptional || step.id === this.Steps_.total) {
813
+ this.updateStepState_(step, this.StepState_.COMPLETED);
814
+ }
815
+ } else {
816
+ this.updateStepState_(step, this.StepState_.COMPLETED);
817
+ }
818
+
819
+ // Now dispatch on step the custom event "onstepcomplete"
820
+ this.dispatchEventOnStepComplete_(step);
821
+ break;
822
+ }
823
+ }
824
+ }
825
+ return moved;
826
+ };
827
+
828
+ /**
829
+ * Update the title message or creates a new if it not exists.
830
+ * @param {MaterialStepper.Steps_.collection<step>} step The step of label to be updated.
831
+ * @param {string} text The text content to update.
832
+ * @return {undefined}
833
+ */
834
+ MaterialStepper.prototype.updateTitleMessage_ = function (step, text) {
835
+ /** @type {HTMLElement | null} */
836
+ var titleMessage;
837
+ titleMessage = step.container.querySelector('.' + this.CssClasses_.STEP_TITLE_MESSAGE);
838
+
839
+ if (!titleMessage) {
840
+ titleMessage = document.createElement('span');
841
+ titleMessage.classList.add(this.CssClasses_.STEP_TITLE_MESSAGE);
842
+ step.labelTitle.appendChild(titleMessage);
843
+ }
844
+ titleMessage.textContent = text;
845
+ };
846
+
847
+ /**
848
+ * Remove the title message if it exists.
849
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to remove title message.
850
+ * @return {undefined}
851
+ */
852
+ MaterialStepper.prototype.removeTitleMessage_ = function (step) {
853
+ /** @type {HTMLElement | null} */
854
+ var titleMessage;
855
+ titleMessage = step.container.querySelector('.' + this.CssClasses_.STEP_TITLE_MESSAGE);
856
+
857
+ if (titleMessage) {
858
+ titleMessage.parentNode.removeChild(titleMessage);
859
+ }
860
+ };
861
+
862
+ /**
863
+ * Remove (feedback) transient effect and applied to the step.
864
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to remove effect.
865
+ * @return {boolean}
866
+ */
867
+ MaterialStepper.prototype.removeTransientEffect_ = function (step) {
868
+ /** @type {HTMLElement | null} */
869
+ var transient;
870
+ transient = step.content.querySelector('.' + this.CssClasses_.TRANSIENT);
871
+
872
+ if (!transient) return false;
873
+
874
+ step.container.classList.remove(this.CssClasses_.STEP_TRANSIENT);
875
+ step.content.removeChild(transient);
876
+ return true;
877
+ };
878
+
879
+ /**
880
+ * Create (feedback) transient effect and apply to the current step.
881
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to add effect.
882
+ * @return {boolean}
883
+ */
884
+ MaterialStepper.prototype.addTransientEffect_ = function (step) {
885
+ /** @type {HTMLElement} */
886
+ var transient;
887
+ /** @type {HTMLElement} */
888
+ var overlay;
889
+ /** @type {HTMLElement} */
890
+ var loader;
891
+ /** @type {HTMLElement} */
892
+ var spinner;
893
+
894
+ if (step.content.querySelector('.' + this.CssClasses_.TRANSIENT)) return false;
895
+
896
+ transient = document.createElement('div');
897
+ overlay = document.createElement('div');
898
+ loader = document.createElement('div');
899
+ spinner = document.createElement('div');
900
+ transient.classList.add(this.CssClasses_.TRANSIENT);
901
+ overlay.classList.add(this.CssClasses_.TRANSIENT_OVERLAY);
902
+ loader.classList.add(this.CssClasses_.TRANSIENT_LOADER);
903
+ spinner.classList.add(this.CssClasses_.SPINNER);
904
+ spinner.classList.add(this.CssClasses_.SPINNER_JS);
905
+ spinner.classList.add(this.CssClasses_.SPINNER_IS_ACTIVE);
906
+ loader.appendChild(spinner);
907
+ transient.appendChild(overlay);
908
+ transient.appendChild(loader);
909
+ step.container.classList.add(this.CssClasses_.STEP_TRANSIENT);
910
+ step.content.appendChild(transient);
911
+ // Assume componentHandler is available in the global scope.
912
+ componentHandler.upgradeDom();
913
+ return true;
914
+ };
915
+
916
+ /**
917
+ * Add event listener to linear, non-linear steppers and dispatch the custom events.
918
+ * @return {undefined}
919
+ */
920
+ MaterialStepper.prototype.setCustomEvents_ = function () {
921
+ /** @type {function} */
922
+ var linearLabels;
923
+ /** @type {function} */
924
+ var nonLinearLabels;
925
+ /** @type {function} */
926
+ var dispatchCustomEvents;
927
+
928
+ linearLabels = function linearLabels(step) {
929
+ // We know that editable steps can be activated by click on label case it's completed
930
+ if (step.isEditable) {
931
+ step.label.addEventListener('click', function (event) {
932
+ event.preventDefault();
933
+
934
+ if (step.state === this.StepState_.COMPLETED) {
935
+ this.setStepActive_(step);
936
+ }
937
+ }.bind(this));
938
+ }
939
+ };
940
+ nonLinearLabels = function nonLinearLabels(step) {
941
+ step.label.addEventListener('click', function (event) {
942
+ event.preventDefault();
943
+ this.setStepActive_(step);
944
+ }.bind(this));
945
+ };
946
+ dispatchCustomEvents = function dispatchCustomEvents(step) {
947
+ this.dispatchEventOnStepNext_(step);
948
+ this.dispatchEventOnStepCancel_(step);
949
+ this.dispatchEventOnStepSkip_(step);
950
+ this.dispatchEventOnStepBack_(step);
951
+ };
952
+
953
+ if (this.Stepper_.isLinear) {
954
+ this.Steps_.collection.forEach(linearLabels.bind(this));
955
+ } else {
956
+ this.Steps_.collection.forEach(nonLinearLabels.bind(this));
957
+ }
958
+ this.Steps_.collection.forEach(dispatchCustomEvents.bind(this));
959
+ };
960
+
961
+ /**
962
+ * Dispatch "onstepcomplete" event on step when method stepper.next() is invoked to the
963
+ * current and return true. Or just when the active step change your state to "completed".
964
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to dispatch event.
965
+ * @return {undefined}
966
+ */
967
+ MaterialStepper.prototype.dispatchEventOnStepComplete_ = function (step) {
968
+ step.container.dispatchEvent(this.CustomEvents_.onstepcomplete);
969
+ };
970
+
971
+ /**
972
+ * Dispatch "onsteperror" event on step when method stepper.error('Your alert message')
973
+ * is invoked to the current step and return true. Or just when the active step
974
+ * change your state to "error".
975
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to dispatch event.
976
+ * @return {undefined}
977
+ */
978
+ MaterialStepper.prototype.dispatchEventOnStepError_ = function (step) {
979
+ step.container.dispatchEvent(this.CustomEvents_.onsteperror);
980
+ };
981
+
982
+ /**
983
+ * Dispatch "onsteppercomplete" event on stepper when all steps are completed.
984
+ * If there is optionals steps, they will be ignored.
985
+ * @return {undefined}
986
+ */
987
+ MaterialStepper.prototype.dispatchEventOnStepperComplete_ = function () {
988
+ this.element_.dispatchEvent(this.CustomEvents_.onsteppercomplete);
989
+ };
990
+
991
+ /**
992
+ * Dispatch "onstepnext" event on step when the step action button/link with
993
+ * [data-stepper-next] attribute is clicked.
994
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to dispatch event.
995
+ * @return {boolean}
996
+ */
997
+ MaterialStepper.prototype.dispatchEventOnStepNext_ = function (step) {
998
+ if (!step.actionsNext) return false;
999
+
1000
+ step.actionsNext.addEventListener('click', function () {
1001
+ if (this.Stepper_.hasFeedback) {
1002
+ this.addTransientEffect_(step);
1003
+ }
1004
+ step.container.dispatchEvent(this.CustomEvents_.onstepnext);
1005
+ }.bind(this));
1006
+
1007
+ return true;
1008
+ };
1009
+
1010
+ /**
1011
+ * Dispatch "onstepcancel" event on step when the step action button/link with
1012
+ * [data-stepper-cancel] attribute is clicked.
1013
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to dispatch event.
1014
+ * @return {boolean}
1015
+ */
1016
+ MaterialStepper.prototype.dispatchEventOnStepCancel_ = function (step) {
1017
+ if (!step.actionsCancel) return false;
1018
+
1019
+ step.actionsCancel.addEventListener('click', function (event) {
1020
+ event.preventDefault();
1021
+ step.container.dispatchEvent(this.CustomEvents_.onstepcancel);
1022
+ }.bind(this));
1023
+
1024
+ return true;
1025
+ };
1026
+
1027
+ /**
1028
+ * Dispatch "onstepskip" event on step when the step action button/link with
1029
+ * [data-stepper-skip] attribute is clicked.
1030
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to dispatch event.
1031
+ * @return {boolean}
1032
+ */
1033
+ MaterialStepper.prototype.dispatchEventOnStepSkip_ = function (step) {
1034
+ if (!step.actionsSkip) return false;
1035
+
1036
+ step.actionsSkip.addEventListener('click', function (event) {
1037
+ event.preventDefault();
1038
+ step.container.dispatchEvent(this.CustomEvents_.onstepskip);
1039
+ }.bind(this));
1040
+ return true;
1041
+ };
1042
+
1043
+ /**
1044
+ * Dispatch "onstepback" event on step when the step action button/link with
1045
+ * [data-stepper-back] attribute is clicked.
1046
+ * @param {MaterialStepper.Steps_.collection<step>} step The step to dispatch event.
1047
+ * @return {boolean}
1048
+ */
1049
+ MaterialStepper.prototype.dispatchEventOnStepBack_ = function (step) {
1050
+ if (!step.actionsBack) return false;
1051
+
1052
+ step.actionsBack.addEventListener('click', function (event) {
1053
+ event.preventDefault();
1054
+ step.container.dispatchEvent(this.CustomEvents_.onstepback);
1055
+ }.bind(this));
1056
+ return true;
1057
+ };
1058
+
1059
+ /**
1060
+ * Check if has some active transient effect on steps.
1061
+ * @return {boolean}
1062
+ */
1063
+ MaterialStepper.prototype.hasTransient = function () {
1064
+ /** @type {string} */
1065
+ var cssClasseStep;
1066
+ /** @type {string} */
1067
+ var cssClasseStepContent;
1068
+ /** @type {string} */
1069
+ var cssClasseTransient;
1070
+ /** @type {string} */
1071
+ var selectorTransient;
1072
+ /** @type {HTMLElement | null} */
1073
+ var transient;
1074
+ cssClasseStep = '.' + this.CssClasses_.STEP;
1075
+ cssClasseStepContent = '.' + this.CssClasses_.STEP_CONTENT;
1076
+ cssClasseTransient = '.' + this.CssClasses_.TRANSIENT;
1077
+ selectorTransient = cssClasseStep + ' > ' + cssClasseStepContent + ' > ' + cssClasseTransient;
1078
+ transient = this.element_.querySelector(selectorTransient);
1079
+ return transient !== null;
1080
+ };
1081
+
1082
+ /**
1083
+ * Initialize the instance.
1084
+ * @return {undefined}
1085
+ * @public
1086
+ */
1087
+ MaterialStepper.prototype.init = function () {
1088
+ // Check if stepper element exists.
1089
+ if (this.element_) {
1090
+ this.Stepper_ = this.getStepper_();
1091
+ this.Steps_ = this.getSteps_();
1092
+ this.setActive_();
1093
+ this.setCustomEvents_();
1094
+ }
1095
+ };
1096
+
1097
+ // The component registers itself. It can assume componentHandler is available
1098
+ // in the global scope.
1099
+ componentHandler.register({
1100
+ constructor: MaterialStepper,
1101
+ classAsString: 'MaterialStepper',
1102
+ cssClass: 'mdl-stepper',
1103
+ widget: true
1104
+ });
1105
+ })();
1106
+
1107
+ /***/ }
1108
+ /******/ ]);