voom-presenters 0.1.13 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/CHANGELOG.md +186 -0
  4. data/Gemfile.lock +37 -38
  5. data/HISTORY.md +61 -0
  6. data/README.md +23 -1
  7. data/app/demo/components/chips.pom +6 -0
  8. data/app/demo/components/{forms.pom → content.pom} +3 -3
  9. data/app/demo/components/date_fields.pom +1 -1
  10. data/app/demo/components/datetime_fields.pom +6 -0
  11. data/app/demo/components/drawers.pom +1 -1
  12. data/app/demo/components/file_inputs.pom +16 -0
  13. data/app/demo/components/footers.pom +1 -1
  14. data/app/demo/components/google_maps.pom +17 -0
  15. data/app/demo/components/headers.pom +1 -1
  16. data/app/demo/components/layouts.pom +36 -4
  17. data/app/demo/components/lists.pom +25 -0
  18. data/app/demo/components/nav/menu.pom +9 -2
  19. data/app/demo/components/nav/pattern_drawer.pom +5 -0
  20. data/app/demo/components/nav/pattern_menu.pom +12 -0
  21. data/app/demo/components/sliders.pom +49 -0
  22. data/app/demo/components/snackbar.pom +10 -0
  23. data/app/demo/components/steppers.pom +178 -0
  24. data/app/demo/components/tab_bars.pom +51 -0
  25. data/app/demo/components/tables.pom +85 -13
  26. data/app/demo/components/text_areas.pom +13 -0
  27. data/app/demo/components/text_fields.pom +20 -8
  28. data/app/demo/components/toggles.pom +50 -14
  29. data/app/demo/components/tooltips.pom +2 -6
  30. data/app/demo/events/actions/clear.pom +23 -0
  31. data/app/demo/events/actions/loads.pom +16 -6
  32. data/app/demo/events/actions/posts.pom +1 -1
  33. data/app/demo/events/actions/toggle_visiblity.pom +4 -3
  34. data/app/demo/events/nav/drawer.pom +2 -2
  35. data/app/demo/events/tagged_input.pom +37 -0
  36. data/app/demo/hello_world.pom +3 -0
  37. data/app/demo/markdown.pom +1 -0
  38. data/app/demo/namespaces.pom +89 -0
  39. data/app/demo/nav/top_nav.pom +12 -0
  40. data/app/demo/patterns.pom +19 -0
  41. data/app/demo/patterns/search_select.pom +104 -0
  42. data/app/demo/shared/context_list.pom +1 -1
  43. data/app/demo/styles.pom +21 -11
  44. data/component-status.yml +11 -11
  45. data/config.ru +2 -1
  46. data/lib/voom/container_methods.rb +1 -1
  47. data/lib/voom/presenters-engine.rb +29 -26
  48. data/lib/voom/presenters.rb +15 -9
  49. data/lib/voom/presenters/api/app.rb +18 -5
  50. data/lib/voom/presenters/api/router.rb +11 -49
  51. data/lib/voom/presenters/demo/echo.rb +5 -0
  52. data/lib/voom/presenters/dsl.rb +10 -4
  53. data/lib/voom/presenters/dsl/components/actions/base.rb +37 -0
  54. data/lib/voom/presenters/dsl/components/actions/clear.rb +17 -0
  55. data/lib/voom/presenters/dsl/components/actions/deletes.rb +17 -0
  56. data/lib/voom/presenters/dsl/components/actions/dialog.rb +17 -0
  57. data/lib/voom/presenters/dsl/components/actions/loads.rb +32 -0
  58. data/lib/voom/presenters/dsl/components/actions/navigates.rb +17 -0
  59. data/lib/voom/presenters/dsl/components/actions/posts.rb +17 -0
  60. data/lib/voom/presenters/dsl/components/actions/remove.rb +17 -0
  61. data/lib/voom/presenters/dsl/components/actions/replaces.rb +25 -0
  62. data/lib/voom/presenters/dsl/components/actions/snackbar.rb +17 -0
  63. data/lib/voom/presenters/dsl/components/actions/stepper.rb +17 -0
  64. data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +17 -0
  65. data/lib/voom/presenters/dsl/components/actions/updates.rb +17 -0
  66. data/lib/voom/presenters/dsl/components/avatar.rb +4 -5
  67. data/lib/voom/presenters/dsl/components/badge.rb +1 -1
  68. data/lib/voom/presenters/dsl/components/base.rb +20 -11
  69. data/lib/voom/presenters/dsl/components/button.rb +12 -10
  70. data/lib/voom/presenters/dsl/components/card.rb +18 -19
  71. data/lib/voom/presenters/dsl/components/checkbox.rb +3 -1
  72. data/lib/voom/presenters/dsl/components/chip.rb +9 -10
  73. data/lib/voom/presenters/dsl/components/content.rb +21 -11
  74. data/lib/voom/presenters/dsl/components/date_field.rb +1 -1
  75. data/lib/voom/presenters/dsl/components/datetime_base.rb +1 -2
  76. data/lib/voom/presenters/dsl/components/datetime_field.rb +1 -1
  77. data/lib/voom/presenters/dsl/components/dialog.rb +10 -6
  78. data/lib/voom/presenters/dsl/components/drawer.rb +6 -4
  79. data/lib/voom/presenters/dsl/components/event.rb +55 -39
  80. data/lib/voom/presenters/dsl/components/event_base.rb +2 -2
  81. data/lib/voom/presenters/dsl/components/expansion_panel.rb +5 -5
  82. data/lib/voom/presenters/dsl/components/file_input.rb +22 -0
  83. data/lib/voom/presenters/dsl/components/footer.rb +1 -1
  84. data/lib/voom/presenters/dsl/components/form.rb +17 -15
  85. data/lib/voom/presenters/dsl/components/google_map.rb +40 -0
  86. data/lib/voom/presenters/dsl/components/grid.rb +58 -18
  87. data/lib/voom/presenters/dsl/components/header.rb +2 -5
  88. data/lib/voom/presenters/dsl/components/hidden_field.rb +2 -2
  89. data/lib/voom/presenters/dsl/components/icon.rb +4 -5
  90. data/lib/voom/presenters/dsl/components/icon_base.rb +3 -3
  91. data/lib/voom/presenters/dsl/components/icon_toggle.rb +2 -2
  92. data/lib/voom/presenters/dsl/components/image.rb +3 -3
  93. data/lib/voom/presenters/dsl/components/input.rb +2 -2
  94. data/lib/voom/presenters/dsl/components/list.rb +12 -10
  95. data/lib/voom/presenters/dsl/components/lists/action.rb +8 -9
  96. data/lib/voom/presenters/dsl/components/lists/actions.rb +8 -8
  97. data/lib/voom/presenters/dsl/components/lists/header.rb +2 -2
  98. data/lib/voom/presenters/dsl/components/lists/line.rb +14 -17
  99. data/lib/voom/presenters/dsl/components/lists/separator.rb +2 -2
  100. data/lib/voom/presenters/dsl/components/menu.rb +10 -12
  101. data/lib/voom/presenters/dsl/components/mixins/attaches.rb +9 -3
  102. data/lib/voom/presenters/dsl/components/mixins/avatar.rb +0 -1
  103. data/lib/voom/presenters/dsl/components/mixins/buttons.rb +1 -1
  104. data/lib/voom/presenters/dsl/components/mixins/chips.rb +1 -2
  105. data/lib/voom/presenters/dsl/components/mixins/common.rb +20 -14
  106. data/lib/voom/presenters/dsl/components/mixins/content.rb +1 -1
  107. data/lib/voom/presenters/dsl/components/mixins/date_time_fields.rb +0 -3
  108. data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +1 -2
  109. data/lib/voom/presenters/dsl/components/mixins/event.rb +3 -3
  110. data/lib/voom/presenters/dsl/components/mixins/expansion_panels.rb +1 -1
  111. data/lib/voom/presenters/dsl/components/mixins/file_inputs.rb +16 -0
  112. data/lib/voom/presenters/dsl/components/mixins/google_maps.rb +15 -0
  113. data/lib/voom/presenters/dsl/components/mixins/grids.rb +1 -1
  114. data/lib/voom/presenters/dsl/components/mixins/icons.rb +0 -1
  115. data/lib/voom/presenters/dsl/components/mixins/menus.rb +1 -1
  116. data/lib/voom/presenters/dsl/components/mixins/selects.rb +0 -1
  117. data/lib/voom/presenters/dsl/components/mixins/sliders.rb +15 -0
  118. data/lib/voom/presenters/dsl/components/mixins/snackbars.rb +0 -1
  119. data/lib/voom/presenters/dsl/components/mixins/steppers.rb +15 -0
  120. data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +15 -0
  121. data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +5 -3
  122. data/lib/voom/presenters/dsl/components/mixins/toggles.rb +1 -4
  123. data/lib/voom/presenters/dsl/components/mixins/tooltips.rb +0 -1
  124. data/lib/voom/presenters/dsl/components/mixins/typography.rb +43 -13
  125. data/lib/voom/presenters/dsl/components/page.rb +0 -1
  126. data/lib/voom/presenters/dsl/components/radio_button.rb +1 -1
  127. data/lib/voom/presenters/dsl/components/rich_text_area.rb +26 -0
  128. data/lib/voom/presenters/dsl/components/select.rb +4 -5
  129. data/lib/voom/presenters/dsl/components/slider.rb +39 -0
  130. data/lib/voom/presenters/dsl/components/snackbar.rb +2 -2
  131. data/lib/voom/presenters/dsl/components/stepper.rb +106 -0
  132. data/lib/voom/presenters/dsl/components/switch.rb +1 -1
  133. data/lib/voom/presenters/dsl/components/tab_bar.rb +53 -0
  134. data/lib/voom/presenters/dsl/components/table.rb +99 -27
  135. data/lib/voom/presenters/dsl/components/text_area.rb +4 -3
  136. data/lib/voom/presenters/dsl/components/text_field.rb +8 -12
  137. data/lib/voom/presenters/dsl/components/time_field.rb +1 -1
  138. data/lib/voom/presenters/dsl/components/toggle_base.rb +2 -2
  139. data/lib/voom/presenters/dsl/components/tooltip.rb +1 -2
  140. data/lib/voom/presenters/dsl/components/typography.rb +4 -5
  141. data/lib/voom/presenters/dsl/definer.rb +2 -2
  142. data/lib/voom/presenters/dsl/definition.rb +6 -4
  143. data/lib/voom/presenters/dsl/user_interface.rb +17 -21
  144. data/lib/voom/presenters/errors/parameter_validation.rb +1 -1
  145. data/lib/voom/presenters/helpers.rb +5 -5
  146. data/lib/voom/presenters/helpers/date.rb +3 -3
  147. data/lib/voom/presenters/helpers/rails.rb +7 -2
  148. data/lib/voom/presenters/helpers/rails/model_table.rb +14 -6
  149. data/lib/voom/presenters/helpers/route.rb +6 -0
  150. data/lib/voom/presenters/helpers/time.rb +1 -1
  151. data/lib/voom/presenters/namespace.rb +12 -0
  152. data/lib/voom/presenters/settings.rb +58 -37
  153. data/lib/voom/presenters/version.rb +1 -1
  154. data/lib/voom/presenters/web_client/app.rb +50 -20
  155. data/lib/voom/presenters/web_client/markdown_render.rb +24 -11
  156. data/lib/voom/presenters/web_client/router.rb +17 -52
  157. data/lib/voom/serializer.rb +2 -2
  158. data/lib/voom/trace.rb +1 -1
  159. data/presenters.gemspec +2 -1
  160. data/public/style-bundle.js +2 -2
  161. data/scripts/bump.sh +1 -0
  162. data/scripts/changelog.sh +5 -0
  163. data/scripts/deploy-demo.sh +1 -0
  164. data/scripts/release.sh +1 -1
  165. data/scripts/tag.sh +5 -0
  166. data/views/mdc/.babelrc +8 -0
  167. data/views/mdc/.eslintrc.yml +23 -0
  168. data/views/mdc/assets/js/app.js +19 -6
  169. data/views/mdc/assets/js/components/base-component.js +25 -2
  170. data/views/mdc/assets/js/components/base-container.js +47 -0
  171. data/views/mdc/assets/js/components/button.js +3 -10
  172. data/views/mdc/assets/js/components/cards.js +11 -0
  173. data/views/mdc/assets/js/components/checkboxes.js +30 -7
  174. data/views/mdc/assets/js/components/chips.js +38 -5
  175. data/views/mdc/assets/js/components/content.js +13 -0
  176. data/views/mdc/assets/js/components/data-tables.js +38 -0
  177. data/views/mdc/assets/js/components/datetime.js +61 -21
  178. data/views/mdc/assets/js/components/dialogs.js +25 -19
  179. data/views/mdc/assets/js/components/events.js +13 -3
  180. data/views/mdc/assets/js/components/events/base.js +13 -3
  181. data/views/mdc/assets/js/components/events/errors.js +1 -1
  182. data/views/mdc/assets/js/components/events/posts.js +53 -13
  183. data/views/mdc/assets/js/components/events/removes.js +20 -0
  184. data/views/mdc/assets/js/components/events/replaces.js +35 -36
  185. data/views/mdc/assets/js/components/events/stepper.js +23 -0
  186. data/views/mdc/assets/js/components/events/toggle_visibility.js +15 -11
  187. data/views/mdc/assets/js/components/file-inputs.js +29 -0
  188. data/views/mdc/assets/js/components/forms.js +8 -59
  189. data/views/mdc/assets/js/components/grid.js +20 -0
  190. data/views/mdc/assets/js/components/hidden-fields.js +33 -0
  191. data/views/mdc/assets/js/components/icon-toggles.js +7 -14
  192. data/views/mdc/assets/js/components/initialize.js +20 -1
  193. data/views/mdc/assets/js/components/lists.js +1 -1
  194. data/views/mdc/assets/js/components/menus.js +12 -13
  195. data/views/mdc/assets/js/components/mixins/visibility-observer.js +34 -0
  196. data/views/mdc/assets/js/components/radios.js +39 -0
  197. data/views/mdc/assets/js/components/rich-text-area.js +43 -0
  198. data/views/mdc/assets/js/components/selects.js +24 -23
  199. data/views/mdc/assets/js/components/sliders.js +56 -0
  200. data/views/mdc/assets/js/components/snackbar.js +14 -23
  201. data/views/mdc/assets/js/components/steppers.js +48 -0
  202. data/views/mdc/assets/js/components/switches.js +24 -23
  203. data/views/mdc/assets/js/components/tab-bars.js +14 -0
  204. data/views/mdc/assets/js/components/text-fields.js +37 -35
  205. data/views/mdc/assets/js/config.js +27 -0
  206. data/views/mdc/assets/js/mdl-stepper.js +1108 -0
  207. data/views/mdc/assets/js/utils/compatibility.js +9 -0
  208. data/views/mdc/assets/js/utils/config.js +73 -0
  209. data/views/mdc/assets/js/utils/config.test.js +59 -0
  210. data/views/mdc/assets/js/utils/urls.js +5 -2
  211. data/views/mdc/assets/scss/app.scss +11 -3
  212. data/views/mdc/assets/scss/components/button.scss +17 -2
  213. data/views/mdc/assets/scss/components/card.scss +8 -3
  214. data/views/mdc/assets/scss/components/checkbox.scss +0 -4
  215. data/views/mdc/assets/scss/components/content.scss +11 -0
  216. data/views/mdc/assets/scss/components/data-table.scss +80 -0
  217. data/views/mdc/assets/scss/components/datetime.scss +6 -0
  218. data/views/mdc/assets/scss/components/fab.scss +2 -1
  219. data/views/mdc/assets/scss/components/file-input.scss +22 -0
  220. data/views/mdc/assets/scss/components/grid.scss +59 -3
  221. data/views/mdc/assets/scss/components/image.scss +6 -0
  222. data/views/mdc/assets/scss/components/list.scss +13 -0
  223. data/views/mdc/assets/scss/components/menu.scss +1 -0
  224. data/views/mdc/assets/scss/components/radio.scss +4 -0
  225. data/views/mdc/assets/scss/components/rich-text-area.scss +37 -0
  226. data/views/mdc/assets/scss/components/slider.scss +1 -0
  227. data/views/mdc/assets/scss/components/snackbar.scss +1 -5
  228. data/views/mdc/assets/scss/components/stepper.scss +235 -0
  229. data/views/mdc/assets/scss/components/switch.scss +4 -5
  230. data/views/mdc/assets/scss/components/tab-bars.scss +4 -0
  231. data/views/mdc/assets/scss/components/textfield.scss +8 -1
  232. data/views/mdc/assets/scss/components/typography.scss +4 -0
  233. data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +2 -2
  234. data/views/mdc/assets/scss/components/vendor/quill.snow.css +945 -0
  235. data/views/mdc/assets/scss/styles.scss +3 -2
  236. data/views/mdc/assets/scss/theme.scss +6 -0
  237. data/views/mdc/body/header.erb +1 -0
  238. data/views/mdc/body/snackbar.erb +1 -1
  239. data/views/mdc/components/actions/clear.rb +11 -0
  240. data/views/mdc/components/actions/delete.rb +11 -0
  241. data/views/mdc/components/actions/dialog.rb +11 -0
  242. data/views/mdc/components/actions/loads.rb +11 -0
  243. data/views/mdc/components/actions/navigates.rb +11 -0
  244. data/views/mdc/components/actions/post.rb +17 -0
  245. data/views/mdc/components/actions/remove.rb +10 -0
  246. data/views/mdc/components/actions/replaces.rb +12 -0
  247. data/views/mdc/components/actions/snackbar.rb +10 -0
  248. data/views/mdc/components/actions/stepper.rb +10 -0
  249. data/views/mdc/components/actions/toggle_visibility.rb +10 -0
  250. data/views/mdc/components/actions/update.rb +10 -0
  251. data/views/mdc/components/button.erb +9 -6
  252. data/views/mdc/components/buttons/button.erb +10 -5
  253. data/views/mdc/components/buttons/fab.erb +8 -2
  254. data/views/mdc/components/buttons/icon.erb +9 -2
  255. data/views/mdc/components/buttons/image.erb +9 -4
  256. data/views/mdc/components/{display.erb → caption.erb} +0 -0
  257. data/views/mdc/components/card.erb +6 -3
  258. data/views/mdc/components/checkbox.erb +21 -9
  259. data/views/mdc/components/chip.erb +12 -3
  260. data/views/mdc/components/content.erb +6 -1
  261. data/views/mdc/components/datetime.erb +21 -13
  262. data/views/mdc/components/dialog.erb +4 -1
  263. data/views/mdc/components/event.erb +5 -9
  264. data/views/mdc/components/file_input.erb +13 -0
  265. data/views/mdc/components/form.erb +19 -5
  266. data/views/mdc/components/google_map.erb +9 -0
  267. data/views/mdc/components/grid.erb +18 -4
  268. data/views/mdc/components/headline.erb +2 -0
  269. data/views/mdc/components/hidden_field.erb +6 -1
  270. data/views/mdc/components/icon_toggle.erb +1 -1
  271. data/views/mdc/components/list.erb +5 -2
  272. data/views/mdc/components/list/actions/switch.erb +1 -1
  273. data/views/mdc/components/list/line.erb +7 -6
  274. data/views/mdc/components/menu.erb +8 -12
  275. data/views/mdc/components/{subheading.erb → overline.erb} +0 -0
  276. data/views/mdc/components/radio_button.erb +20 -10
  277. data/views/mdc/components/rich_text_area.erb +19 -0
  278. data/views/mdc/components/select.erb +7 -3
  279. data/views/mdc/components/slider.erb +41 -0
  280. data/views/mdc/components/snackbar.erb +2 -6
  281. data/views/mdc/components/stepper.erb +47 -0
  282. data/views/mdc/components/stepper/step.erb +33 -0
  283. data/views/mdc/components/{title.erb → subtitle.erb} +0 -0
  284. data/views/mdc/components/switch.erb +27 -12
  285. data/views/mdc/components/tab_bar.erb +29 -0
  286. data/views/mdc/components/table.erb +4 -2
  287. data/views/mdc/components/table/checkbox.erb +17 -0
  288. data/views/mdc/components/table/header.erb +13 -4
  289. data/views/mdc/components/table/pagination.erb +14 -23
  290. data/views/mdc/components/table/row.erb +3 -1
  291. data/views/mdc/components/text_area.erb +17 -7
  292. data/views/mdc/components/text_field.erb +31 -13
  293. data/views/mdc/components/typography.erb +2 -2
  294. data/views/mdc/layout.erb +33 -31
  295. data/views/mdc/package-lock.json +11019 -6996
  296. data/views/mdc/package.json +46 -27
  297. data/views/mdc/webpack.config.js +1 -0
  298. metadata +112 -13
  299. data/app/demo/events/actions/autocomplete.pom +0 -32
  300. data/lib/voom/presenters/dsl/components/action.rb +0 -35
  301. data/views/mdc/assets/js/components/events/autocomplete.js +0 -96
  302. data/views/mdc/assets/js/material.js +0 -3996
  303. data/views/mdc/assets/scss/components/table-pagination.scss +0 -65
  304. data/views/mdc/components/modal.erb +0 -15
  305. data/views/mdc/components/static.erb +0 -7
@@ -0,0 +1,48 @@
1
+ import {eventHandlerMixin} from "./mixins/event-handler";
2
+ import {VBaseContainer} from "./base-container";
3
+ import {hookupComponents} from "./base-component";
4
+
5
+
6
+ export function initSteppers() {
7
+ console.log('\tStepper');
8
+ hookupComponents('.v-stepper', VStepper, null);
9
+ }
10
+
11
+ export class VStepper extends eventHandlerMixin(VBaseContainer) {
12
+ constructor(element, mdcComponent) {
13
+ super(element, mdcComponent);
14
+
15
+ if (typeof componentHandler !== 'undefined') { // MDL is loaded?
16
+ componentHandler.upgradeElement(element);
17
+ this.stepper = element.MaterialStepper;
18
+ }
19
+ }
20
+
21
+ inputs() {
22
+ // A stepper content area does not live within the stepper element so let's get it from the right place
23
+ return document.querySelectorAll('#' + this.element.id + '-content .v-input')
24
+ }
25
+
26
+ navigate(nav_action){
27
+ if(nav_action === 'continue' || nav_action === 'next') {
28
+ this.next_step();
29
+ }
30
+ else if(nav_action === 'back'){
31
+ this.back_step();
32
+ }
33
+ else if(nav_action === 'skip'){
34
+ this.skip_step();
35
+ }
36
+ }
37
+
38
+ next_step() {
39
+ this.stepper.next();
40
+ }
41
+ back_step() {
42
+ this.stepper.back();
43
+ }
44
+ skip_step() {
45
+ this.stepper.skip();
46
+ }
47
+ }
48
+
@@ -1,36 +1,37 @@
1
- import {VBaseComponent} from './base-component';
1
+ import {VBaseComponent, hookupComponents} from './base-component';
2
2
  import {eventHandlerMixin} from './mixins/event-handler';
3
+ import {MDCSwitch} from '@material/switch';
3
4
 
4
5
  export function initSwitches() {
5
6
  console.log('\tSwitches');
7
+ hookupComponents('.v-switch', VSwitch, MDCSwitch);
8
+ }
6
9
 
7
- let components = document.querySelectorAll('.v-switch');
8
- if (components) {
9
- for (let i = 0; i < components.length; i++) {
10
- let component = components[i];
11
- if (!component.vComponent) {
12
- let input = component.querySelector('input');
13
- let vSwitch = new VSwitch(component, input);
14
- component.vComponent = vSwitch;
15
- input.vComponent = vSwitch;
16
- }
10
+ export class VSwitch extends eventHandlerMixin(VBaseComponent) {
11
+ constructor(element, mdcComponent) {
12
+ super(element, mdcComponent);
13
+ this.input = element.querySelector('input');
14
+ }
15
+
16
+ prepareSubmit(params) {
17
+ if (this.input.checked) {
18
+ params.push([this.name(), this.value()]);
17
19
  }
18
20
  }
19
- }
20
21
 
21
- export class VSwitch extends eventHandlerMixin(VBaseComponent) {
22
- constructor(element, input) {
23
- super(element);
24
- this.input = input;
22
+ name() {
23
+ return this.input.name;
25
24
  }
26
25
 
27
- validate(_formData) {
28
- return true;
26
+ value() {
27
+ return this.input.value;
29
28
  }
30
29
 
31
- prepareSubmit(form, params) {
32
- if (!form) {
33
- params.push([this.input.name, this.input.checked]);
34
- }
30
+ clear() {
31
+ this.input.checked = false;
35
32
  }
36
- }
33
+
34
+ setValue(value) {
35
+ this.input.value = value;
36
+ }
37
+ }
@@ -0,0 +1,14 @@
1
+ import {VBaseComponent, hookupComponents} from './base-component';
2
+ import {eventHandlerMixin} from "./mixins/event-handler";
3
+ import {MDCTabBar} from '@material/tab-bar';
4
+
5
+ export function initTabBars() {
6
+ console.log('\tTab Bars');
7
+ hookupComponents('.v-tab-bar', VTabBar, MDCTabBar);
8
+ }
9
+
10
+ export class VTabBar extends eventHandlerMixin(VBaseComponent) {
11
+ constructor(element, mdcComponent) {
12
+ super(element, mdcComponent);
13
+ }
14
+ }
@@ -1,25 +1,23 @@
1
1
  import {MDCTextField} from '@material/textfield';
2
- import {VBaseComponent} from './base-component';
2
+ import {VBaseComponent, hookupComponents} from './base-component';
3
3
  import {eventHandlerMixin} from './mixins/event-handler';
4
+ import {visibilityObserverMixin} from './mixins/visibility-observer';
4
5
 
5
6
  export function initTextFields() {
6
7
  console.log('\tTextFields');
7
-
8
- var textFields = document.querySelectorAll('.mdc-text-field');
9
- for (var i = 0; i < textFields.length; i++) {
10
- var textField = textFields[i];
11
- if (!textField.vComponent) {
12
- textField.vComponent = new VTextField(textField, new MDCTextField(textField));
13
- }
14
- }
8
+ hookupComponents('.v-text-field', VTextField, MDCTextField);
15
9
  }
16
10
 
17
- export class VTextField extends eventHandlerMixin(VBaseComponent) {
11
+ export class VTextField extends visibilityObserverMixin(
12
+ eventHandlerMixin(VBaseComponent)) {
18
13
  constructor(element, mdcComponent) {
19
- super(element);
14
+ super(element, mdcComponent);
20
15
  this.input = element.querySelector('input');
16
+ if (this.input == null) {
17
+ this.input = element.querySelector('textarea');
18
+ }
21
19
  this.input.vComponent = this;
22
- this.mdcComponent = mdcComponent;
20
+ this.recalcWhenVisible(this);
23
21
  }
24
22
 
25
23
  // Called whenever a form is about to be submitted.
@@ -28,56 +26,60 @@ export class VTextField extends eventHandlerMixin(VBaseComponent) {
28
26
  // { email: ["email must be filled", "email must be from your domain"] }
29
27
  // { :page: ["must be filled"] }
30
28
  validate(formData) {
31
- console.log("TextField validate", formData);
29
+ console.log('TextField validate', formData);
32
30
  let isValid = this.input.checkValidity();
33
- if(isValid) {
31
+ if (isValid) {
34
32
  return true;
35
33
  }
36
34
  let errorMessage = {};
37
- errorMessage[this.input.id] = [this.input.validationMessage];
35
+ errorMessage[this.input.id] = [this.input.validationMessage];
38
36
  return errorMessage;
39
37
  }
40
38
 
41
- value(){
42
- return this.input.value;
43
- }
44
-
45
39
  // Called to collect data for submission
46
- prepareSubmit(form, params) {
40
+ prepareSubmit(params) {
47
41
  var optionSelected = this.optionSelected();
48
42
  if (optionSelected) {
49
43
  var key = optionSelected.dataset.key;
50
44
  if (key) {
51
- var name = this.input.name;
45
+ var name = this.name();
52
46
  var id = name + '_id';
53
47
  params.push([id, key]);
54
- console.log("TextField prepareSubmit added:" + id + '=' + key);
48
+ console.log('TextField prepareSubmit added:' + id + '=' + key);
55
49
  }
56
50
  }
57
- // On actual post/submit the form is passed and we are not expected to return our value
58
- if (!form) {
59
- params.push([this.input.name, this.input.value]);
60
- }
51
+ params.push([this.name(), this.value()]);
61
52
  }
62
53
 
63
54
  optionSelected() {
64
55
  var dataList = this.element.querySelector('datalist');
65
- var parentElement = this.input;
66
-
67
- // If we find the input inside our list, we submit the form
68
- for (var element of dataList.children) {
69
- if (element.value === parentElement.value) {
70
- return element;
56
+ if (dataList) {
57
+ var parentElement = this.input;
58
+ // If we find the input inside our list, we submit the form
59
+ for (var element of dataList.children) {
60
+ if (element.value === parentElement.value) {
61
+ return element;
62
+ }
71
63
  }
72
64
  }
73
65
  return null;
74
66
  }
75
67
 
76
- clear(){
77
- this.setValue('');
68
+ name() {
69
+ return this.input.name;
70
+ }
71
+
72
+ value() {
73
+ return this.input.value;
74
+ }
75
+
76
+ clear() {
77
+ if (this.value() !== '') {
78
+ this.setValue('');
79
+ }
78
80
  }
79
81
 
80
- setValue(value){
82
+ setValue(value) {
81
83
  this.input.value = value;
82
84
  }
83
85
  }
@@ -0,0 +1,27 @@
1
+ import VConfig from './utils/config';
2
+
3
+ export default new VConfig({
4
+ component: {
5
+ datetime: {
6
+ flatpickr: {
7
+ altInput: true,
8
+ disableMobile: true,
9
+ clickOpens: false,
10
+ defaultHour: 0
11
+ },
12
+ },
13
+ },
14
+ request: {
15
+ headers: {
16
+ POST: {
17
+ Accept: 'application/json,text/html;q=0.9',
18
+ },
19
+ },
20
+ },
21
+ compatibility: {
22
+ errorMessage: 'Your browser is not supported! Please use a different browser to continue.',
23
+ incompatibleBrowsers: [
24
+ 'ie',
25
+ ],
26
+ },
27
+ });
@@ -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
+ /******/ ]);