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,58 +1,184 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Model Decorator interface, designed to maintain metadata information for all
|
|
3
|
+
# the fields coming from data source (database/api)
|
|
4
|
+
# @see Wallaby::ResourceDecorator for more information on how to customise
|
|
5
|
+
# metadata information
|
|
6
|
+
class ModelDecorator
|
|
7
|
+
attr_reader :model_class
|
|
8
|
+
attr_writer \
|
|
9
|
+
:field_names, :index_field_names, :show_field_names, :form_field_names
|
|
3
10
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
11
|
+
def initialize(model_class)
|
|
12
|
+
@model_class = model_class
|
|
13
|
+
end
|
|
7
14
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def #{ prefix }fields=(#{ prefix }fields)
|
|
15
|
-
@#{ prefix }fields = #{ prefix }fields.with_indifferent_access
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def #{ prefix }field_names
|
|
19
|
-
@#{ prefix }field_names ||= #{ prefix }fields.keys.tap do |names|
|
|
20
|
-
names.delete primary_key
|
|
21
|
-
names.unshift primary_key
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def #{ prefix }field_names=(#{ prefix }field_names)
|
|
26
|
-
@#{ prefix }field_names = #{ prefix }field_names
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def #{ prefix }metadata_of(field_name)
|
|
30
|
-
#{ prefix }fields[field_name] || {}
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def #{ prefix }label_of(field_name)
|
|
34
|
-
#{ prefix }metadata_of(field_name)[:label]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def #{ prefix }type_of(field_name)
|
|
38
|
-
#{ prefix }metadata_of(field_name)[:type]
|
|
39
|
-
end
|
|
40
|
-
RUBY
|
|
41
|
-
end
|
|
15
|
+
# @return [Hash] metadata information for all fields that index/show/form
|
|
16
|
+
# will copy
|
|
17
|
+
def fields
|
|
18
|
+
raise NotImplemented
|
|
19
|
+
end
|
|
42
20
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
21
|
+
# @param fields [Hash] metadata information for all fields
|
|
22
|
+
def fields=(fields)
|
|
23
|
+
@fields = ::ActiveSupport::HashWithIndifferentAccess.new fields
|
|
24
|
+
end
|
|
46
25
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
26
|
+
# @return [Array] field names
|
|
27
|
+
def field_names
|
|
28
|
+
@field_names ||= reposition fields.keys, primary_key
|
|
29
|
+
end
|
|
50
30
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
31
|
+
# @return [Hash] metadata information for a given field
|
|
32
|
+
def metadata_of(field_name)
|
|
33
|
+
fields[field_name] || {}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @return [String] label for a given field
|
|
37
|
+
def label_of(field_name)
|
|
38
|
+
metadata_of(field_name)[:label]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @return [String, Symbol] type for a given field
|
|
42
|
+
def type_of(field_name)
|
|
43
|
+
validate_presence_of metadata_of(field_name)[:type]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @return [Hash] metadata information for all fields that would be used on
|
|
47
|
+
# index page
|
|
48
|
+
def index_fields
|
|
49
|
+
raise NotImplemented
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# @param fields [Hash] metadata information for all fields that would be
|
|
53
|
+
# used on index page
|
|
54
|
+
def index_fields=(fields)
|
|
55
|
+
@index_fields = ::ActiveSupport::HashWithIndifferentAccess.new fields
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @return [Array] field names of index page
|
|
59
|
+
def index_field_names
|
|
60
|
+
@index_field_names ||= reposition index_fields.keys, primary_key
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @return [Hash] index metadata information for a given field
|
|
64
|
+
def index_metadata_of(field_name)
|
|
65
|
+
index_fields[field_name] || {}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @return [String] index label for a given field
|
|
69
|
+
def index_label_of(field_name)
|
|
70
|
+
index_metadata_of(field_name)[:label]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @return [String, Symbol] index type for a given field
|
|
74
|
+
def index_type_of(field_name)
|
|
75
|
+
validate_presence_of index_metadata_of(field_name)[:type]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @return [Hash] metadata information for all fields that would be used on
|
|
79
|
+
# show page
|
|
80
|
+
def show_fields
|
|
81
|
+
raise NotImplemented
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# @param fields [Hash] metadata information for all fields that would be
|
|
85
|
+
# used on show page
|
|
86
|
+
def show_fields=(fields)
|
|
87
|
+
@show_fields = ::ActiveSupport::HashWithIndifferentAccess.new fields
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# @return [Array] field names of show page
|
|
91
|
+
def show_field_names
|
|
92
|
+
@show_field_names ||= reposition show_fields.keys, primary_key
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @return [Hash] show metadata information for a given field
|
|
96
|
+
def show_metadata_of(field_name)
|
|
97
|
+
show_fields[field_name] || {}
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# @return [String] show label for a given field
|
|
101
|
+
def show_label_of(field_name)
|
|
102
|
+
show_metadata_of(field_name)[:label]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @return [String, Symbol] show type for a given field
|
|
106
|
+
def show_type_of(field_name)
|
|
107
|
+
validate_presence_of show_metadata_of(field_name)[:type]
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# @return [Hash] metadata information for all fields that would be used on
|
|
111
|
+
# form page
|
|
112
|
+
def form_fields
|
|
113
|
+
raise NotImplemented
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# @param fields [Hash] metadata information for all fields that would be
|
|
117
|
+
# used on form page
|
|
118
|
+
def form_fields=(fields)
|
|
119
|
+
@form_fields = ::ActiveSupport::HashWithIndifferentAccess.new fields
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# @return [Array] field names of form page
|
|
123
|
+
def form_field_names
|
|
124
|
+
@form_field_names ||= reposition form_fields.keys, primary_key
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @return [Hash] form metadata information for a given field
|
|
128
|
+
def form_metadata_of(field_name)
|
|
129
|
+
form_fields[field_name] || {}
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# @return [String] form label for a given field
|
|
133
|
+
def form_label_of(field_name)
|
|
134
|
+
form_metadata_of(field_name)[:label]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# @return [String, Symbol] form type for a given field
|
|
138
|
+
def form_type_of(field_name)
|
|
139
|
+
validate_presence_of form_metadata_of(field_name)[:type]
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# @return [Hash] custom filters
|
|
143
|
+
def filters
|
|
144
|
+
@filters ||= ::ActiveSupport::HashWithIndifferentAccess.new
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# @return [Hash] errors
|
|
148
|
+
def form_active_errors(_resource)
|
|
149
|
+
raise NotImplemented
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# @return [String] primary key
|
|
153
|
+
def primary_key
|
|
154
|
+
raise NotImplemented
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# @param _resource [Object] resource
|
|
158
|
+
# @return [String] title of given resource
|
|
159
|
+
def guess_title(_resource)
|
|
160
|
+
raise NotImplemented
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# @return [String] resources name mapped from model class
|
|
164
|
+
def resources_name
|
|
165
|
+
Map.resources_name_map @model_class
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
protected
|
|
169
|
+
|
|
170
|
+
# @param field_names [Array] field names
|
|
171
|
+
# @param primary_key [String] primary key name
|
|
172
|
+
# @return [Array] a list of field names that primary key goes first
|
|
173
|
+
def reposition(field_names, primary_key)
|
|
174
|
+
field_names.unshift(primary_key).uniq
|
|
175
|
+
end
|
|
54
176
|
|
|
55
|
-
|
|
56
|
-
|
|
177
|
+
# Ensure type is present
|
|
178
|
+
# @param type [String, Symbol, nil] type of a field
|
|
179
|
+
# @return [String, Symbol] type name
|
|
180
|
+
def validate_presence_of(type)
|
|
181
|
+
type || raise(::ArgumentError, 'Type is required.')
|
|
182
|
+
end
|
|
57
183
|
end
|
|
58
184
|
end
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Model finder interface
|
|
3
|
+
class ModelFinder
|
|
4
|
+
# Need to implement this method to get all the available model for a mode
|
|
5
|
+
def all
|
|
6
|
+
raise NotImplemented
|
|
7
|
+
end
|
|
4
8
|
end
|
|
5
9
|
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Model pagination provider interface
|
|
3
|
+
class ModelPaginationProvider
|
|
4
|
+
# @param collection
|
|
5
|
+
# @param params [ActionController::Parameters]
|
|
6
|
+
# @param options [Hash] options
|
|
7
|
+
# @param model_decorator [Wallaby::ModelDecorator, nil]
|
|
8
|
+
def initialize(collection, params, options: {}, model_decorator: nil)
|
|
9
|
+
@collection = collection
|
|
10
|
+
@params = params
|
|
11
|
+
@options = options
|
|
12
|
+
@model_decorator = model_decorator
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# If a collection has pagination feature
|
|
16
|
+
def paginatable?
|
|
17
|
+
raise NotImplemented
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Check and see if it's the first page
|
|
21
|
+
# @return boolean
|
|
22
|
+
def first_page?
|
|
23
|
+
page_number > first_page_number
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Check and see if it's the previous page
|
|
27
|
+
# @return boolean
|
|
28
|
+
def prev_page?
|
|
29
|
+
page_number > first_page_number
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Check and see if it's the last page
|
|
33
|
+
# @return boolean
|
|
34
|
+
def last_page?
|
|
35
|
+
page_number < last_page_number
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Check and see if it's the next page
|
|
39
|
+
# @return boolean
|
|
40
|
+
def next_page?
|
|
41
|
+
page_number < last_page_number
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Find out the offset `from`
|
|
45
|
+
# @return [Integer]
|
|
46
|
+
def from
|
|
47
|
+
(page_number - 1) * page_size + 1
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Find out the offset `to`
|
|
51
|
+
# @return [Integer]
|
|
52
|
+
def to
|
|
53
|
+
[page_number * page_size, total].min
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Find out the total count of current query
|
|
57
|
+
# @return [Integer]
|
|
58
|
+
def total
|
|
59
|
+
raise NotImplemented
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Find out the current page size
|
|
63
|
+
# @return [Integer]
|
|
64
|
+
def page_size
|
|
65
|
+
raise NotImplemented
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Find out the current page number
|
|
69
|
+
# @return [Integer]
|
|
70
|
+
def page_number
|
|
71
|
+
raise NotImplemented
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Page number of first page
|
|
75
|
+
# @return [Integer]
|
|
76
|
+
def first_page_number
|
|
77
|
+
1
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Page number of last page
|
|
81
|
+
# @return [Integer]
|
|
82
|
+
def last_page_number
|
|
83
|
+
number_of_pages
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Page number of previous page
|
|
87
|
+
# @return [Integer]
|
|
88
|
+
def prev_page_number
|
|
89
|
+
[page_number - 1, first_page_number].max
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Page number of next page
|
|
93
|
+
# @return [Integer]
|
|
94
|
+
def next_page_number
|
|
95
|
+
[page_number + 1, last_page_number].min
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Total number of pages
|
|
99
|
+
# @return [Integer]
|
|
100
|
+
def number_of_pages
|
|
101
|
+
(total / page_size.to_f).ceil
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Model service provider interface
|
|
3
|
+
class ModelServiceProvider
|
|
4
|
+
# @param model_class [Class] model class
|
|
5
|
+
# @param model_decorator [Wallaby::ModelDecorator, nil] model decorator
|
|
6
|
+
def initialize(model_class, model_decorator = nil)
|
|
7
|
+
raise ::ArgumentError, 'model class required' unless model_class
|
|
8
|
+
@model_class = model_class
|
|
9
|
+
@model_decorator = model_decorator || Map.model_decorator_map(model_class)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# To whitelist params for a model class
|
|
13
|
+
# @param _params [ActionController::Parameters]
|
|
14
|
+
def permit(_params)
|
|
15
|
+
raise NotImplemented
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Fetch collection by params
|
|
19
|
+
# @param _params [ActionController::Parameters]
|
|
20
|
+
# @param _authorizer
|
|
21
|
+
def collection(_params, _authorizer)
|
|
22
|
+
raise NotImplemented
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Paginate the records
|
|
26
|
+
# @param _query
|
|
27
|
+
# @param _params [ActionController::Parameters]
|
|
28
|
+
def paginate(_query, _params)
|
|
29
|
+
raise NotImplemented
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Initialize the model class using params
|
|
33
|
+
# @param _params [ActionController::Parameters]
|
|
34
|
+
# @param _authorizer
|
|
35
|
+
def new(_params, _authorizer)
|
|
36
|
+
raise NotImplemented
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Find a record using id
|
|
40
|
+
# @param _id [Object]
|
|
41
|
+
# @param _params [ActionController::Parameters]
|
|
42
|
+
# @param _authorizer
|
|
43
|
+
def find(_id, _params, _authorizer)
|
|
44
|
+
raise NotImplemented
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Save the newly initialized resource
|
|
48
|
+
# @param _resource [Object]
|
|
49
|
+
# @param _params [ActionController::Parameters]
|
|
50
|
+
# @param _authorizer
|
|
51
|
+
def create(_resource, _params, _authorizer)
|
|
52
|
+
raise NotImplemented
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Update the persisted resource
|
|
56
|
+
# @param _resource [Object]
|
|
57
|
+
# @param _params [ActionController::Parameters]
|
|
58
|
+
# @param _authorizer
|
|
59
|
+
def update(_resource, _params, _authorizer)
|
|
60
|
+
raise NotImplemented
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Destroy the given resource
|
|
64
|
+
# @param _resource [Object]
|
|
65
|
+
# @param _params [ActionController::Parameters]
|
|
66
|
+
# @param _authorizer
|
|
67
|
+
def destroy(_resource, _params, _authorizer)
|
|
68
|
+
raise NotImplemented
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Model paginator
|
|
3
|
+
class AbstractResourcePaginator
|
|
4
|
+
def self.model_class
|
|
5
|
+
return unless self < ::Wallaby::ResourcePaginator
|
|
6
|
+
Map.model_class_map name.gsub('Paginator', EMPTY_STRING)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Delegate methods to pagination provider
|
|
10
|
+
instance_methods =
|
|
11
|
+
ModelPaginationProvider.instance_methods - ::Object.instance_methods
|
|
12
|
+
delegate(*instance_methods, to: :@provider)
|
|
13
|
+
|
|
14
|
+
def initialize(model_class, collection, params)
|
|
15
|
+
@model_class = model_class || self.class.model_class
|
|
16
|
+
raise ArgumentError, 'model class required' unless @model_class
|
|
17
|
+
@collection = collection
|
|
18
|
+
@params = params
|
|
19
|
+
@provider =
|
|
20
|
+
Map.pagination_provider_map(@model_class).new(@collection, @params)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# a parser to handle colon query
|
|
3
|
+
class Parser < Parslet::Parser
|
|
4
|
+
root(:statement)
|
|
5
|
+
rule(:statement) { expression >> (space >> expression).repeat }
|
|
6
|
+
rule(:expression) { colon_query | general_keyword }
|
|
7
|
+
rule(:colon_query) do
|
|
8
|
+
name.as(:left) >> operator.as(:op) >> keywords.as(:right)
|
|
9
|
+
end
|
|
10
|
+
rule(:name) { (space.absent? >> colon.absent? >> any).repeat(1) }
|
|
11
|
+
rule(:operator) { colon >> match('[^\s\'\"\:\,0-9a-zA-Z]').repeat(0, 3) }
|
|
12
|
+
rule(:keywords) { general_keyword >> (comma >> general_keyword).repeat }
|
|
13
|
+
rule(:general_keyword) { quoted_keyword | keyword }
|
|
14
|
+
|
|
15
|
+
# basic elements
|
|
16
|
+
rule(:quoted_keyword) do
|
|
17
|
+
open_quote >>
|
|
18
|
+
(close_quote.absent? >> any).repeat.as(:keyword) >>
|
|
19
|
+
close_quote
|
|
20
|
+
end
|
|
21
|
+
rule(:keyword) { ((space | comma).absent? >> any).repeat.as(:keyword) }
|
|
22
|
+
|
|
23
|
+
# atomic entities
|
|
24
|
+
rule(:comma) { str(',') }
|
|
25
|
+
rule(:space) { match('\s').repeat(1) }
|
|
26
|
+
rule(:colon) { str(':') }
|
|
27
|
+
|
|
28
|
+
# open-close elements
|
|
29
|
+
rule(:open_quote) { match('[\'\"]').capture(:quote) }
|
|
30
|
+
rule(:close_quote) { dynamic { |_src, ctx| str(ctx.captures[:quote]) } }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# abstract responder for later usage
|
|
3
|
+
class AbstractResponder < ActionController::Responder
|
|
4
|
+
include ::Responders::FlashResponder
|
|
5
|
+
|
|
6
|
+
delegate :params, :headers, to: :request
|
|
7
|
+
|
|
8
|
+
def to_html
|
|
9
|
+
set_flash_message
|
|
10
|
+
if post? then create_action
|
|
11
|
+
elsif patch? || put? then update_action
|
|
12
|
+
elsif delete? then destroy_action
|
|
13
|
+
else default_render
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_csv
|
|
18
|
+
set_layout_to_none
|
|
19
|
+
headers['Content-Disposition'] = "attachment; filename=\"#{file_name}\""
|
|
20
|
+
default_render
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def to_json
|
|
24
|
+
set_layout_to_none
|
|
25
|
+
return default_render unless post? || patch? || put? || delete?
|
|
26
|
+
if has_errors? then \
|
|
27
|
+
render :bad_request, options.merge(status: :bad_request)
|
|
28
|
+
else render :form, options
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def create_action
|
|
35
|
+
if has_errors?
|
|
36
|
+
render :new, options
|
|
37
|
+
else
|
|
38
|
+
redirect_to resource_location
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def update_action
|
|
43
|
+
if has_errors?
|
|
44
|
+
render :edit, options
|
|
45
|
+
else
|
|
46
|
+
redirect_to resource_location
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def destroy_action
|
|
51
|
+
redirect_to resource_location
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def file_name
|
|
55
|
+
timestamp = Time.zone.now.to_s(:number)
|
|
56
|
+
"#{params[:resources]}-exported-#{timestamp}.#{format}"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def set_layout_to_none
|
|
60
|
+
options[:layout] = false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def set_flash_message
|
|
64
|
+
# @see FlashResponder
|
|
65
|
+
set_flash_message! if set_flash_message?
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Model servicer
|
|
3
|
+
class AbstractModelServicer
|
|
4
|
+
def self.model_class
|
|
5
|
+
return unless self < ::Wallaby::ModelServicer
|
|
6
|
+
Map.model_class_map name.gsub('Servicer', EMPTY_STRING)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def initialize(model_class = nil, authorizer = nil)
|
|
10
|
+
@model_class = model_class || self.class.model_class
|
|
11
|
+
raise ArgumentError, 'model class required' unless @model_class
|
|
12
|
+
@authorizer = authorizer
|
|
13
|
+
@provider = Map.service_provider_map @model_class
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def permit(params)
|
|
17
|
+
@provider.permit params
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def collection(params)
|
|
21
|
+
@provider.collection params, @authorizer
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def paginate(query, params)
|
|
25
|
+
@provider.paginate query, params
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def new(params)
|
|
29
|
+
@provider.new params, @authorizer
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def find(id, params)
|
|
33
|
+
@provider.find id, params, @authorizer
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def create(resource, params)
|
|
37
|
+
@provider.create resource, params, @authorizer
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def update(resource, params)
|
|
41
|
+
@provider.update resource, params, @authorizer
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def destroy(resource, params)
|
|
45
|
+
@provider.destroy resource, params, @authorizer
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Link renderer
|
|
3
|
+
class LinkOptionsNormalizer
|
|
4
|
+
class << self
|
|
5
|
+
def normalize(html_options, block, defaults)
|
|
6
|
+
block ||= defaults[:block]
|
|
7
|
+
html_options[:title] ||= defaults[:block].call
|
|
8
|
+
# allow empty class to be set
|
|
9
|
+
if !html_options.key?(:class) && defaults[:class]
|
|
10
|
+
html_options[:class] = defaults[:class]
|
|
11
|
+
end
|
|
12
|
+
[html_options, block]
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|