blacklight 7.33.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.env +3 -2
- data/.github/workflows/ruby.yml +38 -107
- data/.gitignore +1 -0
- data/.rubocop.yml +243 -2
- data/.rubocop_todo.yml +216 -270
- data/Gemfile +7 -6
- data/README.md +12 -4
- data/Rakefile +18 -0
- data/VERSION +1 -1
- data/app/assets/config/blacklight/manifest.js +3 -0
- data/app/assets/javascripts/blacklight/blacklight.esm.js +376 -0
- data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -0
- data/app/assets/javascripts/blacklight/blacklight.js +332 -485
- data/app/assets/javascripts/blacklight/blacklight.js.map +1 -0
- data/app/assets/stylesheets/blacklight/_autocomplete.scss +25 -0
- data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -1
- data/app/assets/stylesheets/blacklight/_bookmark.scss +16 -0
- data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +8 -0
- data/app/assets/stylesheets/blacklight/_facets.scss +104 -49
- data/app/assets/stylesheets/blacklight/_header.scss +0 -15
- data/app/assets/stylesheets/blacklight/_icons.scss +0 -14
- data/app/assets/stylesheets/blacklight/_mixins.scss +20 -0
- data/app/assets/stylesheets/blacklight/_modal.scss +8 -2
- data/app/assets/stylesheets/blacklight/_search_form.scss +30 -3
- data/app/assets/stylesheets/blacklight/_search_history.scss +10 -1
- data/app/assets/stylesheets/blacklight/_search_results.scss +6 -2
- data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +4 -1
- data/app/builders/blacklight/action_builder.rb +18 -9
- data/app/components/blacklight/advanced_search_form_component.html.erb +1 -1
- data/app/components/blacklight/advanced_search_form_component.rb +7 -9
- data/app/components/blacklight/constraints_component.rb +27 -37
- data/app/components/blacklight/document/action_component.html.erb +2 -9
- data/app/components/blacklight/document/action_component.rb +26 -8
- data/app/components/blacklight/document/actions_component.rb +2 -2
- data/app/components/blacklight/document/bookmark_component.html.erb +9 -0
- data/app/components/blacklight/document/bookmark_component.rb +4 -2
- data/app/components/blacklight/document/citation_component.rb +5 -3
- data/app/components/blacklight/document/group_component.rb +7 -3
- data/app/components/blacklight/document/show_tools_component.html.erb +12 -0
- data/app/components/blacklight/document/show_tools_component.rb +23 -0
- data/app/components/blacklight/document/sidebar_component.html.erb +2 -0
- data/app/components/blacklight/document/sidebar_component.rb +16 -0
- data/app/components/blacklight/document/thumbnail_component.html.erb +2 -7
- data/app/components/blacklight/document/thumbnail_component.rb +1 -9
- data/app/components/blacklight/document_component.html.erb +4 -0
- data/app/components/blacklight/document_component.rb +54 -42
- data/app/components/blacklight/document_metadata_component.html.erb +4 -2
- data/app/components/blacklight/document_metadata_component.rb +11 -6
- data/app/components/blacklight/document_title_component.rb +4 -1
- data/app/components/blacklight/facet_component.rb +1 -1
- data/app/components/blacklight/facet_field_checkboxes_component.html.erb +3 -3
- data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
- data/app/components/blacklight/facet_field_component.html.erb +5 -5
- data/app/components/blacklight/facet_field_component.rb +9 -2
- data/app/components/blacklight/facet_field_list_component.html.erb +3 -3
- data/app/components/blacklight/facet_field_list_component.rb +37 -5
- data/app/components/blacklight/facet_field_no_layout_component.rb +0 -2
- data/app/components/blacklight/facet_item_component.rb +1 -43
- data/app/components/blacklight/facet_item_pivot_component.rb +21 -23
- data/app/components/blacklight/header_component.html.erb +2 -0
- data/app/components/blacklight/header_component.rb +26 -0
- data/app/components/blacklight/hidden_search_state_component.rb +1 -2
- data/app/components/blacklight/icons/legacy_icon_component.rb +30 -0
- data/app/components/blacklight/icons/list_component.rb +16 -0
- data/app/components/blacklight/icons/search_component.rb +16 -0
- data/app/components/blacklight/metadata_field_component.html.erb +2 -2
- data/app/components/blacklight/metadata_field_component.rb +24 -8
- data/app/components/blacklight/metadata_field_layout_component.rb +7 -22
- data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +17 -0
- data/app/components/blacklight/response/facet_group_component.html.erb +5 -6
- data/app/components/blacklight/response/facet_group_component.rb +29 -8
- data/app/components/blacklight/response/sort_component.rb +2 -2
- data/app/components/blacklight/response/spellcheck_component.rb +18 -7
- data/app/components/blacklight/response/view_type_button_component.rb +3 -7
- data/app/components/blacklight/response/view_type_component.rb +4 -6
- data/app/components/blacklight/search/sidebar_component.html.erb +8 -0
- data/app/components/blacklight/search/sidebar_component.rb +17 -0
- data/app/components/blacklight/search_bar_component.html.erb +20 -15
- data/app/components/blacklight/search_bar_component.rb +2 -16
- data/app/components/blacklight/search_button_component.rb +3 -3
- data/app/components/blacklight/search_context/server_applied_params_component.html.erb +4 -0
- data/app/components/blacklight/search_context/server_applied_params_component.rb +13 -0
- data/app/components/blacklight/search_context/server_item_pagination_component.rb +71 -0
- data/app/components/blacklight/search_header_component.html.erb +2 -0
- data/app/components/blacklight/search_header_component.rb +6 -0
- data/app/components/blacklight/search_navbar_component.html.erb +5 -0
- data/app/components/blacklight/search_navbar_component.rb +34 -0
- data/app/components/blacklight/start_over_button_component.rb +5 -3
- data/app/components/blacklight/system/dropdown_component.rb +3 -3
- data/app/components/blacklight/system/flash_message_component.html.erb +3 -1
- data/app/components/blacklight/system/flash_message_component.rb +12 -3
- data/app/components/blacklight/system/modal_component.html.erb +1 -1
- data/app/components/blacklight/system/modal_component.rb +1 -3
- data/app/components/blacklight/top_navbar_component.html.erb +12 -0
- data/app/components/blacklight/top_navbar_component.rb +17 -0
- data/app/controllers/bookmarks_controller.rb +1 -0
- data/app/controllers/catalog_controller.rb +1 -0
- data/app/controllers/concerns/blacklight/bookmarks.rb +11 -6
- data/app/controllers/concerns/blacklight/catalog.rb +21 -72
- data/app/controllers/concerns/blacklight/controller.rb +6 -43
- data/app/controllers/concerns/blacklight/search_context.rb +71 -13
- data/app/controllers/concerns/blacklight/search_history.rb +2 -0
- data/app/controllers/concerns/blacklight/searchable.rb +12 -1
- data/app/controllers/concerns/blacklight/token_based_user.rb +1 -0
- data/app/controllers/search_history_controller.rb +1 -0
- data/app/helpers/blacklight/blacklight_helper_behavior.rb +1 -400
- data/app/helpers/blacklight/catalog_helper_behavior.rb +40 -182
- data/app/helpers/blacklight/component_helper_behavior.rb +1 -63
- data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -117
- data/app/helpers/blacklight/document_helper_behavior.rb +76 -0
- data/app/helpers/blacklight/facets_helper_behavior.rb +4 -321
- data/app/helpers/blacklight/icon_helper_behavior.rb +5 -4
- data/app/helpers/blacklight/layout_helper_behavior.rb +60 -0
- data/app/helpers/blacklight/render_partials_helper_behavior.rb +12 -30
- data/app/helpers/blacklight/url_helper_behavior.rb +21 -97
- data/app/helpers/blacklight_helper.rb +1 -0
- data/app/helpers/catalog_helper.rb +1 -0
- data/app/javascript/blacklight/bookmark_toggle.js +9 -22
- data/app/javascript/blacklight/button_focus.js +9 -7
- data/app/javascript/blacklight/checkbox_submit.js +68 -122
- data/app/javascript/blacklight/core.js +6 -5
- data/app/javascript/blacklight/index.js +14 -0
- data/app/javascript/blacklight/modal.js +100 -165
- data/app/javascript/blacklight/modalForm.js +60 -0
- data/app/javascript/blacklight/search_context.js +13 -29
- data/app/models/blacklight/facet_paginator.rb +3 -2
- data/app/models/blacklight/icon.rb +4 -2
- data/app/models/bookmark.rb +0 -2
- data/app/models/concerns/blacklight/configurable.rb +5 -4
- data/app/models/concerns/blacklight/document/active_model_shim.rb +1 -0
- data/app/models/concerns/blacklight/document/attributes.rb +50 -0
- data/app/models/concerns/blacklight/document/cache_key.rb +1 -0
- data/app/models/concerns/blacklight/document/dublin_core.rb +2 -1
- data/app/models/concerns/blacklight/document/export.rb +2 -1
- data/app/models/concerns/blacklight/document/extensions.rb +1 -0
- data/app/models/concerns/blacklight/document/schema_org.rb +1 -0
- data/app/models/concerns/blacklight/document/semantic_fields.rb +1 -0
- data/app/models/concerns/blacklight/document.rb +23 -20
- data/app/models/concerns/blacklight/suggest/response.rb +1 -0
- data/app/models/concerns/blacklight/user.rb +17 -8
- data/app/models/record_mailer.rb +23 -18
- data/app/models/search.rb +0 -1
- data/app/models/solr_document.rb +1 -0
- data/app/presenters/blacklight/clause_presenter.rb +1 -1
- data/app/presenters/blacklight/document_presenter.rb +24 -30
- data/app/presenters/blacklight/facet_field_presenter.rb +39 -14
- data/app/presenters/blacklight/facet_grouped_item_presenter.rb +1 -5
- data/app/presenters/blacklight/facet_item_pivot_presenter.rb +60 -0
- data/app/presenters/blacklight/facet_item_presenter.rb +3 -9
- data/app/presenters/blacklight/field_presenter.rb +1 -0
- data/app/presenters/blacklight/index_presenter.rb +2 -40
- data/app/presenters/blacklight/json_presenter.rb +7 -5
- data/app/presenters/blacklight/rendering/abstract_step.rb +4 -0
- data/app/presenters/blacklight/rendering/join.rb +7 -1
- data/app/presenters/blacklight/rendering/link_to_facet.rb +3 -6
- data/app/presenters/blacklight/rendering/microdata.rb +1 -1
- data/app/presenters/blacklight/show_presenter.rb +1 -9
- data/app/presenters/blacklight/thumbnail_presenter.rb +1 -1
- data/app/services/blacklight/bookmarks_search_builder.rb +22 -0
- data/app/services/blacklight/field_retriever.rb +1 -8
- data/app/services/blacklight/search_service.rb +9 -7
- data/app/values/blacklight/types.rb +95 -11
- data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +8 -1
- data/app/views/bookmarks/_tools.html.erb +7 -12
- data/app/views/catalog/_advanced_search_form.html.erb +0 -1
- data/app/views/catalog/_bookmark_control.html.erb +1 -1
- data/app/views/catalog/_constraints.html.erb +1 -14
- data/app/views/catalog/_document.atom.builder +12 -14
- data/app/views/catalog/_document.html.erb +3 -6
- data/app/views/catalog/_document.rss.builder +2 -4
- data/app/views/catalog/_document_list.html.erb +2 -1
- data/app/views/catalog/_facet_layout.html.erb +2 -2
- data/app/views/catalog/_facets.html.erb +5 -4
- data/app/views/catalog/_home_text.html.erb +2 -14
- data/app/views/catalog/_search_form.html.erb +3 -3
- data/app/views/catalog/_search_header.html.erb +1 -2
- data/app/views/catalog/_search_results.html.erb +2 -2
- data/app/views/catalog/_search_sidebar.html.erb +5 -1
- data/app/views/catalog/_show_main_content.html.erb +8 -19
- data/app/views/catalog/_show_sidebar.html.erb +2 -2
- data/app/views/catalog/_show_tools.html.erb +1 -19
- data/app/views/catalog/_view_type_group.html.erb +1 -1
- data/app/views/catalog/email_success.html.erb +5 -6
- data/app/views/catalog/facet.html.erb +7 -5
- data/app/views/catalog/index.atom.builder +12 -14
- data/app/views/catalog/index.html.erb +7 -1
- data/app/views/catalog/index.json.jbuilder +19 -19
- data/app/views/catalog/index.rss.builder +1 -1
- data/app/views/catalog/opensearch.xml.builder +1 -1
- data/app/views/catalog/show.html.erb +1 -6
- data/app/views/catalog/sms_success.html.erb +5 -6
- data/app/views/catalog/suggest.html.erb +3 -0
- data/app/views/layouts/blacklight/base.html.erb +19 -9
- data/app/views/record_mailer/email_record.text.erb +4 -3
- data/app/views/record_mailer/sms_record.text.erb +4 -4
- data/app/views/search_history/index.html.erb +6 -2
- data/app/views/shared/_header_navbar.html.erb +1 -22
- data/app/views/shared/_modal.html.erb +3 -3
- data/blacklight.gemspec +8 -10
- data/config/importmap.rb +3 -0
- data/config/locales/blacklight.ar.yml +209 -233
- data/config/locales/blacklight.ca.yml +0 -7
- data/config/locales/blacklight.de.yml +197 -216
- data/config/locales/blacklight.en.yml +2 -7
- data/config/locales/blacklight.es.yml +196 -216
- data/config/locales/blacklight.fr.yml +196 -220
- data/config/locales/blacklight.hu.yml +193 -213
- data/config/locales/blacklight.it.yml +197 -216
- data/config/locales/blacklight.nl.yml +193 -213
- data/config/locales/blacklight.pt-BR.yml +195 -216
- data/config/locales/blacklight.sq.yml +193 -213
- data/config/locales/blacklight.zh.yml +194 -214
- data/config/routes.rb +3 -2
- data/db/migrate/20140202020201_create_searches.rb +1 -0
- data/db/migrate/20140202020202_create_bookmarks.rb +1 -0
- data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -0
- data/docker-compose.yml +1 -0
- data/lib/blacklight/abstract_repository.rb +1 -0
- data/lib/blacklight/configuration/context.rb +4 -4
- data/lib/blacklight/configuration/display_field.rb +7 -9
- data/lib/blacklight/configuration/facet_field.rb +17 -11
- data/lib/blacklight/configuration/field.rb +1 -0
- data/lib/blacklight/configuration/fields.rb +12 -15
- data/lib/blacklight/configuration/index_field.rb +1 -0
- data/lib/blacklight/configuration/null_display_field.rb +17 -0
- data/lib/blacklight/configuration/search_field.rb +1 -0
- data/lib/blacklight/configuration/session_tracking_config.rb +45 -0
- data/lib/blacklight/configuration/show_field.rb +1 -0
- data/lib/blacklight/configuration/sort_field.rb +1 -0
- data/lib/blacklight/configuration/tool_config.rb +1 -0
- data/lib/blacklight/configuration/view_config.rb +16 -10
- data/lib/blacklight/configuration.rb +322 -341
- data/lib/blacklight/engine.rb +13 -15
- data/lib/blacklight/exceptions.rb +2 -2
- data/lib/blacklight/nested_open_struct_with_hash_access.rb +6 -12
- data/lib/blacklight/open_struct_with_hash_access.rb +19 -17
- data/lib/blacklight/parameters.rb +7 -21
- data/lib/blacklight/routes/exportable.rb +1 -0
- data/lib/blacklight/routes/searchable.rb +3 -1
- data/lib/blacklight/routes.rb +1 -0
- data/lib/blacklight/search_builder.rb +10 -10
- data/lib/blacklight/search_state/filter_field.rb +8 -25
- data/lib/blacklight/search_state/pivot_filter_field.rb +144 -0
- data/lib/blacklight/search_state.rb +23 -79
- data/lib/blacklight/solr/document.rb +1 -0
- data/lib/blacklight/solr/facet_paginator.rb +1 -0
- data/lib/blacklight/solr/repository.rb +1 -0
- data/lib/blacklight/solr/request.rb +3 -0
- data/lib/blacklight/solr/response/facets.rb +21 -5
- data/lib/blacklight/solr/response/group.rb +1 -0
- data/lib/blacklight/solr/response/group_response.rb +1 -0
- data/lib/blacklight/solr/response/more_like_this.rb +1 -0
- data/lib/blacklight/solr/response/pagination_methods.rb +4 -3
- data/lib/blacklight/solr/response/params.rb +5 -4
- data/lib/blacklight/solr/response/response.rb +1 -0
- data/lib/blacklight/solr/response/spelling.rb +1 -0
- data/lib/blacklight/solr/response.rb +4 -3
- data/lib/blacklight/solr/search_builder_behavior.rb +16 -32
- data/lib/blacklight/solr.rb +1 -0
- data/lib/blacklight/version.rb +1 -0
- data/lib/blacklight.rb +8 -11
- data/lib/generators/blacklight/assets/importmap_generator.rb +56 -0
- data/lib/generators/blacklight/assets/propshaft_generator.rb +34 -0
- data/lib/generators/blacklight/assets/sprockets_generator.rb +68 -0
- data/lib/generators/blacklight/assets_generator.rb +14 -88
- data/lib/generators/blacklight/controller_generator.rb +3 -2
- data/lib/generators/blacklight/document_generator.rb +1 -0
- data/lib/generators/blacklight/install_generator.rb +7 -4
- data/lib/generators/blacklight/models_generator.rb +1 -0
- data/lib/generators/blacklight/search_builder_generator.rb +1 -0
- data/lib/generators/blacklight/solr_generator.rb +1 -1
- data/lib/generators/blacklight/templates/catalog_controller.rb +37 -7
- data/lib/generators/blacklight/templates/solr_document.rb +1 -7
- data/lib/generators/blacklight/test_support_generator.rb +4 -2
- data/lib/generators/blacklight/user_generator.rb +7 -9
- data/lib/railties/blacklight.rake +2 -3
- data/package.json +10 -10
- data/rollup.config.js +37 -0
- data/spec/components/blacklight/constraints_component_spec.rb +17 -13
- data/spec/components/blacklight/document_component_spec.rb +74 -33
- data/spec/components/blacklight/facet_component_spec.rb +2 -7
- data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +1 -2
- data/spec/components/blacklight/facet_field_list_component_spec.rb +7 -6
- data/spec/components/blacklight/facet_item_pivot_component_spec.rb +9 -7
- data/spec/components/blacklight/header_component_spec.rb +20 -0
- data/spec/components/blacklight/response/view_type_component_spec.rb +83 -0
- data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
- data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +29 -0
- data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +51 -0
- data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +1 -6
- data/spec/controllers/blacklight/{base_spec.rb → catalog_spec.rb} +2 -2
- data/spec/controllers/bookmarks_controller_spec.rb +2 -3
- data/spec/controllers/catalog_controller_spec.rb +24 -126
- data/spec/features/autocomplete_spec.rb +1 -1
- data/spec/features/axe_spec.rb +1 -1
- data/spec/features/bookmarks_spec.rb +1 -1
- data/spec/features/component_template_override_spec.rb +8 -0
- data/spec/features/facets_spec.rb +1 -1
- data/spec/features/modal_spec.rb +12 -0
- data/spec/features/search_context_spec.rb +4 -10
- data/spec/features/search_results_spec.rb +0 -33
- data/spec/features/sitelinks_search_box_spec.rb +13 -0
- data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +2 -138
- data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +0 -387
- data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
- data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +5 -7
- data/spec/helpers/blacklight/url_helper_behavior_spec.rb +10 -132
- data/spec/helpers/blacklight_helper_spec.rb +3 -298
- data/spec/helpers/catalog_helper_spec.rb +60 -115
- data/spec/i18n_spec.rb +1 -0
- data/spec/integration/generators/blacklight/solr_generator_spec.rb +1 -1
- data/spec/lib/blacklight/configuration/facet_field_spec.rb +27 -16
- data/spec/lib/blacklight/configuration/field_spec.rb +1 -1
- data/spec/lib/blacklight/configuration/session_tracking_config_spec.rb +38 -0
- data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
- data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +4 -4
- data/spec/lib/blacklight/parameters_spec.rb +1 -4
- data/spec/lib/blacklight/search_state/filter_field_spec.rb +4 -4
- data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +117 -0
- data/spec/lib/blacklight/search_state_spec.rb +80 -198
- data/spec/lib/tasks/blacklight_task_spec.rb +1 -0
- data/spec/models/blacklight/configuration_spec.rb +41 -53
- data/spec/models/blacklight/document/active_model_shim_spec.rb +2 -2
- data/spec/models/blacklight/icon_spec.rb +29 -15
- data/spec/models/blacklight/search_builder_spec.rb +12 -12
- data/spec/models/blacklight/solr/document_spec.rb +3 -3
- data/spec/models/blacklight/solr/request_spec.rb +2 -2
- data/spec/models/blacklight/solr/response/facets_spec.rb +27 -27
- data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -0
- data/spec/models/blacklight/solr/response/group_spec.rb +1 -0
- data/spec/models/blacklight/solr/response_spec.rb +9 -2
- data/spec/models/blacklight/solr/search_builder_spec.rb +32 -23
- data/spec/models/blacklight/user_spec.rb +22 -0
- data/spec/models/record_mailer_spec.rb +36 -23
- data/spec/models/solr_document_spec.rb +21 -3
- data/spec/presenters/blacklight/clause_presenter_spec.rb +1 -0
- data/spec/presenters/blacklight/document_presenter_spec.rb +3 -2
- data/spec/presenters/blacklight/facet_field_presenter_spec.rb +85 -12
- data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +1 -0
- data/spec/presenters/blacklight/facet_item_presenter_spec.rb +14 -13
- data/spec/presenters/blacklight/field_presenter_spec.rb +2 -16
- data/spec/presenters/blacklight/index_presenter_spec.rb +3 -4
- data/spec/presenters/blacklight/json_presenter_spec.rb +1 -0
- data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -2
- data/spec/presenters/blacklight/show_presenter_spec.rb +11 -25
- data/spec/presenters/pipeline_spec.rb +13 -2
- data/spec/presenters/thumbnail_presenter_spec.rb +1 -1
- data/spec/requests/load_suggestions_spec.rb +16 -0
- data/spec/routing/catalog_routing_spec.rb +6 -1
- data/spec/services/blacklight/search_service_spec.rb +31 -68
- data/spec/spec_helper.rb +4 -3
- data/spec/support/controller_level_helpers.rb +1 -2
- data/spec/support/features/search_helpers.rb +39 -0
- data/spec/support/features/session_helpers.rb +1 -0
- data/spec/support/features.rb +3 -0
- data/spec/support/view_component_test_helpers.rb +21 -0
- data/spec/test_app_templates/Gemfile.extra +4 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +17 -2
- data/spec/views/catalog/_document.html.erb_spec.rb +23 -33
- data/spec/views/catalog/_document_list.html.erb_spec.rb +7 -2
- data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_search_header.erb_spec.rb +1 -0
- data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
- data/spec/views/catalog/_show_tools.html.erb_spec.rb +7 -54
- data/spec/views/catalog/_view_type_group.html.erb_spec.rb +17 -9
- data/spec/views/catalog/email_success.html.erb_spec.rb +2 -2
- data/spec/views/catalog/facet.html.erb_spec.rb +6 -3
- data/spec/views/catalog/index.atom.builder_spec.rb +18 -11
- data/spec/views/catalog/index.html.erb_spec.rb +5 -6
- data/spec/views/catalog/index.json.jbuilder_spec.rb +3 -3
- data/spec/views/catalog/show.html.erb_spec.rb +3 -25
- data/spec/views/catalog/sms_success.html.erb_spec.rb +2 -2
- data/tasks/blacklight.rake +7 -5
- metadata +95 -123
- data/.babelrc +0 -11
- data/app/assets/images/blacklight/list.svg +0 -1
- data/app/assets/images/blacklight/search.svg +0 -1
- data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +0 -37
- data/app/components/blacklight/content_areas_shim.rb +0 -13
- data/app/components/blacklight/search_context_component.rb +0 -34
- data/app/controllers/concerns/blacklight/base.rb +0 -7
- data/app/controllers/concerns/blacklight/default_component_configuration.rb +0 -64
- data/app/controllers/concerns/blacklight/facet.rb +0 -69
- data/app/controllers/concerns/blacklight/search_fields.rb +0 -46
- data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +0 -27
- data/app/helpers/blacklight/render_constraints_helper_behavior.rb +0 -188
- data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +0 -97
- data/app/helpers/blacklight/suggest_helper_behavior.rb +0 -13
- data/app/javascript/blacklight/autocomplete.js +0 -36
- data/app/javascript/blacklight/facet_load.js +0 -22
- data/app/models/concerns/blacklight/document/email.rb +0 -26
- data/app/models/concerns/blacklight/document/sms.rb +0 -24
- data/app/presenters/blacklight/search_bar_presenter.rb +0 -47
- data/app/views/catalog/_constraints_element.html.erb +0 -14
- data/app/views/catalog/_document_action.html.erb +0 -5
- data/app/views/catalog/_facet_group.html.erb +0 -5
- data/app/views/catalog/_facet_limit.html.erb +0 -3
- data/app/views/catalog/_index.html.erb +0 -1
- data/app/views/catalog/_index_header.html.erb +0 -22
- data/app/views/catalog/_previous_next_doc.html.erb +0 -2
- data/app/views/catalog/_show.html.erb +0 -6
- data/app/views/catalog/_show_header.html.erb +0 -2
- data/app/views/catalog/_thumbnail.html.erb +0 -1
- data/lib/blacklight/deprecations/engine_configuration.rb +0 -66
- data/lib/blacklight/deprecations/search_state_normalization.rb +0 -52
- data/spec/controllers/blacklight/facet_spec.rb +0 -33
- data/spec/controllers/blacklight/search_fields_spec.rb +0 -62
- data/spec/features/sitelinks_search_box.rb +0 -13
- data/spec/helpers/blacklight/hash_as_hidden_fields_behavior_spec.rb +0 -26
- data/spec/helpers/blacklight/render_constraints_helper_behavior_spec.rb +0 -92
- data/spec/helpers/blacklight/search_history_constraints_helper_behavior_spec.rb +0 -108
- data/spec/helpers/blacklight/suggest_helper_behavior_spec.rb +0 -48
- data/spec/lib/blacklight/engine_spec.rb +0 -41
- data/spec/models/blacklight/document/email_spec.rb +0 -57
- data/spec/models/blacklight/document/sms_spec.rb +0 -58
- data/spec/presenters/blacklight/search_bar_presenter_spec.rb +0 -94
- data/spec/support/view_component_capybara_test_helpers.rb +0 -8
- data/spec/views/catalog/_constraints.html.erb_spec.rb +0 -33
- data/spec/views/catalog/_facet_group.html.erb_spec.rb +0 -84
- data/spec/views/catalog/_facets.html.erb_spec.rb +0 -15
- data/spec/views/catalog/_index.html.erb_spec.rb +0 -62
- data/spec/views/catalog/_index_header.html.erb_spec.rb +0 -35
- data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +0 -22
- data/spec/views/catalog/_show.html.erb_spec.rb +0 -62
- data/spec/views/catalog/_thumbnail.html.erb_spec.rb +0 -38
- /data/app/components/blacklight/{search_context_component.html.erb → search_context/server_item_pagination_component.html.erb} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import BookmarkToggle from 'blacklight/bookmark_toggle'
|
|
2
|
+
import ButtonFocus from 'blacklight/button_focus'
|
|
3
|
+
import Modal from 'blacklight/modal'
|
|
4
|
+
import SearchContext from 'blacklight/search_context'
|
|
5
|
+
import Core from 'blacklight/core'
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
BookmarkToggle,
|
|
9
|
+
ButtonFocus,
|
|
10
|
+
Modal,
|
|
11
|
+
SearchContext,
|
|
12
|
+
Core,
|
|
13
|
+
onLoad: Core.onLoad
|
|
14
|
+
}
|
|
@@ -23,12 +23,6 @@
|
|
|
23
23
|
of the container will be placed inside the modal, the rest of the
|
|
24
24
|
page will be ignored.
|
|
25
25
|
|
|
26
|
-
If you'd like to have a link or button that closes the modal,
|
|
27
|
-
you can just add a `data-dismiss="modal"` to the link,
|
|
28
|
-
standard Bootstrap convention. But you can also have
|
|
29
|
-
an href on this link for non-JS contexts, we'll make sure
|
|
30
|
-
inside the modal it closes the modal and the link is NOT followed.
|
|
31
|
-
|
|
32
26
|
Link or forms inside the modal will ordinarily cause page loads
|
|
33
27
|
when they are triggered. However, if you'd like their results
|
|
34
28
|
to stay within the modal, just add `data-blacklight-modal="preserve"`
|
|
@@ -38,7 +32,7 @@
|
|
|
38
32
|
|
|
39
33
|
<div data-blacklight-modal="container">
|
|
40
34
|
<div class="modal-header">
|
|
41
|
-
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
|
35
|
+
<button type="button" class="close" data-bl-dismiss="modal" aria-hidden="true">×</button>
|
|
42
36
|
<h3 class="modal-title">Request Placed</h3>
|
|
43
37
|
</div>
|
|
44
38
|
|
|
@@ -49,178 +43,119 @@
|
|
|
49
43
|
|
|
50
44
|
|
|
51
45
|
<div class="modal-footer">
|
|
52
|
-
|
|
46
|
+
<button type="button" class="btn btn-secondary" data-bl-dismiss="modal">Close</button>
|
|
53
47
|
</div>
|
|
54
48
|
</div>
|
|
55
49
|
|
|
56
50
|
|
|
57
|
-
One additional feature. If the content returned from the AJAX
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
51
|
+
One additional feature. If the content returned from the AJAX form submission
|
|
52
|
+
can be a turbo-stream that defines some HTML fragementsand where on the page to put them:
|
|
53
|
+
https://turbo.hotwired.dev/handbook/streams
|
|
54
|
+
*/
|
|
55
|
+
import ModalForm from 'blacklight/modalForm'
|
|
56
|
+
|
|
57
|
+
const Modal = (() => {
|
|
58
|
+
const modal = {}
|
|
59
|
+
|
|
60
|
+
// a Bootstrap modal div that should be already on the page hidden
|
|
61
|
+
modal.modalSelector = '#blacklight-modal';
|
|
62
|
+
|
|
63
|
+
// Trigger selectors identify forms or hyperlinks that should open
|
|
64
|
+
// inside a modal dialog.
|
|
65
|
+
modal.triggerLinkSelector = 'a[data-blacklight-modal~=trigger]';
|
|
66
|
+
|
|
67
|
+
// preserve selectors identify forms or hyperlinks that, if activated already
|
|
68
|
+
// inside a modal dialog, should have destinations remain inside the modal -- but
|
|
69
|
+
// won't trigger a modal if not already in one.
|
|
70
|
+
//
|
|
71
|
+
// No need to repeat selectors from trigger selectors, those will already
|
|
72
|
+
// be preserved. MUST be manually prefixed with the modal selector,
|
|
73
|
+
// so they only apply to things inside a modal.
|
|
74
|
+
modal.preserveLinkSelector = modal.modalSelector + ' a[data-blacklight-modal~=preserve]';
|
|
75
|
+
|
|
76
|
+
modal.containerSelector = '[data-blacklight-modal~=container]';
|
|
77
|
+
|
|
78
|
+
// Called on fatal failure of ajax load, function returns content
|
|
79
|
+
// to show to user in modal. Right now called only for network errors.
|
|
80
|
+
modal.onFailure = function (error) {
|
|
81
|
+
console.error('Server error:', this.url, error);
|
|
82
|
+
|
|
83
|
+
const contents = `<div class="modal-header">
|
|
84
|
+
<div class="modal-title">There was a problem with your request.</div>
|
|
85
|
+
<button type="button" class="blacklight-modal-close btn-close close" data-bl-dismiss="modal" aria-label="Close">
|
|
86
|
+
<span aria-hidden="true" class="visually-hidden">×</span>
|
|
87
|
+
</button>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="modal-body">
|
|
90
|
+
<p>Expected a successful response from the server, but got an error</p>
|
|
91
|
+
<pre>${this.url}\n${error}</pre>
|
|
92
|
+
</div>`
|
|
93
|
+
|
|
94
|
+
document.querySelector(`${modal.modalSelector} .modal-content`).innerHTML = contents
|
|
95
|
+
|
|
96
|
+
modal.show();
|
|
97
|
+
}
|
|
61
98
|
|
|
62
|
-
|
|
99
|
+
// Add the passed in contents to the modal and display it.
|
|
100
|
+
modal.receiveAjax = function (contents) {
|
|
101
|
+
const domparser = new DOMParser();
|
|
102
|
+
const dom = domparser.parseFromString(contents, "text/html")
|
|
103
|
+
// If there is a containerSelector on the document, use its children.
|
|
104
|
+
let elements = dom.querySelectorAll(`${modal.containerSelector} > *`)
|
|
105
|
+
if (elements.length == 0) {
|
|
106
|
+
// If the containerSelector wasn't found, use the whole document
|
|
107
|
+
elements = dom.body.childNodes
|
|
108
|
+
}
|
|
63
109
|
|
|
64
|
-
|
|
65
|
-
dialog as the target, right after content is loaded into the modal but before
|
|
66
|
-
it is shown (if not already a shown modal). In an event handler, you can
|
|
67
|
-
inspect loaded content by looking inside $(this). If you call event.preventDefault(),
|
|
68
|
-
we won't 'show' the dialog (although it may already have been shown, you may want to
|
|
69
|
-
$(this).modal("hide") if you want to ensure hidden/closed.
|
|
110
|
+
document.querySelector(`${modal.modalSelector} .modal-content`).replaceChildren(...elements)
|
|
70
111
|
|
|
71
|
-
|
|
72
|
-
|
|
112
|
+
modal.show();
|
|
113
|
+
};
|
|
73
114
|
|
|
74
|
-
// We keep all our data in Blacklight.modal object.
|
|
75
|
-
// Create lazily if someone else created first.
|
|
76
|
-
if (Blacklight.modal === undefined) {
|
|
77
|
-
Blacklight.modal = {};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// a Bootstrap modal div that should be already on the page hidden
|
|
81
|
-
Blacklight.modal.modalSelector = '#blacklight-modal';
|
|
82
|
-
|
|
83
|
-
// Trigger selectors identify forms or hyperlinks that should open
|
|
84
|
-
// inside a modal dialog.
|
|
85
|
-
Blacklight.modal.triggerLinkSelector = 'a[data-blacklight-modal~=trigger]';
|
|
86
|
-
Blacklight.modal.triggerFormSelector = 'form[data-blacklight-modal~=trigger]';
|
|
87
|
-
|
|
88
|
-
// preserve selectors identify forms or hyperlinks that, if activated already
|
|
89
|
-
// inside a modal dialog, should have destinations remain inside the modal -- but
|
|
90
|
-
// won't trigger a modal if not already in one.
|
|
91
|
-
//
|
|
92
|
-
// No need to repeat selectors from trigger selectors, those will already
|
|
93
|
-
// be preserved. MUST be manually prefixed with the modal selector,
|
|
94
|
-
// so they only apply to things inside a modal.
|
|
95
|
-
Blacklight.modal.preserveLinkSelector = Blacklight.modal.modalSelector + ' a[data-blacklight-modal~=preserve]';
|
|
96
|
-
|
|
97
|
-
Blacklight.modal.containerSelector = '[data-blacklight-modal~=container]';
|
|
98
|
-
|
|
99
|
-
Blacklight.modal.modalCloseSelector = '[data-blacklight-modal~=close]';
|
|
100
|
-
|
|
101
|
-
// Called on fatal failure of ajax load, function returns content
|
|
102
|
-
// to show to user in modal. Right now called only for extreme
|
|
103
|
-
// network errors.
|
|
104
|
-
Blacklight.modal.onFailure = function(jqXHR, textStatus, errorThrown) {
|
|
105
|
-
console.error('Server error:', this.url, jqXHR.status, errorThrown);
|
|
106
|
-
|
|
107
|
-
var contents = '<div class="modal-header">' +
|
|
108
|
-
'<div class="modal-title">There was a problem with your request.</div>' +
|
|
109
|
-
'<button type="button" class="blacklight-modal-close btn-close close" data-dismiss="modal" aria-label="Close">' +
|
|
110
|
-
' <span aria-hidden="true">×</span>' +
|
|
111
|
-
'</button></div>' +
|
|
112
|
-
' <div class="modal-body"><p>Expected a successful response from the server, but got an error</p>' +
|
|
113
|
-
'<pre>' +
|
|
114
|
-
this.type + ' ' + this.url + "\n" + jqXHR.status + ': ' + errorThrown +
|
|
115
|
-
'</pre></div>';
|
|
116
|
-
$(Blacklight.modal.modalSelector).find('.modal-content').html(contents);
|
|
117
|
-
Blacklight.modal.show();
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
Blacklight.modal.receiveAjax = function (contents) {
|
|
121
|
-
// does it have a data- selector for container?
|
|
122
|
-
// important we don't execute script tags, we shouldn't.
|
|
123
|
-
// code modelled off of JQuery ajax.load. https://github.com/jquery/jquery/blob/main/src/ajax/load.js?source=c#L62
|
|
124
|
-
var container = $('<div>').
|
|
125
|
-
append( jQuery.parseHTML(contents) ).find( Blacklight.modal.containerSelector ).first();
|
|
126
|
-
if (container.length !== 0) {
|
|
127
|
-
contents = container.html();
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
$(Blacklight.modal.modalSelector).find('.modal-content').html(contents);
|
|
131
|
-
|
|
132
|
-
// send custom event with the modal dialog div as the target
|
|
133
|
-
var e = $.Event('loaded.blacklight.blacklight-modal')
|
|
134
|
-
$(Blacklight.modal.modalSelector).trigger(e);
|
|
135
|
-
// if they did preventDefault, don't show the dialog
|
|
136
|
-
if (e.isDefaultPrevented()) return;
|
|
137
|
-
|
|
138
|
-
Blacklight.modal.show();
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
Blacklight.modal.modalAjaxLinkClick = function(e) {
|
|
143
|
-
e.preventDefault();
|
|
144
|
-
|
|
145
|
-
$.ajax({
|
|
146
|
-
url: $(this).attr('href')
|
|
147
|
-
})
|
|
148
|
-
.fail(Blacklight.modal.onFailure)
|
|
149
|
-
.done(Blacklight.modal.receiveAjax)
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
Blacklight.modal.modalAjaxFormSubmit = function(e) {
|
|
153
|
-
e.preventDefault();
|
|
154
115
|
|
|
155
|
-
|
|
156
|
-
url: $(this).attr('action'),
|
|
157
|
-
data: $(this).serialize(),
|
|
158
|
-
type: $(this).attr('method') // POST
|
|
159
|
-
})
|
|
160
|
-
.fail(Blacklight.modal.onFailure)
|
|
161
|
-
.done(Blacklight.modal.receiveAjax)
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
Blacklight.modal.setupModal = function() {
|
|
167
|
-
// Event indicating blacklight is setting up a modal link,
|
|
168
|
-
// you can catch it and call e.preventDefault() to abort
|
|
169
|
-
// setup.
|
|
170
|
-
var e = $.Event('setup.blacklight.blacklight-modal');
|
|
171
|
-
$('body').trigger(e);
|
|
172
|
-
if (e.isDefaultPrevented()) return;
|
|
173
|
-
|
|
174
|
-
// Register both trigger and preserve selectors in ONE event handler, combining
|
|
175
|
-
// into one selector with a comma, so if something matches BOTH selectors, it
|
|
176
|
-
// still only gets the event handler called once.
|
|
177
|
-
$('body').on('click', Blacklight.modal.triggerLinkSelector + ', ' + Blacklight.modal.preserveLinkSelector,
|
|
178
|
-
Blacklight.modal.modalAjaxLinkClick);
|
|
179
|
-
$('body').on('submit', Blacklight.modal.triggerFormSelector + ', ' + Blacklight.modal.preserveFormSelector,
|
|
180
|
-
Blacklight.modal.modalAjaxFormSubmit);
|
|
181
|
-
|
|
182
|
-
// Catch our own custom loaded event to implement data-blacklight-modal=closed
|
|
183
|
-
$('body').on('loaded.blacklight.blacklight-modal', Blacklight.modal.checkCloseModal);
|
|
184
|
-
|
|
185
|
-
// we support doing data-dismiss=modal on a <a> with a href for non-ajax
|
|
186
|
-
// use, we need to suppress following the a's href that's there for
|
|
187
|
-
// non-JS contexts.
|
|
188
|
-
$('body').on('click', Blacklight.modal.modalSelector + ' a[data-dismiss~=modal]', function (e) {
|
|
116
|
+
modal.modalAjaxLinkClick = function(e) {
|
|
189
117
|
e.preventDefault();
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
118
|
+
const href = e.target.getAttribute('href')
|
|
119
|
+
fetch(href)
|
|
120
|
+
.then(response => {
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
throw new TypeError("Request failed");
|
|
123
|
+
}
|
|
124
|
+
return response.text();
|
|
125
|
+
})
|
|
126
|
+
.then(data => modal.receiveAjax(data))
|
|
127
|
+
.catch(error => modal.onFailure(error))
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
modal.setupModal = function() {
|
|
131
|
+
// Register both trigger and preserve selectors in ONE event handler, combining
|
|
132
|
+
// into one selector with a comma, so if something matches BOTH selectors, it
|
|
133
|
+
// still only gets the event handler called once.
|
|
134
|
+
document.addEventListener('click', (e) => {
|
|
135
|
+
if (e.target.closest(`${modal.triggerLinkSelector}, ${modal.preserveLinkSelector}`))
|
|
136
|
+
modal.modalAjaxLinkClick(e)
|
|
137
|
+
else if (e.target.closest('[data-bl-dismiss="modal"]'))
|
|
138
|
+
modal.hide()
|
|
139
|
+
})
|
|
140
|
+
};
|
|
198
141
|
|
|
199
|
-
|
|
200
|
-
|
|
142
|
+
modal.hide = function (el) {
|
|
143
|
+
const dom = document.querySelector(modal.modalSelector)
|
|
201
144
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
modalFlashes.fadeIn(500);
|
|
145
|
+
if (!dom.open) return
|
|
146
|
+
dom.close()
|
|
205
147
|
}
|
|
206
|
-
}
|
|
207
148
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
bootstrap.Modal.getOrCreateInstance(el || document.querySelector(Blacklight.modal.modalSelector)).hide();
|
|
211
|
-
} else {
|
|
212
|
-
$(el || Blacklight.modal.modalSelector).modal('hide');
|
|
213
|
-
}
|
|
214
|
-
}
|
|
149
|
+
modal.show = function(el) {
|
|
150
|
+
const dom = document.querySelector(modal.modalSelector)
|
|
215
151
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
bootstrap.Modal.getOrCreateInstance(el || document.querySelector(Blacklight.modal.modalSelector)).show();
|
|
219
|
-
} else {
|
|
220
|
-
$(el || Blacklight.modal.modalSelector).modal('show');
|
|
152
|
+
if (dom.open) return
|
|
153
|
+
dom.showModal()
|
|
221
154
|
}
|
|
222
|
-
}
|
|
223
155
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
156
|
+
modal.setupModal()
|
|
157
|
+
|
|
158
|
+
return modal;
|
|
159
|
+
})()
|
|
160
|
+
|
|
161
|
+
export default Modal
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// The email and sms forms are displayed inside a modal. When the form is submitted,
|
|
2
|
+
// this script closes the modal and puts the output on the main part of the page.
|
|
3
|
+
// By default it is rendering catalog/sms_success and catalog/email_succcess.
|
|
4
|
+
// These templates deliver a payload of the format used by turbo-streams.
|
|
5
|
+
// See https://turbo.hotwired.dev/handbook/streams
|
|
6
|
+
// That format allows a downstream application to override the template to define
|
|
7
|
+
// multiple customizable areas of the page to get updated.
|
|
8
|
+
export default class {
|
|
9
|
+
constructor(errorHandler, badRequestHandler, hideModal) {
|
|
10
|
+
this.errorHandler = errorHandler
|
|
11
|
+
this.badRequestHandler = badRequestHandler
|
|
12
|
+
this.hideModal = hideModal
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get triggerFormSelector() {
|
|
16
|
+
return 'form[data-blacklight-modal~=trigger]'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
bind() {
|
|
20
|
+
document.addEventListener('submit', (e) => {
|
|
21
|
+
if (e.target.matches(this.triggerFormSelector))
|
|
22
|
+
this.onSubmit(e)
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// This is like a light-weight version of turbo that only supports append presently.
|
|
27
|
+
updateTurboStream(data) {
|
|
28
|
+
this.hideModal()
|
|
29
|
+
const domparser = new DOMParser();
|
|
30
|
+
const dom = domparser.parseFromString(data, "text/html")
|
|
31
|
+
dom.querySelectorAll("turbo-stream[action='append']").forEach((node) => {
|
|
32
|
+
const target = node.getAttribute('target')
|
|
33
|
+
const element = document.getElementById(target)
|
|
34
|
+
if (element)
|
|
35
|
+
element.append(node.querySelector('template').content.cloneNode(true))
|
|
36
|
+
else
|
|
37
|
+
console.error(`Unable to find an element on the page with and ID of "${target}""`)
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
onSubmit(e) {
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
const form = e.target
|
|
44
|
+
fetch(form.action, {
|
|
45
|
+
body: new FormData(form),
|
|
46
|
+
headers: { "X-Requested-With": "XMLHttpRequest" }, // Ensures rails will return true when checking request.xhr?
|
|
47
|
+
method: form.method,
|
|
48
|
+
})
|
|
49
|
+
.then(response => {
|
|
50
|
+
if (response.status === 422) {
|
|
51
|
+
return response.text().then(content => this.badRequestHandler(content) )
|
|
52
|
+
}
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
throw new TypeError("Request failed");
|
|
55
|
+
}
|
|
56
|
+
response.text().then(content => this.updateTurboStream(content))
|
|
57
|
+
})
|
|
58
|
+
.catch(error => this.errorHandler(error))
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -1,37 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
if (
|
|
3
|
-
|
|
4
|
-
return Blacklight.do_search_context_behavior();
|
|
1
|
+
const SearchContext = (e) => {
|
|
2
|
+
if (e.target.matches('[data-context-href]')) {
|
|
3
|
+
SearchContext.handleSearchContextMethod.call(e.target, e)
|
|
5
4
|
}
|
|
5
|
+
}
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const nodes = Array.prototype.slice.call(elements)
|
|
10
|
-
|
|
11
|
-
nodes.forEach(function(element) {
|
|
12
|
-
element.addEventListener('click', function(e) {
|
|
13
|
-
Blacklight.handleSearchContextMethod.call(e.currentTarget, e)
|
|
14
|
-
})
|
|
15
|
-
})
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
Blacklight.csrfToken = () => document.querySelector('meta[name=csrf-token]')?.content
|
|
19
|
-
Blacklight.csrfParam = () => document.querySelector('meta[name=csrf-param]')?.content
|
|
7
|
+
SearchContext.csrfToken = () => document.querySelector('meta[name=csrf-token]')?.content
|
|
8
|
+
SearchContext.csrfParam = () => document.querySelector('meta[name=csrf-param]')?.content
|
|
20
9
|
|
|
21
10
|
// this is the Rails.handleMethod with a couple adjustments, described inline:
|
|
22
11
|
// first, we're attaching this directly to the event handler, so we can check for meta-keys
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
console.warn("handle_search_context_method is deprecated. Use handleSearchContextMethod instead.");
|
|
26
|
-
return Blacklight.handle_search_context_method(event);
|
|
27
|
-
}
|
|
28
|
-
var link = this
|
|
12
|
+
SearchContext.handleSearchContextMethod = function(event) {
|
|
13
|
+
const link = this
|
|
29
14
|
|
|
30
15
|
// instead of using the normal href, we need to use the context href instead
|
|
31
16
|
let href = link.getAttribute('data-context-href')
|
|
32
17
|
let target = link.getAttribute('target')
|
|
33
|
-
let csrfToken =
|
|
34
|
-
let csrfParam =
|
|
18
|
+
let csrfToken = SearchContext.csrfToken()
|
|
19
|
+
let csrfParam = SearchContext.csrfParam()
|
|
35
20
|
let form = document.createElement('form')
|
|
36
21
|
form.method = 'post'
|
|
37
22
|
form.action = href
|
|
@@ -61,9 +46,8 @@ Blacklight.handleSearchContextMethod = function(event) {
|
|
|
61
46
|
form.querySelector('[type="submit"]').click()
|
|
62
47
|
|
|
63
48
|
event.preventDefault()
|
|
64
|
-
event.stopPropagation()
|
|
65
49
|
};
|
|
66
50
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
51
|
+
document.addEventListener('click', SearchContext)
|
|
52
|
+
|
|
53
|
+
export default SearchContext
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Blacklight
|
|
3
4
|
# Pagination for facet values -- works by setting the limit to max
|
|
4
5
|
# displayable. You have to ask Solr for limit+1, to get enough
|
|
@@ -52,10 +53,10 @@ module Blacklight
|
|
|
52
53
|
|
|
53
54
|
def current_page
|
|
54
55
|
# A nil limit is unlimited, thus only one page.
|
|
55
|
-
if limit.nil? || limit.zero? #check for divide by zero
|
|
56
|
+
if limit.nil? || limit.zero? # check for divide by zero
|
|
56
57
|
1
|
|
57
58
|
else
|
|
58
|
-
@offset / limit + 1
|
|
59
|
+
(@offset / limit) + 1
|
|
59
60
|
end
|
|
60
61
|
end
|
|
61
62
|
|
|
@@ -4,6 +4,8 @@ module Blacklight
|
|
|
4
4
|
class Icon
|
|
5
5
|
attr_reader :icon_name, :aria_hidden, :label, :role, :additional_options
|
|
6
6
|
|
|
7
|
+
delegate :present?, to: :file
|
|
8
|
+
|
|
7
9
|
##
|
|
8
10
|
# @param [String, Symbol] icon_name
|
|
9
11
|
# @param [String] classes additional classes separated by a string
|
|
@@ -32,7 +34,7 @@ module Blacklight
|
|
|
32
34
|
end
|
|
33
35
|
|
|
34
36
|
def icon_label
|
|
35
|
-
I18n.
|
|
37
|
+
I18n.t("blacklight.icon.#{icon_name_context}", default: icon_name.to_s.titleize)
|
|
36
38
|
end
|
|
37
39
|
|
|
38
40
|
##
|
|
@@ -40,7 +42,7 @@ module Blacklight
|
|
|
40
42
|
def options
|
|
41
43
|
{
|
|
42
44
|
class: classes,
|
|
43
|
-
|
|
45
|
+
'aria-hidden': (true if aria_hidden)
|
|
44
46
|
}
|
|
45
47
|
end
|
|
46
48
|
|
data/app/models/bookmark.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Blacklight::Configurable
|
|
3
4
|
extend ActiveSupport::Concern
|
|
4
5
|
|
|
@@ -6,7 +7,7 @@ module Blacklight::Configurable
|
|
|
6
7
|
helper_method :blacklight_config if respond_to? :helper_method
|
|
7
8
|
end
|
|
8
9
|
|
|
9
|
-
#instance methods for blacklight_config, so get a deep copy of the class-level config
|
|
10
|
+
# instance methods for blacklight_config, so get a deep copy of the class-level config
|
|
10
11
|
def blacklight_config
|
|
11
12
|
@blacklight_config ||= self.class.blacklight_config.deep_copy
|
|
12
13
|
end
|
|
@@ -31,9 +32,9 @@ module Blacklight::Configurable
|
|
|
31
32
|
end
|
|
32
33
|
attr_writer :blacklight_config
|
|
33
34
|
|
|
34
|
-
#simply a convenience method for blacklight_config.configure
|
|
35
|
-
def configure_blacklight(
|
|
36
|
-
blacklight_config.configure(
|
|
35
|
+
# simply a convenience method for blacklight_config.configure
|
|
36
|
+
def configure_blacklight(...)
|
|
37
|
+
blacklight_config.configure(...)
|
|
37
38
|
end
|
|
38
39
|
|
|
39
40
|
##
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'active_model/conversion'
|
|
4
|
+
|
|
5
|
+
module Blacklight::Document
|
|
6
|
+
module Attributes
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
included do
|
|
10
|
+
class_attribute :attribute_types, instance_accessor: false
|
|
11
|
+
self.attribute_types = Hash.new(Blacklight::Types::Value)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class_methods do
|
|
15
|
+
# Define an attribute reader on a document model
|
|
16
|
+
# @param [Symbol] name the name of the attribute to define
|
|
17
|
+
# @param [Symbol, Class] type the type of the attribute to define
|
|
18
|
+
# @param [String] field the name of the document's field to use for this attribute
|
|
19
|
+
# @param [any, Proc] default the default value for the attribute
|
|
20
|
+
# @example
|
|
21
|
+
# class SolrDocument
|
|
22
|
+
# include Blacklight::Solr::Document
|
|
23
|
+
# attribute :title, :string, 'title_tesim'
|
|
24
|
+
#
|
|
25
|
+
# Deprecated syntax:
|
|
26
|
+
# attribute :title, Blacklight::Types::String, 'title_tesim'
|
|
27
|
+
# end
|
|
28
|
+
#
|
|
29
|
+
# doc = SolrDocument.new(title_tesim: ["One flew over the cuckoo's nest"])
|
|
30
|
+
# doc.title
|
|
31
|
+
# #=> "One flew over the cuckoo's nest"
|
|
32
|
+
def attribute(name, type = :value, deprecated_field = name, field: nil, default: nil, **kwargs)
|
|
33
|
+
field ||= deprecated_field
|
|
34
|
+
|
|
35
|
+
define_method name do
|
|
36
|
+
if type.respond_to?(:coerce) && !(type < Blacklight::Types::Value)
|
|
37
|
+
# deprecated behavior using a bespoke api
|
|
38
|
+
type.coerce(fetch(field, default))
|
|
39
|
+
else
|
|
40
|
+
# newer behavior better aligned with ActiveModel::Type
|
|
41
|
+
instance = Blacklight::Types.lookup(type, **kwargs) if type.is_a? Symbol
|
|
42
|
+
instance ||= type.new(**kwargs)
|
|
43
|
+
|
|
44
|
+
instance.cast(fetch(field, default))
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'builder'
|
|
3
4
|
|
|
4
5
|
# This module provide Dublin Core export based on the document's semantic values
|
|
@@ -26,7 +27,7 @@ module Blacklight::Document::DublinCore
|
|
|
26
27
|
'xmlns:dc' => "http://purl.org/dc/elements/1.1/",
|
|
27
28
|
'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",
|
|
28
29
|
'xsi:schemaLocation' => %(http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd)) do
|
|
29
|
-
to_semantic_values.select { |field, _values| dublin_core_field_name? field
|
|
30
|
+
to_semantic_values.select { |field, _values| dublin_core_field_name? field }.each do |field, values|
|
|
30
31
|
Array.wrap(values).each do |v|
|
|
31
32
|
xml.tag! "dc:#{field}", v
|
|
32
33
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
# == Transformation conventions
|
|
3
4
|
# The main use case for extensions is for transforming a Document to another
|
|
4
5
|
# format. Either to another type of Ruby object, or to an exportable string in
|
|
@@ -55,7 +56,7 @@ module Blacklight::Document::Export
|
|
|
55
56
|
# register it using Mime::Type.register_alias if it's not previously
|
|
56
57
|
# registered. This is a bit sketchy though.
|
|
57
58
|
def will_export_as(short_name, content_type = nil)
|
|
58
|
-
#Lookup in Rails Mime::Type, register if needed, otherwise take
|
|
59
|
+
# Lookup in Rails Mime::Type, register if needed, otherwise take
|
|
59
60
|
# content-type from registration if needed.
|
|
60
61
|
if defined?(Mime) && Mime[short_name.to_sym]
|
|
61
62
|
content_type ||= Mime[short_name.to_sym]
|