voom-presenters 0.1.10 → 2.0.0
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 +39 -0
- data/.gitignore +4 -2
- data/.releaserc +8 -0
- data/.ruby-version +2 -1
- data/CHANGELOG.md +136 -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/bin/presenters +3 -0
- data/component-status.yml +26 -26
- data/config.ru +21 -10
- data/docs/settings.md +81 -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 +353 -31
- 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 @@
|
|
1
|
+
Dir[File.join(__dir__, 'errors', '*.rb')].each { |file| require file }
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Voom
|
2
|
+
module Presenters
|
3
|
+
module Generators
|
4
|
+
module Inflectors
|
5
|
+
def classify(input)
|
6
|
+
# "books" => "Book"
|
7
|
+
@inflector.classify(input)
|
8
|
+
end
|
9
|
+
|
10
|
+
def pluralize(input)
|
11
|
+
#book" => "books"
|
12
|
+
@inflector.pluralize(input)
|
13
|
+
end
|
14
|
+
|
15
|
+
def singularize(input)
|
16
|
+
#"books" => "book"
|
17
|
+
@inflector.singularize(input)
|
18
|
+
end
|
19
|
+
|
20
|
+
def camelize(input)
|
21
|
+
# "dry/inflector" => "Dry::Inflector"
|
22
|
+
@inflector.camelize(input)
|
23
|
+
end
|
24
|
+
|
25
|
+
def tableize(input)
|
26
|
+
# "Book" => "books"
|
27
|
+
@inflector.tableize(input)
|
28
|
+
end
|
29
|
+
|
30
|
+
def dasherize(input)
|
31
|
+
# "dry_inflector" => "dry-inflector"
|
32
|
+
@inflector.dasherize(input)
|
33
|
+
end
|
34
|
+
|
35
|
+
def underscore(input)
|
36
|
+
# "dry-inflector" => "dry_inflector"
|
37
|
+
@inflector.underscore(input)
|
38
|
+
end
|
39
|
+
|
40
|
+
def demodulize(input)
|
41
|
+
# "Dry::Inflector" => "Inflector"
|
42
|
+
@inflector.demodulize(input)
|
43
|
+
end
|
44
|
+
|
45
|
+
def humanize(input)
|
46
|
+
# "dry_inflector" => "Dry inflector", "author_id" => "Author"
|
47
|
+
@inflector.humanize(input)
|
48
|
+
end
|
49
|
+
|
50
|
+
def ordinalize(input)
|
51
|
+
# 1 => "1st
|
52
|
+
@inflector.ordinalize(input)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require "dry/inflector"
|
2
|
+
require_relative 'inflectors'
|
3
|
+
|
4
|
+
module Voom
|
5
|
+
module Presenters
|
6
|
+
module Generators
|
7
|
+
class Plugin < ::Thor::Group
|
8
|
+
TEMPLATES_ROOT = File.join('templates','plugin')
|
9
|
+
LIB_ROOT = File.join('lib','voom','presenters','plugins')
|
10
|
+
include Thor::Actions
|
11
|
+
argument :name
|
12
|
+
|
13
|
+
def initialize(args = [], local_options = {}, config = {})
|
14
|
+
@inflector = Dry::Inflector.new
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.source_root
|
19
|
+
File.dirname(__FILE__)
|
20
|
+
end
|
21
|
+
|
22
|
+
no_tasks do
|
23
|
+
include Voom::Presenters::Generators::Inflectors
|
24
|
+
|
25
|
+
def join_path(*parts)
|
26
|
+
File.join(*parts.compact)
|
27
|
+
end
|
28
|
+
|
29
|
+
def template_file(template, target_filename=template, source_path=nil, target_path=source_path)
|
30
|
+
underscore_name = underscored_name
|
31
|
+
source = join_path(TEMPLATES_ROOT, source_path, "#{template}.tt")
|
32
|
+
destination = join_path(underscore_name, target_path, target_filename)
|
33
|
+
template source, destination
|
34
|
+
end
|
35
|
+
|
36
|
+
def file(file, target_filename=file, source_path=nil, target_path=nil)
|
37
|
+
underscore_name = underscored_name
|
38
|
+
source = join_path(TEMPLATES_ROOT, source_path, file)
|
39
|
+
destination = join_path(underscore_name, target_path, target_filename)
|
40
|
+
|
41
|
+
copy_file source, destination
|
42
|
+
end
|
43
|
+
|
44
|
+
def lib_dir(*args)
|
45
|
+
dir(LIB_ROOT, *args)
|
46
|
+
end
|
47
|
+
|
48
|
+
def dir(*args)
|
49
|
+
join_path(*args)
|
50
|
+
end
|
51
|
+
|
52
|
+
def named_dir(*args)
|
53
|
+
lib_dir(underscored_name, *args)
|
54
|
+
end
|
55
|
+
|
56
|
+
def underscored_name
|
57
|
+
underscore(name)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_root_files
|
62
|
+
file('.gitignore')
|
63
|
+
file('Gemfile')
|
64
|
+
template_file('LICENSE.txt')
|
65
|
+
template_file('presenter_plugin.gemspec', "#{underscored_name}_presenter_plugin.gemspec")
|
66
|
+
file 'README.md'
|
67
|
+
end
|
68
|
+
|
69
|
+
def create_plugin
|
70
|
+
template_file('plugin.rb', "#{underscored_name}.rb", LIB_ROOT)
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_component_files
|
74
|
+
template_file('component.rb', "#{underscored_name}_component.rb",
|
75
|
+
lib_dir('components'),
|
76
|
+
named_dir('components'))
|
77
|
+
template_file('dsl.rb', "#{underscored_name}_dsl.rb",
|
78
|
+
lib_dir('components'),
|
79
|
+
named_dir('components'))
|
80
|
+
template_file('render.rb', "#{underscored_name}_render.rb",
|
81
|
+
lib_dir('web_client', 'components'),
|
82
|
+
named_dir('web_client', 'components'))
|
83
|
+
template_file('component.css', "#{underscored_name}.css",
|
84
|
+
dir('views', 'assets', 'css', 'components'))
|
85
|
+
template_file('component.js', "#{underscored_name}.js",
|
86
|
+
dir('views', 'assets', 'js', 'components'))
|
87
|
+
template_file('component.erb', "#{underscored_name}.erb",
|
88
|
+
dir('views', 'components'))
|
89
|
+
template_file('component_header.erb', "#{underscored_name}_header.erb",
|
90
|
+
dir('views', 'components'))
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_action_files
|
94
|
+
template_file('action.rb', "#{underscored_name}_action.rb",
|
95
|
+
lib_dir('components', 'actions'),
|
96
|
+
named_dir('components', 'actions'))
|
97
|
+
template_file('dsl.rb', "#{underscored_name}_dsl.rb",
|
98
|
+
lib_dir('components', 'actions'),
|
99
|
+
named_dir('components', 'actions'))
|
100
|
+
template_file('data.rb', "#{underscored_name}_data.rb",
|
101
|
+
lib_dir('web_client', 'components', 'actions'),
|
102
|
+
named_dir('web_client', 'components', 'actions'))
|
103
|
+
template_file('action.js', "#{underscored_name}.js",
|
104
|
+
dir('views', 'assets', 'js', 'components', 'actions'))
|
105
|
+
end
|
106
|
+
|
107
|
+
def create_helper_files
|
108
|
+
template_file('helper.rb', "#{underscored_name}_helper.rb",
|
109
|
+
lib_dir('helpers'),
|
110
|
+
named_dir('helpers'))
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) <%= Time.new.year %> <%=`git config user.name`.strip%> (<%= `git config user.email`.strip %>)
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
@@ -0,0 +1,253 @@
|
|
1
|
+
# Presenter Plugins
|
2
|
+
|
3
|
+
Presenter plugins allows extension and modification of the DSL and WebClient.
|
4
|
+
It is powerfully designed for adding additional components to the system, or to change the behavior/look feel/capabilities of existing components.
|
5
|
+
|
6
|
+
## Global Plugins
|
7
|
+
|
8
|
+
Presenters have global plugins that are configured in the system. They are declared as a setting like so:
|
9
|
+
|
10
|
+
Voom::Presenters::Settings.configure do |config|
|
11
|
+
config.presenters.plugins.push(:foo)
|
12
|
+
end
|
13
|
+
|
14
|
+
A global plugin is available to all presenters.
|
15
|
+
|
16
|
+
## Local Plugins
|
17
|
+
|
18
|
+
A presenters can define that it uses a plugin like so:
|
19
|
+
|
20
|
+
Voom::Presenters.define(:index, namespace: :plugins) do
|
21
|
+
plugin :foo
|
22
|
+
end
|
23
|
+
|
24
|
+
A local plugin is available only to the presenter that it is defined in.
|
25
|
+
|
26
|
+
|
27
|
+
## Creating Plugins
|
28
|
+
|
29
|
+
The skeleton for a plugin starts with an empty module in a file stored in `voom/presenters/plugins` somewhere in ruby's load path
|
30
|
+
(typically in a gemfile or in the lib directory of an framework app, like Rails):
|
31
|
+
|
32
|
+
module Voom
|
33
|
+
module Presenters
|
34
|
+
module Plugins
|
35
|
+
module Foo
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
## Extending the presenter DSL and POM
|
42
|
+
|
43
|
+
### Components
|
44
|
+
If you want to add additional components to the presenters DSL, provide a `DSLComponents` module under the plugin module:
|
45
|
+
|
46
|
+
module DSLComponents
|
47
|
+
def foo(random_fact, **attributes, &block)
|
48
|
+
self << Foo::Component.new(random_fact, parent: self, **attributes, &block)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
The above example will extend the dsl by adding the foo method that will add the Foo component to the
|
53
|
+
presenter object model tree.
|
54
|
+
|
55
|
+
A presenter component derives from `DSL::Components::Base` or if it needs to handle events `DSL::Components::EventBase`
|
56
|
+
|
57
|
+
require 'voom/presenters/dsl/components/base'
|
58
|
+
|
59
|
+
module Voom
|
60
|
+
module Presenters
|
61
|
+
module Plugins
|
62
|
+
module Foo
|
63
|
+
class Component < DSL::Components::Base
|
64
|
+
def initialize(**attribs_, &block)
|
65
|
+
super(type: :foo, **attribs_, &block)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
### Helpers
|
74
|
+
|
75
|
+
To add helpers to the POM define the module `DSLHelpers`
|
76
|
+
|
77
|
+
module DSLHelpers
|
78
|
+
def random_fact
|
79
|
+
"http://en.wikipedia.org/wiki/Special:Randompage"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
### Event Actions
|
84
|
+
A plugin can extend the set of event actions that are available.
|
85
|
+
When an event fires in the client, like mouse click, a set of actions are executed. A plugin can provide custom
|
86
|
+
actions. This examnple adds a actionJs actionJs that can be bound to an event.
|
87
|
+
|
88
|
+
module DSLEventActions
|
89
|
+
def actionJs(text, **attributes, &block)
|
90
|
+
self << Foo::Action.new(text: text, parent: self, **attributes, &block)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
Example actionJs class:
|
95
|
+
|
96
|
+
require 'voom/presenters/dsl/components/actions/base'
|
97
|
+
|
98
|
+
module Voom
|
99
|
+
module Presenters
|
100
|
+
module Plugins
|
101
|
+
module Foo
|
102
|
+
class Action < DSL::Components::Actions::Base
|
103
|
+
def initialize(**attribs_, &block)
|
104
|
+
super(type: :actionJs, **attribs_, &block)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
## Adding a WebClient implementation
|
114
|
+
|
115
|
+
A plugin that extends the DSL will give you a new custom POM (Presenter Object Model), but that alone won't get you very far.
|
116
|
+
The POM describes the user interface, a client must implement each of the components.
|
117
|
+
For the WebClient this means adding a template with HTML, CSS and Javascript.
|
118
|
+
|
119
|
+
### Component Templates
|
120
|
+
|
121
|
+
To render your component you need to add the following to your plugin:
|
122
|
+
|
123
|
+
module WebClientComponents
|
124
|
+
def render_foo(comp,
|
125
|
+
render:,
|
126
|
+
components:,
|
127
|
+
index:)
|
128
|
+
view_dir = File.join(__dir__, 'foo')
|
129
|
+
render.call :erb, :foo, views: view_dir,
|
130
|
+
locals: {comp: comp,
|
131
|
+
components: components, index: index}
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
From you ERB you can call any of the other built in WebClient erb's. You can even replace built in component templates.
|
136
|
+
The render object supports all the template types supported by Tilt/Sinatra (http://sinatrarb.com/intro.html)
|
137
|
+
|
138
|
+
Example template:
|
139
|
+
|
140
|
+
<iframe id="random_fact" src="<%= comp.random_fact %>" height=512 <%= erb :"components/event", :locals => {comp: comp, events: comp.events, parent_id: comp.id} %>></iframe>
|
141
|
+
|
142
|
+
|
143
|
+
### Event Action Data
|
144
|
+
|
145
|
+
An actionJs from the Presenter Object Model (POM) is sent to a ruby method during template expansion.
|
146
|
+
You are able to then setup any data that you want passed to your actionJs javascript method.
|
147
|
+
It expects you will return an array with a type that matches your event actionJs presenter type. The rest is up to you.
|
148
|
+
|
149
|
+
|
150
|
+
module WebClientActions
|
151
|
+
def action_data_bar(actionJs, _parent_id, *)
|
152
|
+
# Type, URL, Options, Params (passed into javascript event/actionJs classes)
|
153
|
+
[actionJs.type, actionJs.url, actionJs.options.to_h, actionJs.attributes.to_h]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
Example Javascript method (typically rendered by a template triggered by the render_foo method above):
|
158
|
+
|
159
|
+
<script>
|
160
|
+
function actionJs(_options, params, _event) {
|
161
|
+
// Reload iFrame: https://stackoverflow.com/questions/86428/what-s-the-best-way-to-reload-refresh-an-iframe
|
162
|
+
document.getElementById('random_fact').src += '';
|
163
|
+
return {actionJs: 'actionJs', content: {data: params.text}, statusCode: 200};
|
164
|
+
}
|
165
|
+
</script>
|
166
|
+
|
167
|
+
Event actionJs WebClient methods must return a Javascript Object with the properties `actionJs`, `content` and `statusCode`.
|
168
|
+
|
169
|
+
|
170
|
+
## WebClient Javascript Interface
|
171
|
+
|
172
|
+
When developing a plugin for the WebClient you may want to have your data submitted as part of another component container.
|
173
|
+
The most familiar example is a Form. This requires that you bind your component to the DOM with a few methods.
|
174
|
+
Not all plugins need to do this.
|
175
|
+
It is only needed in the case of those components that add their data to an http post.
|
176
|
+
|
177
|
+
The following components are Containers that will collect data from nested DOM elements using this lifecycle protocol.
|
178
|
+
cards.js
|
179
|
+
content.js
|
180
|
+
dialogs.js
|
181
|
+
file-inputs.js
|
182
|
+
forms.js
|
183
|
+
grid.js
|
184
|
+
steppers.js
|
185
|
+
|
186
|
+
Lifecycle Protocol:
|
187
|
+
|
188
|
+
We call it it a protocol, because it defines a small number of DOM relationships to participate as an integrated component.
|
189
|
+
Many frameworks require a common base class, this approach is very light by design.
|
190
|
+
|
191
|
+
Container data in the WebClient is collected and submitted using the following sequence:
|
192
|
+
|
193
|
+
In your element markup include the `v-input` class on an DOM element.
|
194
|
+
|
195
|
+
You can see the container calling code here:
|
196
|
+
https://github.com/rx/presenters/blob/master/views/mdc/assets/js/components/base-container.js
|
197
|
+
|
198
|
+
If you add the v-plugin class to the DOM element along with a data-plugin-callback dataset that contains a string
|
199
|
+
with the class name to proxy the plugin events to.
|
200
|
+
|
201
|
+
|
202
|
+
Sample callback class:
|
203
|
+
|
204
|
+
// Optional Javascript callback class. You typically need to define this when you have data to submit, or special
|
205
|
+
// event handling to bind to.
|
206
|
+
// To hook this up you need to provide the `v-plugin` class and
|
207
|
+
// data-plugin-callback='RandomFacts' on the element.
|
208
|
+
class RandomFacts {
|
209
|
+
// passed the DOM element that has the .v-plugin class on it.
|
210
|
+
constructor(element) {
|
211
|
+
}
|
212
|
+
|
213
|
+
// optional.
|
214
|
+
// Called before the component is submitted via post/put. Allows the component to add its key/value pairs to the
|
215
|
+
// submitted data.
|
216
|
+
// If you provide this you need to add the v-input class to your DOM element to get called.
|
217
|
+
// Containers iterate their elements that have the v-input class defined on them and invoke the prepareSubmit
|
218
|
+
// function for each.
|
219
|
+
prepareSubmit(params) {
|
220
|
+
// params is a key,value pair. Add name/value like so:
|
221
|
+
// params.push(['some_name', 'some_value']);
|
222
|
+
}
|
223
|
+
|
224
|
+
// optional.
|
225
|
+
// Called whenever a container is about to be submitted, before prepareSubmit.
|
226
|
+
// returns true on success
|
227
|
+
// returns on failure return an error object that can be processed by VErrors:
|
228
|
+
// { email: ["email must be filled", "email must be from your domain"] }
|
229
|
+
// { page: ["must be filled"] }
|
230
|
+
// Returning an error stops the submission.
|
231
|
+
validate(formData) {
|
232
|
+
return true;
|
233
|
+
}
|
234
|
+
|
235
|
+
// optional.
|
236
|
+
// Clear's the control
|
237
|
+
clear() {
|
238
|
+
}
|
239
|
+
|
240
|
+
// called to add an event listener to the component
|
241
|
+
// this only needs to be defined if you need the event handler to be bound to the component
|
242
|
+
// in a different manner. Here is the default implementation you get if you don't define this method:
|
243
|
+
initEventListener(eventName, eventHandler) {
|
244
|
+
if (typeof this.eventsHandler === 'undefined') {
|
245
|
+
this.eventsHandler = {};
|
246
|
+
}
|
247
|
+
if (!this.eventsHandler[eventName]) {
|
248
|
+
// Delegate to the component if possible
|
249
|
+
this.eventsHandler[eventName] = eventHandler;
|
250
|
+
this.element.addEventListener(eventName, eventHandler);
|
251
|
+
}
|
252
|
+
}
|
253
|
+
}
|