coprl 0.1.0 → 3.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (618) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +59 -6
  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 +43 -0
  8. data/.gitignore +50 -7
  9. data/.releaserc +11 -0
  10. data/.ruby-version +2 -0
  11. data/CHANGELOG.md +160 -0
  12. data/CODE-OF-CONDUCT.md +73 -0
  13. data/CONTRIBUTING.md +60 -0
  14. data/Gemfile +24 -6
  15. data/Gemfile.lock +172 -0
  16. data/HISTORY.md +61 -0
  17. data/{LICENSE.txt → LICENSE} +6 -6
  18. data/Procfile +1 -0
  19. data/README.md +121 -19
  20. data/ROADMAP.md +6 -0
  21. data/Rakefile +3 -9
  22. data/app/demo/components.pom +19 -0
  23. data/app/demo/components/avatars.pom +40 -0
  24. data/app/demo/components/badges.pom +26 -0
  25. data/app/demo/components/buttons.pom +63 -0
  26. data/app/demo/components/cards.pom +84 -0
  27. data/app/demo/components/chips.pom +103 -0
  28. data/app/demo/components/content.pom +111 -0
  29. data/app/demo/components/date_fields.pom +106 -0
  30. data/app/demo/components/datetime_fields.pom +113 -0
  31. data/app/demo/components/dialogs.pom +195 -0
  32. data/app/demo/components/drawers.pom +35 -0
  33. data/app/demo/components/expansion_panels.pom +20 -0
  34. data/app/demo/components/fabs-mini.pom +17 -0
  35. data/app/demo/components/fabs.pom +16 -0
  36. data/app/demo/components/file_inputs.pom +52 -0
  37. data/app/demo/components/footers.pom +36 -0
  38. data/app/demo/components/google_maps.pom +22 -0
  39. data/app/demo/components/headers.pom +101 -0
  40. data/app/demo/components/hidden_fields.pom +18 -0
  41. data/app/demo/components/icons.pom +125 -0
  42. data/app/demo/components/image_lists.pom +100 -0
  43. data/app/demo/components/images.pom +45 -0
  44. data/app/demo/components/layouts.pom +54 -0
  45. data/app/demo/components/lists.pom +168 -0
  46. data/app/demo/components/menus.pom +53 -0
  47. data/app/demo/components/multi_selects.pom +29 -0
  48. data/app/demo/components/nav/drawer.pom +5 -0
  49. data/app/demo/components/nav/menu.pom +54 -0
  50. data/app/demo/components/nav/pattern_drawer.pom +5 -0
  51. data/app/demo/components/nav/pattern_menu.pom +12 -0
  52. data/app/demo/components/number_fields.pom +53 -0
  53. data/app/demo/components/padding.pom +96 -0
  54. data/app/demo/components/progress.pom +71 -0
  55. data/app/demo/components/selects.pom +69 -0
  56. data/app/demo/components/sliders.pom +54 -0
  57. data/app/demo/components/snackbar.pom +35 -0
  58. data/app/demo/components/snackbar_attached.pom +6 -0
  59. data/app/demo/components/steppers.pom +178 -0
  60. data/app/demo/components/tab_bars.pom +66 -0
  61. data/app/demo/components/tables.pom +121 -0
  62. data/app/demo/components/text_areas.pom +38 -0
  63. data/app/demo/components/text_fields.pom +114 -0
  64. data/app/demo/components/time_fields.pom +59 -0
  65. data/app/demo/components/toggles.pom +122 -0
  66. data/app/demo/components/tooltips.pom +119 -0
  67. data/app/demo/components/unordered_list.pom +81 -0
  68. data/app/demo/custom_css.pom +37 -0
  69. data/app/demo/events.pom +29 -0
  70. data/app/demo/events/actions/autocomplete.pom +32 -0
  71. data/app/demo/events/actions/clear.pom +25 -0
  72. data/app/demo/events/actions/deletes.pom +24 -0
  73. data/app/demo/events/actions/dialog.pom +19 -0
  74. data/app/demo/events/actions/dialogs/discard.pom +9 -0
  75. data/app/demo/events/actions/dialogs/show_dialog.pom +11 -0
  76. data/app/demo/events/actions/dialogs/trigger.pom +86 -0
  77. data/app/demo/events/actions/last_response.pom +40 -0
  78. data/app/demo/events/actions/loads.pom +29 -0
  79. data/app/demo/events/actions/posts.pom +23 -0
  80. data/app/demo/events/actions/prompt_if_dirty.pom +54 -0
  81. data/app/demo/events/actions/replace_text.pom +6 -0
  82. data/app/demo/events/actions/replaces.pom +21 -0
  83. data/app/demo/events/actions/snackbar.pom +19 -0
  84. data/app/demo/events/actions/toggle_visiblity.pom +22 -0
  85. data/app/demo/events/actions/updates.pom +24 -0
  86. data/app/demo/events/content_as_form.pom +313 -0
  87. data/app/demo/events/field_level.pom +20 -0
  88. data/app/demo/events/form_level.pom +24 -0
  89. data/app/demo/events/nav/drawer.pom +25 -0
  90. data/app/demo/events/parallel.pom +44 -0
  91. data/app/demo/events/tagged_input.pom +37 -0
  92. data/app/demo/formatting_tokens.pom +125 -0
  93. data/app/demo/hello_world.pom +3 -0
  94. data/app/demo/helpers/indented_grid.rb +14 -0
  95. data/app/demo/index.pom +26 -0
  96. data/app/demo/markdown.pom +67 -0
  97. data/app/demo/namespaces.pom +89 -0
  98. data/app/demo/nav/top_nav.pom +60 -0
  99. data/app/demo/patterns.pom +19 -0
  100. data/app/demo/patterns/drag_drop.pom +89 -0
  101. data/app/demo/patterns/floating_card.pom +29 -0
  102. data/app/demo/patterns/search_select.pom +106 -0
  103. data/app/demo/plugins/chart.pom +254 -0
  104. data/app/demo/plugins/image_crop.pom +44 -0
  105. data/app/demo/plugins/index.pom +29 -0
  106. data/app/demo/plugins/nav/drawer.pom +19 -0
  107. data/app/demo/shared/code.pom +20 -0
  108. data/app/demo/shared/context_list.pom +29 -0
  109. data/app/demo/shared/debug.pom +17 -0
  110. data/app/demo/styles.pom +42 -0
  111. data/bin/console +14 -7
  112. data/component-status.yml +219 -0
  113. data/config.ru +41 -0
  114. data/coprl.gemspec +35 -27
  115. data/docs/migrating_from_v2_to_v3.md +33 -0
  116. data/docs/settings.md +81 -0
  117. data/exe/coprl +2 -2
  118. data/lib/coprl.rb +22 -4
  119. data/lib/coprl/container_methods.rb +40 -0
  120. data/lib/coprl/logger_methods.rb +11 -0
  121. data/lib/coprl/parameters.rb +73 -0
  122. data/lib/coprl/presenters/api/app.rb +86 -0
  123. data/lib/coprl/presenters/api/router.rb +10 -0
  124. data/lib/coprl/presenters/app.rb +55 -0
  125. data/lib/coprl/presenters/cli.rb +28 -0
  126. data/lib/coprl/presenters/container_item.rb +16 -0
  127. data/lib/coprl/presenters/demo/dragon_drop.rb +48 -0
  128. data/lib/coprl/presenters/demo/echo.rb +36 -0
  129. data/lib/coprl/presenters/demo/search-terms.yml +50 -0
  130. data/lib/coprl/presenters/demo/search.rb +29 -0
  131. data/lib/coprl/presenters/demo/slow.rb +18 -0
  132. data/lib/coprl/presenters/dsl/components/actions/autocomplete.rb +15 -0
  133. data/lib/coprl/presenters/dsl/components/actions/base.rb +65 -0
  134. data/lib/coprl/presenters/dsl/components/actions/clear.rb +15 -0
  135. data/lib/coprl/presenters/dsl/components/actions/close_dialog.rb +17 -0
  136. data/lib/coprl/presenters/dsl/components/actions/deletes.rb +15 -0
  137. data/lib/coprl/presenters/dsl/components/actions/dialog.rb +15 -0
  138. data/lib/coprl/presenters/dsl/components/actions/loads.rb +31 -0
  139. data/lib/coprl/presenters/dsl/components/actions/navigates.rb +15 -0
  140. data/lib/coprl/presenters/dsl/components/actions/post_message.rb +17 -0
  141. data/lib/coprl/presenters/dsl/components/actions/posts.rb +20 -0
  142. data/lib/coprl/presenters/dsl/components/actions/prompt_if_dirty.rb +15 -0
  143. data/lib/coprl/presenters/dsl/components/actions/remove.rb +15 -0
  144. data/lib/coprl/presenters/dsl/components/actions/replaces.rb +25 -0
  145. data/lib/coprl/presenters/dsl/components/actions/snackbar.rb +15 -0
  146. data/lib/coprl/presenters/dsl/components/actions/stepper.rb +15 -0
  147. data/lib/coprl/presenters/dsl/components/actions/toggle_disabled.rb +15 -0
  148. data/lib/coprl/presenters/dsl/components/actions/toggle_visibility.rb +15 -0
  149. data/lib/coprl/presenters/dsl/components/actions/updates.rb +20 -0
  150. data/lib/coprl/presenters/dsl/components/avatar.rb +22 -0
  151. data/lib/coprl/presenters/dsl/components/badge.rb +19 -0
  152. data/lib/coprl/presenters/dsl/components/base.rb +100 -0
  153. data/lib/coprl/presenters/dsl/components/button.rb +60 -0
  154. data/lib/coprl/presenters/dsl/components/card.rb +135 -0
  155. data/lib/coprl/presenters/dsl/components/checkbox.rb +17 -0
  156. data/lib/coprl/presenters/dsl/components/chip.rb +50 -0
  157. data/lib/coprl/presenters/dsl/components/chipset.rb +33 -0
  158. data/lib/coprl/presenters/dsl/components/content.rb +57 -0
  159. data/lib/coprl/presenters/dsl/components/date_field.rb +34 -0
  160. data/lib/coprl/presenters/dsl/components/datetime_base.rb +46 -0
  161. data/lib/coprl/presenters/dsl/components/datetime_field.rb +23 -0
  162. data/lib/coprl/presenters/dsl/components/dialog.rb +80 -0
  163. data/lib/coprl/presenters/dsl/components/drawer.rb +45 -0
  164. data/lib/coprl/presenters/dsl/components/event.rb +178 -0
  165. data/lib/coprl/presenters/dsl/components/event_base.rb +18 -0
  166. data/lib/coprl/presenters/dsl/components/expansion_panel.rb +49 -0
  167. data/lib/coprl/presenters/dsl/components/file_input.rb +34 -0
  168. data/lib/coprl/presenters/dsl/components/footer.rb +25 -0
  169. data/lib/coprl/presenters/dsl/components/form.rb +33 -0
  170. data/lib/coprl/presenters/dsl/components/grid.rb +110 -0
  171. data/lib/coprl/presenters/dsl/components/header.rb +58 -0
  172. data/lib/coprl/presenters/dsl/components/hidden_field.rb +23 -0
  173. data/lib/coprl/presenters/dsl/components/icon.rb +18 -0
  174. data/lib/coprl/presenters/dsl/components/icon_base.rb +22 -0
  175. data/lib/coprl/presenters/dsl/components/icon_toggle.rb +19 -0
  176. data/lib/coprl/presenters/dsl/components/image.rb +84 -0
  177. data/lib/coprl/presenters/dsl/components/image_list.rb +43 -0
  178. data/lib/coprl/presenters/dsl/components/input.rb +30 -0
  179. data/lib/coprl/presenters/dsl/components/link.rb +33 -0
  180. data/lib/coprl/presenters/dsl/components/list.rb +47 -0
  181. data/lib/coprl/presenters/dsl/components/lists/action.rb +69 -0
  182. data/lib/coprl/presenters/dsl/components/lists/actions.rb +60 -0
  183. data/lib/coprl/presenters/dsl/components/lists/header.rb +19 -0
  184. data/lib/coprl/presenters/dsl/components/lists/line.rb +105 -0
  185. data/lib/coprl/presenters/dsl/components/lists/separator.rb +16 -0
  186. data/lib/coprl/presenters/dsl/components/menu.rb +123 -0
  187. data/lib/coprl/presenters/dsl/components/mixins/append.rb +20 -0
  188. data/lib/coprl/presenters/dsl/components/mixins/attaches.rb +22 -0
  189. data/lib/coprl/presenters/dsl/components/mixins/avatar.rb +15 -0
  190. data/lib/coprl/presenters/dsl/components/mixins/buttons.rb +15 -0
  191. data/lib/coprl/presenters/dsl/components/mixins/chips.rb +18 -0
  192. data/lib/coprl/presenters/dsl/components/mixins/chipset.rb +19 -0
  193. data/lib/coprl/presenters/dsl/components/mixins/common.rb +55 -0
  194. data/lib/coprl/presenters/dsl/components/mixins/content.rb +15 -0
  195. data/lib/coprl/presenters/dsl/components/mixins/date_time_fields.rb +26 -0
  196. data/lib/coprl/presenters/dsl/components/mixins/dialogs.rb +16 -0
  197. data/lib/coprl/presenters/dsl/components/mixins/event.rb +17 -0
  198. data/lib/coprl/presenters/dsl/components/mixins/expansion_panels.rb +15 -0
  199. data/lib/coprl/presenters/dsl/components/mixins/file_inputs.rb +16 -0
  200. data/lib/coprl/presenters/dsl/components/mixins/google_maps.rb +15 -0
  201. data/lib/coprl/presenters/dsl/components/mixins/grids.rb +15 -0
  202. data/lib/coprl/presenters/dsl/components/mixins/helpers.rb +20 -0
  203. data/lib/coprl/presenters/dsl/components/mixins/icons.rb +16 -0
  204. data/lib/coprl/presenters/dsl/components/mixins/image_lists.rb +15 -0
  205. data/lib/coprl/presenters/dsl/components/mixins/images.rb +15 -0
  206. data/lib/coprl/presenters/dsl/components/mixins/last_response.rb +48 -0
  207. data/lib/coprl/presenters/dsl/components/mixins/menus.rb +15 -0
  208. data/lib/coprl/presenters/dsl/components/mixins/padding.rb +42 -0
  209. data/lib/coprl/presenters/dsl/components/mixins/progress.rb +16 -0
  210. data/lib/coprl/presenters/dsl/components/mixins/selects.rb +22 -0
  211. data/lib/coprl/presenters/dsl/components/mixins/sliders.rb +15 -0
  212. data/lib/coprl/presenters/dsl/components/mixins/snackbars.rb +17 -0
  213. data/lib/coprl/presenters/dsl/components/mixins/steppers.rb +15 -0
  214. data/lib/coprl/presenters/dsl/components/mixins/tab_bars.rb +17 -0
  215. data/lib/coprl/presenters/dsl/components/mixins/tables.rb +15 -0
  216. data/lib/coprl/presenters/dsl/components/mixins/text_fields.rb +36 -0
  217. data/lib/coprl/presenters/dsl/components/mixins/toggles.rb +35 -0
  218. data/lib/coprl/presenters/dsl/components/mixins/tooltips.rb +17 -0
  219. data/lib/coprl/presenters/dsl/components/mixins/typography.rb +117 -0
  220. data/lib/coprl/presenters/dsl/components/mixins/yield_to.rb +15 -0
  221. data/lib/coprl/presenters/dsl/components/multi_select.rb +56 -0
  222. data/lib/coprl/presenters/dsl/components/number_field.rb +20 -0
  223. data/lib/coprl/presenters/dsl/components/page.rb +28 -0
  224. data/lib/coprl/presenters/dsl/components/page_title.rb +31 -0
  225. data/lib/coprl/presenters/dsl/components/progress.rb +27 -0
  226. data/lib/coprl/presenters/dsl/components/radio_button.rb +14 -0
  227. data/lib/coprl/presenters/dsl/components/rich_text_area.rb +20 -0
  228. data/lib/coprl/presenters/dsl/components/select.rb +72 -0
  229. data/lib/coprl/presenters/dsl/components/separator.rb +21 -0
  230. data/lib/coprl/presenters/dsl/components/slider.rb +38 -0
  231. data/lib/coprl/presenters/dsl/components/snackbar.rb +32 -0
  232. data/lib/coprl/presenters/dsl/components/stepper.rb +96 -0
  233. data/lib/coprl/presenters/dsl/components/switch.rb +14 -0
  234. data/lib/coprl/presenters/dsl/components/tab_bar.rb +50 -0
  235. data/lib/coprl/presenters/dsl/components/table.rb +193 -0
  236. data/lib/coprl/presenters/dsl/components/text_area.rb +19 -0
  237. data/lib/coprl/presenters/dsl/components/text_field.rb +113 -0
  238. data/lib/coprl/presenters/dsl/components/time_field.rb +21 -0
  239. data/lib/coprl/presenters/dsl/components/toggle_base.rb +25 -0
  240. data/lib/coprl/presenters/dsl/components/tooltip.rb +24 -0
  241. data/lib/coprl/presenters/dsl/components/typography.rb +31 -0
  242. data/lib/coprl/presenters/dsl/components/unordered_list.rb +50 -0
  243. data/lib/coprl/presenters/dsl/definer.rb +9 -0
  244. data/lib/coprl/presenters/dsl/definition.rb +34 -0
  245. data/lib/coprl/presenters/dsl/invalid_presenter.rb +8 -0
  246. data/lib/coprl/presenters/dsl/lockable.rb +11 -0
  247. data/lib/coprl/presenters/dsl/protect_from_forgery.rb +43 -0
  248. data/lib/coprl/presenters/dsl/user_interface.rb +157 -0
  249. data/lib/coprl/presenters/errors.rb +1 -0
  250. data/lib/coprl/presenters/errors/invalid_dsl.rb +8 -0
  251. data/lib/coprl/presenters/errors/parameter_validation.rb +8 -0
  252. data/lib/coprl/presenters/errors/unprocessable.rb +8 -0
  253. data/lib/coprl/presenters/generators/inflectors.rb +59 -0
  254. data/lib/coprl/presenters/generators/plugin.rb +121 -0
  255. data/lib/coprl/presenters/generators/templates/plugin/.gitignore +12 -0
  256. data/lib/coprl/presenters/generators/templates/plugin/Gemfile.tt +6 -0
  257. data/lib/coprl/presenters/generators/templates/plugin/LICENSE.txt.tt +21 -0
  258. data/lib/coprl/presenters/generators/templates/plugin/README.md +253 -0
  259. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/components/actions/action.rb.tt +16 -0
  260. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/components/actions/dsl.rb.tt +22 -0
  261. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/components/component.rb.tt +18 -0
  262. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/components/dsl.rb.tt +19 -0
  263. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/helpers/helper.rb.tt +15 -0
  264. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/plugin.rb.tt +9 -0
  265. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/web_client/components/actions/data.rb.tt +17 -0
  266. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/web_client/components/render.rb.tt +27 -0
  267. data/lib/coprl/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +21 -0
  268. data/lib/coprl/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt +21 -0
  269. data/lib/coprl/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt +15 -0
  270. data/lib/coprl/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt +39 -0
  271. data/lib/coprl/presenters/generators/templates/plugin/views/components/application/component.erb.tt +14 -0
  272. data/lib/coprl/presenters/generators/templates/plugin/views/components/application/component_header.erb.tt +20 -0
  273. data/lib/coprl/presenters/helpers.rb +12 -0
  274. data/lib/coprl/presenters/helpers/date.rb +22 -0
  275. data/lib/coprl/presenters/helpers/errors.rb +11 -0
  276. data/lib/coprl/presenters/helpers/inflector.rb +16 -0
  277. data/lib/coprl/presenters/helpers/rails.rb +43 -0
  278. data/lib/coprl/presenters/helpers/rails/currency.rb +16 -0
  279. data/lib/coprl/presenters/helpers/rails/model_table.rb +60 -0
  280. data/lib/coprl/presenters/helpers/redact.rb +13 -0
  281. data/lib/coprl/presenters/helpers/route.rb +24 -0
  282. data/lib/coprl/presenters/helpers/time.rb +27 -0
  283. data/lib/coprl/presenters/namespace.rb +12 -0
  284. data/lib/coprl/presenters/pluggable.rb +37 -0
  285. data/lib/coprl/presenters/plugins.rb +7 -0
  286. data/lib/coprl/presenters/plugins/google_maps.rb +24 -0
  287. data/lib/coprl/presenters/plugins/google_maps/google_map.erb +10 -0
  288. data/lib/coprl/presenters/plugins/google_maps/google_map.rb +41 -0
  289. data/lib/coprl/presenters/rails/engine.rb +19 -0
  290. data/lib/coprl/presenters/rails/railtie.rb +41 -0
  291. data/lib/coprl/presenters/registry.rb +64 -0
  292. data/lib/coprl/presenters/router.rb +59 -0
  293. data/lib/coprl/presenters/settings.rb +81 -0
  294. data/lib/coprl/presenters/version.rb +7 -0
  295. data/lib/coprl/presenters/views.rb +17 -0
  296. data/lib/coprl/presenters/web_client/app.rb +121 -0
  297. data/lib/coprl/presenters/web_client/component_decorator_factory.rb +27 -0
  298. data/lib/coprl/presenters/web_client/component_html_decorator.rb +50 -0
  299. data/lib/coprl/presenters/web_client/component_renderer.rb +49 -0
  300. data/lib/coprl/presenters/web_client/custom_css.rb +66 -0
  301. data/lib/coprl/presenters/web_client/custom_render.rb +31 -0
  302. data/lib/coprl/presenters/web_client/helpers/color.rb +18 -0
  303. data/lib/coprl/presenters/web_client/helpers/drag_and_drop.rb +21 -0
  304. data/lib/coprl/presenters/web_client/helpers/equal.rb +7 -0
  305. data/lib/coprl/presenters/web_client/helpers/expand_hash.rb +19 -0
  306. data/lib/coprl/presenters/web_client/helpers/form_helpers.rb +14 -0
  307. data/lib/coprl/presenters/web_client/helpers/headers.rb +40 -0
  308. data/lib/coprl/presenters/web_client/helpers/html_safe.rb +8 -0
  309. data/lib/coprl/presenters/web_client/helpers/includes.rb +11 -0
  310. data/lib/coprl/presenters/web_client/helpers/inflector.rb +7 -0
  311. data/lib/coprl/presenters/web_client/helpers/markdown.rb +29 -0
  312. data/lib/coprl/presenters/web_client/helpers/padding_helpers.rb +21 -0
  313. data/lib/coprl/presenters/web_client/helpers/rails.rb +12 -0
  314. data/lib/coprl/presenters/web_client/helpers/rails/escape_html.rb +9 -0
  315. data/lib/coprl/presenters/web_client/helpers/rails/local_variables.rb +11 -0
  316. data/lib/coprl/presenters/web_client/helpers/rails/namespaced.rb +12 -0
  317. data/lib/coprl/presenters/web_client/helpers/rails/partials.rb +20 -0
  318. data/lib/coprl/presenters/web_client/helpers/rails/raw.rb +9 -0
  319. data/lib/coprl/presenters/web_client/helpers/rails/safe_markdown.rb +9 -0
  320. data/lib/coprl/presenters/web_client/helpers/render_component.rb +11 -0
  321. data/lib/coprl/presenters/web_client/helpers/shared.rb +18 -0
  322. data/lib/coprl/presenters/web_client/helpers/sinatra.rb +11 -0
  323. data/lib/coprl/presenters/web_client/helpers/sinatra/escape_html.rb +9 -0
  324. data/lib/coprl/presenters/web_client/helpers/sinatra/local_variables.rb +11 -0
  325. data/lib/coprl/presenters/web_client/helpers/sinatra/partials.rb +27 -0
  326. data/lib/coprl/presenters/web_client/helpers/sinatra/raw.rb +9 -0
  327. data/lib/coprl/presenters/web_client/helpers/sinatra/safe_markdown.rb +10 -0
  328. data/lib/coprl/presenters/web_client/helpers/snake_to_camel.rb +12 -0
  329. data/lib/coprl/presenters/web_client/helpers/transform_hash.rb +20 -0
  330. data/lib/coprl/presenters/web_client/helpers/unique_id.rb +7 -0
  331. data/lib/coprl/presenters/web_client/plugin_headers.rb +37 -0
  332. data/lib/coprl/presenters/web_client/plugin_views_path.rb +35 -0
  333. data/lib/coprl/presenters/web_client/router.rb +10 -0
  334. data/lib/coprl/serializer.rb +43 -0
  335. data/lib/coprl/symbol/to_str.rb +29 -0
  336. data/lib/coprl/trace.rb +17 -0
  337. data/lib/hash_ext/traverse.rb +14 -0
  338. data/public/bundle.css +18256 -0
  339. data/public/bundle.js +60195 -0
  340. data/public/dialog-polyfill.js +738 -0
  341. data/public/favicon.ico +0 -0
  342. data/public/img/demo/dog.png +0 -0
  343. data/public/img/demo/grace-hopper-headshot.png +0 -0
  344. data/public/img/demo/grace-hopper-wide.png +0 -0
  345. data/public/img/demo/grace-hopper.png +0 -0
  346. data/public/img/demo/image_card.jpg +0 -0
  347. data/public/img/demo/rx.png +0 -0
  348. data/public/img/demo/welcome_card.jpg +0 -0
  349. data/public/img/settings/blue.png +0 -0
  350. data/public/img/settings/green.png +0 -0
  351. data/public/img/settings/orange.png +0 -0
  352. data/public/img/settings/purple.png +0 -0
  353. data/public/img/settings/red.png +0 -0
  354. data/public/img/settings/teal.png +0 -0
  355. data/public/img/settings/white.png +0 -0
  356. data/public/img/settings/yellow.png +0 -0
  357. data/public/presenters/custom_css.css +26 -0
  358. data/public/scripts.js +289 -0
  359. data/public/style-bundle.js +73 -0
  360. data/public/styles.css +16 -0
  361. data/public/wc.js +52950 -0
  362. data/rails-engine/app/controllers/coprl_controller.rb +24 -0
  363. data/rails-engine/app/helpers/coprl_helper.rb +3 -0
  364. data/rails-engine/app/views/application/_show.html.pom +2 -0
  365. data/rails-engine/app/views/coprl/show.html.pom +2 -0
  366. data/rails-engine/app/views/layouts/coprl.html.erb +21 -0
  367. data/rails-engine/config.ru +1 -0
  368. data/rails-engine/config/initializers/presenters.rb +43 -0
  369. data/rails-engine/config/routes.rb +13 -0
  370. data/scripts/build.sh +10 -0
  371. data/views/mdc/.babelrc +8 -0
  372. data/views/mdc/.eslintrc.yml +24 -0
  373. data/views/mdc/.gitignore +1 -0
  374. data/views/mdc/.nvmrc +1 -0
  375. data/views/mdc/assets/js/app.js +34 -0
  376. data/views/mdc/assets/js/components/base-component.js +163 -0
  377. data/views/mdc/assets/js/components/base-container.js +87 -0
  378. data/views/mdc/assets/js/components/base-toggle.js +56 -0
  379. data/views/mdc/assets/js/components/button.js +77 -0
  380. data/views/mdc/assets/js/components/cards.js +14 -0
  381. data/views/mdc/assets/js/components/checkboxes.js +15 -0
  382. data/views/mdc/assets/js/components/chips.js +109 -0
  383. data/views/mdc/assets/js/components/content.js +14 -0
  384. data/views/mdc/assets/js/components/data-tables.js +15 -0
  385. data/views/mdc/assets/js/components/datetime.js +186 -0
  386. data/views/mdc/assets/js/components/dialogs.js +135 -0
  387. data/views/mdc/assets/js/components/drag_n_drop.js +182 -0
  388. data/views/mdc/assets/js/components/drawer.js +43 -0
  389. data/views/mdc/assets/js/components/events.js +277 -0
  390. data/views/mdc/assets/js/components/events/action_parameter.js +62 -0
  391. data/views/mdc/assets/js/components/events/action_parameter.test.js +62 -0
  392. data/views/mdc/assets/js/components/events/autocomplete.js +94 -0
  393. data/views/mdc/assets/js/components/events/base.js +167 -0
  394. data/views/mdc/assets/js/components/events/clears.js +29 -0
  395. data/views/mdc/assets/js/components/events/close_dialog.js +50 -0
  396. data/views/mdc/assets/js/components/events/dialog.js +43 -0
  397. data/views/mdc/assets/js/components/events/encode.js +8 -0
  398. data/views/mdc/assets/js/components/events/errors.js +225 -0
  399. data/views/mdc/assets/js/components/events/loads.js +62 -0
  400. data/views/mdc/assets/js/components/events/navigates.js +19 -0
  401. data/views/mdc/assets/js/components/events/plugin.js +18 -0
  402. data/views/mdc/assets/js/components/events/post_message.js +21 -0
  403. data/views/mdc/assets/js/components/events/posts.js +218 -0
  404. data/views/mdc/assets/js/components/events/prompt_if_dirty.js +67 -0
  405. data/views/mdc/assets/js/components/events/removes.js +21 -0
  406. data/views/mdc/assets/js/components/events/replaces.js +135 -0
  407. data/views/mdc/assets/js/components/events/snackbar.js +23 -0
  408. data/views/mdc/assets/js/components/events/stepper.js +21 -0
  409. data/views/mdc/assets/js/components/events/toggle_disabled.js +41 -0
  410. data/views/mdc/assets/js/components/events/toggle_visibility.js +72 -0
  411. data/views/mdc/assets/js/components/file-inputs.js +76 -0
  412. data/views/mdc/assets/js/components/form-fields.js +16 -0
  413. data/views/mdc/assets/js/components/forms.js +14 -0
  414. data/views/mdc/assets/js/components/get_event_target.js +15 -0
  415. data/views/mdc/assets/js/components/grid.js +21 -0
  416. data/views/mdc/assets/js/components/header.js +20 -0
  417. data/views/mdc/assets/js/components/hidden-fields.js +44 -0
  418. data/views/mdc/assets/js/components/icon-toggles.js +14 -0
  419. data/views/mdc/assets/js/components/images.js +19 -0
  420. data/views/mdc/assets/js/components/initialize.js +82 -0
  421. data/views/mdc/assets/js/components/lists.js +92 -0
  422. data/views/mdc/assets/js/components/menus.js +79 -0
  423. data/views/mdc/assets/js/components/mixins/dirtyable.js +22 -0
  424. data/views/mdc/assets/js/components/mixins/event-handler.js +13 -0
  425. data/views/mdc/assets/js/components/mixins/visibility-observer.js +35 -0
  426. data/views/mdc/assets/js/components/multi-select.js +75 -0
  427. data/views/mdc/assets/js/components/plugins.js +86 -0
  428. data/views/mdc/assets/js/components/progress.js +31 -0
  429. data/views/mdc/assets/js/components/radios.js +14 -0
  430. data/views/mdc/assets/js/components/rich-text-area.js +227 -0
  431. data/views/mdc/assets/js/components/rich-text-area/horizontal-rule-blot.js +23 -0
  432. data/views/mdc/assets/js/components/root_document.js +5 -0
  433. data/views/mdc/assets/js/components/selects.js +56 -0
  434. data/views/mdc/assets/js/components/sliders.js +67 -0
  435. data/views/mdc/assets/js/components/snackbar.js +26 -0
  436. data/views/mdc/assets/js/components/steppers.js +48 -0
  437. data/views/mdc/assets/js/components/switches.js +14 -0
  438. data/views/mdc/assets/js/components/tab-bars.js +28 -0
  439. data/views/mdc/assets/js/components/text-fields.js +157 -0
  440. data/views/mdc/assets/js/components/tooltip.js +17 -0
  441. data/views/mdc/assets/js/components/typography.js +28 -0
  442. data/views/mdc/assets/js/components/uninitialize.js +7 -0
  443. data/views/mdc/assets/js/config.js +27 -0
  444. data/views/mdc/assets/js/mdl-stepper.js +1108 -0
  445. data/views/mdc/assets/js/utils/compatibility.js +9 -0
  446. data/views/mdc/assets/js/utils/config.js +73 -0
  447. data/views/mdc/assets/js/utils/config.test.js +59 -0
  448. data/views/mdc/assets/js/utils/form-data.js +12 -0
  449. data/views/mdc/assets/js/utils/urls.js +57 -0
  450. data/views/mdc/assets/js/wc.js +111 -0
  451. data/views/mdc/assets/scss/app.scss +47 -0
  452. data/views/mdc/assets/scss/components/avatar.scss +85 -0
  453. data/views/mdc/assets/scss/components/button.scss +76 -0
  454. data/views/mdc/assets/scss/components/card.scss +60 -0
  455. data/views/mdc/assets/scss/components/checkbox.scss +1 -0
  456. data/views/mdc/assets/scss/components/chip.scss +34 -0
  457. data/views/mdc/assets/scss/components/content.scss +36 -0
  458. data/views/mdc/assets/scss/components/data-table.scss +91 -0
  459. data/views/mdc/assets/scss/components/datetime.scss +29 -0
  460. data/views/mdc/assets/scss/components/dialog.scss +8 -0
  461. data/views/mdc/assets/scss/components/drag_n_drop.scss +17 -0
  462. data/views/mdc/assets/scss/components/drawer.scss +82 -0
  463. data/views/mdc/assets/scss/components/expansion-panel.scss +153 -0
  464. data/views/mdc/assets/scss/components/fab.scss +27 -0
  465. data/views/mdc/assets/scss/components/file-input.scss +18 -0
  466. data/views/mdc/assets/scss/components/grid.scss +81 -0
  467. data/views/mdc/assets/scss/components/header.scss +21 -0
  468. data/views/mdc/assets/scss/components/icon-button-toggles.scss +2 -0
  469. data/views/mdc/assets/scss/components/icon.scss +57 -0
  470. data/views/mdc/assets/scss/components/image-list.scss +18 -0
  471. data/views/mdc/assets/scss/components/image.scss +22 -0
  472. data/views/mdc/assets/scss/components/list.scss +43 -0
  473. data/views/mdc/assets/scss/components/menu.scss +28 -0
  474. data/views/mdc/assets/scss/components/multi-select.scss +44 -0
  475. data/views/mdc/assets/scss/components/progress.scss +1 -0
  476. data/views/mdc/assets/scss/components/radio.scss +4 -0
  477. data/views/mdc/assets/scss/components/rich-text-area.scss +73 -0
  478. data/views/mdc/assets/scss/components/select.scss +23 -0
  479. data/views/mdc/assets/scss/components/separator.scss +3 -0
  480. data/views/mdc/assets/scss/components/slider.scss +1 -0
  481. data/views/mdc/assets/scss/components/snackbar.scss +5 -0
  482. data/views/mdc/assets/scss/components/stepper.scss +235 -0
  483. data/views/mdc/assets/scss/components/switch.scss +15 -0
  484. data/views/mdc/assets/scss/components/tab-bars.scss +4 -0
  485. data/views/mdc/assets/scss/components/textfield.scss +19 -0
  486. data/views/mdc/assets/scss/components/tooltip.scss +3 -0
  487. data/views/mdc/assets/scss/components/typography.scss +35 -0
  488. data/views/mdc/assets/scss/components/unordered-lists.scss +17 -0
  489. data/views/mdc/assets/scss/components/vendor/quill.snow.css +945 -0
  490. data/views/mdc/assets/scss/material.blue_grey-orange.min.css +8 -0
  491. data/views/mdc/assets/scss/media.scss +39 -0
  492. data/views/mdc/assets/scss/palette.scss +16 -0
  493. data/views/mdc/assets/scss/styles.scss +54 -0
  494. data/views/mdc/assets/scss/theme.scss +78 -0
  495. data/views/mdc/body/_dismissable-drawer.erb +34 -0
  496. data/views/mdc/body/_footer.erb +1 -0
  497. data/views/mdc/body/_header.erb +39 -0
  498. data/views/mdc/body/_modal-drawer.erb +35 -0
  499. data/views/mdc/body/_postamble.erb +17 -0
  500. data/views/mdc/body/_preamble.erb +26 -0
  501. data/views/mdc/body/_snackbar.erb +16 -0
  502. data/views/mdc/body/drawer/_divider.erb +1 -0
  503. data/views/mdc/body/drawer/_item.erb +13 -0
  504. data/views/mdc/body/drawer/_label.erb +1 -0
  505. data/views/mdc/body/drawers/_menu.erb +25 -0
  506. data/views/mdc/body/footers/_large.erb +27 -0
  507. data/views/mdc/body/footers/_menu_item.erb +6 -0
  508. data/views/mdc/body/footers/_small.erb +14 -0
  509. data/views/mdc/components/_avatar.erb +31 -0
  510. data/views/mdc/components/_badge.erb +2 -0
  511. data/views/mdc/components/_body.erb +2 -0
  512. data/views/mdc/components/_button.erb +28 -0
  513. data/views/mdc/components/_caption.erb +2 -0
  514. data/views/mdc/components/_card.erb +71 -0
  515. data/views/mdc/components/_checkbox.erb +34 -0
  516. data/views/mdc/components/_chip.erb +56 -0
  517. data/views/mdc/components/_chipset.erb +17 -0
  518. data/views/mdc/components/_content.erb +36 -0
  519. data/views/mdc/components/_date.erb +1 -0
  520. data/views/mdc/components/_datetime.erb +33 -0
  521. data/views/mdc/components/_dialog.erb +50 -0
  522. data/views/mdc/components/_event.erb +12 -0
  523. data/views/mdc/components/_expansion_panel.erb +13 -0
  524. data/views/mdc/components/_file_input.erb +17 -0
  525. data/views/mdc/components/_form.erb +14 -0
  526. data/views/mdc/components/_grid.erb +43 -0
  527. data/views/mdc/components/_headline.erb +4 -0
  528. data/views/mdc/components/_hidden_field.erb +5 -0
  529. data/views/mdc/components/_icon.erb +35 -0
  530. data/views/mdc/components/_icon_toggle.erb +16 -0
  531. data/views/mdc/components/_image.erb +25 -0
  532. data/views/mdc/components/_image_list.erb +38 -0
  533. data/views/mdc/components/_link.erb +4 -0
  534. data/views/mdc/components/_list.erb +20 -0
  535. data/views/mdc/components/_menu.erb +45 -0
  536. data/views/mdc/components/_multi_select.erb +33 -0
  537. data/views/mdc/components/_number_field.erb +38 -0
  538. data/views/mdc/components/_overline.erb +2 -0
  539. data/views/mdc/components/_page_title.erb +4 -0
  540. data/views/mdc/components/_progress.erb +11 -0
  541. data/views/mdc/components/_radio_button.erb +20 -0
  542. data/views/mdc/components/_render.erb +3 -0
  543. data/views/mdc/components/_rich_text_area.erb +22 -0
  544. data/views/mdc/components/_select.erb +43 -0
  545. data/views/mdc/components/_separator.erb +3 -0
  546. data/views/mdc/components/_slider.erb +43 -0
  547. data/views/mdc/components/_snackbar.erb +13 -0
  548. data/views/mdc/components/_stepper.erb +47 -0
  549. data/views/mdc/components/_subtitle.erb +4 -0
  550. data/views/mdc/components/_switch.erb +29 -0
  551. data/views/mdc/components/_tab_bar.erb +35 -0
  552. data/views/mdc/components/_table.erb +28 -0
  553. data/views/mdc/components/_text_area.erb +18 -0
  554. data/views/mdc/components/_text_field.erb +39 -0
  555. data/views/mdc/components/_time.erb +1 -0
  556. data/views/mdc/components/_tooltip.erb +5 -0
  557. data/views/mdc/components/_typography.erb +15 -0
  558. data/views/mdc/components/_unordered_list.erb +10 -0
  559. data/views/mdc/components/actions/autocomplete.rb +8 -0
  560. data/views/mdc/components/actions/clear.rb +11 -0
  561. data/views/mdc/components/actions/close_dialog.rb +10 -0
  562. data/views/mdc/components/actions/delete.rb +11 -0
  563. data/views/mdc/components/actions/dialog.rb +11 -0
  564. data/views/mdc/components/actions/loads.rb +17 -0
  565. data/views/mdc/components/actions/navigates.rb +11 -0
  566. data/views/mdc/components/actions/post.rb +14 -0
  567. data/views/mdc/components/actions/post_message.rb +10 -0
  568. data/views/mdc/components/actions/prompt_if_dirty.rb +17 -0
  569. data/views/mdc/components/actions/remove.rb +10 -0
  570. data/views/mdc/components/actions/replaces.rb +16 -0
  571. data/views/mdc/components/actions/resolver.rb +39 -0
  572. data/views/mdc/components/actions/snackbar.rb +12 -0
  573. data/views/mdc/components/actions/stepper.rb +10 -0
  574. data/views/mdc/components/actions/toggle_disabled.rb +10 -0
  575. data/views/mdc/components/actions/toggle_visibility.rb +10 -0
  576. data/views/mdc/components/actions/update.rb +10 -0
  577. data/views/mdc/components/buttons/_button.erb +27 -0
  578. data/views/mdc/components/buttons/_fab.erb +23 -0
  579. data/views/mdc/components/buttons/_icon.erb +24 -0
  580. data/views/mdc/components/buttons/_image.erb +25 -0
  581. data/views/mdc/components/list/_actions.erb +6 -0
  582. data/views/mdc/components/list/_avatar.erb +6 -0
  583. data/views/mdc/components/list/_checkbox.erb +5 -0
  584. data/views/mdc/components/list/_header.erb +37 -0
  585. data/views/mdc/components/list/_hidden_field.erb +3 -0
  586. data/views/mdc/components/list/_icon.erb +6 -0
  587. data/views/mdc/components/list/_info.erb +1 -0
  588. data/views/mdc/components/list/_line.erb +45 -0
  589. data/views/mdc/components/list/_menu.erb +28 -0
  590. data/views/mdc/components/list/_separator.erb +1 -0
  591. data/views/mdc/components/list/actions/_button.erb +1 -0
  592. data/views/mdc/components/list/actions/_checkbox.erb +1 -0
  593. data/views/mdc/components/list/actions/_icon.erb +1 -0
  594. data/views/mdc/components/list/actions/_icon_toggle.erb +1 -0
  595. data/views/mdc/components/list/actions/_radio_button.erb +1 -0
  596. data/views/mdc/components/list/actions/_switch.erb +1 -0
  597. data/views/mdc/components/shared/_hint_error_display.erb +9 -0
  598. data/views/mdc/components/shared/_input_label.erb +7 -0
  599. data/views/mdc/components/stepper/_step.erb +33 -0
  600. data/views/mdc/components/table/_checkbox.erb +20 -0
  601. data/views/mdc/components/table/_column.erb +18 -0
  602. data/views/mdc/components/table/_footer.erb +8 -0
  603. data/views/mdc/components/table/_header.erb +17 -0
  604. data/views/mdc/components/table/_pagination.erb +11 -0
  605. data/views/mdc/components/table/_row.erb +16 -0
  606. data/views/mdc/components/unordered_list/_icon.erb +2 -0
  607. data/views/mdc/components/unordered_list/_list_item.erb +7 -0
  608. data/views/mdc/init-depends.sh +2 -0
  609. data/views/mdc/layout.erb +18 -0
  610. data/views/mdc/package-lock.json +16461 -0
  611. data/views/mdc/package.json +76 -0
  612. data/views/mdc/web.erb +5 -0
  613. data/views/mdc/webpack.config.js +60 -0
  614. metadata +900 -19
  615. data/.rspec +0 -3
  616. data/.rubocop.yml +0 -10
  617. data/CODE_OF_CONDUCT.md +0 -84
  618. data/lib/coprl/version.rb +0 -5
@@ -0,0 +1,28 @@
1
+ import {VBaseComponent} from './base-component';
2
+ import {hookupComponents} from './base-component';
3
+ import {eventHandlerMixin} from './mixins/event-handler';
4
+
5
+ export function initTypography(e) {
6
+ console.debug('\tTypography');
7
+ hookupComponents(e, '.v-typography', VTypography);
8
+ }
9
+
10
+
11
+ export class VTypography extends eventHandlerMixin(VBaseComponent) {
12
+ constructor(element) {
13
+ super(element);
14
+ }
15
+
16
+ preview(result, acceptsMimeTypes, file) {
17
+ this.element.innerText = file.name;
18
+ }
19
+
20
+ clear() {
21
+ this.element.innerText = '';
22
+ }
23
+
24
+ value() {
25
+ return this.element.innerText;
26
+ }
27
+ }
28
+
@@ -0,0 +1,7 @@
1
+ import {uninitMenus} from './menus';
2
+
3
+ export function uninitialize(root) {
4
+ console.debug('Uninitializing components');
5
+
6
+ uninitMenus(root);
7
+ }
@@ -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
+ /******/ ]);