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