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,16 @@
|
|
1
|
+
require 'voom/presenters/dsl/components/actions/base'
|
2
|
+
|
3
|
+
|
4
|
+
module Voom
|
5
|
+
module Presenters
|
6
|
+
module Plugins
|
7
|
+
module <%= classify(name) %>
|
8
|
+
class <%= classify(name) %>Action < DSL::Components::Actions::Base
|
9
|
+
def initialize(**attribs_, &block)
|
10
|
+
super(type: :<%= underscore(name) %>_action, **attribs_, &block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative '<%= classify(name) %>_action'
|
2
|
+
|
3
|
+
module Voom
|
4
|
+
module Presenters
|
5
|
+
module Plugins
|
6
|
+
module <%= classify(name) %>
|
7
|
+
# Event Actions are methods that appear inside an event block.
|
8
|
+
# They do something on the (web) client and require code written for the client.
|
9
|
+
# Name this actionJs method whatever you want
|
10
|
+
# The data for this actionJs is rendered into the DOM using the file:
|
11
|
+
# web_client/components/actions/<%= classify(name) %>_data.rb
|
12
|
+
# The javascript that performs the actionJs is defined in the file:
|
13
|
+
# views/js/components/actions/<%= classify(name) %>_action.js
|
14
|
+
module DSLEventActions
|
15
|
+
def <%= underscore(name) %>_action(text, **attributes, &block)
|
16
|
+
self << <%= classify(name) %>::<%= classify(name) %>Action.new(text: text, parent: self, **attributes, &block)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'voom/presenters/dsl/components/event_base'
|
2
|
+
|
3
|
+
module Voom
|
4
|
+
module Presenters
|
5
|
+
module Plugins
|
6
|
+
module <%= classify(name) %>
|
7
|
+
class <%= classify(name) %>Component < DSL::Components::EventBase
|
8
|
+
attr_reader :random_fact
|
9
|
+
def initialize(random_fact, **attribs_, &block)
|
10
|
+
@random_fact = random_fact
|
11
|
+
super(type: :<%= underscore(name) %>, **attribs_, &block)
|
12
|
+
expand!
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative '<%= underscore(name) %>_component'
|
2
|
+
|
3
|
+
module Voom
|
4
|
+
module Presenters
|
5
|
+
module Plugins
|
6
|
+
module <%= classify(name) %>
|
7
|
+
# Components add new methods to the POM component hierarchy. They should add a component object to the
|
8
|
+
# POM component stream. These components are the declarative instructions that are used to render a client.
|
9
|
+
# POM components require corresponding views templates and JS that render them.
|
10
|
+
# Name this method whatever you want.
|
11
|
+
module DSLComponents
|
12
|
+
def <%= underscore(name) %>(random_fact, **attributes, &block)
|
13
|
+
self << <%= classify(name) %>::<%= classify(name) %>Component.new(random_fact, parent: self, **attributes, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Voom
|
2
|
+
module Presenters
|
3
|
+
module Plugins
|
4
|
+
module <%= classify(name) %>
|
5
|
+
# Helpers are added to all POM in the system automatically when the plugin is included on the POM or globally.
|
6
|
+
module DSLHelpers
|
7
|
+
# Add your methods here
|
8
|
+
def random_fact
|
9
|
+
"http://en.wikipedia.org/wiki/Special:Randompage"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# Loads the plugin features
|
2
|
+
# Helpers
|
3
|
+
require_relative '<%= underscore(name) %>/helpers/<%= underscore(name) %>_helper'
|
4
|
+
# Components
|
5
|
+
require_relative '<%= underscore(name) %>/components/<%= underscore(name) %>_dsl'
|
6
|
+
require_relative '<%= underscore(name) %>/web_client/components/<%= underscore(name) %>_render'
|
7
|
+
# Actions
|
8
|
+
require_relative '<%= underscore(name) %>/components/actions/<%= underscore(name) %>_dsl'
|
9
|
+
require_relative '<%= underscore(name) %>/web_client/components/actions/<%= underscore(name) %>_data'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Voom
|
2
|
+
module Presenters
|
3
|
+
module Plugins
|
4
|
+
module <%= classify(name) %>
|
5
|
+
# Web Client Actions set up the the event handler data that will be consumed by a javascript class
|
6
|
+
# This data will be stored on the DOM as a data attribute defined in the
|
7
|
+
# file: views/components/assets/<%= underscore(name) %>.erb
|
8
|
+
module WebClientActions
|
9
|
+
def action_data_<%= underscore(name) %>_action(action, _parent_id, *)
|
10
|
+
# Type, URL, Options, Params (passed into javascript event/action classes)
|
11
|
+
[action.type, action.url, action.options.to_h, action.attributes.to_h]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Voom
|
2
|
+
module Presenters
|
3
|
+
module Plugins
|
4
|
+
module <%= classify(name) %>
|
5
|
+
module WebClientComponents
|
6
|
+
def render_<%= underscore(name) %>(comp,render:, components:, index:)
|
7
|
+
view_dir = File.join(__dir__, '../../../../../../..', 'views', 'components')
|
8
|
+
render.call :erb, :<%= underscore(name) %>, views: view_dir,
|
9
|
+
locals: {comp: comp,
|
10
|
+
components: components, index: index}
|
11
|
+
end
|
12
|
+
# The string returned from this method will be added to the HTML header section of the page layout
|
13
|
+
# It will be called once for the page.
|
14
|
+
# The pom is passed along with the sinatra render method.
|
15
|
+
def render_header_<%= underscore(name) %>(_pom, render:)
|
16
|
+
view_dir = File.join(__dir__, '../../../../../../..', 'views', 'components')
|
17
|
+
render.call :erb, :<%= underscore(name) %>_header, views: view_dir
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "<%= name %>_presenter_plugin"
|
6
|
+
spec.version = '0.0.1'
|
7
|
+
spec.authors = ["<%= `git config user.name`.strip %>"]
|
8
|
+
spec.email = ["<%= `git config user.email`.strip %>"]
|
9
|
+
|
10
|
+
spec.summary = %q{<%= name %> presenter plugin.}
|
11
|
+
spec.homepage = 'http://github.com/<%= `git config user.name`.strip %>/<%= name %>_presenters_plugin'
|
12
|
+
spec.license = "MIT"
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
15
|
+
f.match(%r{^(test|spec|features)/})
|
16
|
+
end
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
20
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
+
end
|
data/lib/voom/presenters/generators/templates/plugin/views/assets/css/components/component.css.tt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
/* Custom CSS for this component - defines a fade in animation*/
|
2
|
+
#random_fact {
|
3
|
+
opacity: 0;
|
4
|
+
}
|
5
|
+
|
6
|
+
#random_fact.load {
|
7
|
+
opacity: 1;
|
8
|
+
animation-name: fadeInOpacity;
|
9
|
+
animation-iteration-count: 1;
|
10
|
+
animation-timing-function: ease-in;
|
11
|
+
animation-duration: 2s;
|
12
|
+
}
|
13
|
+
|
14
|
+
@keyframes fadeInOpacity {
|
15
|
+
0% {
|
16
|
+
opacity: 0;
|
17
|
+
}
|
18
|
+
100% {
|
19
|
+
opacity: 1;
|
20
|
+
}
|
21
|
+
}
|
data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/actions/action.js.tt
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
// This event callback pushes its results into the results array and returns a promise.
|
2
|
+
function <%=underscore(name)%>_action(_options, params, _event, results) {
|
3
|
+
var promiseObj = new Promise(function(resolve) {
|
4
|
+
console.log('<%= classify(name) %> called');
|
5
|
+
// Reload iFrame: https://stackoverflow.com/questions/86428/what-s-the-best-way-to-reload-refresh-an-iframe
|
6
|
+
document.getElementById('random_fact').src += '';
|
7
|
+
results.push({
|
8
|
+
action: 'action',
|
9
|
+
content: JSON.stringify({data: params.text}),
|
10
|
+
statusCode: 200,
|
11
|
+
});
|
12
|
+
resolve(results);
|
13
|
+
});
|
14
|
+
return promiseObj;
|
15
|
+
}
|
data/lib/voom/presenters/generators/templates/plugin/views/assets/js/components/component.js.tt
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
// Optional Javascript callback class. You typically need to define this when you have data to submit, or special
|
2
|
+
// event handling to bind to.
|
3
|
+
// To hook this up you need to provide the `v-plugin` class and
|
4
|
+
// data-plugin-callback='RandomFacts' on the element.
|
5
|
+
class RandomFacts {
|
6
|
+
// passed the DOM element that has the .v-plugin class on it.
|
7
|
+
constructor(element) {
|
8
|
+
// This is where you might pull data elements into your
|
9
|
+
// component from the markup. Like so:
|
10
|
+
// this.data = element.dataset.someDataICareAbout;
|
11
|
+
}
|
12
|
+
|
13
|
+
// Optional
|
14
|
+
// Called before the component is submitted via post/put. Allows the component to add its key/value pairs to the
|
15
|
+
// submitted data.
|
16
|
+
// If you provide this you need to add the v-input class to your DOM element to get called.
|
17
|
+
// Containers iterate their elements that have the v-input class defined on them and invoke the prepareSubmit
|
18
|
+
// function for each.
|
19
|
+
prepareSubmit(params) {
|
20
|
+
// params is a key,value pair. Add name/value like so:
|
21
|
+
// params.push(['some_name', 'some_value']);
|
22
|
+
}
|
23
|
+
|
24
|
+
// Optional
|
25
|
+
// Called whenever a container is about to be submitted, before prepareSubmit.
|
26
|
+
// returns true on success
|
27
|
+
// returns on failure return an error object that can be processed by VErrors:
|
28
|
+
// { email: ["email must be filled", "email must be from your domain"] }
|
29
|
+
// { page: ["must be filled"] }
|
30
|
+
// Returning an error stops the submission.
|
31
|
+
validate(formData) {
|
32
|
+
return true;
|
33
|
+
}
|
34
|
+
|
35
|
+
// Optional
|
36
|
+
// Clear's the control
|
37
|
+
clear() {
|
38
|
+
}
|
39
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!--Custom markup.
|
2
|
+
If the plugin defines a component then it should set v-plugin and data-plugin-callback to the class of the component
|
3
|
+
|
4
|
+
If the plugin posts data then it should define the v-input class.
|
5
|
+
That will cause its validate and prepareSubmit methods in the component to be called
|
6
|
+
|
7
|
+
If the plugin has events it publishes then the erb :"components/event" needs to be invoked to
|
8
|
+
hookup the event handling markup
|
9
|
+
|
10
|
+
Any additional data you want to pass to your component javascript should be setup here as data attributes.
|
11
|
+
-->
|
12
|
+
<iframe id="random_fact" class='v-plugin v-input' data-plugin-callback='RandomFacts'
|
13
|
+
src="<%%= comp.random_fact %>" height=512
|
14
|
+
<%%= erb :"components/event", :locals => {comp: comp, events: comp.events, parent_id: comp.id} %>></iframe>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<style>
|
2
|
+
<%%= File.read(File.expand_path('../assets/css/components/<%= underscore(name) %>.css', __dir__) ) %>
|
3
|
+
</style>
|
4
|
+
|
5
|
+
<script>
|
6
|
+
// This file is defining the callback method that will be invoked when the custom plugin actionJs `actionJs` is encountered
|
7
|
+
<%%= File.read(File.expand_path('../assets/js/components/actions/<%= underscore(name) %>.js', __dir__) ) %>
|
8
|
+
// This file is defining the plugin component that will be delegated to by the WebClient.
|
9
|
+
<%%= File.read(File.expand_path('../assets/js/components/<%= underscore(name) %>.js', __dir__) ) %>
|
10
|
+
|
11
|
+
// Custom javascript specific to this sample plugin - sets the class name that causes the initial load to
|
12
|
+
// animate a transition (defined in the component.css.tt file)
|
13
|
+
function load() {
|
14
|
+
document.getElementById('random_fact').className = ' load';
|
15
|
+
}
|
16
|
+
|
17
|
+
window.onload = load;
|
18
|
+
</script>
|
19
|
+
|
20
|
+
|
@@ -1,16 +1,10 @@
|
|
1
|
-
require_relative 'helpers/date'
|
2
|
-
require_relative 'helpers/time'
|
3
|
-
require_relative 'helpers/inflector'
|
4
|
-
require_relative 'helpers/errors'
|
5
|
-
|
6
1
|
module Voom
|
7
2
|
module Presenters
|
8
3
|
module Helpers
|
9
4
|
include Helpers::Time
|
10
5
|
include Helpers::Date
|
11
|
-
include Helpers::
|
12
|
-
if defined?(Rails)
|
13
|
-
require_relative 'helpers/rails'
|
6
|
+
include Helpers::Redact
|
7
|
+
if defined?(::Rails)
|
14
8
|
include Voom::Presenters::Helpers::Rails
|
15
9
|
end
|
16
10
|
end
|
@@ -2,10 +2,10 @@ module Voom
|
|
2
2
|
module Presenters
|
3
3
|
module Helpers
|
4
4
|
module Date
|
5
|
-
LONG_FORMAT='%
|
6
|
-
SHORT_FORMAT='%
|
5
|
+
LONG_FORMAT='%B %e, %Y'
|
6
|
+
SHORT_FORMAT='%e %b'
|
7
7
|
|
8
|
-
def format_date(date, format:
|
8
|
+
def format_date(date, format: LONG_FORMAT)
|
9
9
|
date ? date.strftime(format) : ''
|
10
10
|
end
|
11
11
|
|
@@ -1,7 +1,4 @@
|
|
1
1
|
if defined?(Rails)
|
2
|
-
require_relative 'rails/currency'
|
3
|
-
require_relative 'rails/model_table'
|
4
|
-
|
5
2
|
module Voom
|
6
3
|
module Presenters
|
7
4
|
module Helpers
|
@@ -9,12 +6,19 @@ if defined?(Rails)
|
|
9
6
|
include ActionView::Helpers::AssetUrlHelper
|
10
7
|
include Voom::Presenters::Helpers::Rails::Currency
|
11
8
|
include Voom::Presenters::Helpers::Rails::ModelTable
|
9
|
+
include Namespace
|
10
|
+
|
12
11
|
def default_url_options
|
13
12
|
{}
|
14
13
|
end
|
15
14
|
|
16
|
-
def presenters_path(presenter, **params)
|
17
|
-
|
15
|
+
def presenters_path(presenter, host: false, **params)
|
16
|
+
presenter = _expand_namespace_(presenter, namespace)
|
17
|
+
presenter = presenter.gsub(':', '/')
|
18
|
+
|
19
|
+
path = host ? voom_presenters_web_client_app_url(params, host: router.base_url) :
|
20
|
+
voom_presenters_web_client_app_path(params)
|
21
|
+
|
18
22
|
if path.include?('?')
|
19
23
|
path = path.sub('?', "#{presenter}?")
|
20
24
|
else
|
@@ -24,8 +28,16 @@ if defined?(Rails)
|
|
24
28
|
end
|
25
29
|
path
|
26
30
|
end
|
31
|
+
|
32
|
+
alias presenter_path presenters_path
|
33
|
+
|
34
|
+
def presenters_url(presenter, host: true, **params)
|
35
|
+
presenters_path(presenter, host: host, **params)
|
36
|
+
end
|
37
|
+
|
38
|
+
alias presenter_url presenters_url
|
27
39
|
end
|
28
40
|
end
|
29
41
|
end
|
30
42
|
end
|
31
|
-
end
|
43
|
+
end
|
@@ -5,8 +5,9 @@ module Voom
|
|
5
5
|
module ModelTable
|
6
6
|
# Build a a table from a Rails model
|
7
7
|
def table_for(query_,
|
8
|
-
empty_icon:
|
8
|
+
empty_icon: 'far fa-folder-open fa-rotate-180',
|
9
9
|
except: [:id, :created_at, :updated_at],
|
10
|
+
timezone: nil, # The timezone to covnert _at and _on values
|
10
11
|
selectable: false, &block)
|
11
12
|
row1 = query_.first
|
12
13
|
if row1
|
@@ -16,27 +17,34 @@ module Voom
|
|
16
17
|
|
17
18
|
query_.each do |item_|
|
18
19
|
row do
|
19
|
-
_table_row_(__columns__, block, except, item_)
|
20
|
+
_table_row_(__columns__, block, except, item_, timezone: timezone)
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
23
24
|
else
|
24
|
-
|
25
|
-
|
25
|
+
icon empty_icon, size: '6rem' if empty_icon
|
26
|
+
body "You have no #{query_.arel_table.name.pluralize.humanize}"
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
30
|
|
30
31
|
private
|
31
|
-
def _table_row_(__columns__, block, except, item_)
|
32
|
+
def _table_row_(__columns__, block, except, item_, timezone: nil)
|
32
33
|
__columns__.each do |col|
|
33
34
|
next if except.include?(col.name.to_sym)
|
34
|
-
|
35
|
+
value = format_value(col.name,item_.send(col.name.to_sym), timezone: timezone)
|
36
|
+
column value do
|
35
37
|
self.instance_exec(item_, col.name.to_sym, &block) if block
|
36
38
|
end
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
42
|
+
def format_value(col_name, value, timezone:)
|
43
|
+
return format_time_long(value, timezone: timezone) if timezone &&
|
44
|
+
col_name.ends_with?('_at') || col_name.ends_with?('_on')
|
45
|
+
value
|
46
|
+
end
|
47
|
+
|
40
48
|
def _table_header_(__columns__, except)
|
41
49
|
header do
|
42
50
|
__columns__.each do |col|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Voom
|
2
|
+
module Presenters
|
3
|
+
module Helpers
|
4
|
+
module Redact
|
5
|
+
# https://material.io/guidelines/patterns/data-formats.html#data-formats-data-redaction-truncation
|
6
|
+
def redact(string, last_chars = 4)
|
7
|
+
return "" unless string
|
8
|
+
"• • • #{string.split(//).last(last_chars).join}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|