blacklight 7.15.2 → 7.16.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/VERSION +1 -1
- data/app/components/blacklight/document/action_component.html.erb +1 -1
- data/app/components/blacklight/document/action_component.rb +2 -1
- data/app/components/blacklight/document/actions_component.html.erb +1 -1
- data/app/components/blacklight/document/actions_component.rb +2 -1
- data/app/components/blacklight/search_bar_component.rb +5 -1
- data/app/controllers/concerns/blacklight/catalog.rb +1 -1
- data/app/helpers/blacklight/blacklight_helper_behavior.rb +3 -4
- data/app/helpers/blacklight/component_helper_behavior.rb +2 -2
- data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -2
- data/app/presenters/blacklight/document_presenter.rb +8 -4
- data/app/services/blacklight/search_service.rb +1 -1
- data/app/views/bookmarks/_tools.html.erb +1 -1
- data/app/views/catalog/_show_main_content.html.erb +2 -2
- data/lib/blacklight/configuration.rb +50 -5
- data/lib/blacklight/configuration/view_config.rb +16 -5
- data/lib/blacklight/open_struct_with_hash_access.rb +4 -0
- data/lib/blacklight/search_state.rb +2 -2
- data/lib/blacklight/solr/search_builder_behavior.rb +11 -1
- data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
- data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +12 -0
- data/spec/models/blacklight/configuration_spec.rb +64 -0
- data/spec/models/blacklight/solr/search_builder_spec.rb +32 -0
- data/spec/views/catalog/index.atom.builder_spec.rb +1 -1
- metadata +6 -6
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 6ceacfa202c3acda3cb375ea3f76dd2e854f786aaba9e5a83a40cce15a1a77f5
         | 
| 4 | 
            +
              data.tar.gz: b09a2d694145f7b8da82ecb99314632c1e521d63748ea0854a8d7dd131710633
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9fd109f991c7cf33507b73fa8e40bd67c90601751abca9374da323d0e907f8117ab676406f2edba878e1aba39f2bfd477fe4892e1dd015b11a30ef9311d95d6f
         | 
| 7 | 
            +
              data.tar.gz: a10adadf6affff113b5ee41dd10c469ace59eda64afb560052fb8cdd94a1188ee11b1dc7c7cafe92ff229a43504a8590c8508c407f64c6fdfadb9dfbc70a7ccd
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            7. | 
| 1 | 
            +
            7.16.0
         | 
| @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
              <%= link_to label,
         | 
| 3 3 | 
             
                          url,
         | 
| 4 4 | 
             
                          id: @id,
         | 
| 5 | 
            -
                          class:  | 
| 5 | 
            +
                          class: @link_classes,
         | 
| 6 6 | 
             
                          data: {}.merge(({ blacklight_modal: "trigger" } if @action.modal != false) || {}) %>
         | 
| 7 7 | 
             
            <% else %>
         | 
| 8 8 | 
             
              <%= @view_context.render(partial: @action.partial || @action.name.to_s, locals: { document: @document, document_action_config: @action }.merge(@options)) %>
         | 
| @@ -7,12 +7,13 @@ module Blacklight | |
| 7 7 | 
             
                  with_collection_parameter :action
         | 
| 8 8 |  | 
| 9 9 | 
             
                  # @param [Blacklight::Document] document
         | 
| 10 | 
            -
                  def initialize(document:, action:, options: {}, url_opts: {}, id: nil)
         | 
| 10 | 
            +
                  def initialize(document:, action:, options: {}, url_opts: {}, id: nil, link_classes: 'nav-link')
         | 
| 11 11 | 
             
                    @document = document
         | 
| 12 12 | 
             
                    @action = action
         | 
| 13 13 | 
             
                    @options = options
         | 
| 14 14 | 
             
                    @url_opts = url_opts
         | 
| 15 15 | 
             
                    @id = id || @action.fetch(:id, "#{@action.name}Link")
         | 
| 16 | 
            +
                    @link_classes = link_classes
         | 
| 16 17 | 
             
                  end
         | 
| 17 18 |  | 
| 18 19 | 
             
                  def using_default_document_action?
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            <%= content_tag @tag, class: @classes do %>
         | 
| 2 2 | 
             
              <% @actions.each do |action| %>
         | 
| 3 | 
            -
                <% result = capture { @view_context.render((action.component || Blacklight::Document::ActionComponent).new(action: action, document: @document, options: @options, url_opts: @url_opts)) } %>
         | 
| 3 | 
            +
                <% result = capture { @view_context.render((action.component || Blacklight::Document::ActionComponent).new(action: action, document: @document, options: @options, url_opts: @url_opts, link_classes: @link_classes)) } %>
         | 
| 4 4 |  | 
| 5 5 | 
             
                <% if @wrapping_tag %>
         | 
| 6 6 | 
             
                  <%= content_tag(@wrapping_tag, class: Array(@wrapping_classes) + [action.key]) do %>
         | 
| @@ -6,7 +6,7 @@ module Blacklight | |
| 6 6 | 
             
                class ActionsComponent < ::ViewComponent::Base
         | 
| 7 7 | 
             
                  # @param [Blacklight::Document] document
         | 
| 8 8 | 
             
                  # rubocop:disable Metrics/ParameterLists
         | 
| 9 | 
            -
                  def initialize(document: nil, actions: [], options: {}, url_opts: nil, tag: :div, classes: 'index-document-functions', wrapping_tag: nil, wrapping_classes: nil)
         | 
| 9 | 
            +
                  def initialize(document: nil, actions: [], options: {}, url_opts: nil, tag: :div, classes: 'index-document-functions', wrapping_tag: nil, wrapping_classes: nil, link_classes: 'nav-link')
         | 
| 10 10 | 
             
                    @document = document
         | 
| 11 11 | 
             
                    @actions = actions
         | 
| 12 12 | 
             
                    @tag = tag
         | 
| @@ -15,6 +15,7 @@ module Blacklight | |
| 15 15 | 
             
                    @url_opts = url_opts
         | 
| 16 16 | 
             
                    @wrapping_tag = wrapping_tag
         | 
| 17 17 | 
             
                    @wrapping_classes = wrapping_classes
         | 
| 18 | 
            +
                    @link_classes = link_classes
         | 
| 18 19 | 
             
                  end
         | 
| 19 20 | 
             
                  # rubocop:enable Metrics/ParameterLists
         | 
| 20 21 |  | 
| @@ -46,7 +46,11 @@ module Blacklight | |
| 46 46 | 
             
                private
         | 
| 47 47 |  | 
| 48 48 | 
             
                def presenter
         | 
| 49 | 
            -
                  @presenter ||=  | 
| 49 | 
            +
                  @presenter ||= presenter_class.new(controller, blacklight_config)
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def presenter_class
         | 
| 53 | 
            +
                  blacklight_config.view_config(action_name: :index).search_bar_presenter_class
         | 
| 50 54 | 
             
                end
         | 
| 51 55 |  | 
| 52 56 | 
             
                def blacklight_config
         | 
| @@ -198,7 +198,7 @@ module Blacklight::Catalog | |
| 198 198 | 
             
              # @example
         | 
| 199 199 | 
             
              #   config.index.respond_to.txt = Proc.new { render plain: "A list of docs." }
         | 
| 200 200 | 
             
              def additional_response_formats(format)
         | 
| 201 | 
            -
                blacklight_config.index.respond_to.each do |key, config|
         | 
| 201 | 
            +
                blacklight_config.view_config(action_name: :index).respond_to.each do |key, config|
         | 
| 202 202 | 
             
                  format.send key do
         | 
| 203 203 | 
             
                    case config
         | 
| 204 204 | 
             
                    when false
         | 
| @@ -380,7 +380,7 @@ module Blacklight::BlacklightHelperBehavior | |
| 380 380 | 
             
              def show_presenter_class(_document)
         | 
| 381 381 | 
             
                Deprecation.warn(Blacklight::BlacklightHelperBehavior, '#show_presenter_class is deprecated; use #document_presenter_class instead')
         | 
| 382 382 |  | 
| 383 | 
            -
                blacklight_config.show.document_presenter_class
         | 
| 383 | 
            +
                blacklight_config.view_config(:show, action_name: action_name).document_presenter_class
         | 
| 384 384 | 
             
              end
         | 
| 385 385 |  | 
| 386 386 | 
             
              # @deprecated
         | 
| @@ -388,13 +388,12 @@ module Blacklight::BlacklightHelperBehavior | |
| 388 388 | 
             
              def index_presenter_class(_document)
         | 
| 389 389 | 
             
                Deprecation.warn(Blacklight::BlacklightHelperBehavior, '#index_presenter_class is deprecated; use #document_presenter_class instead')
         | 
| 390 390 |  | 
| 391 | 
            -
                 | 
| 392 | 
            -
                  blacklight_config.index.document_presenter_class
         | 
| 391 | 
            +
                blacklight_config.view_config(document_index_view_type, action_name: action_name).document_presenter_class
         | 
| 393 392 | 
             
              end
         | 
| 394 393 |  | 
| 395 394 | 
             
              # @return [Class]
         | 
| 396 395 | 
             
              def search_bar_presenter_class
         | 
| 397 | 
            -
                blacklight_config.index.search_bar_presenter_class
         | 
| 396 | 
            +
                blacklight_config.view_config(action_name: :index).search_bar_presenter_class
         | 
| 398 397 | 
             
              end
         | 
| 399 398 |  | 
| 400 399 | 
             
              # @!group Layout helpers
         | 
| @@ -94,11 +94,11 @@ module Blacklight | |
| 94 94 | 
             
                end
         | 
| 95 95 |  | 
| 96 96 | 
             
                def show_doc_actions?(document = @document, options = {})
         | 
| 97 | 
            -
                  filter_partials(blacklight_config.show.document_actions, { document: document }.merge(options)).any?
         | 
| 97 | 
            +
                  filter_partials(blacklight_config.view_config(:show).document_actions, { document: document }.merge(options)).any?
         | 
| 98 98 | 
             
                end
         | 
| 99 99 |  | 
| 100 100 | 
             
                def document_actions(document, options: {})
         | 
| 101 | 
            -
                  filter_partials(blacklight_config.show.document_actions, { document: document }.merge(options)).map { |_k, v| v }
         | 
| 101 | 
            +
                  filter_partials(blacklight_config.view_config(:show).document_actions, { document: document }.merge(options)).map { |_k, v| v }
         | 
| 102 102 | 
             
                end
         | 
| 103 103 |  | 
| 104 104 | 
             
                private
         | 
| @@ -101,9 +101,9 @@ module Blacklight::ConfigurationHelperBehavior | |
| 101 101 |  | 
| 102 102 | 
             
              # Return the label for a search view
         | 
| 103 103 | 
             
              # @return [String]
         | 
| 104 | 
            -
              def view_label | 
| 104 | 
            +
              def view_label(view)
         | 
| 105 105 | 
             
                view_config = blacklight_config.view[view]
         | 
| 106 | 
            -
                view_config.display_label | 
| 106 | 
            +
                view_config.display_label
         | 
| 107 107 | 
             
              end
         | 
| 108 108 | 
             
              deprecation_deprecate view_label: 'Moving to ViewConfig#display_label and Blacklight::Response::ViewTypeComponent'
         | 
| 109 109 |  | 
| @@ -72,9 +72,9 @@ module Blacklight | |
| 72 72 | 
             
                  fields += Array.wrap(view_config[:"#{base_name}_display_type_field"]) if base_name && view_config.key?(:"#{base_name}_display_type_field")
         | 
| 73 73 | 
             
                  fields += Array.wrap(view_config.display_type_field)
         | 
| 74 74 |  | 
| 75 | 
            -
                  if fields.empty?
         | 
| 76 | 
            -
                    fields += Array.wrap( | 
| 77 | 
            -
                    fields += Array.wrap( | 
| 75 | 
            +
                  if fields.empty? && show_view_config != view_config
         | 
| 76 | 
            +
                    fields += Array.wrap(show_view_config[:"#{base_name}_display_type_field"]) if base_name && show_view_config.key?(:"#{base_name}_display_type_field")
         | 
| 77 | 
            +
                    fields += Array.wrap(show_view_config.display_type_field)
         | 
| 78 78 | 
             
                  end
         | 
| 79 79 |  | 
| 80 80 | 
             
                  fields += ['format'] if fields.empty? # backwards compatibility with the old default value for display_type_field
         | 
| @@ -118,7 +118,11 @@ module Blacklight | |
| 118 118 | 
             
                end
         | 
| 119 119 |  | 
| 120 120 | 
             
                def view_config
         | 
| 121 | 
            -
                  @view_config ||=  | 
| 121 | 
            +
                  @view_config ||= show_view_config
         | 
| 122 | 
            +
                end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                def show_view_config
         | 
| 125 | 
            +
                  configuration.view_config(:show)
         | 
| 122 126 | 
             
                end
         | 
| 123 127 |  | 
| 124 128 | 
             
                private
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            <% if render_show_doc_actions_method_from_blacklight? %>
         | 
| 2 | 
            -
              <%= render(Blacklight::Document::ActionsComponent.new(document: nil, tag: ' | 
| 2 | 
            +
              <%= render(Blacklight::Document::ActionsComponent.new(document: nil, tag: 'div', classes: "#{controller_name}Tools", wrapping_tag: 'span', wrapping_classes: 'btn btn-outline-primary', link_classes: '', actions: document_actions(document_list, options: { document: nil }), options: { document_list: @response.documents }, url_opts: Blacklight::Parameters.sanitize(params.to_unsafe_h))) %>
         | 
| 3 3 | 
             
            <% else %>
         | 
| 4 4 | 
             
              <% Deprecation.warn(self, '#render_show_doc_actions is deprecated; use ActionComponents instead') %>
         | 
| 5 5 | 
             
              <ul class="<%= controller_name %>Tools nav nav-pills">
         | 
| @@ -3,7 +3,7 @@ | |
| 3 3 | 
             
            <% @page_title = t('blacklight.search.show.title', document_title: Deprecation.silence(Blacklight::BlacklightHelperBehavior) { document_show_html_title }, application_name: application_name).html_safe %>
         | 
| 4 4 | 
             
            <% content_for(:head) { render_link_rel_alternates } %>
         | 
| 5 5 |  | 
| 6 | 
            -
            <%= render (blacklight_config.show.document_component || Blacklight::DocumentComponent).new(document: @document, component: :div, title_component: :h1, show: true) do |component| %>
         | 
| 6 | 
            +
            <%= render (blacklight_config.view_config(:show).document_component || Blacklight::DocumentComponent).new(document: @document, component: :div, title_component: :h1, show: true) do |component| %>
         | 
| 7 7 | 
             
              <% component.with(:footer) do %>
         | 
| 8 8 | 
             
                <% if @document.respond_to?(:export_as_openurl_ctx_kev) %>
         | 
| 9 9 | 
             
                  <!--
         | 
| @@ -17,7 +17,7 @@ | |
| 17 17 |  | 
| 18 18 | 
             
              <%# Use :body for complete backwards compatibility (overriding the component body markup),
         | 
| 19 19 | 
             
                    but if the app explicitly  opted-in to components, make the partials data available as :partials to ease migrations pain %>
         | 
| 20 | 
            -
              <% component.with(blacklight_config.show.document_component.blank? && blacklight_config.view_config(:show).partials.any? ? :body : :partials) do %>
         | 
| 20 | 
            +
              <% component.with(blacklight_config.view_config(:show).document_component.blank? && blacklight_config.view_config(:show).partials.any? ? :body : :partials) do %>
         | 
| 21 21 | 
             
                <div id="doc_<%= @document.id.to_s.parameterize %>">
         | 
| 22 22 | 
             
                  <%= render_document_partials @document, blacklight_config.view_config(:show).partials, component: component %>
         | 
| 23 23 | 
             
                </div>
         | 
| @@ -95,6 +95,12 @@ module Blacklight | |
| 95 95 | 
             
                        partials: [:show_header, :show],
         | 
| 96 96 | 
             
                        document_actions: NestedOpenStructWithHashAccess.new(ToolConfig)
         | 
| 97 97 | 
             
                      ),
         | 
| 98 | 
            +
                      action_mapping: NestedOpenStructWithHashAccess.new(
         | 
| 99 | 
            +
                        ViewConfig,
         | 
| 100 | 
            +
                        default: { top_level_config: :index },
         | 
| 101 | 
            +
                        show: { top_level_config: :show },
         | 
| 102 | 
            +
                        citation: { parent_config: :show }
         | 
| 103 | 
            +
                      ),
         | 
| 98 104 | 
             
                      # Configurations for specific types of index views
         | 
| 99 105 | 
             
                      view: NestedOpenStructWithHashAccess.new(ViewConfig,
         | 
| 100 106 | 
             
                                                               list: {},
         | 
| @@ -307,13 +313,35 @@ module Blacklight | |
| 307 313 | 
             
                end
         | 
| 308 314 | 
             
                alias_method :inheritable_copy, :build
         | 
| 309 315 |  | 
| 310 | 
            -
                # Get a view configuration for the given view type
         | 
| 311 | 
            -
                #  | 
| 316 | 
            +
                # Get a view configuration for the given view type + action. The effective
         | 
| 317 | 
            +
                # view configuration is inherited from:
         | 
| 318 | 
            +
                # - the configuration from blacklight_config.view with the key `view_type`
         | 
| 319 | 
            +
                # - the configuration from blacklight_config.action_mapping with the key `action_name`
         | 
| 320 | 
            +
                # - any parent config for the action map result above
         | 
| 321 | 
            +
                # - the action_mapping default configuration
         | 
| 322 | 
            +
                # - the top-level index/show view configuration
         | 
| 323 | 
            +
                #
         | 
| 312 324 | 
             
                # @param [Symbol,#to_sym] view_type
         | 
| 313 325 | 
             
                # @return [Blacklight::Configuration::ViewConfig]
         | 
| 314 | 
            -
                def view_config(view_type)
         | 
| 315 | 
            -
                  view_type  | 
| 316 | 
            -
                   | 
| 326 | 
            +
                def view_config(view_type = nil, action_name: :index)
         | 
| 327 | 
            +
                  view_type &&= view_type.to_sym
         | 
| 328 | 
            +
                  action_name &&= action_name.to_sym
         | 
| 329 | 
            +
                  action_name ||= :index
         | 
| 330 | 
            +
             | 
| 331 | 
            +
                  if view_type == :show
         | 
| 332 | 
            +
                    action_name = view_type
         | 
| 333 | 
            +
                    view_type = nil
         | 
| 334 | 
            +
                  end
         | 
| 335 | 
            +
             | 
| 336 | 
            +
                  @view_config ||= {}
         | 
| 337 | 
            +
                  @view_config[[view_type, action_name]] ||= begin
         | 
| 338 | 
            +
                    if view_type.nil?
         | 
| 339 | 
            +
                      action_config(action_name)
         | 
| 340 | 
            +
                    else
         | 
| 341 | 
            +
                      base_config = action_config(action_name)
         | 
| 342 | 
            +
                      base_config.merge(view.fetch(view_type, {}))
         | 
| 343 | 
            +
                    end
         | 
| 344 | 
            +
                  end
         | 
| 317 345 | 
             
                end
         | 
| 318 346 |  | 
| 319 347 | 
             
                # YARD will include inline disabling as docs, cannot do multiline inside @!macro.  AND this must be separate from doc block.
         | 
| @@ -441,5 +469,22 @@ module Blacklight | |
| 441 469 | 
             
                    yield(object)
         | 
| 442 470 | 
             
                  end
         | 
| 443 471 | 
             
                end
         | 
| 472 | 
            +
             | 
| 473 | 
            +
                def action_config(action, default: :index)
         | 
| 474 | 
            +
                  action_config = action_mapping[action]
         | 
| 475 | 
            +
                  action_config ||= action_mapping[:default]
         | 
| 476 | 
            +
             | 
| 477 | 
            +
                  if action_config.parent_config && action_config.parent_config != :default
         | 
| 478 | 
            +
                    parent_config = action_mapping[action_config.parent_config]
         | 
| 479 | 
            +
                    raise "View configuration error: the parent configuration of #{action_config.key}, #{parent_config.key}, must not specific its own parent configuration" if parent_config.parent_config
         | 
| 480 | 
            +
             | 
| 481 | 
            +
                    action_config = action_config.reverse_merge(parent_config)
         | 
| 482 | 
            +
                  end
         | 
| 483 | 
            +
                  action_config = action_config.reverse_merge(action_mapping[:default]) if action_config != action_mapping[:default]
         | 
| 484 | 
            +
             | 
| 485 | 
            +
                  action_config = action_config.reverse_merge(self[action_config.top_level_config]) if action_config.top_level_config
         | 
| 486 | 
            +
                  action_config = action_config.reverse_merge(show) if default == :show && action_config.top_level_config != :show
         | 
| 487 | 
            +
                  action_config.reverse_merge(index)
         | 
| 488 | 
            +
                end
         | 
| 444 489 | 
             
              end
         | 
| 445 490 | 
             
            end
         | 
| @@ -17,15 +17,18 @@ class Blacklight::Configuration | |
| 17 17 | 
             
                  super || Blacklight::SearchBarPresenter
         | 
| 18 18 | 
             
                end
         | 
| 19 19 |  | 
| 20 | 
            -
                def display_label( | 
| 20 | 
            +
                def display_label(deprecated_key = nil, **options)
         | 
| 21 | 
            +
                  Deprecation.warn('Passing the key argument to ViewConfig#display_label is deprecated') if deprecated_key.present?
         | 
| 22 | 
            +
             | 
| 21 23 | 
             
                  I18n.t(
         | 
| 22 | 
            -
                    :"blacklight.search.view_title.#{key}",
         | 
| 24 | 
            +
                    :"blacklight.search.view_title.#{deprecated_key || key}",
         | 
| 23 25 | 
             
                    default: [
         | 
| 24 | 
            -
                      :"blacklight.search.view.#{key}",
         | 
| 26 | 
            +
                      :"blacklight.search.view.#{deprecated_key || key}",
         | 
| 25 27 | 
             
                      label,
         | 
| 26 28 | 
             
                      title,
         | 
| 27 | 
            -
                      key.to_s.humanize
         | 
| 28 | 
            -
                    ]
         | 
| 29 | 
            +
                      (deprecated_key || key).to_s.humanize
         | 
| 30 | 
            +
                    ],
         | 
| 31 | 
            +
                    **options
         | 
| 29 32 | 
             
                  )
         | 
| 30 33 | 
             
                end
         | 
| 31 34 |  | 
| @@ -38,6 +41,10 @@ class Blacklight::Configuration | |
| 38 41 | 
             
                  def document_presenter_class
         | 
| 39 42 | 
             
                    super || Blacklight::ShowPresenter
         | 
| 40 43 | 
             
                  end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  def to_h
         | 
| 46 | 
            +
                    super.merge(document_presenter_class: document_presenter_class)
         | 
| 47 | 
            +
                  end
         | 
| 41 48 | 
             
                end
         | 
| 42 49 |  | 
| 43 50 | 
             
                class Index < ViewConfig
         | 
| @@ -52,6 +59,10 @@ class Blacklight::Configuration | |
| 52 59 | 
             
                  def document_presenter_class
         | 
| 53 60 | 
             
                    super || Blacklight::IndexPresenter
         | 
| 54 61 | 
             
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  def to_h
         | 
| 64 | 
            +
                    super.merge(document_presenter_class: document_presenter_class)
         | 
| 65 | 
            +
                  end
         | 
| 55 66 | 
             
                end
         | 
| 56 67 | 
             
              end
         | 
| 57 68 | 
             
            end
         | 
| @@ -44,6 +44,10 @@ module Blacklight | |
| 44 44 | 
             
                  @table.merge!((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
         | 
| 45 45 | 
             
                end
         | 
| 46 46 |  | 
| 47 | 
            +
                def reverse_merge(other_hash)
         | 
| 48 | 
            +
                  self.class.new to_h.reverse_merge((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 47 51 | 
             
                def deep_dup
         | 
| 48 52 | 
             
                  self.class.new @table.deep_dup
         | 
| 49 53 | 
             
                end
         | 
| @@ -115,9 +115,9 @@ module Blacklight | |
| 115 115 | 
             
                # documents
         | 
| 116 116 | 
             
                def url_for_document(doc, options = {})
         | 
| 117 117 | 
             
                  if respond_to?(:blacklight_config) &&
         | 
| 118 | 
            -
                      blacklight_config.show.route &&
         | 
| 118 | 
            +
                      blacklight_config.view_config(:show).route &&
         | 
| 119 119 | 
             
                      (!doc.respond_to?(:to_model) || doc.to_model.is_a?(SolrDocument))
         | 
| 120 | 
            -
                    route = blacklight_config.show.route.merge(action: :show, id: doc).merge(options)
         | 
| 120 | 
            +
                    route = blacklight_config.view_config(:show).route.merge(action: :show, id: doc).merge(options)
         | 
| 121 121 | 
             
                    route[:controller] = params[:controller] if route[:controller] == :current
         | 
| 122 122 | 
             
                    route
         | 
| 123 123 | 
             
                  else
         | 
| @@ -59,6 +59,8 @@ module Blacklight::Solr | |
| 59 59 | 
             
                  ##
         | 
| 60 60 | 
             
                  if search_field&.query_builder.present?
         | 
| 61 61 | 
             
                    add_search_field_query_builder_params(solr_parameters)
         | 
| 62 | 
            +
                  elsif search_field&.clause_params.present?
         | 
| 63 | 
            +
                    add_search_field_with_json_query_parameters(solr_parameters)
         | 
| 62 64 | 
             
                  elsif search_field&.solr_local_parameters.present?
         | 
| 63 65 | 
             
                    add_search_field_with_local_parameters(solr_parameters)
         | 
| 64 66 | 
             
                  elsif search_state.query_param.is_a? Hash
         | 
| @@ -86,6 +88,14 @@ module Blacklight::Solr | |
| 86 88 | 
             
                  solr_parameters[:spellcheck] = 'false'
         | 
| 87 89 | 
             
                end
         | 
| 88 90 |  | 
| 91 | 
            +
                def add_search_field_with_json_query_parameters(solr_parameters)
         | 
| 92 | 
            +
                  bool_query = search_field.clause_params.transform_values { |v| v.merge(query: search_state.query_param) }
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  solr_parameters[:json] ||= { query: { bool: { must: [] } } }
         | 
| 95 | 
            +
                  solr_parameters[:json][:query] ||= { bool: { must: [] } }
         | 
| 96 | 
            +
                  solr_parameters[:json][:query][:bool][:must] << bool_query
         | 
| 97 | 
            +
                end
         | 
| 98 | 
            +
             | 
| 89 99 | 
             
                # Transform "clause" parameters into the Solr JSON Query DSL
         | 
| 90 100 | 
             
                def add_adv_search_clauses(solr_parameters)
         | 
| 91 101 | 
             
                  return if search_state.clause_params.blank?
         | 
| @@ -367,7 +377,7 @@ module Blacklight::Solr | |
| 367 377 | 
             
                ##
         | 
| 368 378 | 
             
                # The key to use to retrieve the grouped field to display
         | 
| 369 379 | 
             
                def grouped_key_for_results
         | 
| 370 | 
            -
                  blacklight_config.index.group
         | 
| 380 | 
            +
                  blacklight_config.view_config(action_name: :index).group
         | 
| 371 381 | 
             
                end
         | 
| 372 382 |  | 
| 373 383 | 
             
                def facet_fields_to_include_in_request
         | 
| @@ -9,7 +9,7 @@ RSpec.describe Blacklight::Configuration::ViewConfig do | |
| 9 9 | 
             
              describe '#display_label' do
         | 
| 10 10 | 
             
                it "looks up the label to display for the given document and field" do
         | 
| 11 11 | 
             
                  allow(I18n).to receive(:t).with(:"blacklight.search.view_title.my_view", default: [:"blacklight.search.view.my_view", label, nil, "My view"]).and_return('x')
         | 
| 12 | 
            -
                  expect(subject.display_label | 
| 12 | 
            +
                  expect(subject.display_label).to eq 'x'
         | 
| 13 13 | 
             
                end
         | 
| 14 14 | 
             
              end
         | 
| 15 15 | 
             
            end
         | 
| @@ -123,6 +123,18 @@ RSpec.describe Blacklight::OpenStructWithHashAccess do | |
| 123 123 | 
             
                end
         | 
| 124 124 | 
             
              end
         | 
| 125 125 |  | 
| 126 | 
            +
              describe '#reverse_merge' do
         | 
| 127 | 
            +
                before do
         | 
| 128 | 
            +
                  @h = described_class.new
         | 
| 129 | 
            +
                  @h[:a] = 1
         | 
| 130 | 
            +
                  @h[:b] = 2
         | 
| 131 | 
            +
                end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                it 'reverse merges the object with the hash, preserving the object class' do
         | 
| 134 | 
            +
                  expect(@h.reverse_merge(b: 3, c: 4)).to have_attributes a: 1, b: 2, c: 4
         | 
| 135 | 
            +
                end
         | 
| 136 | 
            +
              end
         | 
| 137 | 
            +
             | 
| 126 138 | 
             
              describe "#to_json" do
         | 
| 127 139 | 
             
                subject { described_class.new a: 1, b: 2 }
         | 
| 128 140 |  | 
| @@ -557,4 +557,68 @@ RSpec.describe "Blacklight::Configuration", api: true do | |
| 557 557 | 
             
                  expect(config.facet_paginator_class).to eq Blacklight::Solr::FacetPaginator
         | 
| 558 558 | 
             
                end
         | 
| 559 559 | 
             
              end
         | 
| 560 | 
            +
             | 
| 561 | 
            +
              describe '#view_config' do
         | 
| 562 | 
            +
                before do
         | 
| 563 | 
            +
                  config.index.title_field = 'title_tsim'
         | 
| 564 | 
            +
                end
         | 
| 565 | 
            +
             | 
| 566 | 
            +
                context 'with a view that does not exist' do
         | 
| 567 | 
            +
                  it 'defaults to the index config' do
         | 
| 568 | 
            +
                    expect(config.view_config('this-doesnt-exist')).to have_attributes config.index.to_h
         | 
| 569 | 
            +
                  end
         | 
| 570 | 
            +
                end
         | 
| 571 | 
            +
             | 
| 572 | 
            +
                context 'with the :show view' do
         | 
| 573 | 
            +
                  it 'includes the show config' do
         | 
| 574 | 
            +
                    expect(config.view_config(:show)).to have_attributes config.show.to_h
         | 
| 575 | 
            +
                  end
         | 
| 576 | 
            +
             | 
| 577 | 
            +
                  it 'uses the show document presenter' do
         | 
| 578 | 
            +
                    expect(config.view_config(:show)).to have_attributes document_presenter_class: Blacklight::ShowPresenter
         | 
| 579 | 
            +
                  end
         | 
| 580 | 
            +
             | 
| 581 | 
            +
                  it 'includes index config defaults' do
         | 
| 582 | 
            +
                    expect(config.view_config(:show)).to have_attributes title_field: 'title_tsim'
         | 
| 583 | 
            +
                  end
         | 
| 584 | 
            +
                end
         | 
| 585 | 
            +
             | 
| 586 | 
            +
                context 'with just an action name' do
         | 
| 587 | 
            +
                  it 'includes the action config' do
         | 
| 588 | 
            +
                    expect(config.view_config(action_name: :show)).to have_attributes config.show.to_h
         | 
| 589 | 
            +
                  end
         | 
| 590 | 
            +
             | 
| 591 | 
            +
                  it 'includes the default action mapping configuration' do
         | 
| 592 | 
            +
                    config.action_mapping.default.whatever = :some_value
         | 
| 593 | 
            +
             | 
| 594 | 
            +
                    expect(config.view_config(action_name: :show)).to have_attributes whatever: :some_value
         | 
| 595 | 
            +
                  end
         | 
| 596 | 
            +
             | 
| 597 | 
            +
                  it 'includes the action-specific mappings' do
         | 
| 598 | 
            +
                    config.action_mapping.foo.document_presenter_class = Blacklight::DocumentPresenter
         | 
| 599 | 
            +
             | 
| 600 | 
            +
                    expect(config.view_config(action_name: :foo)).to have_attributes config.action_mapping.foo.to_h
         | 
| 601 | 
            +
                  end
         | 
| 602 | 
            +
             | 
| 603 | 
            +
                  it 'allows the action mapping to specific a parent configuration with some more defaults' do
         | 
| 604 | 
            +
                    config.action_mapping.foo.parent_config = :bar
         | 
| 605 | 
            +
                    config.action_mapping.bar.whatever = :bar_value
         | 
| 606 | 
            +
             | 
| 607 | 
            +
                    expect(config.view_config(action_name: :foo)).to have_attributes whatever: :bar_value
         | 
| 608 | 
            +
                  end
         | 
| 609 | 
            +
             | 
| 610 | 
            +
                  context 'with the :citation action' do
         | 
| 611 | 
            +
                    it 'also includes the show config' do
         | 
| 612 | 
            +
                      expect(config.view_config(action_name: :citation)).to have_attributes config.show.to_h
         | 
| 613 | 
            +
                    end
         | 
| 614 | 
            +
                  end
         | 
| 615 | 
            +
                end
         | 
| 616 | 
            +
             | 
| 617 | 
            +
                context 'with a view' do
         | 
| 618 | 
            +
                  it 'includes the configuration-level view parameters' do
         | 
| 619 | 
            +
                    expect(config.view_config(:atom)).to have_attributes config.index.to_h.except(:partials)
         | 
| 620 | 
            +
                    expect(config.view_config(:atom)).to have_attributes partials: [:document]
         | 
| 621 | 
            +
                  end
         | 
| 622 | 
            +
                end
         | 
| 623 | 
            +
              end
         | 
| 560 624 | 
             
            end
         | 
| @@ -321,6 +321,38 @@ RSpec.describe Blacklight::Solr::SearchBuilderBehavior, api: true do | |
| 321 321 | 
             
                  end
         | 
| 322 322 | 
             
                end
         | 
| 323 323 |  | 
| 324 | 
            +
                describe "solr json query parameters from the fielded search" do
         | 
| 325 | 
            +
                  let(:user_params) { subject_search_params }
         | 
| 326 | 
            +
             | 
| 327 | 
            +
                  before do
         | 
| 328 | 
            +
                    blacklight_config.search_fields['subject'].solr_parameters = {
         | 
| 329 | 
            +
                      some: :parameter
         | 
| 330 | 
            +
                    }
         | 
| 331 | 
            +
             | 
| 332 | 
            +
                    blacklight_config.search_fields['subject'].clause_params = {
         | 
| 333 | 
            +
                      edismax: {
         | 
| 334 | 
            +
                        another: :parameter
         | 
| 335 | 
            +
                      }
         | 
| 336 | 
            +
                    }
         | 
| 337 | 
            +
                  end
         | 
| 338 | 
            +
             | 
| 339 | 
            +
                  it 'sets solr parameters from the field' do
         | 
| 340 | 
            +
                    expect(subject[:some]).to eq :parameter
         | 
| 341 | 
            +
                  end
         | 
| 342 | 
            +
             | 
| 343 | 
            +
                  it 'does not set a q parameter' do
         | 
| 344 | 
            +
                    expect(subject).not_to have_key :q
         | 
| 345 | 
            +
                  end
         | 
| 346 | 
            +
             | 
| 347 | 
            +
                  it 'includes the user query in the JSON query DSL request' do
         | 
| 348 | 
            +
                    expect(subject.dig(:json, :query, :bool, :must, 0, :edismax)).to include query: 'wome'
         | 
| 349 | 
            +
                  end
         | 
| 350 | 
            +
             | 
| 351 | 
            +
                  it 'includes addtional clause parameters for the field' do
         | 
| 352 | 
            +
                    expect(subject.dig(:json, :query, :bool, :must, 0, :edismax)).to include another: :parameter
         | 
| 353 | 
            +
                  end
         | 
| 354 | 
            +
                end
         | 
| 355 | 
            +
             | 
| 324 356 | 
             
                describe "overriding of qt parameter" do
         | 
| 325 357 | 
             
                  let(:user_params) do
         | 
| 326 358 | 
             
                    { qt: 'overridden' }
         | 
| @@ -12,7 +12,7 @@ RSpec.describe "catalog/index" do | |
| 12 12 | 
             
                end
         | 
| 13 13 | 
             
              end
         | 
| 14 14 |  | 
| 15 | 
            -
              let(:blacklight_config) { CatalogController.blacklight_config }
         | 
| 15 | 
            +
              let(:blacklight_config) { CatalogController.blacklight_config.deep_copy }
         | 
| 16 16 |  | 
| 17 17 | 
             
              before do
         | 
| 18 18 | 
             
                @response = Blacklight::Solr::Response.new({ response: { numFound: 30 } }, start: 10, rows: 10)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: blacklight
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 7. | 
| 4 | 
            +
              version: 7.16.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jonathan Rochkind
         | 
| @@ -14,10 +14,10 @@ authors: | |
| 14 14 | 
             
            - Dan Funk
         | 
| 15 15 | 
             
            - Naomi Dushay
         | 
| 16 16 | 
             
            - Justin Coyne
         | 
| 17 | 
            -
            autorequire:
         | 
| 17 | 
            +
            autorequire: 
         | 
| 18 18 | 
             
            bindir: exe
         | 
| 19 19 | 
             
            cert_chain: []
         | 
| 20 | 
            -
            date: 2021-03- | 
| 20 | 
            +
            date: 2021-03-30 00:00:00.000000000 Z
         | 
| 21 21 | 
             
            dependencies:
         | 
| 22 22 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 23 23 | 
             
              name: rails
         | 
| @@ -881,7 +881,7 @@ homepage: http://projectblacklight.org/ | |
| 881 881 | 
             
            licenses:
         | 
| 882 882 | 
             
            - Apache 2.0
         | 
| 883 883 | 
             
            metadata: {}
         | 
| 884 | 
            -
            post_install_message:
         | 
| 884 | 
            +
            post_install_message: 
         | 
| 885 885 | 
             
            rdoc_options: []
         | 
| 886 886 | 
             
            require_paths:
         | 
| 887 887 | 
             
            - lib
         | 
| @@ -896,8 +896,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 896 896 | 
             
                - !ruby/object:Gem::Version
         | 
| 897 897 | 
             
                  version: '0'
         | 
| 898 898 | 
             
            requirements: []
         | 
| 899 | 
            -
            rubygems_version: 3. | 
| 900 | 
            -
            signing_key:
         | 
| 899 | 
            +
            rubygems_version: 3.1.4
         | 
| 900 | 
            +
            signing_key: 
         | 
| 901 901 | 
             
            specification_version: 4
         | 
| 902 902 | 
             
            summary: Blacklight provides a discovery interface for any Solr (http://lucene.apache.org/solr)
         | 
| 903 903 | 
             
              index.
         |