wallaby 5.0.1 → 5.1.3
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/Rakefile +1 -3
- data/app/assets/images/wallaby/404.png +0 -0
- data/app/assets/images/wallaby/422.png +0 -0
- data/app/assets/images/wallaby/500.png +0 -0
- data/app/assets/javascripts/wallaby/application.js +1 -15
- data/app/assets/javascripts/wallaby/auto_select.js +77 -0
- data/app/assets/javascripts/wallaby/base.js +17 -0
- data/app/assets/javascripts/wallaby/setup.js.erb +60 -0
- data/app/assets/stylesheets/wallaby/application.scss +1 -51
- data/app/assets/stylesheets/wallaby/base/_layout.scss +257 -9
- data/app/assets/stylesheets/wallaby/base/_layout_desktop.scss +53 -0
- data/app/assets/stylesheets/wallaby/base/_mixins.scss +119 -0
- data/app/assets/stylesheets/wallaby/base/_override.scss +10 -0
- data/app/assets/stylesheets/wallaby/base/_vars.scss +72 -2
- data/app/assets/stylesheets/wallaby/base.scss +27 -0
- data/app/assets/stylesheets/wallaby/components/_auto_select.scss +119 -0
- data/app/assets/stylesheets/wallaby/components/_auto_select_desktop.scss +7 -0
- data/app/assets/stylesheets/wallaby/components/_color_square.scss +8 -0
- data/app/assets/stylesheets/wallaby/components/_filters.scss +14 -0
- data/app/assets/stylesheets/wallaby/components/_links.scss +25 -0
- data/app/assets/stylesheets/wallaby/components/_pagination.scss +35 -91
- data/app/assets/stylesheets/wallaby/components/_query.scss +101 -0
- data/app/assets/stylesheets/wallaby/components/_text.scss +6 -6
- data/app/assets/stylesheets/wallaby/pages/_error.scss +108 -0
- data/app/assets/stylesheets/wallaby/pages/_form.scss +40 -0
- data/app/assets/stylesheets/wallaby/pages/_index.scss +193 -0
- data/app/assets/stylesheets/wallaby/pages/_index_desktop.scss +22 -0
- data/app/assets/stylesheets/wallaby/pages/_show.scss +21 -0
- data/app/controllers/wallaby/abstract_resources_controller.rb +334 -0
- data/app/controllers/wallaby/application_controller.rb +45 -15
- data/app/controllers/wallaby/base_controller.rb +30 -0
- data/app/controllers/wallaby/resources_controller.rb +2 -131
- data/app/controllers/wallaby/secure_controller.rb +38 -24
- data/app/routes/wallaby/resources_router.rb +40 -43
- data/app/security/ability.rb +4 -28
- data/app/views/layouts/wallaby/application.html.erb +11 -6
- data/app/views/layouts/wallaby/error.html.erb +26 -4
- data/app/views/wallaby/error.html.erb +11 -0
- data/app/views/wallaby/error.json.jbuilder +8 -0
- data/app/views/wallaby/{shared → resources}/_flash_messages.html.erb +0 -0
- data/app/views/wallaby/resources/_footer.html.erb +1 -0
- data/app/views/wallaby/resources/_form.html.erb +2 -2
- data/app/views/wallaby/resources/_header.html.erb +38 -0
- data/app/views/wallaby/resources/_imodal.html.erb +13 -0
- data/app/views/wallaby/resources/_index_actions.html.erb +4 -1
- data/app/views/wallaby/resources/_index_filters.html.erb +23 -0
- data/app/views/wallaby/resources/_index_pagination.html.erb +63 -0
- data/app/views/wallaby/resources/_index_query.html.erb +23 -0
- data/app/views/wallaby/resources/_logo.html.erb +1 -0
- data/app/views/wallaby/resources/_navs.html.erb +9 -0
- data/app/views/wallaby/resources/_resource_actions.html.erb +3 -3
- data/app/views/wallaby/resources/{shared/_resource_nav.html.erb → _resource_navs.html.erb} +6 -6
- data/app/views/wallaby/resources/_title.html.erb +1 -0
- data/app/views/wallaby/resources/_user_menu.html.erb +5 -0
- data/app/views/wallaby/resources/bad_request.json.jbuilder +7 -0
- data/app/views/wallaby/resources/edit.html.erb +16 -12
- data/app/views/wallaby/resources/form/_belongs_to.html.erb +63 -12
- data/app/views/wallaby/resources/form/_bigint.html.erb +10 -1
- data/app/views/wallaby/resources/form/_bigserial.html.erb +18 -0
- data/app/views/wallaby/resources/form/_binary.html.erb +11 -2
- data/app/views/wallaby/resources/form/_bit.html.erb +10 -1
- data/app/views/wallaby/resources/form/_bit_varying.html.erb +10 -1
- data/app/views/wallaby/resources/form/_blob.html.erb +21 -0
- data/app/views/wallaby/resources/form/_boolean.html.erb +9 -0
- data/app/views/wallaby/resources/form/_box.html.erb +21 -0
- data/app/views/wallaby/resources/form/_cidr.html.erb +13 -1
- data/app/views/wallaby/resources/form/_circle.html.erb +21 -0
- data/app/views/wallaby/resources/form/_citext.html.erb +11 -2
- data/app/views/wallaby/resources/form/_color.html.erb +11 -2
- data/app/views/wallaby/resources/form/_date.html.erb +12 -3
- data/app/views/wallaby/resources/form/_daterange.html.erb +14 -5
- data/app/views/wallaby/resources/form/_datetime.html.erb +12 -3
- data/app/views/wallaby/resources/form/_decimal.html.erb +10 -1
- data/app/views/wallaby/resources/form/_dropdown.html.erb +18 -0
- data/app/views/wallaby/resources/form/_email.html.erb +9 -0
- data/app/views/wallaby/resources/form/_file.html.erb +21 -0
- data/app/views/wallaby/resources/form/_float.html.erb +10 -1
- data/app/views/wallaby/resources/form/_has_and_belongs_to_many.html.erb +53 -7
- data/app/views/wallaby/resources/form/_has_many.html.erb +52 -7
- data/app/views/wallaby/resources/form/_has_one.html.erb +10 -2
- data/app/views/wallaby/resources/form/_hstore.html.erb +12 -5
- data/app/views/wallaby/resources/form/_inet.html.erb +13 -1
- data/app/views/wallaby/resources/form/_int4range.html.erb +11 -2
- data/app/views/wallaby/resources/form/_int8range.html.erb +11 -2
- data/app/views/wallaby/resources/form/_integer.html.erb +10 -1
- data/app/views/wallaby/resources/form/_json.html.erb +13 -6
- data/app/views/wallaby/resources/form/_jsonb.html.erb +13 -6
- data/app/views/wallaby/resources/form/_line.html.erb +21 -0
- data/app/views/wallaby/resources/form/_longblob.html.erb +21 -0
- data/app/views/wallaby/resources/form/_longtext.html.erb +30 -0
- data/app/views/wallaby/resources/form/_lseg.html.erb +21 -0
- data/app/views/wallaby/resources/form/_ltree.html.erb +17 -1
- data/app/views/wallaby/resources/form/_macaddr.html.erb +13 -1
- data/app/views/wallaby/resources/form/_markdown.html.erb +29 -0
- data/app/views/wallaby/resources/form/_mediumblob.html.erb +21 -0
- data/app/views/wallaby/resources/form/_mediumtext.html.erb +30 -0
- data/app/views/wallaby/resources/form/_money.html.erb +10 -1
- data/app/views/wallaby/resources/form/_numrange.html.erb +11 -2
- data/app/views/wallaby/resources/form/_password.html.erb +14 -1
- data/app/views/wallaby/resources/form/_path.html.erb +17 -0
- data/app/views/wallaby/resources/form/_point.html.erb +11 -2
- data/app/views/wallaby/resources/form/_polygon.html.erb +17 -0
- data/app/views/wallaby/resources/form/_serial.html.erb +18 -0
- data/app/views/wallaby/resources/form/_sti.html.erb +18 -0
- data/app/views/wallaby/resources/form/_string.html.erb +14 -1
- data/app/views/wallaby/resources/form/_text.html.erb +11 -2
- data/app/views/wallaby/resources/form/_time.html.erb +12 -3
- data/app/views/wallaby/resources/form/_tinyblob.html.erb +21 -0
- data/app/views/wallaby/resources/form/_tinytext.html.erb +30 -0
- data/app/views/wallaby/resources/form/_tsrange.html.erb +14 -5
- data/app/views/wallaby/resources/form/_tstzrange.html.erb +14 -5
- data/app/views/wallaby/resources/form/_tsvector.html.erb +9 -0
- data/app/views/wallaby/resources/form/_unsigned_bigint.html.erb +18 -0
- data/app/views/wallaby/resources/form/_unsigned_decimal.html.erb +18 -0
- data/app/views/wallaby/resources/form/_unsigned_float.html.erb +18 -0
- data/app/views/wallaby/resources/form/_unsigned_integer.html.erb +18 -0
- data/app/views/wallaby/resources/form/_uuid.html.erb +10 -1
- data/app/views/wallaby/resources/form/_xml.html.erb +11 -5
- data/app/views/wallaby/resources/form.json.jbuilder +5 -0
- data/app/views/wallaby/{core → resources}/home.html.erb +1 -1
- data/app/views/wallaby/resources/index/_belongs_to.html.erb +5 -1
- data/app/views/wallaby/resources/index/_bigint.html.erb +4 -0
- data/app/views/wallaby/resources/index/_bigserial.html.erb +5 -0
- data/app/views/wallaby/resources/index/_binary.html.erb +5 -1
- data/app/views/wallaby/resources/index/_bit.html.erb +4 -0
- data/app/views/wallaby/resources/index/_bit_varying.html.erb +4 -0
- data/app/views/wallaby/resources/index/_blob.html.erb +5 -0
- data/app/views/wallaby/resources/index/_boolean.html.erb +5 -1
- data/app/views/wallaby/resources/index/_box.html.erb +16 -0
- data/app/views/wallaby/resources/index/_cidr.html.erb +5 -1
- data/app/views/wallaby/resources/index/_circle.html.erb +16 -0
- data/app/views/wallaby/resources/index/_citext.html.erb +5 -1
- data/app/views/wallaby/resources/index/_color.html.erb +6 -1
- data/app/views/wallaby/resources/index/_date.html.erb +4 -0
- data/app/views/wallaby/resources/index/_daterange.html.erb +5 -1
- data/app/views/wallaby/resources/index/_datetime.html.erb +5 -1
- data/app/views/wallaby/resources/index/_decimal.html.erb +4 -0
- data/app/views/wallaby/resources/index/_email.html.erb +4 -0
- data/app/views/wallaby/resources/index/_float.html.erb +4 -0
- data/app/views/wallaby/resources/index/_has_and_belongs_to_many.html.erb +6 -2
- data/app/views/wallaby/resources/index/_has_many.html.erb +6 -2
- data/app/views/wallaby/resources/index/_has_one.html.erb +5 -1
- data/app/views/wallaby/resources/index/_hstore.html.erb +6 -2
- data/app/views/wallaby/resources/index/_inet.html.erb +5 -1
- data/app/views/wallaby/resources/index/_int4range.html.erb +4 -0
- data/app/views/wallaby/resources/index/_int8range.html.erb +4 -0
- data/app/views/wallaby/resources/index/_integer.html.erb +4 -0
- data/app/views/wallaby/resources/index/_json.html.erb +5 -2
- data/app/views/wallaby/resources/index/_jsonb.html.erb +5 -2
- data/app/views/wallaby/resources/index/_line.html.erb +16 -0
- data/app/views/wallaby/resources/index/_longblob.html.erb +5 -0
- data/app/views/wallaby/resources/index/_longtext.html.erb +16 -0
- data/app/views/wallaby/resources/index/_lseg.html.erb +16 -0
- data/app/views/wallaby/resources/index/_ltree.html.erb +5 -1
- data/app/views/wallaby/resources/index/_macaddr.html.erb +4 -0
- data/app/views/wallaby/resources/index/_mediumblob.html.erb +5 -0
- data/app/views/wallaby/resources/index/_mediumtext.html.erb +16 -0
- data/app/views/wallaby/resources/index/_money.html.erb +4 -0
- data/app/views/wallaby/resources/index/_numrange.html.erb +4 -0
- data/app/views/wallaby/resources/index/_password.html.erb +9 -0
- data/app/views/wallaby/resources/index/_path.html.erb +16 -0
- data/app/views/wallaby/resources/index/_point.html.erb +4 -0
- data/app/views/wallaby/resources/index/_polygon.html.erb +16 -0
- data/app/views/wallaby/resources/index/_raw.html.erb +9 -0
- data/app/views/wallaby/resources/index/_serial.html.erb +5 -0
- data/app/views/wallaby/resources/index/_sti.html.erb +16 -0
- data/app/views/wallaby/resources/index/_string.html.erb +5 -1
- data/app/views/wallaby/resources/index/_text.html.erb +5 -1
- data/app/views/wallaby/resources/index/_time.html.erb +4 -0
- data/app/views/wallaby/resources/index/_tinyblob.html.erb +5 -0
- data/app/views/wallaby/resources/index/_tinytext.html.erb +16 -0
- data/app/views/wallaby/resources/index/_tsrange.html.erb +5 -1
- data/app/views/wallaby/resources/index/_tstzrange.html.erb +5 -1
- data/app/views/wallaby/resources/index/_tsvector.html.erb +5 -1
- data/app/views/wallaby/resources/index/_unsigned_bigint.html.erb +5 -0
- data/app/views/wallaby/resources/index/_unsigned_decimal.html.erb +5 -0
- data/app/views/wallaby/resources/index/_unsigned_float.html.erb +5 -0
- data/app/views/wallaby/resources/index/_unsigned_integer.html.erb +5 -0
- data/app/views/wallaby/resources/index/_uuid.html.erb +5 -1
- data/app/views/wallaby/resources/index/_xml.html.erb +5 -1
- data/app/views/wallaby/resources/index.csv.erb +26 -0
- data/app/views/wallaby/resources/index.html.erb +47 -59
- data/app/views/wallaby/resources/index.json.jbuilder +5 -0
- data/app/views/wallaby/resources/new.html.erb +12 -11
- data/app/views/wallaby/resources/show/_belongs_to.html.erb +5 -1
- data/app/views/wallaby/resources/show/_bigint.html.erb +4 -0
- data/app/views/wallaby/resources/show/_bigserial.html.erb +5 -0
- data/app/views/wallaby/resources/show/_binary.html.erb +5 -1
- data/app/views/wallaby/resources/show/_bit.html.erb +4 -0
- data/app/views/wallaby/resources/show/_bit_varying.html.erb +4 -0
- data/app/views/wallaby/resources/show/_blob.html.erb +5 -0
- data/app/views/wallaby/resources/show/_boolean.html.erb +5 -1
- data/app/views/wallaby/resources/show/_box.html.erb +9 -0
- data/app/views/wallaby/resources/show/_cidr.html.erb +5 -1
- data/app/views/wallaby/resources/show/_circle.html.erb +9 -0
- data/app/views/wallaby/resources/show/_citext.html.erb +4 -0
- data/app/views/wallaby/resources/show/_color.html.erb +6 -1
- data/app/views/wallaby/resources/show/_date.html.erb +4 -0
- data/app/views/wallaby/resources/show/_daterange.html.erb +4 -0
- data/app/views/wallaby/resources/show/_datetime.html.erb +4 -0
- data/app/views/wallaby/resources/show/_decimal.html.erb +4 -0
- data/app/views/wallaby/resources/show/_email.html.erb +4 -0
- data/app/views/wallaby/resources/show/_float.html.erb +4 -0
- data/app/views/wallaby/resources/show/_has_and_belongs_to_many.html.erb +6 -2
- data/app/views/wallaby/resources/show/_has_many.html.erb +6 -2
- data/app/views/wallaby/resources/show/_has_one.html.erb +5 -1
- data/app/views/wallaby/resources/show/_hstore.html.erb +4 -0
- data/app/views/wallaby/resources/show/_image.html.erb +9 -0
- data/app/views/wallaby/resources/show/_inet.html.erb +5 -1
- data/app/views/wallaby/resources/show/_int4range.html.erb +4 -0
- data/app/views/wallaby/resources/show/_int8range.html.erb +4 -0
- data/app/views/wallaby/resources/show/_integer.html.erb +4 -0
- data/app/views/wallaby/resources/show/_json.html.erb +4 -0
- data/app/views/wallaby/resources/show/_jsonb.html.erb +4 -0
- data/app/views/wallaby/resources/show/_line.html.erb +9 -0
- data/app/views/wallaby/resources/show/_longblob.html.erb +5 -0
- data/app/views/wallaby/resources/show/_longtext.html.erb +5 -0
- data/app/views/wallaby/resources/show/_lseg.html.erb +9 -0
- data/app/views/wallaby/resources/show/_ltree.html.erb +4 -0
- data/app/views/wallaby/resources/show/_macaddr.html.erb +4 -0
- data/app/views/wallaby/resources/show/_mediumblob.html.erb +5 -0
- data/app/views/wallaby/resources/show/_mediumtext.html.erb +5 -0
- data/app/views/wallaby/resources/show/_money.html.erb +4 -0
- data/app/views/wallaby/resources/show/_numrange.html.erb +4 -0
- data/app/views/wallaby/resources/show/_password.html.erb +9 -0
- data/app/views/wallaby/resources/show/_path.html.erb +9 -0
- data/app/views/wallaby/resources/show/_point.html.erb +4 -0
- data/app/views/wallaby/resources/show/_polygon.html.erb +9 -0
- data/app/views/wallaby/resources/show/_raw.html.erb +9 -0
- data/app/views/wallaby/resources/show/_serial.html.erb +5 -0
- data/app/views/wallaby/resources/show/_sti.html.erb +5 -0
- data/app/views/wallaby/resources/show/_string.html.erb +4 -0
- data/app/views/wallaby/resources/show/_text.html.erb +4 -0
- data/app/views/wallaby/resources/show/_time.html.erb +4 -0
- data/app/views/wallaby/resources/show/_tinyblob.html.erb +5 -0
- data/app/views/wallaby/resources/show/_tinytext.html.erb +5 -0
- data/app/views/wallaby/resources/show/_tsrange.html.erb +4 -0
- data/app/views/wallaby/resources/show/_tstzrange.html.erb +4 -0
- data/app/views/wallaby/resources/show/_tsvector.html.erb +4 -0
- data/app/views/wallaby/resources/show/_unsigned_bigint.html.erb +5 -0
- data/app/views/wallaby/resources/show/_unsigned_decimal.html.erb +5 -0
- data/app/views/wallaby/resources/show/_unsigned_float.html.erb +5 -0
- data/app/views/wallaby/resources/show/_unsigned_integer.html.erb +5 -0
- data/app/views/wallaby/resources/show/_uuid.html.erb +4 -0
- data/app/views/wallaby/resources/show/_xml.html.erb +4 -0
- data/app/views/wallaby/resources/show.html.erb +14 -24
- data/app/views/wallaby/resources/show.json.jbuilder +5 -0
- data/config/brakeman.ignore +26 -0
- data/config/locales/wallaby.en.yml +91 -0
- data/config/massa.yml +45 -0
- data/config/rails_best_practices.yml +42 -0
- data/config/routes.rb +29 -23
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/association_builder.rb +39 -0
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/polymorphic_builder.rb +44 -0
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb +42 -0
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +41 -94
- data/lib/adaptors/wallaby/active_record/model_decorator/title_field_finder.rb +24 -14
- data/lib/adaptors/wallaby/active_record/model_decorator.rb +118 -64
- data/lib/adaptors/wallaby/active_record/model_finder.rb +44 -15
- data/lib/adaptors/wallaby/active_record/model_pagination_provider.rb +30 -0
- data/lib/adaptors/wallaby/active_record/model_service_provider/normalizer.rb +42 -0
- data/lib/adaptors/wallaby/active_record/model_service_provider/permitter.rb +64 -0
- data/lib/adaptors/wallaby/active_record/model_service_provider/querier/transformer.rb +70 -0
- data/lib/adaptors/wallaby/active_record/model_service_provider/querier.rb +102 -0
- data/lib/adaptors/wallaby/active_record/model_service_provider/validator.rb +29 -0
- data/lib/adaptors/wallaby/active_record/model_service_provider.rb +137 -0
- data/lib/adaptors/wallaby/active_record.rb +4 -1
- data/lib/decorators/wallaby/abstract_resource_decorator.rb +74 -0
- data/lib/decorators/wallaby/resource_decorator.rb +5 -76
- data/lib/errors/wallaby/model_not_found.rb +5 -1
- data/lib/errors/wallaby/not_found.rb +4 -0
- data/lib/errors/wallaby/resource_not_found.rb +5 -1
- data/lib/forms/wallaby/form_builder.rb +42 -19
- data/lib/helpers/wallaby/application_helper.rb +34 -24
- data/lib/helpers/wallaby/base_helper.rb +52 -0
- data/lib/helpers/wallaby/form_helper.rb +40 -16
- data/lib/helpers/wallaby/index_helper.rb +59 -0
- data/lib/helpers/wallaby/links_helper.rb +150 -81
- data/lib/helpers/wallaby/resources_helper.rb +41 -46
- data/lib/helpers/wallaby/secure_helper.rb +36 -19
- data/lib/helpers/wallaby/styling_helper.rb +53 -44
- data/lib/interfaces/wallaby/mode.rb +19 -12
- data/lib/interfaces/wallaby/model_decorator.rb +176 -50
- data/lib/interfaces/wallaby/model_finder.rb +7 -3
- data/lib/interfaces/wallaby/model_pagination_provider.rb +104 -0
- data/lib/interfaces/wallaby/model_service_provider.rb +71 -0
- data/lib/paginators/wallaby/abstract_resource_paginator.rb +23 -0
- data/lib/paginators/wallaby/resource_paginator.rb +6 -0
- data/lib/parsers/wallaby/parser.rb +32 -0
- data/lib/responders/wallaby/abstract_responder.rb +68 -0
- data/lib/responders/wallaby/resources_responder.rb +6 -0
- data/lib/servicers/wallaby/abstract_model_servicer.rb +48 -0
- data/lib/servicers/wallaby/model_servicer.rb +5 -0
- data/lib/services/wallaby/link_options_normalizer.rb +16 -0
- data/lib/services/wallaby/lookup_context_wrapper.rb +23 -30
- data/lib/services/wallaby/map/mode_mapper.rb +19 -0
- data/lib/services/wallaby/map/model_class_collector.rb +41 -0
- data/lib/services/wallaby/map/model_class_mapper.rb +24 -0
- data/lib/services/wallaby/map.rb +76 -39
- data/lib/services/wallaby/partial_renderer.rb +60 -0
- data/lib/services/wallaby/prefixes_builder.rb +54 -0
- data/lib/services/wallaby/sorting/hash_builder.rb +16 -0
- data/lib/services/wallaby/sorting/link_builder.rb +45 -0
- data/lib/services/wallaby/sorting/next_builder.rb +54 -0
- data/lib/services/wallaby/url_for.rb +36 -0
- data/lib/tree/wallaby/node.rb +17 -0
- data/lib/utils/wallaby/utils.rb +67 -22
- data/lib/wallaby/configuration/features.rb +12 -0
- data/lib/wallaby/configuration/metadata.rb +12 -0
- data/lib/wallaby/configuration/models.rb +27 -12
- data/lib/wallaby/configuration/pagination.rb +12 -0
- data/lib/wallaby/configuration/security.rb +55 -24
- data/lib/wallaby/configuration.rb +38 -19
- data/lib/wallaby/engine.rb +84 -39
- data/lib/wallaby/version.rb +1 -1
- data/lib/wallaby.rb +22 -3
- metadata +200 -55
- data/app/assets/javascripts/wallaby/form.js +0 -8
- data/app/assets/stylesheets/wallaby/base/_functions.scss +0 -0
- data/app/assets/stylesheets/wallaby/base/_normalize.scss +0 -0
- data/app/assets/stylesheets/wallaby/base/_reset.scss +0 -0
- data/app/assets/stylesheets/wallaby/components/_forms.scss +0 -53
- data/app/assets/stylesheets/wallaby/components/_nav.scss +0 -19
- data/app/assets/stylesheets/wallaby/components/_tables.scss +0 -78
- data/app/assets/stylesheets/wallaby/form.scss +0 -11
- data/app/controllers/wallaby/core_controller.rb +0 -28
- data/app/views/layouts/wallaby/_footer.html.erb +0 -2
- data/app/views/layouts/wallaby/_header.html.erb +0 -57
- data/app/views/layouts/wallaby/_navs.html.erb +0 -1
- data/app/views/wallaby/errors/access_denied.html.erb +0 -1
- data/app/views/wallaby/errors/not_authenticated.html.erb +0 -1
- data/app/views/wallaby/errors/not_found.html.erb +0 -6
- data/app/views/wallaby/errors/unprocessable_entity.erb +0 -1
- data/config/locales/en.yml +0 -29
- data/lib/adaptors/wallaby/active_record/model_operator/normalizer.rb +0 -44
- data/lib/adaptors/wallaby/active_record/model_operator/permitter.rb +0 -50
- data/lib/adaptors/wallaby/active_record/model_operator/querier.rb +0 -47
- data/lib/adaptors/wallaby/active_record/model_operator/validator.rb +0 -16
- data/lib/adaptors/wallaby/active_record/model_operator.rb +0 -82
- data/lib/errors/wallaby/deprecated.rb +0 -4
- data/lib/errors/wallaby/operation_not_found.rb +0 -4
- data/lib/handlers/wallaby/cached_compiled_erb.rb +0 -14
- data/lib/helpers/wallaby/core_helper.rb +0 -50
- data/lib/helpers/wallaby/paginatable_helper.rb +0 -9
- data/lib/helpers/wallaby/sorting_helper.rb +0 -43
- data/lib/interfaces/wallaby/model_operator.rb +0 -31
- data/lib/services/wallaby/decorator_finder.rb +0 -16
- data/lib/services/wallaby/model_servicer.rb +0 -38
- data/lib/services/wallaby/servicer_finder.rb +0 -5
|
@@ -1,40 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Lookup context wrapper.
|
|
3
|
+
# This is to take care of missing template in production to return string
|
|
4
|
+
# template.
|
|
5
|
+
# @see Wallaby::PartialRenderer
|
|
6
|
+
class LookupContextWrapper
|
|
7
|
+
origin_methods = ::ActionView::LookupContext.instance_methods \
|
|
8
|
+
- ::Object.instance_methods - %i(find_template)
|
|
9
|
+
delegate(*origin_methods, to: :@lookup_context)
|
|
6
10
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
def initialize(lookup_context)
|
|
12
|
+
@lookup_context = lookup_context
|
|
13
|
+
end
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
def find_template(*args)
|
|
16
|
+
@lookup_context.find_template(*args)
|
|
17
|
+
rescue ::ActionView::MissingTemplate
|
|
18
|
+
raise if Rails.env.development?
|
|
19
|
+
BlankTemplate.new
|
|
15
20
|
end
|
|
16
|
-
end
|
|
17
21
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@templates[key] = begin
|
|
23
|
-
yield
|
|
24
|
-
rescue ActionView::MissingTemplate
|
|
25
|
-
raise if Rails.env.development?
|
|
26
|
-
BlankTemplate.new
|
|
22
|
+
# Blank template to return nil. It should be used by production
|
|
23
|
+
class BlankTemplate < ::ActionView::Template::HTML
|
|
24
|
+
def initialize
|
|
25
|
+
super nil
|
|
27
26
|
end
|
|
28
|
-
end
|
|
29
|
-
@templates[key]
|
|
30
|
-
end
|
|
31
27
|
|
|
32
|
-
|
|
33
|
-
def initialize
|
|
34
|
-
super nil
|
|
35
|
-
end
|
|
28
|
+
def render(*args); end
|
|
36
29
|
|
|
37
|
-
|
|
30
|
+
def virtual_path(*args); end
|
|
38
31
|
end
|
|
39
32
|
end
|
|
40
33
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
class Map
|
|
3
|
+
# To map model class to mode class so that we know how to handle a model
|
|
4
|
+
class ModeMapper
|
|
5
|
+
def initialize(mode_classes)
|
|
6
|
+
@mode_classes = mode_classes
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def map
|
|
10
|
+
return {} if @mode_classes.blank?
|
|
11
|
+
@mode_classes.each_with_object({}) do |mode_class, map|
|
|
12
|
+
mode_class.model_finder.new.all.each do |model_class|
|
|
13
|
+
map[model_class] = mode_class
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
class Map
|
|
3
|
+
# To collect model classes that are configured to be handled by Wallaby
|
|
4
|
+
class ModelClassCollector
|
|
5
|
+
def initialize(configuration)
|
|
6
|
+
@configuration = configuration
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def collect
|
|
10
|
+
return all_models - excluded_models if configured_models.blank?
|
|
11
|
+
invalid_models_check
|
|
12
|
+
configured_models
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def invalid_models_check
|
|
18
|
+
invalid_models = configured_models - all_models
|
|
19
|
+
return if invalid_models.blank?
|
|
20
|
+
message = "#{invalid_models.to_sentence} are invalid models."
|
|
21
|
+
raise InvalidError, message
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def models
|
|
25
|
+
@configuration.models
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def all_models
|
|
29
|
+
Map.mode_map.keys
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def excluded_models
|
|
33
|
+
models.excludes
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def configured_models
|
|
37
|
+
models.presence
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
class Map
|
|
3
|
+
# To map model class to a klass
|
|
4
|
+
class ModelClassMapper
|
|
5
|
+
def initialize(base_class)
|
|
6
|
+
@base_class = base_class
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def map
|
|
10
|
+
(@base_class.try(:subclasses) || EMPTY_HASH)
|
|
11
|
+
.each_with_object({}) do |klass, map|
|
|
12
|
+
next if anonymous? klass
|
|
13
|
+
map[klass.model_class] = block_given? ? yield(klass) : klass
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
|
|
19
|
+
def anonymous?(klass)
|
|
20
|
+
klass.name.blank?
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/services/wallaby/map.rb
CHANGED
|
@@ -1,53 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
map[model_class] = mode_class
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Global storage of all the maps for model classes
|
|
3
|
+
class Map
|
|
4
|
+
# { model => mode }
|
|
5
|
+
def self.mode_map
|
|
6
|
+
@mode_map ||= ModeMapper.new(Mode.subclasses).map.freeze
|
|
11
7
|
end
|
|
12
|
-
end
|
|
13
8
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
# [ model classes ]
|
|
10
|
+
def self.model_classes
|
|
11
|
+
@model_classes ||=
|
|
12
|
+
ModelClassCollector.new(::Wallaby.configuration).collect.freeze
|
|
13
|
+
end
|
|
19
14
|
|
|
20
|
-
|
|
15
|
+
# { model => controller }
|
|
16
|
+
def self.controller_map(model_class)
|
|
17
|
+
@controller_map ||= ModelClassMapper.new(ResourcesController).map
|
|
18
|
+
@controller_map[model_class] ||= ResourcesController
|
|
19
|
+
end
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
# { model => model decorator }
|
|
22
|
+
def self.model_decorator_map(model_class)
|
|
23
|
+
@model_decorator_map ||= {}
|
|
24
|
+
@model_decorator_map[model_class] ||= begin
|
|
25
|
+
mode = mode_map[model_class]
|
|
26
|
+
mode.model_decorator.new model_class if mode
|
|
25
27
|
end
|
|
26
|
-
configed_models
|
|
27
28
|
end
|
|
28
|
-
end
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
# { model => resource decorator }
|
|
31
|
+
def self.resource_decorator_map(model_class)
|
|
32
|
+
@resource_decorator_map ||= ModelClassMapper.new(ResourceDecorator).map
|
|
33
|
+
@resource_decorator_map[model_class] ||= begin
|
|
34
|
+
ResourceDecorator if mode_map[model_class]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
33
37
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
# { model => servicer }
|
|
39
|
+
def self.servicer_map(model_class)
|
|
40
|
+
@servicer_map ||= ModelClassMapper.new(ModelServicer).map
|
|
41
|
+
@servicer_map[model_class] ||= begin
|
|
42
|
+
ModelServicer if mode_map[model_class]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
37
45
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
46
|
+
# { model => service_provider }
|
|
47
|
+
def self.service_provider_map(model_class)
|
|
48
|
+
@service_provider_map ||= {}
|
|
49
|
+
@service_provider_map[model_class] ||= begin
|
|
50
|
+
mode = mode_map[model_class]
|
|
51
|
+
mode.model_service_provider.new model_class if mode
|
|
52
|
+
end
|
|
53
|
+
end
|
|
41
54
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
.each do |klass|
|
|
48
|
-
map[klass.model_class] = klass
|
|
49
|
-
end
|
|
55
|
+
# { model => paginator }
|
|
56
|
+
def self.paginator_map(model_class)
|
|
57
|
+
@paginator_map ||= ModelClassMapper.new(ResourcePaginator).map
|
|
58
|
+
@paginator_map[model_class] ||= begin
|
|
59
|
+
ResourcePaginator if mode_map[model_class]
|
|
50
60
|
end
|
|
51
61
|
end
|
|
62
|
+
|
|
63
|
+
# { model => pagination_provider }
|
|
64
|
+
def self.pagination_provider_map(model_class)
|
|
65
|
+
@pagination_provider_map ||= {}
|
|
66
|
+
@pagination_provider_map[model_class] ||=
|
|
67
|
+
mode_map[model_class].try(:model_pagination_provider)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# { model => resources name }
|
|
71
|
+
def self.resources_name_map(model_class)
|
|
72
|
+
@resources_name_map ||= {}
|
|
73
|
+
@resources_name_map[model_class] ||= Utils.to_resources_name model_class
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# { resources name => model }
|
|
77
|
+
def self.model_class_map(resources_name)
|
|
78
|
+
@model_class_map ||= {}
|
|
79
|
+
@model_class_map[resources_name] ||= Utils.to_model_class resources_name
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Clear all the class variables to nil
|
|
83
|
+
def self.clear
|
|
84
|
+
@mode_map, @model_classes, @controller_map, @model_decorator_map,
|
|
85
|
+
@resource_decorator_map, @servicer_map, @service_provider_map,
|
|
86
|
+
@paginator_map, @pagination_provider_map, @model_class_map,
|
|
87
|
+
@resources_name_map = []
|
|
88
|
+
end
|
|
52
89
|
end
|
|
53
90
|
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Partial renderer
|
|
3
|
+
class PartialRenderer
|
|
4
|
+
class << self
|
|
5
|
+
# Render form partial
|
|
6
|
+
# @param view [ActionView] view
|
|
7
|
+
# @param options [String] partial name
|
|
8
|
+
# @param locals [Hash]
|
|
9
|
+
# @return [String] HTML
|
|
10
|
+
def render(view, options = {}, locals = {}, action_name = nil, &block)
|
|
11
|
+
decorated = locals[:object]
|
|
12
|
+
field_name = locals[:field_name].to_s
|
|
13
|
+
action_name ||= Utils.to_partial_name view.params[:action]
|
|
14
|
+
|
|
15
|
+
partial_arguments_check decorated, field_name
|
|
16
|
+
|
|
17
|
+
locals[:metadata] =
|
|
18
|
+
decorated.public_send :"#{action_name}_metadata_of", field_name
|
|
19
|
+
locals[:value] = decorated.public_send field_name
|
|
20
|
+
|
|
21
|
+
view.render(options, locals, &block) \
|
|
22
|
+
|| view.render('string', locals, &block)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Render form partial
|
|
26
|
+
# @param view [ActionView] view
|
|
27
|
+
# @param options [String] partial name
|
|
28
|
+
# @param locals [Hash]
|
|
29
|
+
# @return [String] HTML
|
|
30
|
+
def render_form(view, options = {}, locals = {}, &block)
|
|
31
|
+
form = locals[:form]
|
|
32
|
+
field_name = locals[:field_name].to_s
|
|
33
|
+
|
|
34
|
+
form_arguments_check form, field_name
|
|
35
|
+
|
|
36
|
+
decorated = locals[:object] = form.object
|
|
37
|
+
locals[:metadata] = decorated.form_metadata_of locals[:field_name]
|
|
38
|
+
locals[:value] = decorated.public_send locals[:field_name]
|
|
39
|
+
|
|
40
|
+
view.render(options, locals, &block) \
|
|
41
|
+
|| view.render('string', locals, &block)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def partial_arguments_check(object, field_name)
|
|
47
|
+
raise ArgumentError, 'Field name is required.' if field_name.blank?
|
|
48
|
+
raise ArgumentError, 'Object is not decorated.' \
|
|
49
|
+
unless object.is_a? ResourceDecorator
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def form_arguments_check(form, field_name)
|
|
53
|
+
raise ArgumentError, 'Form is required.' if form.blank?
|
|
54
|
+
raise ArgumentError, 'Field name is required.' if field_name.blank?
|
|
55
|
+
raise ArgumentError, 'Object is not decorated.' \
|
|
56
|
+
unless form.object.is_a? ResourceDecorator
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Prefix builder
|
|
3
|
+
class PrefixesBuilder
|
|
4
|
+
def initialize(origin_prefixes, controller_path, resources_name, params)
|
|
5
|
+
@origin_prefixes = origin_prefixes
|
|
6
|
+
@controller_path = controller_path
|
|
7
|
+
@resources_name = resources_name
|
|
8
|
+
@params = params
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def build
|
|
12
|
+
prefixes = minimal_prefixes
|
|
13
|
+
prefixes.unshift mounted_prefix if resource_path != @controller_path
|
|
14
|
+
suffix = build_suffix(@params)
|
|
15
|
+
prefixes.each_with_object([]) do |prefix, result|
|
|
16
|
+
result << "#{prefix}/#{suffix}" << prefix if prefix
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
protected
|
|
21
|
+
|
|
22
|
+
def minimal_prefixes
|
|
23
|
+
# this should contains only the current controller's path and wallaby path
|
|
24
|
+
index = @origin_prefixes.index wallaby_path
|
|
25
|
+
@origin_prefixes.slice 0..index
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def mounted_prefix
|
|
29
|
+
prefix = mounted_path.try(:slice, 1..-1) || ''
|
|
30
|
+
prefix << SLASH unless prefix.empty?
|
|
31
|
+
prefix << resource_path if resource_path
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def build_suffix(params)
|
|
35
|
+
Utils.to_partial_name params[:action]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def wallaby_path
|
|
39
|
+
ResourcesController.controller_path
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def mounted_path
|
|
43
|
+
# TODO: need to find out if this will fail
|
|
44
|
+
# when wallaby is mounted more than once on different namespace?
|
|
45
|
+
Rails.application.routes.named_routes[:wallaby_engine].try do |route|
|
|
46
|
+
route.path.spec.to_s
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def resource_path
|
|
51
|
+
@resource_path ||= @resources_name.try :gsub, COLONS, SLASH
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
module Sorting
|
|
3
|
+
# Turn a string `'name asc,id desc'` into sort hash
|
|
4
|
+
class HashBuilder
|
|
5
|
+
SORT_REGEX = /(([^\s,]+)\s+(asc|desc))\s*,?\s*/i
|
|
6
|
+
|
|
7
|
+
def self.build(sort_string)
|
|
8
|
+
::ActiveSupport::HashWithIndifferentAccess.new.tap do |hash|
|
|
9
|
+
(sort_string || EMPTY_STRING).scan SORT_REGEX do |_, key, order|
|
|
10
|
+
hash[key] = order
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
module Sorting
|
|
3
|
+
# Build the sorting link
|
|
4
|
+
class LinkBuilder
|
|
5
|
+
delegate :model_class, to: :@model_decorator
|
|
6
|
+
|
|
7
|
+
def initialize(model_decorator, params, helper)
|
|
8
|
+
@model_decorator = model_decorator
|
|
9
|
+
@params = params
|
|
10
|
+
@helper = helper
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# To turn sort string into a hash for later usage
|
|
14
|
+
# @return [Hash]
|
|
15
|
+
def current_sort
|
|
16
|
+
@current_sort ||= HashBuilder.build @params[:sort]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Build sort link for given field name
|
|
20
|
+
# @param field_name [String]
|
|
21
|
+
# @return [String] link
|
|
22
|
+
def build(field_name)
|
|
23
|
+
metadata = @model_decorator.index_metadata_of field_name
|
|
24
|
+
label = Utils.to_field_label field_name, metadata
|
|
25
|
+
return label unless sortable? metadata
|
|
26
|
+
sort_field_name = metadata[:sort_field_name] || field_name
|
|
27
|
+
url_params = next_builder.next_params sort_field_name
|
|
28
|
+
@helper.index_link(model_class, url_params: url_params) { label }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# @see Wallaby::Sorting::NextBuilder
|
|
34
|
+
def next_builder
|
|
35
|
+
@next_builder ||= NextBuilder.new @params, current_sort
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# If it's non-association field or custom sorting field
|
|
39
|
+
def sortable?(metadata)
|
|
40
|
+
metadata[:is_origin] && !metadata[:is_association] \
|
|
41
|
+
|| metadata[:sort_field_name]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
module Sorting
|
|
3
|
+
# Pass field_name to generate sort param
|
|
4
|
+
class NextBuilder
|
|
5
|
+
ASC = 'asc'.freeze
|
|
6
|
+
DESC = 'desc'.freeze
|
|
7
|
+
|
|
8
|
+
def initialize(params, hash = nil)
|
|
9
|
+
@params = params
|
|
10
|
+
@hash = hash || HashBuilder.build(params[:sort])
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def next_params(field_name)
|
|
14
|
+
params = clean_params
|
|
15
|
+
update params, :sort, complete_sorting_str_with(field_name)
|
|
16
|
+
params
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
protected
|
|
20
|
+
|
|
21
|
+
def clean_params
|
|
22
|
+
@params.except :resources, :controller, :action
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def complete_sorting_str_with(field_name)
|
|
26
|
+
hash = @hash.except field_name
|
|
27
|
+
current_sort = @hash[field_name]
|
|
28
|
+
|
|
29
|
+
update hash, field_name, next_value_for(current_sort)
|
|
30
|
+
rebuild_str_from hash
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def rebuild_str_from(hash)
|
|
34
|
+
hash.each_with_object '' do |(name, sort), str|
|
|
35
|
+
str << (str == EMPTY_STRING ? str : COMMA)
|
|
36
|
+
str << name << SPACE << sort
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def next_value_for(current)
|
|
41
|
+
case current
|
|
42
|
+
when ASC then DESC
|
|
43
|
+
when DESC then nil
|
|
44
|
+
else ASC
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def update(hash, key, value)
|
|
49
|
+
return hash.delete key if value.blank?
|
|
50
|
+
hash[key] = value
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Url helper
|
|
3
|
+
class UrlFor
|
|
4
|
+
class << self
|
|
5
|
+
# Handle wallaby engine url properly.
|
|
6
|
+
# @param wallaby_engine [ActionDispatch::Routing::RoutesProxy]
|
|
7
|
+
# @param options [ActionController::Parameters, Hash]
|
|
8
|
+
# @return [String] url string for wallaby engine
|
|
9
|
+
def handle(wallaby_engine, options)
|
|
10
|
+
# NOTE: DEPRECATION WARNING: You are calling a `*_path` helper with the
|
|
11
|
+
# `only_path` option explicitly set to `false`.
|
|
12
|
+
# This option will stop working on path helpers in Rails 5.
|
|
13
|
+
# Use the corresponding `*_url` helper instead.
|
|
14
|
+
hash = normalize_params(options).except(:only_path)
|
|
15
|
+
case hash[:action]
|
|
16
|
+
when 'index', 'create' then wallaby_engine.resources_path hash
|
|
17
|
+
when 'new' then wallaby_engine.new_resource_path hash
|
|
18
|
+
when 'edit' then wallaby_engine.edit_resource_path hash
|
|
19
|
+
else wallaby_engine.resource_path hash
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
# We will need to normalize params and return a hash
|
|
26
|
+
# so that the url helper
|
|
27
|
+
# could build up the url properly.
|
|
28
|
+
# @param options [ActionController::Parameters, Hash]
|
|
29
|
+
# @return [Hash]
|
|
30
|
+
def normalize_params(options)
|
|
31
|
+
return options unless options.is_a? ActionController::Parameters
|
|
32
|
+
options.permit(:resources, :action, :id).to_h
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Node to present tree structure
|
|
3
|
+
class Node
|
|
4
|
+
attr_reader :klass
|
|
5
|
+
attr_accessor :parent
|
|
6
|
+
|
|
7
|
+
delegate :name, to: :klass
|
|
8
|
+
|
|
9
|
+
def initialize(klass)
|
|
10
|
+
@klass = klass
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def children
|
|
14
|
+
@children ||= []
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/utils/wallaby/utils.rb
CHANGED
|
@@ -1,31 +1,76 @@
|
|
|
1
|
-
module Wallaby
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Utils
|
|
3
|
+
module Utils
|
|
4
|
+
def self.to_resources_name(model_class)
|
|
5
|
+
return EMPTY_STRING if model_class.blank?
|
|
6
|
+
model_class.to_s.underscore.gsub(SLASH, COLONS).pluralize
|
|
7
|
+
end
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
def self.to_model_label(model_class)
|
|
10
|
+
return EMPTY_STRING if model_class.blank?
|
|
11
|
+
model_class_name = to_model_name model_class
|
|
12
|
+
model_class_name.titleize.gsub(SLASH, SPACE + SLASH + SPACE)
|
|
13
|
+
end
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
def self.to_model_name(resources_name)
|
|
16
|
+
return EMPTY_STRING if resources_name.blank?
|
|
17
|
+
resources_name.to_s.singularize.gsub(COLONS, SLASH).camelize
|
|
18
|
+
end
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
begin
|
|
20
|
+
def self.to_model_class(resources_name)
|
|
21
|
+
return if resources_name.blank?
|
|
20
22
|
class_name = to_model_name resources_name
|
|
23
|
+
# NOTE: do not use if statement instead of rescue here
|
|
24
|
+
# we want the class_name to be eagerly loaded
|
|
21
25
|
class_name.constantize
|
|
22
|
-
rescue
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
rescue NameError => _error
|
|
27
|
+
raise ModelNotFound, class_name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.find_filter_name(filter_name, filters)
|
|
31
|
+
filter_name || # from params
|
|
32
|
+
filters.find { |_k, v| v[:default] }.try(:first) || # from default value
|
|
33
|
+
:all # last resort
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.to_field_label(field_name, metadata)
|
|
37
|
+
field_name = field_name.to_s if field_name.is_a? Symbol
|
|
38
|
+
metadata[:label] || field_name.humanize
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.to_partial_name(action_name)
|
|
42
|
+
FORM_ACTIONS.include?(action_name) ? 'form' : action_name
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.to_hash(array)
|
|
46
|
+
Hash[*array.flatten(1)]
|
|
25
47
|
end
|
|
26
|
-
end
|
|
27
48
|
|
|
28
|
-
|
|
29
|
-
|
|
49
|
+
# @see http://stackoverflow.com/a/8710663/1326499
|
|
50
|
+
def self.clone(object)
|
|
51
|
+
::Marshal.load(::Marshal.dump(object))
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def self.preload_all
|
|
55
|
+
::Wallaby::ApplicationController.to_s
|
|
56
|
+
preload 'app/models/**/*.rb'
|
|
57
|
+
preload 'app/decorators/**/*.rb'
|
|
58
|
+
preload 'app/controllers/**/*.rb'
|
|
59
|
+
preload 'app/servicers/**/*.rb'
|
|
60
|
+
preload 'app/**/*.rb'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.preload(file_pattern)
|
|
64
|
+
Dir[file_pattern].each do |file_path|
|
|
65
|
+
begin
|
|
66
|
+
name = file_path[%r{app/[^/]+/(.+)\.rb}, 1].gsub('concerns/', '')
|
|
67
|
+
class_name = name.classify
|
|
68
|
+
class_name.constantize unless Module.const_defined? class_name
|
|
69
|
+
rescue NameError, LoadError => e
|
|
70
|
+
Rails.logger.debug ">>>>>>>>> PRELOAD ERROR: #{e.message}"
|
|
71
|
+
Rails.logger.debug e.backtrace.slice(0, 5)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
30
75
|
end
|
|
31
76
|
end
|