blacklight 6.24.0 → 7.0.0.rc1
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/.gitignore +1 -0
- data/.npmignore +23 -0
- data/.rubocop.yml +15 -3
- data/.rubocop_todo.yml +242 -379
- data/.solr_wrapper.yml +1 -1
- data/.travis.yml +20 -24
- data/Gemfile +1 -4
- data/README.md +21 -4
- data/Rakefile +1 -2
- data/VERSION +1 -1
- data/app/assets/images/blacklight/list.svg +1 -0
- data/app/assets/images/blacklight/search.svg +1 -0
- data/app/assets/javascripts/blacklight/blacklight.js +496 -56
- data/app/assets/stylesheets/blacklight/_balanced_list.scss +7 -12
- data/app/assets/stylesheets/blacklight/_blacklight_base.scss +3 -1
- data/app/assets/stylesheets/blacklight/_bookmark.scss +1 -13
- data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +27 -0
- data/app/assets/stylesheets/blacklight/_constraints.scss +17 -25
- data/app/assets/stylesheets/blacklight/_controls.scss +8 -16
- data/app/assets/stylesheets/blacklight/_facets.scss +74 -92
- data/app/assets/stylesheets/blacklight/_header.scss +35 -48
- data/app/assets/stylesheets/blacklight/_icons.scss +29 -0
- data/app/assets/stylesheets/blacklight/_layout.scss +0 -10
- data/app/assets/stylesheets/blacklight/_mixins.scss +15 -0
- data/app/assets/stylesheets/blacklight/_modal.scss +9 -17
- data/app/assets/stylesheets/blacklight/_pagination.scss +2 -17
- data/app/assets/stylesheets/blacklight/_search_history.scss +5 -13
- data/app/assets/stylesheets/blacklight/_search_results.scss +9 -8
- data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +1 -2
- data/app/builders/blacklight/action_builder.rb +56 -0
- data/app/controllers/bookmarks_controller.rb +2 -2
- data/app/controllers/catalog_controller.rb +2 -2
- data/app/controllers/concerns/blacklight/base.rb +0 -33
- data/app/controllers/concerns/blacklight/bookmarks.rb +20 -37
- data/app/controllers/concerns/blacklight/catalog.rb +254 -213
- data/app/controllers/concerns/blacklight/controller.rb +117 -133
- data/app/controllers/concerns/blacklight/default_component_configuration.rb +12 -43
- data/app/controllers/concerns/blacklight/search_context.rb +10 -14
- data/app/controllers/concerns/blacklight/search_fields.rb +4 -14
- data/app/controllers/concerns/blacklight/token_based_user.rb +6 -10
- data/app/helpers/blacklight/blacklight_helper_behavior.rb +32 -118
- data/app/helpers/blacklight/catalog_helper_behavior.rb +94 -88
- data/app/helpers/blacklight/component_helper_behavior.rb +19 -19
- data/app/helpers/blacklight/configuration_helper_behavior.rb +25 -54
- data/app/helpers/blacklight/facets_helper_behavior.rb +40 -39
- data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +9 -11
- data/app/helpers/blacklight/icon_helper_behavior.rb +16 -0
- data/app/helpers/blacklight/layout_helper_behavior.rb +3 -10
- data/app/helpers/blacklight/render_constraints_helper_behavior.rb +6 -6
- data/app/helpers/blacklight/render_partials_helper_behavior.rb +195 -0
- data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +18 -11
- data/app/helpers/blacklight/suggest_helper_behavior.rb +1 -0
- data/app/helpers/blacklight/url_helper_behavior.rb +21 -27
- data/app/{assets/javascripts → javascript}/blacklight/autocomplete.js +3 -2
- data/app/javascript/blacklight/autofocus.js +20 -0
- data/app/javascript/blacklight/bookmark_toggle.js +25 -0
- data/app/javascript/blacklight/checkbox_submit.js +133 -0
- data/app/{assets/javascripts → javascript}/blacklight/collapsable.js +1 -1
- data/app/javascript/blacklight/core.js +39 -0
- data/app/{assets/javascripts → javascript}/blacklight/facet_load.js +6 -6
- data/app/{assets/javascripts/blacklight/ajax_modal.js → javascript/blacklight/modal.js} +63 -63
- data/app/{assets/javascripts → javascript}/blacklight/search_context.js +10 -2
- data/app/models/blacklight/facet_paginator.rb +3 -3
- data/app/models/blacklight/icon.rb +53 -0
- data/app/models/blacklight/solr/facet_paginator.rb +3 -3
- data/app/models/blacklight/suggest_search.rb +15 -4
- data/app/models/bookmark.rb +4 -9
- data/app/models/concerns/blacklight/configurable.rb +13 -13
- data/app/models/concerns/blacklight/document.rb +8 -42
- data/app/models/concerns/blacklight/document/active_model_shim.rb +8 -11
- data/app/models/concerns/blacklight/document/cache_key.rb +1 -1
- data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
- data/app/models/concerns/blacklight/document/email.rb +1 -1
- data/app/models/concerns/blacklight/document/extensions.rb +5 -5
- data/app/models/concerns/blacklight/document/semantic_fields.rb +9 -9
- data/app/models/concerns/blacklight/document/sms.rb +1 -1
- data/app/models/concerns/blacklight/solr/document.rb +7 -8
- data/app/models/concerns/blacklight/suggest/response.rb +3 -5
- data/app/models/concerns/blacklight/user.rb +6 -6
- data/app/models/record_mailer.rb +5 -6
- data/app/models/search.rb +4 -7
- data/app/presenters/blacklight/field_presenter.rb +5 -5
- data/app/presenters/blacklight/index_presenter.rb +34 -71
- data/app/presenters/blacklight/json_presenter.rb +7 -4
- data/app/presenters/blacklight/link_alternate_presenter.rb +1 -1
- data/app/presenters/blacklight/rendering/abstract_step.rb +5 -5
- data/app/presenters/blacklight/rendering/helper_method.rb +8 -8
- data/app/presenters/blacklight/rendering/join.rb +3 -3
- data/app/presenters/blacklight/rendering/link_to_facet.rb +19 -19
- data/app/presenters/blacklight/rendering/microdata.rb +3 -3
- data/app/presenters/blacklight/rendering/pipeline.rb +5 -5
- data/app/presenters/blacklight/search_bar_presenter.rb +37 -0
- data/app/presenters/blacklight/show_presenter.rb +20 -69
- data/app/presenters/blacklight/thumbnail_presenter.rb +72 -0
- data/app/services/blacklight/document_factory.rb +11 -0
- data/app/services/blacklight/field_retriever.rb +24 -24
- data/app/services/blacklight/search_service.rb +154 -0
- data/app/views/blacklight/nav/_bookmark.html.erb +2 -2
- data/app/views/blacklight/nav/_search_history.html.erb +1 -1
- data/app/views/bookmarks/_tools.html.erb +2 -2
- data/app/views/bookmarks/index.html.erb +2 -2
- data/app/views/catalog/_bookmark_control.html.erb +26 -10
- data/app/views/catalog/_citation.html.erb +18 -23
- data/app/views/catalog/_constraints.html.erb +5 -8
- data/app/views/catalog/_constraints_element.html.erb +6 -6
- data/app/views/catalog/{_document_default.atom.builder → _document.atom.builder} +2 -2
- data/app/views/catalog/_document.html.erb +5 -3
- data/app/views/catalog/{_document_default.rss.builder → _document.rss.builder} +0 -0
- data/app/views/catalog/_document_action.html.erb +2 -1
- data/app/views/catalog/_email_form.html.erb +8 -4
- data/app/views/catalog/_facet_index_navigation.html.erb +3 -3
- data/app/views/catalog/_facet_layout.html.erb +5 -7
- data/app/views/catalog/_facet_limit.html.erb +3 -2
- data/app/views/catalog/_facet_pagination.html.erb +10 -10
- data/app/views/catalog/_facet_pivot.html.erb +2 -2
- data/app/views/catalog/_facets.html.erb +8 -12
- data/app/views/catalog/{_group_default.html.erb → _group.html.erb} +0 -0
- data/app/views/catalog/_home_text.html.erb +32 -36
- data/app/views/catalog/_index.html.erb +12 -0
- data/app/views/catalog/{_index_header_default.html.erb → _index_header.html.erb} +2 -2
- data/app/views/catalog/_per_page_widget.html.erb +6 -7
- data/app/views/catalog/_previous_next_doc.html.erb +6 -14
- data/app/views/catalog/_search_form.html.erb +12 -8
- data/app/views/catalog/_search_header.html.erb +0 -3
- data/app/views/catalog/_search_results.html.erb +4 -0
- data/app/views/catalog/_show.html.erb +10 -0
- data/app/views/catalog/{_show_header_default.html.erb → _show_header.html.erb} +0 -0
- data/app/views/catalog/_show_main_content.html.erb +4 -4
- data/app/views/catalog/_show_sidebar.html.erb +3 -3
- data/app/views/catalog/_show_tools.html.erb +9 -11
- data/app/views/catalog/_sms_form.html.erb +8 -4
- data/app/views/catalog/_sort_and_per_page.html.erb +3 -3
- data/app/views/catalog/_sort_widget.html.erb +7 -7
- data/app/views/catalog/_thumbnail.html.erb +5 -0
- data/app/views/catalog/_view_type_group.html.erb +2 -2
- data/app/views/catalog/citation.html.erb +1 -1
- data/app/views/catalog/citation.js.erb +9 -1
- data/app/views/catalog/email.html.erb +5 -5
- data/app/views/catalog/email_success.html.erb +11 -9
- data/app/views/catalog/facet.html.erb +5 -6
- data/app/views/catalog/index.atom.builder +10 -15
- data/app/views/catalog/index.html.erb +9 -11
- data/app/views/catalog/index.json.jbuilder +65 -3
- data/app/views/catalog/index.rss.builder +5 -5
- data/app/views/catalog/opensearch.xml.builder +10 -10
- data/app/views/catalog/show.html.erb +11 -6
- data/app/views/catalog/sms.html.erb +2 -3
- data/app/views/catalog/sms_success.html.erb +11 -10
- data/app/views/kaminari/blacklight/_first_page.html.erb +2 -2
- data/app/views/kaminari/blacklight/_gap.html.erb +2 -2
- data/app/views/kaminari/blacklight/_last_page.html.erb +2 -2
- data/app/views/kaminari/blacklight/_next_page.html.erb +4 -4
- data/app/views/kaminari/blacklight/_page.html.erb +3 -3
- data/app/views/kaminari/blacklight/_prev_page.html.erb +4 -4
- data/app/views/kaminari/blacklight_compact/_paginator.html.erb +4 -4
- data/app/views/layouts/blacklight.html.erb +14 -41
- data/app/views/layouts/blacklight/base.html.erb +43 -0
- data/app/views/layouts/catalog_result.html.erb +11 -0
- data/app/views/search_history/index.html.erb +16 -21
- data/app/views/{_flash_msg.html.erb → shared/_flash_msg.html.erb} +0 -0
- data/app/views/shared/_header_navbar.html.erb +8 -13
- data/app/views/shared/_modal.html.erb +6 -0
- data/app/views/shared/_user_util_links.html.erb +22 -0
- data/blacklight.gemspec +10 -11
- data/config/locales/blacklight.de.yml +0 -30
- data/config/locales/blacklight.en.yml +1 -27
- data/config/locales/blacklight.es.yml +0 -30
- data/config/locales/blacklight.fr.yml +0 -30
- data/config/locales/blacklight.hu.yml +210 -0
- data/config/locales/blacklight.it.yml +0 -30
- data/config/locales/blacklight.nl.yml +210 -0
- data/config/locales/blacklight.pt-BR.yml +6 -32
- data/config/locales/blacklight.sq.yml +1 -28
- data/config/locales/blacklight.zh.yml +0 -25
- data/config/routes.rb +3 -10
- data/db/migrate/20140202020202_create_bookmarks.rb +0 -1
- data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -1
- data/lib/blacklight.rb +4 -5
- data/lib/blacklight/abstract_repository.rb +9 -21
- data/lib/blacklight/configuration.rb +82 -89
- data/lib/blacklight/configuration/context.rb +1 -1
- data/lib/blacklight/configuration/facet_field.rb +16 -9
- data/lib/blacklight/configuration/field.rb +32 -3
- data/lib/blacklight/configuration/fields.rb +41 -48
- data/lib/blacklight/configuration/search_field.rb +2 -2
- data/lib/blacklight/configuration/sort_field.rb +2 -2
- data/lib/blacklight/configuration/view_config.rb +4 -0
- data/lib/blacklight/engine.rb +6 -10
- data/lib/blacklight/exceptions.rb +4 -7
- data/lib/blacklight/nested_open_struct_with_hash_access.rb +107 -0
- data/lib/blacklight/open_struct_with_hash_access.rb +49 -0
- data/lib/blacklight/parameters.rb +1 -1
- data/lib/blacklight/routes/searchable.rb +1 -0
- data/lib/blacklight/search_builder.rb +26 -35
- data/lib/blacklight/search_state.rb +8 -8
- data/lib/blacklight/solr/repository.rb +3 -36
- data/lib/blacklight/solr/request.rb +1 -1
- data/lib/blacklight/solr/response.rb +29 -30
- data/lib/blacklight/solr/response/facets.rb +29 -31
- data/lib/blacklight/solr/response/group.rb +3 -3
- data/lib/blacklight/solr/response/group_response.rb +1 -1
- data/lib/blacklight/solr/response/more_like_this.rb +2 -2
- data/lib/blacklight/solr/response/response.rb +2 -2
- data/lib/blacklight/solr/response/spelling.rb +3 -3
- data/lib/blacklight/solr/search_builder_behavior.rb +25 -29
- data/lib/blacklight/version.rb +1 -1
- data/lib/generators/blacklight/assets_generator.rb +8 -8
- data/lib/generators/blacklight/controller_generator.rb +4 -5
- data/lib/generators/blacklight/document_generator.rb +1 -1
- data/lib/generators/blacklight/install_generator.rb +18 -21
- data/lib/generators/blacklight/search_builder_generator.rb +1 -1
- data/lib/generators/blacklight/{solr5_generator.rb → solr_generator.rb} +4 -6
- data/lib/generators/blacklight/templates/.solr_wrapper.yml +5 -0
- data/lib/generators/blacklight/templates/blacklight.scss +0 -2
- data/lib/generators/blacklight/templates/catalog_controller.rb +52 -51
- data/{solr → lib/generators/blacklight/templates/solr}/conf/_rest_managed.json +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/admin-extra.html +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/elevate.xml +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/mapping-ISOLatin1Accent.txt +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/protwords.txt +0 -0
- data/lib/generators/blacklight/templates/solr/conf/schema.xml +390 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/scripts.conf +0 -0
- data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +195 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/spellings.txt +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords.txt +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords_en.txt +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/synonyms.txt +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example.xsl +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_atom.xsl +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_rss.xsl +0 -0
- data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/luke.xsl +0 -0
- data/lib/generators/blacklight/test_support_generator.rb +10 -10
- data/lib/generators/blacklight/user_generator.rb +3 -6
- data/lib/railties/blacklight.rake +19 -14
- data/package-lock.json +2057 -0
- data/package.json +28 -0
- data/spec/controllers/alternate_controller_spec.rb +1 -1
- data/spec/controllers/application_controller_spec.rb +1 -1
- data/spec/controllers/blacklight/base_spec.rb +1 -1
- data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +11 -7
- data/spec/controllers/blacklight/facet_spec.rb +1 -1
- data/spec/controllers/blacklight/search_fields_spec.rb +1 -13
- data/spec/controllers/bookmarks_controller_spec.rb +1 -36
- data/spec/controllers/catalog_controller_spec.rb +153 -53
- data/spec/controllers/search_history_controller_spec.rb +2 -2
- data/spec/features/alternate_controller_spec.rb +1 -1
- data/spec/features/autocomplete_spec.rb +2 -2
- data/spec/features/bookmarks_spec.rb +10 -10
- data/spec/features/did_you_mean_spec.rb +3 -9
- data/spec/features/facets_spec.rb +11 -11
- data/spec/features/record_view_spec.rb +1 -6
- data/spec/features/search_context_spec.rb +2 -2
- data/spec/features/search_filters_spec.rb +41 -41
- data/spec/features/search_formats_spec.rb +1 -1
- data/spec/features/search_history_spec.rb +1 -26
- data/spec/features/search_pagination_spec.rb +1 -1
- data/spec/features/search_results_spec.rb +3 -4
- data/spec/features/search_sort_spec.rb +2 -2
- data/spec/features/search_spec.rb +5 -10
- data/{solr → spec/fixtures}/sample_solr_documents.yml +688 -688
- data/spec/helpers/{configuration_helper_spec.rb → blacklight/configuration_helper_behavior_spec.rb} +70 -65
- data/spec/helpers/{facets_helper_spec.rb → blacklight/facets_helper_behavior_spec.rb} +7 -8
- data/spec/helpers/{hash_as_hidden_fields_spec.rb → blacklight/hash_as_hidden_fields_behavior_spec.rb} +1 -1
- data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
- data/spec/helpers/{layout_helper_spec.rb → blacklight/layout_helper_behavior_spec.rb} +5 -15
- data/spec/helpers/{render_constraints_helper_spec.rb → blacklight/render_constraints_helper_behavior_spec.rb} +2 -3
- data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +80 -0
- data/spec/helpers/{search_history_constraints_helper_spec.rb → blacklight/search_history_constraints_helper_behavior_spec.rb} +9 -9
- data/spec/helpers/{suggest_helper_spec.rb → blacklight/suggest_helper_behavior_spec.rb} +4 -2
- data/spec/helpers/{url_helper_spec.rb → blacklight/url_helper_behavior_spec.rb} +11 -15
- data/spec/helpers/blacklight_helper_spec.rb +36 -141
- data/spec/helpers/catalog_helper_spec.rb +37 -56
- data/spec/integration/generators/blacklight/{solr5_generator_spec.rb → solr_generator_spec.rb} +3 -3
- data/spec/lib/blacklight/configuration/facet_field_spec.rb +11 -0
- data/spec/lib/blacklight/configuration/field_spec.rb +12 -0
- data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +17 -0
- data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +153 -0
- data/spec/lib/blacklight/parameters_spec.rb +1 -1
- data/spec/lib/blacklight/search_state_spec.rb +2 -2
- data/spec/lib/blacklight_spec.rb +1 -1
- data/spec/lib/tasks/blacklight_task_spec.rb +1 -1
- data/spec/models/blacklight/configurable_spec.rb +15 -16
- data/spec/models/blacklight/configuration/context_spec.rb +1 -1
- data/spec/models/blacklight/configuration_spec.rb +146 -135
- data/spec/models/blacklight/document/active_model_shim_spec.rb +11 -1
- data/spec/models/blacklight/document/cache_key_spec.rb +1 -1
- data/spec/models/blacklight/document/dublin_core_spec.rb +5 -5
- data/spec/models/blacklight/document/email_spec.rb +3 -3
- data/spec/models/blacklight/document/sms_spec.rb +3 -3
- data/spec/models/blacklight/document_spec.rb +3 -16
- data/spec/models/blacklight/facet_paginator_spec.rb +1 -1
- data/spec/models/blacklight/icon_spec.rb +34 -0
- data/spec/models/blacklight/search_builder_spec.rb +33 -27
- data/spec/models/blacklight/solr/document_spec.rb +18 -7
- data/spec/models/blacklight/solr/facet_paginator_spec.rb +1 -1
- data/spec/models/blacklight/solr/repository_spec.rb +32 -27
- data/spec/models/blacklight/solr/request_spec.rb +1 -1
- data/spec/models/blacklight/solr/response/facets_spec.rb +1 -1
- data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -1
- data/spec/models/blacklight/solr/response/group_spec.rb +1 -1
- data/spec/models/blacklight/solr/response_spec.rb +9 -6
- data/spec/models/blacklight/solr/search_builder_spec.rb +35 -48
- data/spec/models/blacklight/suggest/response_spec.rb +4 -5
- data/spec/models/blacklight/suggest_search_spec.rb +14 -7
- data/spec/models/blacklight/user_spec.rb +1 -1
- data/spec/models/bookmark_spec.rb +1 -1
- data/spec/models/record_mailer_spec.rb +2 -2
- data/spec/models/search_spec.rb +1 -1
- data/spec/models/solr_document_spec.rb +3 -3
- data/spec/presenters/blacklight/search_bar_presenter_spec.rb +72 -0
- data/spec/presenters/index_presenter_spec.rb +70 -143
- data/spec/presenters/pipeline_spec.rb +4 -4
- data/spec/presenters/show_presenter_spec.rb +83 -145
- data/spec/presenters/thumbnail_presenter_spec.rb +171 -0
- data/spec/routing/catalog_routing_spec.rb +1 -17
- data/spec/services/blacklight/search_service_spec.rb +446 -0
- data/spec/spec_helper.rb +22 -9
- data/spec/test_app_templates/Gemfile.extra +2 -5
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
- data/spec/views/catalog/_constraints.html.erb_spec.rb +1 -3
- data/spec/views/catalog/_constraints_element.html.erb_spec.rb +8 -8
- data/spec/views/catalog/_document.html.erb_spec.rb +7 -7
- data/spec/views/catalog/_document_list.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_facet_layout.html.erb_spec.rb +6 -6
- data/spec/views/catalog/_facets.html.erb_spec.rb +2 -2
- data/spec/views/catalog/{_index_default.erb_spec.rb → _index.html.erb_spec.rb} +1 -1
- data/spec/views/catalog/{_index_header_default.html.erb_spec.rb → _index_header.html.erb_spec.rb} +4 -4
- data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +4 -27
- data/spec/views/catalog/_search_header.erb_spec.rb +1 -3
- data/spec/views/catalog/{_show_default.erb_spec.rb → _show.html.erb_spec.rb} +1 -1
- data/spec/views/catalog/_show_sidebar.erb_spec.rb +3 -3
- data/spec/views/catalog/_show_tools.html.erb_spec.rb +3 -3
- data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +1 -1
- data/spec/views/catalog/{_thumbnail_default.erb_spec.rb → _thumbnail.html.erb_spec.rb} +3 -3
- data/spec/views/catalog/_view_type_group.html.erb_spec.rb +5 -1
- data/spec/views/catalog/email_success.html.erb_spec.rb +9 -0
- data/spec/views/catalog/facet.html.erb_spec.rb +1 -1
- data/spec/views/catalog/facet.json.jbuilder_spec.rb +1 -1
- data/spec/views/catalog/index.atom.builder_spec.rb +2 -2
- data/spec/views/catalog/index.html.erb_spec.rb +4 -7
- data/spec/views/catalog/index.json.jbuilder_spec.rb +66 -21
- data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
- data/spec/views/catalog/show.html.erb_spec.rb +2 -2
- data/spec/views/catalog/sms_success.html.erb_spec.rb +9 -0
- data/spec/views/{_user_util_links.html.erb_spec.rb → shared/_user_util_links.html.erb_spec.rb} +4 -4
- data/tasks/blacklight.rake +10 -8
- data/template.demo.rb +1 -11
- metadata +171 -189
- data/app/assets/javascripts/blacklight/autofocus.js +0 -16
- data/app/assets/javascripts/blacklight/bookmark_toggle.js +0 -23
- data/app/assets/javascripts/blacklight/checkbox_submit.js +0 -139
- data/app/assets/javascripts/blacklight/core.js +0 -30
- data/app/controllers/concerns/blacklight/request_builders.rb +0 -77
- data/app/controllers/concerns/blacklight/saved_searches.rb +0 -70
- data/app/controllers/concerns/blacklight/search_helper.rb +0 -161
- data/app/controllers/concerns/blacklight/suggest.rb +0 -25
- data/app/controllers/saved_searches_controller.rb +0 -4
- data/app/controllers/suggest_controller.rb +0 -4
- data/app/helpers/blacklight/deprecated_url_helper_behavior.rb +0 -57
- data/app/helpers/blacklight/render_partials_helper.rb +0 -205
- data/app/helpers/blacklight_configuration_helper.rb +0 -4
- data/app/helpers/blacklight_url_helper.rb +0 -4
- data/app/helpers/component_helper.rb +0 -4
- data/app/helpers/facets_helper.rb +0 -4
- data/app/helpers/hash_as_hidden_fields_helper.rb +0 -4
- data/app/helpers/layout_helper.rb +0 -4
- data/app/helpers/render_constraints_helper.rb +0 -4
- data/app/helpers/search_history_constraints_helper.rb +0 -4
- data/app/helpers/suggest_helper.rb +0 -4
- data/app/models/concerns/blacklight/solr/document/more_like_this.rb +0 -6
- data/app/presenters/blacklight/document_presenter.rb +0 -153
- data/app/views/_user_util_links.html.erb +0 -26
- data/app/views/blacklight/nav/_saved_searches.html.erb +0 -1
- data/app/views/catalog/_index_default.html.erb +0 -12
- data/app/views/catalog/_show_default.html.erb +0 -10
- data/app/views/catalog/_thumbnail_default.html.erb +0 -5
- data/app/views/saved_searches/index.html.erb +0 -32
- data/app/views/shared/_ajax_modal.html.erb +0 -6
- data/lib/blacklight/utils.rb +0 -183
- data/lib/generators/blacklight/solr4_generator.rb +0 -31
- data/solr/conf/schema.xml +0 -627
- data/solr/conf/solrconfig.xml +0 -411
- data/spec/controllers/blacklight/search_helper_spec.rb +0 -489
- data/spec/controllers/saved_searches_controller_spec.rb +0 -32
- data/spec/controllers/suggest_controller_spec.rb +0 -17
- data/spec/features/saved_searches_spec.rb +0 -47
- data/spec/helpers/deprecated_url_helper_behavior_spec.rb +0 -101
- data/spec/lib/blacklight/utils_spec.rb +0 -167
- data/spec/models/blacklight/solr/document/more_like_this_spec.rb +0 -18
- data/spec/presenters/document_presenter_spec.rb +0 -438
- data/spec/support/backport_test.rb +0 -14
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
.blacklight-icons {
|
|
2
|
+
display: inline-block;
|
|
3
|
+
height: $font-size-base;
|
|
4
|
+
vertical-align: text-top;
|
|
5
|
+
width: $font-size-base;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@each $color, $value in $theme-colors {
|
|
9
|
+
.btn-#{$color} {
|
|
10
|
+
.blacklight-icons g {
|
|
11
|
+
@include stroke-yiq(theme-color($color));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.btn-outline-#{$color} {
|
|
16
|
+
.blacklight-icons g {
|
|
17
|
+
stroke: $value;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
&.hover,
|
|
21
|
+
&:hover,
|
|
22
|
+
&:active,
|
|
23
|
+
&.active {
|
|
24
|
+
.blacklight-icons g {
|
|
25
|
+
@include stroke-yiq(theme-color($color));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Stroke contrast
|
|
2
|
+
// Ripped off from https://github.com/twbs/bootstrap/commit/c31d52499811d5c68d122db806ce27a112b489bd
|
|
3
|
+
@mixin stroke-yiq($color) {
|
|
4
|
+
$r: red($color);
|
|
5
|
+
$g: green($color);
|
|
6
|
+
$b: blue($color);
|
|
7
|
+
|
|
8
|
+
$yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
|
|
9
|
+
|
|
10
|
+
@if ($yiq >= 150) {
|
|
11
|
+
stroke: #111;
|
|
12
|
+
} @else {
|
|
13
|
+
stroke: #fff;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,29 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
.modal-content {
|
|
2
|
+
@extend .clearfix;
|
|
2
3
|
|
|
3
|
-
.
|
|
4
|
-
@extend .clearfix;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
#email_form {
|
|
8
|
-
width: auto;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
.facet_pagination.top {
|
|
4
|
+
.facet-pagination.top {
|
|
12
5
|
display: none;
|
|
13
6
|
}
|
|
14
7
|
|
|
15
|
-
|
|
8
|
+
.page-sidebar {
|
|
16
9
|
display: none;
|
|
17
10
|
}
|
|
18
11
|
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
.blacklight-modal-close {
|
|
13
|
+
display: block;
|
|
21
14
|
}
|
|
22
15
|
}
|
|
23
16
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
button.ajax-modal-close.close {
|
|
17
|
+
// app/views/catalog/facet.html.erb may be rendered as a modal or a whole page.
|
|
18
|
+
// When it's a whole page, don't show the close button.
|
|
19
|
+
.blacklight-modal-close {
|
|
28
20
|
display: none;
|
|
29
21
|
}
|
|
@@ -1,21 +1,6 @@
|
|
|
1
|
-
.
|
|
1
|
+
.page-links {
|
|
2
2
|
display: inline-block;
|
|
3
3
|
border: 1px solid transparent;
|
|
4
|
-
padding: $padding-
|
|
4
|
+
padding: $input-btn-padding-y $input-btn-padding-x;
|
|
5
5
|
padding-left: 0;
|
|
6
6
|
}
|
|
7
|
-
|
|
8
|
-
.pagination {
|
|
9
|
-
text-align: center ;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
.pagination-xs {
|
|
14
|
-
li {
|
|
15
|
-
a,
|
|
16
|
-
span {
|
|
17
|
-
border: none;
|
|
18
|
-
padding: $padding-xs-vertical $padding-xs-horizontal;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
/* Search History */
|
|
2
|
-
.
|
|
3
|
-
{
|
|
4
|
-
|
|
5
|
-
.constraint
|
|
6
|
-
{
|
|
2
|
+
.search-history {
|
|
3
|
+
.constraint {
|
|
4
|
+
@extend .px-3;
|
|
7
5
|
display: block;
|
|
8
|
-
text-indent:
|
|
9
|
-
padding-left: $padding-large-horizontal;
|
|
10
|
-
|
|
6
|
+
text-indent: -1 * map-get($spacers, 3);
|
|
11
7
|
}
|
|
12
8
|
|
|
13
|
-
.
|
|
14
|
-
{
|
|
9
|
+
.filter-name, .filter-separator {
|
|
15
10
|
@extend .text-muted;
|
|
16
11
|
}
|
|
17
12
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// the search results on the index view of the catalog
|
|
2
|
-
|
|
2
|
+
.documents-list {
|
|
3
3
|
.document {
|
|
4
|
-
margin-top: $padding-base-vertical;
|
|
5
|
-
padding-top: $padding-base-vertical;
|
|
6
|
-
border-bottom:1px dotted $table-border-color;
|
|
7
4
|
@extend .clearfix;
|
|
5
|
+
border-bottom: 1px dotted $table-border-color;
|
|
6
|
+
margin-top: $spacer;
|
|
7
|
+
padding-top: $spacer;
|
|
8
8
|
|
|
9
9
|
.document-title-heading {
|
|
10
10
|
@extend h5;
|
|
@@ -13,16 +13,17 @@
|
|
|
13
13
|
// bookmarks checkbox on index, give it some
|
|
14
14
|
// lower margin when it collapses
|
|
15
15
|
.index-document-functions {
|
|
16
|
-
margin-bottom: ($line-height-
|
|
17
|
-
|
|
16
|
+
margin-bottom: ($line-height-base / 2);
|
|
17
|
+
|
|
18
|
+
@media (min-width: breakpoint-min(sm)) {
|
|
18
19
|
margin-bottom: 0;
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
.document-thumbnail {
|
|
23
24
|
float: right;
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
margin-bottom: $line-height-base;
|
|
26
|
+
padding-left: $line-height-base;
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
# Dynamically creates methods on the given controller (typically CatalogController)
|
|
5
|
+
# for handling configured show tools
|
|
6
|
+
class ActionBuilder
|
|
7
|
+
def initialize(klass, name, opts)
|
|
8
|
+
@klass = klass
|
|
9
|
+
@name = name
|
|
10
|
+
@opts = opts
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :klass, :name, :opts
|
|
14
|
+
|
|
15
|
+
# Define a simple action handler for the tool as long as the method
|
|
16
|
+
# doesn't already exist or the `:define_method` option is not `false`
|
|
17
|
+
def build
|
|
18
|
+
return if skip?
|
|
19
|
+
callback = opts.fetch(:callback, nil).inspect
|
|
20
|
+
validator = opts.fetch(:validator, nil).inspect
|
|
21
|
+
klass.class_eval <<EORUBY, __FILE__, __LINE__ + 1
|
|
22
|
+
def #{name}
|
|
23
|
+
@response, @documents = action_documents
|
|
24
|
+
|
|
25
|
+
if request.post? && #{callback} &&
|
|
26
|
+
(#{validator}.blank? || send(#{validator}))
|
|
27
|
+
|
|
28
|
+
send(#{callback}, @documents)
|
|
29
|
+
|
|
30
|
+
flash[:success] ||= I18n.t("blacklight.#{name}.success", default: nil)
|
|
31
|
+
|
|
32
|
+
respond_to do |format|
|
|
33
|
+
format.html do
|
|
34
|
+
return render "#{name}_success" if request.xhr?
|
|
35
|
+
redirect_to action_success_redirect_path
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
else
|
|
39
|
+
respond_to do |format|
|
|
40
|
+
format.html do
|
|
41
|
+
return render layout: false if request.xhr?
|
|
42
|
+
# Otherwise draw the full page
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
EORUBY
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def skip?
|
|
53
|
+
klass.method_defined?(name) || opts[:define_method] == false
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -3,38 +3,5 @@ module Blacklight::Base
|
|
|
3
3
|
extend ActiveSupport::Concern
|
|
4
4
|
|
|
5
5
|
include Blacklight::Configurable
|
|
6
|
-
include Blacklight::SearchHelper
|
|
7
|
-
|
|
8
6
|
include Blacklight::SearchContext
|
|
9
|
-
|
|
10
|
-
included do
|
|
11
|
-
# When Blacklight::Exceptions::InvalidRequest is raised, the rsolr_request_error method is executed.
|
|
12
|
-
# The index action will more than likely throw this one.
|
|
13
|
-
# Example, when the standard query parser is used, and a user submits a "bad" query.
|
|
14
|
-
rescue_from Blacklight::Exceptions::InvalidRequest, with: :handle_request_error if respond_to? :rescue_from
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
protected
|
|
18
|
-
|
|
19
|
-
# when The index throws an error (Blacklight::Exceptions::InvalidRequest), this method is executed.
|
|
20
|
-
def handle_request_error(exception)
|
|
21
|
-
if Rails.env.development? || Rails.env.test?
|
|
22
|
-
raise exception # Rails own code will catch and give usual Rails error page with stack trace
|
|
23
|
-
else
|
|
24
|
-
|
|
25
|
-
flash_notice = I18n.t('blacklight.search.errors.request_error')
|
|
26
|
-
|
|
27
|
-
# If there are errors coming from the index page, we want to trap those sensibly
|
|
28
|
-
|
|
29
|
-
if flash[:notice] == flash_notice
|
|
30
|
-
logger.error "Cowardly aborting rsolr_request_error exception handling, because we redirected to a page that raises another exception"
|
|
31
|
-
raise exception
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
logger.error exception
|
|
35
|
-
|
|
36
|
-
flash[:notice] = flash_notice
|
|
37
|
-
redirect_to root_path
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
7
|
end
|
|
@@ -8,7 +8,6 @@ module Blacklight::Bookmarks
|
|
|
8
8
|
##
|
|
9
9
|
# Give Bookmarks access to the CatalogController configuration
|
|
10
10
|
include Blacklight::Configurable
|
|
11
|
-
include Blacklight::SearchHelper
|
|
12
11
|
include Blacklight::TokenBasedUser
|
|
13
12
|
|
|
14
13
|
copy_blacklight_config_from(CatalogController)
|
|
@@ -25,7 +24,7 @@ module Blacklight::Bookmarks
|
|
|
25
24
|
def action_documents
|
|
26
25
|
bookmarks = token_or_current_or_guest_user.bookmarks
|
|
27
26
|
bookmark_ids = bookmarks.collect { |b| b.document_id.to_s }
|
|
28
|
-
fetch(bookmark_ids)
|
|
27
|
+
search_service.fetch(bookmark_ids)
|
|
29
28
|
end
|
|
30
29
|
|
|
31
30
|
def action_success_redirect_path
|
|
@@ -41,13 +40,13 @@ module Blacklight::Bookmarks
|
|
|
41
40
|
def index
|
|
42
41
|
@bookmarks = token_or_current_or_guest_user.bookmarks
|
|
43
42
|
bookmark_ids = @bookmarks.collect { |b| b.document_id.to_s }
|
|
44
|
-
|
|
45
|
-
@
|
|
43
|
+
@response, deprecated_document_list = search_service.fetch(bookmark_ids)
|
|
44
|
+
@document_list = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(deprecated_document_list, "The @document_list instance variable is now deprecated and will be removed in Blacklight 8.0")
|
|
46
45
|
|
|
47
46
|
respond_to do |format|
|
|
48
|
-
format.html {
|
|
49
|
-
format.rss { render :
|
|
50
|
-
format.atom { render :
|
|
47
|
+
format.html {}
|
|
48
|
+
format.rss { render layout: false }
|
|
49
|
+
format.atom { render layout: false }
|
|
51
50
|
format.json do
|
|
52
51
|
render json: render_search_results_as_json
|
|
53
52
|
end
|
|
@@ -71,7 +70,7 @@ module Blacklight::Bookmarks
|
|
|
71
70
|
# is simpler.
|
|
72
71
|
def create
|
|
73
72
|
@bookmarks = if params[:bookmarks]
|
|
74
|
-
|
|
73
|
+
params[:bookmarks]
|
|
75
74
|
else
|
|
76
75
|
[{ document_id: params[:id], document_type: blacklight_config.document_model.to_s }]
|
|
77
76
|
end
|
|
@@ -79,16 +78,16 @@ module Blacklight::Bookmarks
|
|
|
79
78
|
current_or_guest_user.save! unless current_or_guest_user.persisted?
|
|
80
79
|
|
|
81
80
|
success = @bookmarks.all? do |bookmark|
|
|
82
|
-
|
|
81
|
+
current_or_guest_user.bookmarks.where(bookmark).exists? || current_or_guest_user.bookmarks.create(bookmark)
|
|
83
82
|
end
|
|
84
83
|
|
|
85
84
|
if request.xhr?
|
|
86
|
-
success ? render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count }}) : render(plain: "", status: "500")
|
|
85
|
+
success ? render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count } }) : render(plain: "", status: "500")
|
|
87
86
|
else
|
|
88
87
|
if @bookmarks.any? && success
|
|
89
|
-
flash[:notice] = I18n.t('blacklight.bookmarks.add.success', :
|
|
88
|
+
flash[:notice] = I18n.t('blacklight.bookmarks.add.success', count: @bookmarks.length)
|
|
90
89
|
elsif @bookmarks.any?
|
|
91
|
-
flash[:error] = I18n.t('blacklight.bookmarks.add.failure', :
|
|
90
|
+
flash[:error] = I18n.t('blacklight.bookmarks.add.failure', count: @bookmarks.length)
|
|
92
91
|
end
|
|
93
92
|
|
|
94
93
|
if respond_to? :redirect_back
|
|
@@ -103,21 +102,11 @@ module Blacklight::Bookmarks
|
|
|
103
102
|
# Beware, :id is the Solr document_id, not the actual Bookmark id.
|
|
104
103
|
# idempotent, as DELETE is supposed to be.
|
|
105
104
|
def destroy
|
|
106
|
-
|
|
107
|
-
if params[:bookmarks]
|
|
108
|
-
permit_bookmarks[:bookmarks]
|
|
109
|
-
else
|
|
110
|
-
[{ document_id: params[:id], document_type: blacklight_config.document_model.to_s }]
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
success = @bookmarks.all? do |bookmark|
|
|
114
|
-
bookmark = current_or_guest_user.bookmarks.find_by(bookmark)
|
|
115
|
-
bookmark && bookmark.delete && bookmark.destroyed?
|
|
116
|
-
end
|
|
105
|
+
bookmark = current_or_guest_user.bookmarks.find_by(document_id: params[:id], document_type: blacklight_config.document_model.to_s)
|
|
117
106
|
|
|
118
|
-
if
|
|
107
|
+
if bookmark && bookmark.delete && bookmark.destroyed?
|
|
119
108
|
if request.xhr?
|
|
120
|
-
render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count }})
|
|
109
|
+
render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count } })
|
|
121
110
|
elsif respond_to? :redirect_back
|
|
122
111
|
redirect_back fallback_location: bookmarks_path, notice: I18n.t('blacklight.bookmarks.remove.success')
|
|
123
112
|
else
|
|
@@ -126,11 +115,8 @@ module Blacklight::Bookmarks
|
|
|
126
115
|
end
|
|
127
116
|
elsif request.xhr?
|
|
128
117
|
head 500 # ajaxy request needs no redirect and should not have flash set
|
|
129
|
-
elsif respond_to? :redirect_back
|
|
130
|
-
redirect_back fallback_location: bookmarks_path, flash: { error: I18n.t('blacklight.bookmarks.remove.failure') }
|
|
131
118
|
else
|
|
132
|
-
|
|
133
|
-
redirect_to :back, flash: { error: I18n.t('blacklight.bookmarks.remove.failure') }
|
|
119
|
+
redirect_back fallback_location: bookmarks_path, flash: { error: I18n.t('blacklight.bookmarks.remove.failure') }
|
|
134
120
|
end
|
|
135
121
|
end
|
|
136
122
|
|
|
@@ -140,22 +126,19 @@ module Blacklight::Bookmarks
|
|
|
140
126
|
else
|
|
141
127
|
flash[:error] = I18n.t('blacklight.bookmarks.clear.failure')
|
|
142
128
|
end
|
|
143
|
-
redirect_to :
|
|
129
|
+
redirect_to action: "index"
|
|
144
130
|
end
|
|
145
131
|
|
|
146
|
-
|
|
132
|
+
private
|
|
147
133
|
|
|
148
134
|
def verify_user
|
|
149
|
-
unless current_or_guest_user
|
|
150
|
-
flash[:notice] = I18n.t('blacklight.bookmarks.need_login')
|
|
135
|
+
unless current_or_guest_user || (action == "index" && token_or_current_or_guest_user)
|
|
136
|
+
flash[:notice] = I18n.t('blacklight.bookmarks.need_login')
|
|
137
|
+
raise Blacklight::Exceptions::AccessDenied
|
|
151
138
|
end
|
|
152
139
|
end
|
|
153
140
|
|
|
154
141
|
def start_new_search_session?
|
|
155
142
|
action_name == "index"
|
|
156
143
|
end
|
|
157
|
-
|
|
158
|
-
def permit_bookmarks
|
|
159
|
-
params.permit(bookmarks: [:document_id, :document_type])
|
|
160
|
-
end
|
|
161
144
|
end
|
|
@@ -3,270 +3,311 @@ module Blacklight::Catalog
|
|
|
3
3
|
extend ActiveSupport::Concern
|
|
4
4
|
|
|
5
5
|
include Blacklight::Base
|
|
6
|
-
include Blacklight::DefaultComponentConfiguration
|
|
7
6
|
include Blacklight::Facet
|
|
8
7
|
|
|
9
8
|
# The following code is executed when someone includes blacklight::catalog in their
|
|
10
9
|
# own controller.
|
|
11
10
|
included do
|
|
12
|
-
|
|
13
|
-
helper_method :sms_mappings, :has_search_parameters?
|
|
14
|
-
end
|
|
11
|
+
helper_method :sms_mappings, :has_search_parameters?, :facet_limit_for
|
|
15
12
|
|
|
16
|
-
helper Blacklight::Facet
|
|
13
|
+
helper Blacklight::Facet
|
|
17
14
|
|
|
18
|
-
#
|
|
19
|
-
# the
|
|
20
|
-
rescue_from Blacklight::Exceptions::
|
|
15
|
+
# The index action will more than likely throw this one.
|
|
16
|
+
# Example: when the standard query parser is used, and a user submits a "bad" query.
|
|
17
|
+
rescue_from Blacklight::Exceptions::InvalidRequest, with: :handle_request_error
|
|
21
18
|
|
|
22
19
|
record_search_parameters
|
|
23
20
|
end
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
format.html { store_preferred_view }
|
|
31
|
-
format.rss { render :layout => false }
|
|
32
|
-
format.atom { render :layout => false }
|
|
33
|
-
format.json do
|
|
34
|
-
@presenter = Blacklight::JsonPresenter.new(@response,
|
|
35
|
-
@document_list,
|
|
36
|
-
facets_from_request,
|
|
37
|
-
blacklight_config)
|
|
38
|
-
end
|
|
39
|
-
additional_response_formats(format)
|
|
40
|
-
document_export_formats(format)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
22
|
+
# get search results from the solr index
|
|
23
|
+
def index
|
|
24
|
+
(@response, deprecated_document_list) = search_service.search_results
|
|
25
|
+
|
|
26
|
+
@document_list = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(deprecated_document_list, 'The @document_list instance variable is deprecated; use @response.documents instead.')
|
|
43
27
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
28
|
+
respond_to do |format|
|
|
29
|
+
format.html { store_preferred_view }
|
|
30
|
+
format.rss { render layout: false }
|
|
31
|
+
format.atom { render layout: false }
|
|
32
|
+
format.json do
|
|
33
|
+
@presenter = Blacklight::JsonPresenter.new(@response,
|
|
34
|
+
facets_from_request,
|
|
35
|
+
blacklight_config)
|
|
52
36
|
end
|
|
37
|
+
additional_response_formats(format)
|
|
38
|
+
document_export_formats(format)
|
|
53
39
|
end
|
|
40
|
+
end
|
|
54
41
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
42
|
+
# get a single document from the index
|
|
43
|
+
# to add responses for formats other than html or json see _Blacklight::Document::Export_
|
|
44
|
+
def show
|
|
45
|
+
deprecated_response, @document = search_service.fetch(params[:id])
|
|
46
|
+
@response = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(deprecated_response, 'The @response instance variable is deprecated; use @document.response instead.')
|
|
60
47
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
else
|
|
66
|
-
redirect_to blacklight_config.document_model.new(id: params[:id]), status: 303
|
|
67
|
-
end
|
|
48
|
+
respond_to do |format|
|
|
49
|
+
format.html { @search_context = setup_next_and_previous_documents }
|
|
50
|
+
format.json { render json: { response: { document: @document } } }
|
|
51
|
+
additional_export_formats(@document, format)
|
|
68
52
|
end
|
|
53
|
+
end
|
|
69
54
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
end
|
|
83
|
-
format.json
|
|
84
|
-
end
|
|
55
|
+
# updates the search counter (allows the show view to paginate)
|
|
56
|
+
def track
|
|
57
|
+
search_session['counter'] = params[:counter]
|
|
58
|
+
search_session['id'] = params[:search_id]
|
|
59
|
+
search_session['per_page'] = params[:per_page]
|
|
60
|
+
|
|
61
|
+
if params[:redirect] && (params[:redirect].starts_with?('/') || params[:redirect] =~ URI::DEFAULT_PARSER.make_regexp)
|
|
62
|
+
uri = URI.parse(params[:redirect])
|
|
63
|
+
path = uri.query ? "#{uri.path}?#{uri.query}" : uri.path
|
|
64
|
+
redirect_to path, status: 303
|
|
65
|
+
else
|
|
66
|
+
redirect_to blacklight_config.document_model.new(id: params[:id]), status: 303
|
|
85
67
|
end
|
|
68
|
+
end
|
|
86
69
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
70
|
+
# displays values and pagination links for a single facet field
|
|
71
|
+
def facet
|
|
72
|
+
@facet = blacklight_config.facet_fields[params[:id]]
|
|
73
|
+
raise ActionController::RoutingError, 'Not Found' unless @facet
|
|
74
|
+
@response = search_service.facet_field_response(@facet.key)
|
|
75
|
+
@display_facet = @response.aggregations[@facet.field]
|
|
76
|
+
@pagination = facet_paginator(@facet, @display_facet)
|
|
77
|
+
respond_to do |format|
|
|
78
|
+
format.html do
|
|
79
|
+
# Draw the partial for the "more" facet modal window:
|
|
80
|
+
return render layout: false if request.xhr?
|
|
81
|
+
# Otherwise draw the facet selector for users who have javascript disabled.
|
|
92
82
|
end
|
|
83
|
+
format.json
|
|
93
84
|
end
|
|
85
|
+
end
|
|
94
86
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
search_state.url_for_document(blacklight_config.document_model.new(id: params[:id]))
|
|
87
|
+
# method to serve up XML OpenSearch description and JSON autocomplete response
|
|
88
|
+
def opensearch
|
|
89
|
+
respond_to do |format|
|
|
90
|
+
format.xml { render layout: false }
|
|
91
|
+
format.json { render json: search_service.opensearch_response }
|
|
101
92
|
end
|
|
93
|
+
end
|
|
102
94
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
95
|
+
def suggest
|
|
96
|
+
respond_to do |format|
|
|
97
|
+
format.json do
|
|
98
|
+
render json: suggestions_service.suggestions
|
|
99
|
+
end
|
|
108
100
|
end
|
|
101
|
+
end
|
|
109
102
|
|
|
110
|
-
|
|
103
|
+
def action_documents
|
|
104
|
+
search_service.fetch(Array(params[:id]))
|
|
105
|
+
end
|
|
111
106
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
def action_success_redirect_path
|
|
108
|
+
search_state.url_for_document(blacklight_config.document_model.new(id: params[:id]))
|
|
109
|
+
end
|
|
115
110
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
session[:preferred_view] = params[:view] if params[:view]
|
|
123
|
-
end
|
|
111
|
+
##
|
|
112
|
+
# Check if any search parameters have been set
|
|
113
|
+
# @return [Boolean]
|
|
114
|
+
def has_search_parameters?
|
|
115
|
+
!params[:q].blank? || !params[:f].blank? || !params[:search_field].blank?
|
|
116
|
+
end
|
|
124
117
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
end
|
|
147
|
-
end
|
|
118
|
+
DEFAULT_FACET_LIMIT = 10
|
|
119
|
+
|
|
120
|
+
# Look up facet limit for given facet_field. Will look at config, and
|
|
121
|
+
# if config is 'true' will look up from Solr @response if available. If
|
|
122
|
+
# no limit is available, returns nil. Used from #add_facetting_to_solr
|
|
123
|
+
# to supply f.fieldname.facet.limit values in solr request (no @response
|
|
124
|
+
# available), and used in display (with @response available) to create
|
|
125
|
+
# a facet paginator with the right limit.
|
|
126
|
+
def facet_limit_for(facet_field)
|
|
127
|
+
facet = blacklight_config.facet_fields[facet_field]
|
|
128
|
+
return if facet.blank?
|
|
129
|
+
|
|
130
|
+
if facet.limit && @response && @response.aggregations[facet.field]
|
|
131
|
+
limit = @response.aggregations[facet.field].limit
|
|
132
|
+
|
|
133
|
+
if limit.nil? # we didn't get or a set a limit, so infer one.
|
|
134
|
+
facet.limit if facet.limit != true
|
|
135
|
+
elsif limit == -1 # limit -1 is solr-speak for unlimited
|
|
136
|
+
nil
|
|
137
|
+
else
|
|
138
|
+
limit.to_i - 1 # we added 1 to find out if we needed to paginate
|
|
148
139
|
end
|
|
140
|
+
elsif facet.limit
|
|
141
|
+
facet.limit == true ? DEFAULT_FACET_LIMIT : facet.limit
|
|
149
142
|
end
|
|
143
|
+
end
|
|
150
144
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
145
|
+
private
|
|
146
|
+
|
|
147
|
+
#
|
|
148
|
+
# non-routable methods ->
|
|
149
|
+
#
|
|
150
|
+
|
|
151
|
+
def render_sms_action?(_config, _options)
|
|
152
|
+
sms_mappings.present?
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def search_service
|
|
156
|
+
search_service_class.new(blacklight_config, search_state.to_h)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
##
|
|
160
|
+
# If the params specify a view, then store it in the session. If the params
|
|
161
|
+
# do not specifiy the view, set the view parameter to the value stored in the
|
|
162
|
+
# session. This enables a user with a session to do subsequent searches and have
|
|
163
|
+
# them default to the last used view.
|
|
164
|
+
def store_preferred_view
|
|
165
|
+
session[:preferred_view] = params[:view] if params[:view]
|
|
166
|
+
end
|
|
159
167
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
168
|
+
##
|
|
169
|
+
# Render additional response formats for the index action, as provided by the
|
|
170
|
+
# blacklight configuration
|
|
171
|
+
# @param [Hash] format
|
|
172
|
+
# @note Make sure your format has a well known mime-type or is registered in config/initializers/mime_types.rb
|
|
173
|
+
# @example
|
|
174
|
+
# config.index.respond_to.txt = Proc.new { render plain: "A list of docs." }
|
|
175
|
+
def additional_response_formats format
|
|
176
|
+
blacklight_config.index.respond_to.each do |key, config|
|
|
177
|
+
format.send key do
|
|
178
|
+
case config
|
|
179
|
+
when false
|
|
180
|
+
raise ActionController::RoutingError, 'Not Found'
|
|
181
|
+
when Hash
|
|
182
|
+
render config
|
|
183
|
+
when Proc
|
|
184
|
+
instance_exec(&config)
|
|
185
|
+
when Symbol, String
|
|
186
|
+
send config
|
|
167
187
|
else
|
|
168
|
-
|
|
188
|
+
render({})
|
|
169
189
|
end
|
|
170
190
|
end
|
|
171
191
|
end
|
|
192
|
+
end
|
|
172
193
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
render
|
|
179
|
-
rescue ActionView::MissingTemplate
|
|
180
|
-
render plain: @response.documents.map { |x| x.export_as(format_name) if x.exports_as? format_name }.compact.join("\n"), layout: false
|
|
194
|
+
##
|
|
195
|
+
# Render additional export formats for the show action, as provided by
|
|
196
|
+
# the document extension framework. See _Blacklight::Document::Export_
|
|
197
|
+
def additional_export_formats(document, format)
|
|
198
|
+
document.export_formats.each_key do |format_name|
|
|
199
|
+
format.send(format_name.to_sym) { render body: document.export_as(format_name), layout: false }
|
|
181
200
|
end
|
|
201
|
+
end
|
|
182
202
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
203
|
+
##
|
|
204
|
+
# Try to render a response from the document export formats available
|
|
205
|
+
def document_export_formats format
|
|
206
|
+
format.any do
|
|
207
|
+
format_name = params.fetch(:format, '').to_sym
|
|
208
|
+
if @response.export_formats.include? format_name
|
|
209
|
+
render_document_export_format format_name
|
|
210
|
+
else
|
|
211
|
+
raise ActionController::UnknownFormat
|
|
212
|
+
end
|
|
188
213
|
end
|
|
214
|
+
end
|
|
189
215
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
# SMS action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
|
|
201
|
-
def sms_action documents
|
|
202
|
-
to = "#{params[:to].gsub(/[^\d]/, '')}@#{params[:carrier]}"
|
|
203
|
-
mail = RecordMailer.sms_record(documents, { :to => to }, url_options)
|
|
204
|
-
if mail.respond_to? :deliver_now
|
|
205
|
-
mail.deliver_now
|
|
206
|
-
else
|
|
207
|
-
mail.deliver
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
def validate_sms_params
|
|
212
|
-
if params[:to].blank?
|
|
213
|
-
flash[:error] = I18n.t('blacklight.sms.errors.to.blank')
|
|
214
|
-
elsif params[:carrier].blank?
|
|
215
|
-
flash[:error] = I18n.t('blacklight.sms.errors.carrier.blank')
|
|
216
|
-
elsif params[:to].gsub(/[^\d]/, '').length != 10
|
|
217
|
-
flash[:error] = I18n.t('blacklight.sms.errors.to.invalid', :to => params[:to])
|
|
218
|
-
elsif !sms_mappings.values.include?(params[:carrier])
|
|
219
|
-
flash[:error] = I18n.t('blacklight.sms.errors.carrier.invalid')
|
|
220
|
-
end
|
|
216
|
+
##
|
|
217
|
+
# Render the document export formats for a response
|
|
218
|
+
# First, try to render an appropriate template (e.g. index.endnote.erb)
|
|
219
|
+
# If that fails, just concatenate the document export responses with a newline.
|
|
220
|
+
def render_document_export_format format_name
|
|
221
|
+
render
|
|
222
|
+
rescue ActionView::MissingTemplate
|
|
223
|
+
render plain: @response.documents.map { |x| x.export_as(format_name) if x.exports_as? format_name }.compact.join("\n"), layout: false
|
|
224
|
+
end
|
|
221
225
|
|
|
222
|
-
|
|
223
|
-
|
|
226
|
+
# Overrides the Blacklight::Controller provided #search_action_url.
|
|
227
|
+
# By default, any search action from a Blacklight::Catalog controller
|
|
228
|
+
# should use the current controller when constructing the route.
|
|
229
|
+
def search_action_url options = {}
|
|
230
|
+
url_for(options.reverse_merge(action: 'index'))
|
|
231
|
+
end
|
|
224
232
|
|
|
225
|
-
|
|
226
|
-
|
|
233
|
+
# Email Action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
|
|
234
|
+
def email_action documents
|
|
235
|
+
mail = RecordMailer.email_record(documents, { to: params[:to], message: params[:message] }, url_options)
|
|
236
|
+
if mail.respond_to? :deliver_now
|
|
237
|
+
mail.deliver_now
|
|
238
|
+
else
|
|
239
|
+
mail.deliver
|
|
227
240
|
end
|
|
241
|
+
end
|
|
228
242
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
243
|
+
# SMS action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
|
|
244
|
+
def sms_action documents
|
|
245
|
+
to = "#{params[:to].gsub(/[^\d]/, '')}@#{params[:carrier]}"
|
|
246
|
+
mail = RecordMailer.sms_record(documents, { to: to }, url_options)
|
|
247
|
+
if mail.respond_to? :deliver_now
|
|
248
|
+
mail.deliver_now
|
|
249
|
+
else
|
|
250
|
+
mail.deliver
|
|
251
|
+
end
|
|
252
|
+
end
|
|
235
253
|
|
|
236
|
-
|
|
254
|
+
def validate_sms_params
|
|
255
|
+
if params[:to].blank?
|
|
256
|
+
flash[:error] = I18n.t('blacklight.sms.errors.to.blank')
|
|
257
|
+
elsif params[:carrier].blank?
|
|
258
|
+
flash[:error] = I18n.t('blacklight.sms.errors.carrier.blank')
|
|
259
|
+
elsif params[:to].gsub(/[^\d]/, '').length != 10
|
|
260
|
+
flash[:error] = I18n.t('blacklight.sms.errors.to.invalid', to: params[:to])
|
|
261
|
+
elsif !sms_mappings.values.include?(params[:carrier])
|
|
262
|
+
flash[:error] = I18n.t('blacklight.sms.errors.carrier.invalid')
|
|
237
263
|
end
|
|
238
264
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
respond_to do |format|
|
|
253
|
-
format.xml { render :xml => error_info, :status => 404 }
|
|
254
|
-
format.json { render :json => error_info, :status => 404 }
|
|
255
|
-
|
|
256
|
-
# default to HTML response, even for other non-HTML formats we don't
|
|
257
|
-
# neccesarily know about, seems to be consistent with what Rails4 does
|
|
258
|
-
# by default with uncaught ActiveRecord::RecordNotFound in production
|
|
259
|
-
format.any do
|
|
260
|
-
# use standard, possibly locally overridden, 404.html file. Even for
|
|
261
|
-
# possibly non-html formats, this is consistent with what Rails does
|
|
262
|
-
# on raising an ActiveRecord::RecordNotFound. Rails.root IS needed
|
|
263
|
-
# for it to work under testing, without worrying about CWD.
|
|
264
|
-
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false, :content_type => 'text/html'
|
|
265
|
-
end
|
|
266
|
-
end
|
|
265
|
+
flash[:error].blank?
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def sms_mappings
|
|
269
|
+
Blacklight::Engine.config.sms_mappings
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def validate_email_params
|
|
273
|
+
if params[:to].blank?
|
|
274
|
+
flash[:error] = I18n.t('blacklight.email.errors.to.blank')
|
|
275
|
+
elsif !params[:to].match(Blacklight::Engine.config.email_regexp)
|
|
276
|
+
flash[:error] = I18n.t('blacklight.email.errors.to.invalid', to: params[:to])
|
|
267
277
|
end
|
|
268
278
|
|
|
269
|
-
|
|
270
|
-
|
|
279
|
+
flash[:error].blank?
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def start_new_search_session?
|
|
283
|
+
action_name == "index"
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def suggestions_service
|
|
287
|
+
Blacklight::SuggestSearch.new(params, search_service.repository).suggestions
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def determine_layout
|
|
291
|
+
action_name == 'show' ? 'catalog_result' : super
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
# when a method throws a Blacklight::Exceptions::InvalidRequest, this method is executed.
|
|
295
|
+
def handle_request_error(exception)
|
|
296
|
+
# Rails own code will catch and give usual Rails error page with stack trace
|
|
297
|
+
raise exception if Rails.env.development? || Rails.env.test?
|
|
298
|
+
|
|
299
|
+
flash_notice = I18n.t('blacklight.search.errors.request_error')
|
|
300
|
+
|
|
301
|
+
# If there are errors coming from the index page, we want to trap those sensibly
|
|
302
|
+
|
|
303
|
+
if flash[:notice] == flash_notice
|
|
304
|
+
logger.error "Cowardly aborting rsolr_request_error exception handling, because we redirected to a page that raises another exception"
|
|
305
|
+
raise exception
|
|
271
306
|
end
|
|
307
|
+
|
|
308
|
+
logger.error exception
|
|
309
|
+
|
|
310
|
+
flash[:notice] = flash_notice
|
|
311
|
+
redirect_to search_action_url
|
|
312
|
+
end
|
|
272
313
|
end
|