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
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
class ActiveRecord
|
|
3
|
+
# Model service provider
|
|
4
|
+
# @see Wallaby::ModelServiceProvider
|
|
5
|
+
class ModelServiceProvider < ::Wallaby::ModelServiceProvider
|
|
6
|
+
# @see Wallaby::ModelServiceProvider#permit
|
|
7
|
+
def permit(params)
|
|
8
|
+
return {} if params[param_key].blank?
|
|
9
|
+
# using fetch could avoid ActionController::ParameterMissing
|
|
10
|
+
params.fetch(param_key, {}).permit permitted_fields
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# @see Wallaby::ModelServiceProvider#collection
|
|
14
|
+
def collection(params, authorizer)
|
|
15
|
+
# NOTE: pagination free here
|
|
16
|
+
# since somewhere might use it without pagination
|
|
17
|
+
query = querier.search params
|
|
18
|
+
query = query.order params[:sort] if params[:sort].present?
|
|
19
|
+
query.accessible_by authorizer
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @see Wallaby::ModelServiceProvider#paginate
|
|
23
|
+
def paginate(query, params)
|
|
24
|
+
per = params[:per] || Wallaby.configuration.pagination.page_size
|
|
25
|
+
query = query.page params[:page] if query.respond_to? :page
|
|
26
|
+
query = query.per per if query.respond_to? :per
|
|
27
|
+
query
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @see Wallaby::ModelServiceProvider#new
|
|
31
|
+
def new(permitted_params, _authorizer)
|
|
32
|
+
@model_class.new normalize permitted_params
|
|
33
|
+
rescue ::ActiveModel::UnknownAttributeError
|
|
34
|
+
@model_class.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @see Wallaby::ModelServiceProvider#find
|
|
38
|
+
def find(id, permitted_params, _authorizer)
|
|
39
|
+
resource = @model_class.find id
|
|
40
|
+
resource.assign_attributes normalize permitted_params
|
|
41
|
+
resource
|
|
42
|
+
rescue ::ActiveRecord::RecordNotFound
|
|
43
|
+
raise ResourceNotFound, id
|
|
44
|
+
rescue ::ActiveModel::UnknownAttributeError
|
|
45
|
+
resource
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @see Wallaby::ModelServiceProvider#create
|
|
49
|
+
def create(resource_with_new_value, params, authorizer)
|
|
50
|
+
save __callee__, resource_with_new_value, params, authorizer
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @see Wallaby::ModelServiceProvider#update
|
|
54
|
+
def update(resource_with_new_value, params, authorizer)
|
|
55
|
+
save __callee__, resource_with_new_value, params, authorizer
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @see Wallaby::ModelServiceProvider#destroy
|
|
59
|
+
def destroy(resource, _params, _authorizer)
|
|
60
|
+
resource.destroy
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
protected
|
|
64
|
+
|
|
65
|
+
# Save the active record
|
|
66
|
+
# @param action [String] `create`, `update`
|
|
67
|
+
# @param resource [Object]
|
|
68
|
+
# @param _params [ActionController::Parameters]
|
|
69
|
+
# @param authorizer [Object]
|
|
70
|
+
# @return resource itself
|
|
71
|
+
def save(action, resource, _params, authorizer)
|
|
72
|
+
ensure_attributes_for authorizer, action, resource
|
|
73
|
+
resource.save if valid? resource
|
|
74
|
+
resource
|
|
75
|
+
rescue ::ActiveRecord::StatementInvalid => e
|
|
76
|
+
resource.errors.add :base, e.message
|
|
77
|
+
resource
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Normalize params
|
|
81
|
+
# @param params [ActionController::Parameters]
|
|
82
|
+
def normalize(params)
|
|
83
|
+
normalizer.normalize params
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# See if a resource is valid
|
|
87
|
+
# @param resource [Object]
|
|
88
|
+
# @return [Boolean]
|
|
89
|
+
def valid?(resource)
|
|
90
|
+
validator.valid? resource
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# To make sure that the record can be updated with the values that are
|
|
94
|
+
# allowed to.
|
|
95
|
+
# @param authorizer [Object]
|
|
96
|
+
# @param action [String]
|
|
97
|
+
# @param resource [Object]
|
|
98
|
+
def ensure_attributes_for(authorizer, action, resource)
|
|
99
|
+
return if authorizer.blank?
|
|
100
|
+
restricted_conditions = authorizer.attributes_for action, resource
|
|
101
|
+
resource.assign_attributes restricted_conditions
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# The params key
|
|
105
|
+
def param_key
|
|
106
|
+
@model_class.model_name.param_key
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# The list of attributes to whitelist
|
|
110
|
+
# @return [Array]
|
|
111
|
+
def permitted_fields
|
|
112
|
+
@permitted_fields ||=
|
|
113
|
+
permitter.simple_field_names << permitter.compound_hashed_fields
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# @see Wallaby::ModelServiceProvider::Permitter
|
|
117
|
+
def permitter
|
|
118
|
+
@permitter ||= Permitter.new @model_decorator
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# @see Wallaby::ModelServiceProvider::Querier
|
|
122
|
+
def querier
|
|
123
|
+
@querier ||= Querier.new @model_decorator
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# @see Wallaby::ModelServiceProvider::Normalizer
|
|
127
|
+
def normalizer
|
|
128
|
+
@normalizer ||= Normalizer.new @model_decorator
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# @see Wallaby::ModelServiceProvider::Validator
|
|
132
|
+
def validator
|
|
133
|
+
@validator ||= Validator.new @model_decorator
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Resource Decorator base class
|
|
3
|
+
class AbstractResourceDecorator
|
|
4
|
+
class << self
|
|
5
|
+
# Guess the model class from class name
|
|
6
|
+
# @return [Class]
|
|
7
|
+
def model_class
|
|
8
|
+
return unless self < ::Wallaby::ResourceDecorator
|
|
9
|
+
Map.model_class_map name.gsub 'Decorator', EMPTY_STRING
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Get the model decorator for the model class
|
|
13
|
+
# It should be the same as #model_decorator
|
|
14
|
+
# @return Wallaby::ModelDecorator
|
|
15
|
+
def model_decorator
|
|
16
|
+
return unless self < ::Wallaby::ResourceDecorator
|
|
17
|
+
Map.model_decorator_map model_class
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
delegation_methods =
|
|
21
|
+
ModelDecorator.instance_methods \
|
|
22
|
+
- ::Object.instance_methods - %i(model_class)
|
|
23
|
+
delegate(*delegation_methods, to: :model_decorator, allow_nil: true)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
attr_reader :resource, :model_decorator
|
|
27
|
+
|
|
28
|
+
def initialize(resource)
|
|
29
|
+
@resource = resource
|
|
30
|
+
@model_decorator = Map.model_decorator_map model_class
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @return [Class] resource's class
|
|
34
|
+
def model_class
|
|
35
|
+
@resource.class
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Guess the title for given resource
|
|
39
|
+
# It falls back to primary key value when no text field is found
|
|
40
|
+
# `.to_s` at the end is to ensure String is returned that won't cause any
|
|
41
|
+
# issue when `#to_label` is used in a link_to block. Coz integer is ignored.
|
|
42
|
+
# @return [String]
|
|
43
|
+
def to_label
|
|
44
|
+
(@model_decorator.guess_title(@resource) || primary_key_value).to_s
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Return the validation errors
|
|
48
|
+
# @return [Hash, Array]
|
|
49
|
+
def errors
|
|
50
|
+
@model_decorator.form_active_errors(@resource)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @return [Object] primary key value
|
|
54
|
+
def primary_key_value
|
|
55
|
+
@resource.public_send primary_key
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
delegation_methods =
|
|
59
|
+
ModelDecorator.instance_methods \
|
|
60
|
+
- ::Object.instance_methods - %i(model_class)
|
|
61
|
+
delegate(*delegation_methods, to: :model_decorator)
|
|
62
|
+
delegate :to_s, :to_param, to: :resource
|
|
63
|
+
|
|
64
|
+
# We delegate missing methods to resource
|
|
65
|
+
def method_missing(method_id, *args)
|
|
66
|
+
return super unless @resource.respond_to? method_id
|
|
67
|
+
@resource.public_send method_id, *args
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def respond_to_missing?(method_id, _include_private)
|
|
71
|
+
@resource.respond_to?(method_id) || super
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -1,78 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def model_decorator
|
|
10
|
-
if self < Wallaby::ResourceDecorator
|
|
11
|
-
@model_decorator ||= Wallaby::DecoratorFinder.new_model model_class
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def decorate(resource)
|
|
16
|
-
return resource if resource.is_a? Wallaby::ResourceDecorator
|
|
17
|
-
new resource
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
delegate *begin
|
|
21
|
-
Wallaby::ModelDecorator.instance_methods \
|
|
22
|
-
- Object.instance_methods - %i( model_class )
|
|
23
|
-
end, to: :model_decorator, allow_nil: true
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def initialize(resource)
|
|
27
|
-
@resource = resource
|
|
28
|
-
@model_decorator = self.class.model_decorator || Wallaby::DecoratorFinder.new_model(model_class)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def method_missing(method_id, *args)
|
|
32
|
-
if @resource.respond_to? method_id
|
|
33
|
-
@resource.public_send method_id, *args
|
|
34
|
-
else
|
|
35
|
-
super
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
delegate :to_s, :to_param, :to_params, to: :@resource
|
|
40
|
-
delegate *begin
|
|
41
|
-
Wallaby::ModelDecorator.instance_methods \
|
|
42
|
-
- %i( index_fields index_field_names show_fields show_field_names form_fields form_field_names ) \
|
|
43
|
-
- Object.instance_methods
|
|
44
|
-
end, to: :@model_decorator
|
|
45
|
-
attr_reader :model_decorator
|
|
46
|
-
|
|
47
|
-
def model_class
|
|
48
|
-
@resource.class
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def resource
|
|
52
|
-
@resource
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def to_label
|
|
56
|
-
@model_decorator.guess_title(@resource) || primary_key_value
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def errors
|
|
60
|
-
@model_decorator.form_active_errors(@resource)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def primary_key_value
|
|
64
|
-
@resource.public_send primary_key
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
[ '', 'index_', 'show_', 'form_' ].each do |prefix|
|
|
68
|
-
class_eval <<-RUBY
|
|
69
|
-
def #{ prefix }fields
|
|
70
|
-
@#{ prefix }fields ||= @model_decorator.#{ prefix }fields.dup.freeze
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def #{ prefix }field_names
|
|
74
|
-
@#{ prefix }field_names ||= @model_decorator.#{ prefix }field_names.dup.freeze
|
|
75
|
-
end
|
|
76
|
-
RUBY
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Resource Decorator
|
|
3
|
+
# @see Wallaby::AbstractResourceDecorator
|
|
4
|
+
# @overwritable
|
|
5
|
+
class ResourceDecorator < AbstractResourceDecorator
|
|
77
6
|
end
|
|
78
7
|
end
|
|
@@ -1,30 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Custom form builder to add more helper functions
|
|
3
|
+
class FormBuilder < ::ActionView::Helpers::FormBuilder
|
|
4
|
+
# Return error class if there is error
|
|
5
|
+
# @param field_name [String/Symbol]
|
|
6
|
+
# @return [String]
|
|
7
|
+
def error_class(field_name)
|
|
8
|
+
'has-error' if object.errors[field_name].present?
|
|
9
|
+
end
|
|
5
10
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return
|
|
11
|
+
# Build up the HTML for displaying error messages
|
|
12
|
+
# @param field_name [String/Symbol]
|
|
13
|
+
# @return [String] HTML
|
|
14
|
+
def error_messages(field_name)
|
|
15
|
+
errors = Array object.errors[field_name]
|
|
16
|
+
return if errors.blank?
|
|
9
17
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
content_tag :ul, class: 'errors' do
|
|
19
|
+
errors.each do |message|
|
|
20
|
+
concat content_tag :li, content_tag(:small, raw(message))
|
|
21
|
+
end
|
|
13
22
|
end
|
|
14
23
|
end
|
|
15
|
-
end
|
|
16
24
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
# Extend label to accept proc type `text` argument
|
|
26
|
+
def label(method, text = nil, options = {}, &block)
|
|
27
|
+
text = instance_exec(&text) if text.respond_to? :call
|
|
28
|
+
super
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Extend select to accept proc type `choices` argument
|
|
32
|
+
def select(method, choices = nil, options = {}, html_options = {}, &block)
|
|
33
|
+
choices = instance_exec(&choices) if choices.respond_to? :call
|
|
34
|
+
super
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
|
|
39
|
+
# Try to delegate method to `@template`
|
|
40
|
+
def method_missing(method, *args, &block)
|
|
41
|
+
return super unless @template.respond_to? method
|
|
42
|
+
# Delegate the method so that we don't come in here the next time
|
|
43
|
+
# same method is called
|
|
20
44
|
self.class.delegate method, to: :@template
|
|
21
45
|
@template.public_send method, *args, &block
|
|
22
|
-
else
|
|
23
|
-
super
|
|
24
46
|
end
|
|
25
|
-
end
|
|
26
47
|
|
|
27
|
-
|
|
28
|
-
|
|
48
|
+
# Pair with #method_missing
|
|
49
|
+
def respond_to_missing?(method, _include_private)
|
|
50
|
+
@template.respond_to?(method) || super
|
|
51
|
+
end
|
|
29
52
|
end
|
|
30
53
|
end
|
|
@@ -1,30 +1,40 @@
|
|
|
1
|
-
module Wallaby
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Application helper
|
|
3
|
+
module ApplicationHelper
|
|
4
|
+
# Override `actionview/lib/action_view/routing_url_for.rb#url_for`
|
|
5
|
+
# to handle the url_for properly for wallaby engine
|
|
6
|
+
def url_for(options = nil)
|
|
7
|
+
# possible Hash or Parameters
|
|
8
|
+
if options.respond_to?(:to_h) \
|
|
9
|
+
&& options[:resources].present? && options[:action].present?
|
|
10
|
+
UrlFor.handle wallaby_engine, options
|
|
11
|
+
else
|
|
12
|
+
super options
|
|
13
|
+
end
|
|
14
|
+
end
|
|
5
15
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
16
|
+
# Add turbolinks options when it's enabled
|
|
17
|
+
def stylesheet_link_tag(*sources)
|
|
18
|
+
default_options =
|
|
19
|
+
if Wallaby.configuration.features.turbolinks_enabled
|
|
20
|
+
{ 'data-turbolinks-track' => true }
|
|
21
|
+
else
|
|
22
|
+
{}
|
|
23
|
+
end
|
|
24
|
+
options = default_options.merge!(sources.extract_options!.stringify_keys)
|
|
25
|
+
super(*sources, options)
|
|
10
26
|
end
|
|
11
|
-
super
|
|
12
|
-
end
|
|
13
27
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
when 'show', 'update', 'destroy'
|
|
25
|
-
wallaby_engine.resource_path options
|
|
26
|
-
else
|
|
27
|
-
wallaby_engine.url_for options
|
|
28
|
+
# Add turbolinks options when it's enabled
|
|
29
|
+
def javascript_include_tag(*sources)
|
|
30
|
+
default_options =
|
|
31
|
+
if Wallaby.configuration.features.turbolinks_enabled
|
|
32
|
+
{ 'data-turbolinks-track' => true, 'data-turbolinks-eval' => false }
|
|
33
|
+
else
|
|
34
|
+
{}
|
|
35
|
+
end
|
|
36
|
+
options = default_options.merge!(sources.extract_options!.stringify_keys)
|
|
37
|
+
super(*sources, options)
|
|
28
38
|
end
|
|
29
39
|
end
|
|
30
40
|
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# NOTE: Global helper methods should go in here
|
|
3
|
+
module BaseHelper
|
|
4
|
+
include StylingHelper
|
|
5
|
+
include LinksHelper
|
|
6
|
+
|
|
7
|
+
# @see Utils.to_model_label
|
|
8
|
+
def to_model_label(model_class)
|
|
9
|
+
Utils.to_model_label model_class
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# @see Map.resources_name_map
|
|
13
|
+
def to_resources_name(model_class)
|
|
14
|
+
Map.resources_name_map model_class
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @return [String] css classes for body tag
|
|
18
|
+
def body_class
|
|
19
|
+
[
|
|
20
|
+
params[:action],
|
|
21
|
+
current_resources_name.try(:gsub, COLONS, '__'),
|
|
22
|
+
content_for(:custom_body_class)
|
|
23
|
+
].compact.join SPACE
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Turn a list of classes into tree structure
|
|
27
|
+
# @param classes [Array] a list of all the classes that wallaby supports
|
|
28
|
+
# @return [Array] a tree structure of given classes
|
|
29
|
+
def model_classes(classes = Map.model_classes)
|
|
30
|
+
nested_hash = classes.each_with_object({}) do |klass, hash|
|
|
31
|
+
hash[klass] = Node.new(klass)
|
|
32
|
+
end
|
|
33
|
+
nested_hash.each do |klass, node|
|
|
34
|
+
node.parent = parent = nested_hash[klass.superclass]
|
|
35
|
+
parent.children << node if parent
|
|
36
|
+
end
|
|
37
|
+
nested_hash.values.select { |v| v.parent.nil? }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @param array [Array] root classes
|
|
41
|
+
# @return [String] HTML for the whole tree
|
|
42
|
+
def model_tree(array)
|
|
43
|
+
return EMPTY_STRING.html_safe if array.blank?
|
|
44
|
+
content_tag :ul, class: 'dropdown-menu' do
|
|
45
|
+
array.sort_by(&:name).each do |node|
|
|
46
|
+
content = index_link(node.klass).try :<<, model_tree(node.children)
|
|
47
|
+
concat content_tag(:li, content)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -1,21 +1,45 @@
|
|
|
1
|
-
module Wallaby
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
locals[:metadata] = object.form_metadata_of locals[:field_name]
|
|
10
|
-
locals[:value] = object.public_send locals[:field_name]
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Form helper
|
|
3
|
+
module FormHelper
|
|
4
|
+
# @param options [Hash, String]
|
|
5
|
+
# @param locals [Hash] local variables for the partial
|
|
6
|
+
def form_type_partial_render(options = {}, locals = {}, &block)
|
|
7
|
+
PartialRenderer.render_form self, options, locals, &block
|
|
8
|
+
end
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
# To generate remote url for auto select plugin.
|
|
11
|
+
# @see app/assets/javascripts/wallaby/auto_select.js
|
|
12
|
+
# @param url [String, nil]
|
|
13
|
+
# if url is nil, it will fall back to default remote url
|
|
14
|
+
# @param model_class [Class]
|
|
15
|
+
# @param wildcard [String] wildcard that auto_select uses to replace with
|
|
16
|
+
# the typed keyword
|
|
17
|
+
def remote_url(url, model_class, wildcard = 'QUERY')
|
|
18
|
+
url ||
|
|
19
|
+
index_path(
|
|
20
|
+
model_class, url_params: {
|
|
21
|
+
q: wildcard, per: Wallaby.configuration.pagination.page_size
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
end
|
|
14
25
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
# To generate dropdown options (class => url) for polymorphic class.
|
|
27
|
+
# @see app/assets/javascripts/wallaby/auto_select.js
|
|
28
|
+
# This function will pull out remote urls from `metadata[:remote_urls]`
|
|
29
|
+
# (Class => url).
|
|
30
|
+
# @param metadata [Hash]
|
|
31
|
+
# @param wildcard [String]
|
|
32
|
+
# @param select_options [Hash]
|
|
33
|
+
# @return [String] HTML
|
|
34
|
+
def polymorphic_options(metadata, wildcard = 'QUERY', select_options = {})
|
|
35
|
+
urls = metadata[:remote_urls] || {}
|
|
36
|
+
options = (metadata[:polymorphic_list] || []).map do |klass|
|
|
37
|
+
[
|
|
38
|
+
klass, klass,
|
|
39
|
+
{ data: { url: remote_url(urls[klass], klass, wildcard) } }
|
|
40
|
+
]
|
|
41
|
+
end
|
|
42
|
+
options_for_select options, select_options
|
|
19
43
|
end
|
|
20
44
|
end
|
|
21
45
|
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module Wallaby
|
|
2
|
+
# Helper methods for index page
|
|
3
|
+
module IndexHelper
|
|
4
|
+
# Wrap the collection with paginator
|
|
5
|
+
# @param model_class [Class]
|
|
6
|
+
# @param collection [#map]
|
|
7
|
+
# @param params [ActionController::Parameters]
|
|
8
|
+
# @return [Wallaby::ResourcePaginator]
|
|
9
|
+
def paginate(model_class, collection, params)
|
|
10
|
+
Map.paginator_map(model_class).new model_class, collection, params
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Just a label
|
|
14
|
+
# @return [String]
|
|
15
|
+
def all_label
|
|
16
|
+
t 'filters.all'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Label for a given name
|
|
20
|
+
# @param filter_name [String, Symbol]
|
|
21
|
+
# @param filters [Hash]
|
|
22
|
+
# @return [String]
|
|
23
|
+
def filter_label(filter_name, filters)
|
|
24
|
+
filters[filter_name].try(:[], :label) || filter_name.to_s.humanize
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Export link for a given model_class
|
|
28
|
+
# @param model_class [Class]
|
|
29
|
+
# @return [String] HTML anchor link
|
|
30
|
+
def export_link(model_class)
|
|
31
|
+
url_params = index_params.except(:page, :per).merge(format: 'csv')
|
|
32
|
+
index_link model_class, url_params: url_params do
|
|
33
|
+
t 'links.export', ext: 'CSV'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Link for a given model class and filter name
|
|
38
|
+
# @param model_class [Class]
|
|
39
|
+
# @param filter_name [String, Symbol]
|
|
40
|
+
# @param filters [Hash]
|
|
41
|
+
# @return [String] HTML anchor link
|
|
42
|
+
def filter_link(model_class, filter_name, filters)
|
|
43
|
+
is_all = filter_name == :all
|
|
44
|
+
config = filters[filter_name] || {}
|
|
45
|
+
label = is_all ? all_label : filter_label(filter_name, filters)
|
|
46
|
+
url_params = if config[:default] then index_params.except(:filter)
|
|
47
|
+
else index_params.merge(filter: filter_name)
|
|
48
|
+
end
|
|
49
|
+
index_link(model_class, url_params: url_params) { label }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Sort link builder
|
|
53
|
+
# @return [Sorting::LinkBuilder]
|
|
54
|
+
def sort_link_builder
|
|
55
|
+
@sort_link_builder ||=
|
|
56
|
+
Sorting::LinkBuilder.new current_model_decorator, index_params, self
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|