blacklight 7.15.1 → 7.17.2

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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/VERSION +1 -1
  4. data/app/components/blacklight/advanced_search_form_component.html.erb +9 -3
  5. data/app/components/blacklight/advanced_search_form_component.rb +48 -35
  6. data/app/components/blacklight/constraints_component.html.erb +19 -3
  7. data/app/components/blacklight/constraints_component.rb +5 -1
  8. data/app/components/blacklight/content_areas_shim.rb +12 -0
  9. data/app/components/blacklight/document/action_component.html.erb +1 -1
  10. data/app/components/blacklight/document/action_component.rb +6 -1
  11. data/app/components/blacklight/document/actions_component.html.erb +3 -5
  12. data/app/components/blacklight/document/actions_component.rb +16 -2
  13. data/app/components/blacklight/document_component.html.erb +4 -7
  14. data/app/components/blacklight/document_component.rb +73 -73
  15. data/app/components/blacklight/document_metadata_component.html.erb +2 -2
  16. data/app/components/blacklight/document_metadata_component.rb +13 -2
  17. data/app/components/blacklight/document_title_component.html.erb +17 -0
  18. data/app/components/blacklight/document_title_component.rb +59 -0
  19. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +2 -2
  20. data/app/components/blacklight/facet_field_component.rb +4 -1
  21. data/app/components/blacklight/facet_field_list_component.html.erb +2 -2
  22. data/app/components/blacklight/facet_field_no_layout_component.rb +4 -1
  23. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  24. data/app/components/blacklight/metadata_field_layout_component.html.erb +3 -1
  25. data/app/components/blacklight/metadata_field_layout_component.rb +26 -1
  26. data/app/components/blacklight/response/view_type_button_component.html.erb +4 -0
  27. data/app/components/blacklight/response/view_type_button_component.rb +38 -0
  28. data/app/components/blacklight/response/view_type_component.html.erb +2 -5
  29. data/app/components/blacklight/response/view_type_component.rb +9 -13
  30. data/app/components/blacklight/search_bar_component.rb +9 -2
  31. data/app/components/blacklight/system/dropdown_component.html.erb +4 -7
  32. data/app/components/blacklight/system/dropdown_component.rb +24 -0
  33. data/app/components/blacklight/system/flash_message_component.html.erb +1 -1
  34. data/app/components/blacklight/system/flash_message_component.rb +7 -1
  35. data/app/components/blacklight/system/modal_component.rb +7 -1
  36. data/app/controllers/concerns/blacklight/catalog.rb +1 -1
  37. data/app/helpers/blacklight/blacklight_helper_behavior.rb +3 -4
  38. data/app/helpers/blacklight/catalog_helper_behavior.rb +2 -0
  39. data/app/helpers/blacklight/component_helper_behavior.rb +2 -2
  40. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -2
  41. data/app/presenters/blacklight/document_presenter.rb +8 -4
  42. data/app/services/blacklight/search_service.rb +1 -1
  43. data/app/views/bookmarks/_tools.html.erb +1 -1
  44. data/app/views/catalog/_citation.html.erb +1 -1
  45. data/app/views/catalog/_document.html.erb +2 -2
  46. data/app/views/catalog/_facet_layout.html.erb +2 -2
  47. data/app/views/catalog/_show_main_content.html.erb +3 -3
  48. data/app/views/catalog/email.html.erb +2 -2
  49. data/app/views/catalog/email_success.html.erb +1 -1
  50. data/app/views/catalog/facet.html.erb +3 -3
  51. data/app/views/catalog/sms.html.erb +2 -2
  52. data/app/views/catalog/sms_success.html.erb +1 -1
  53. data/blacklight.gemspec +1 -1
  54. data/config/locales/blacklight.de.yml +2 -2
  55. data/lib/blacklight/configuration.rb +50 -5
  56. data/lib/blacklight/configuration/view_config.rb +18 -5
  57. data/lib/blacklight/engine.rb +3 -1
  58. data/lib/blacklight/open_struct_with_hash_access.rb +22 -1
  59. data/lib/blacklight/search_state.rb +2 -2
  60. data/lib/blacklight/solr/facet_paginator.rb +2 -0
  61. data/lib/blacklight/solr/request.rb +31 -0
  62. data/lib/blacklight/solr/response.rb +2 -16
  63. data/lib/blacklight/solr/response/facets.rb +76 -22
  64. data/lib/blacklight/solr/response/params.rb +104 -0
  65. data/lib/blacklight/solr/search_builder_behavior.rb +57 -27
  66. data/lib/generators/blacklight/assets_generator.rb +6 -2
  67. data/lib/generators/blacklight/user_generator.rb +1 -1
  68. data/spec/components/blacklight/document_component_spec.rb +3 -3
  69. data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
  70. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +20 -0
  71. data/spec/models/blacklight/configuration_spec.rb +64 -0
  72. data/spec/models/blacklight/solr/facet_paginator_spec.rb +4 -0
  73. data/spec/models/blacklight/solr/request_spec.rb +62 -29
  74. data/spec/models/blacklight/solr/response/facets_spec.rb +109 -0
  75. data/spec/models/blacklight/solr/response_spec.rb +10 -0
  76. data/spec/models/blacklight/solr/search_builder_spec.rb +49 -0
  77. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +8 -9
  78. data/spec/views/catalog/index.atom.builder_spec.rb +1 -1
  79. metadata +10 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c361c374c8af05f8f0104e57699a41ccc32af93ceefa4f37ecdb036d10931a9
4
- data.tar.gz: 1243d79f46fc64008b804b1e6fb78ceeb4a73fb95c235624adc5257b6d3098a5
3
+ metadata.gz: cacc94e8533f909ef9e137dca8f86809489626624507e04051c0923f1471d21c
4
+ data.tar.gz: 83c86c5a1789266ca17d1ad446320f4634acf0c6a95c456dffd7cbd1653bb4e1
5
5
  SHA512:
6
- metadata.gz: dd26f409ddc7382b884ec3e9de4ad2f9ac437707d7ee7d0256e0f1603c9da2cea82f954d2ea83724873ce9a965fc9c7187d14af73ef948d03d7a43d77736628f
7
- data.tar.gz: 0d9682303fdfc23e100ee2ed83bf9c077dcbdc013417f6b371ad40bf49cdd7b1b91e1847342036cad8eadf8d04acd4bba057f661c63ef791a8239c032cc448f1
6
+ metadata.gz: 07aa3c78687f57145209b5834d4f3512ced41f80b34e4b2dd6d72271d229922041de56f015271ba58ad62dc9c21fbd7f7f9cc0eb284080036e6e6092de73a48e
7
+ data.tar.gz: 7cd2dd6b95c77c07d06b3c1c58e4e5d7dda5fe415a6dfd61498a8e2fc83778685b0a86d08a354fbc8fc60f69dbe842f1a45a9fea5da133978d75888ee9506026
data/.rubocop.yml CHANGED
@@ -57,6 +57,7 @@ Naming/MethodParameterName:
57
57
  AllowedNames:
58
58
  - id
59
59
  - q
60
+ - as
60
61
 
61
62
  Naming/PredicateName:
62
63
  ForbiddenPrefixes:
@@ -122,3 +123,6 @@ Style/RedundantRegexpEscape:
122
123
 
123
124
  Style/SlicingWithRange:
124
125
  Enabled: true
126
+
127
+ Rails/ContentTag:
128
+ Enabled: false
data/VERSION CHANGED
@@ -1 +1 @@
1
- 7.15.1
1
+ 7.17.2
@@ -1,7 +1,9 @@
1
1
  <% if constraints.present? %>
2
2
  <div class="constraints well search_history">
3
3
  <h4><%= t 'blacklight.advanced_search.form.search_context' %></h4>
4
- <%= constraints %>
4
+ <% constraints.each do |constraint| %>
5
+ <%= constraint %>
6
+ <% end %>
5
7
  </div>
6
8
  <% end %>
7
9
 
@@ -15,7 +17,9 @@
15
17
  </h2>
16
18
 
17
19
  <div id="advanced_search">
18
- <%= search_field_controls %>
20
+ <% search_field_controls.each do |control| %>
21
+ <%= control %>
22
+ <% end %>
19
23
  </div>
20
24
  </div>
21
25
 
@@ -24,7 +28,9 @@
24
28
 
25
29
  <div id="advanced_search_facets" class="limit_input">
26
30
  <div class="advanced-facet-limits panel-group">
27
- <%= search_filter_controls %>
31
+ <% search_filter_controls.each do |control| %>
32
+ <%= control %>
33
+ <% end %>
28
34
  </div>
29
35
  </div>
30
36
  </div>
@@ -2,66 +2,79 @@
2
2
 
3
3
  module Blacklight
4
4
  class AdvancedSearchFormComponent < SearchBarComponent
5
- with_content_areas :constraints, :search_field_controls, :search_filter_controls
5
+ include Blacklight::ContentAreasShim
6
+
7
+ renders_many :constraints
8
+ renders_many :search_field_controls
9
+ renders_many :search_filter_controls, (lambda do |config:, display_facet:, presenter: nil, component: nil, **kwargs|
10
+ presenter ||= (config.presenter || Blacklight::FacetFieldPresenter).new(config, display_facet, @view_context)
11
+ component = component || config.advanced_search_component || Blacklight::FacetFieldCheckboxesComponent
12
+
13
+ component.new(facet_field: presenter, **kwargs)
14
+ end)
6
15
 
7
16
  def initialize(response:, **options)
8
17
  super(**options)
9
18
  @response = response
10
19
  end
11
20
 
21
+ def before_render
22
+ initialize_search_field_controls if search_field_controls.blank?
23
+ initialize_search_filter_controls if search_filter_controls.blank?
24
+ initialize_constraints if constraints.blank?
25
+ end
26
+
12
27
  def default_operator_menu
13
28
  options_with_labels = [:must, :should].index_by { |op| t(op, scope: 'blacklight.advanced_search.op') }
14
29
  select_tag(:op, options_for_select(options_with_labels, params[:op]), class: 'input-small')
15
30
  end
16
31
 
17
- # Rubocop is just wrong here, so...:
18
- # rubocop:disable Rails/ContentTag
19
- def search_field_controls
20
- @search_field_controls || safe_join(search_fields.values.map.with_index do |field, i|
21
- fields_for('clause[]', i, include_id: false) do |f|
22
- content_tag(:div, class: 'form-group advanced-search-field row') do
23
- f.label(:query, field.display_label('search'), class: "col-sm-3 col-form-label") +
24
- content_tag(:div, class: 'col-sm-9') do
25
- f.hidden_field(:field, value: field.key) +
26
- f.text_field(:query, value: query_for_search_clause(field.key), class: 'form-control')
32
+ def sort_fields_select
33
+ options = sort_fields.values.map { |field_config| [@view_context.sort_field_label(field_config.key), field_config.key] }
34
+ select_tag(:sort, options_for_select(options, params[:sort]), class: "form-control sort-select")
35
+ end
36
+
37
+ private
38
+
39
+ def initialize_search_field_controls
40
+ search_fields.values.each.with_index do |field, i|
41
+ search_field_control do
42
+ fields_for('clause[]', i, include_id: false) do |f|
43
+ content_tag(:div, class: 'form-group advanced-search-field row') do
44
+ f.label(:query, field.display_label('search'), class: "col-sm-3 col-form-label") +
45
+ content_tag(:div, class: 'col-sm-9') do
46
+ f.hidden_field(:field, value: field.key) +
47
+ f.text_field(:query, value: query_for_search_clause(field.key), class: 'form-control')
48
+ end
27
49
  end
28
50
  end
29
51
  end
30
- end, "\n")
31
- end
32
- # rubocop:enable Rails/ContentTag
33
-
34
- def query_for_search_clause(key)
35
- field = (@params[:clause] || {}).values.find { |value| value['field'].to_s == key.to_s }
36
-
37
- field&.dig('query')
52
+ end
38
53
  end
39
54
 
40
- def search_filter_controls
41
- return @search_filter_controls if @search_filter_controls
42
-
55
+ def initialize_search_filter_controls
43
56
  fields = blacklight_config.facet_fields.select { |_k, v| v.include_in_advanced_search || v.include_in_advanced_search.nil? }
44
57
 
45
- safe_join(fields.map do |_k, config|
58
+ fields.each do |_k, config|
46
59
  display_facet = @response.aggregations[config.field]
47
-
48
- presenter = (config.presenter || Blacklight::FacetFieldPresenter).new(config, display_facet, @view_context)
49
- component = config.advanced_search_component || Blacklight::FacetFieldCheckboxesComponent
50
- @view_context.render(component.new(facet_field: presenter))
51
- end, "\n")
60
+ search_filter_control(config: config, display_facet: display_facet)
61
+ end
52
62
  end
53
63
 
54
- def constraints
55
- params = @view_context.search_state.params_for_search.except :page, :f_inclusive, :q, :search_field, :op, :index, :sort
64
+ def initialize_constraints
65
+ constraint do
66
+ params = @view_context.search_state.params_for_search.except :page, :f_inclusive, :q, :search_field, :op, :index, :sort
56
67
 
57
- params.except!(*search_fields.map { |_key, field_def| field_def[:key] })
68
+ params.except!(*search_fields.map { |_key, field_def| field_def[:key] })
58
69
 
59
- @view_context.render_search_to_s(params)
70
+ @view_context.render_search_to_s(params)
71
+ end
60
72
  end
61
73
 
62
- def sort_fields_select
63
- options = sort_fields.values.map { |field_config| [@view_context.sort_field_label(field_config.key), field_config.key] }
64
- select_tag(:sort, options_for_select(options, params[:sort]), class: "form-control sort-select")
74
+ def query_for_search_clause(key)
75
+ field = (@params[:clause] || {}).values.find { |value| value['field'].to_s == key.to_s }
76
+
77
+ field&.dig('query')
65
78
  end
66
79
 
67
80
  def search_fields
@@ -4,7 +4,23 @@
4
4
  <%= link_to t('blacklight.search.start_over'), start_over_path, class: "catalog_startOverLink btn btn-primary" %>
5
5
 
6
6
  <span class="constraints-label sr-only"><%= t('blacklight.search.filters.title') %></span>
7
- <%= query_constraints_area || query_constraints %>
8
- <%= facet_constraints_area || facet_constraints %>
9
- <%= additional_constraints %>
7
+ <% if query_constraints_area.present? %>
8
+ <% query_constraints_area.each do |constraint| %>
9
+ <%= constraint %>
10
+ <% end %>
11
+ <% else %>
12
+ <%= query_constraints %>
13
+ <% end %>
14
+
15
+ <% if facet_constraints_area.present? %>
16
+ <% facet_constraints_area.each do |constraint| %>
17
+ <%= constraint %>
18
+ <% end %>
19
+ <% else %>
20
+ <%= facet_constraints %>
21
+ <% end %>
22
+
23
+ <% additional_constraints.each do |constraints| %>
24
+ <%= constraints %>
25
+ <% end %>
10
26
  <% end %>
@@ -2,7 +2,11 @@
2
2
 
3
3
  module Blacklight
4
4
  class ConstraintsComponent < ::ViewComponent::Base
5
- with_content_areas :query_constraints_area, :facet_constraints_area, :additional_constraints
5
+ include Blacklight::ContentAreasShim
6
+
7
+ renders_many :query_constraints_area
8
+ renders_many :facet_constraints_area
9
+ renders_many :additional_constraints
6
10
 
7
11
  def initialize(search_state:,
8
12
  id: 'appliedParams', classes: 'clearfix constraints-container',
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ # Shim to support ViewComponent v2 slots using the content_areas API for backwards compatibility
5
+ module ContentAreasShim
6
+ # Shim the `with` helper to write content into slots instead
7
+ def with(slot_name, *args, **kwargs, &block)
8
+ Deprecation.warn('ViewComponents deprecated `with` and it will be removed in ViewComponents 3.0. content_areas. Use slots (https://viewcomponent.org/guide/slots.html) instead.')
9
+ public_send(slot_name, *args, **kwargs, &block)
10
+ end
11
+ end
12
+ end
@@ -2,7 +2,7 @@
2
2
  <%= link_to label,
3
3
  url,
4
4
  id: @id,
5
- class: 'nav-link',
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?
@@ -33,6 +34,10 @@ module Blacklight
33
34
  @view_context.document_action_path(@action, @url_opts.merge(({ id: @document } if @document) || {}))
34
35
  end
35
36
  end
37
+
38
+ def key
39
+ @action.key
40
+ end
36
41
  end
37
42
  end
38
43
  end
@@ -1,13 +1,11 @@
1
1
  <%= content_tag @tag, class: @classes do %>
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)) } %>
4
-
2
+ <% actions.each do |action| %>
5
3
  <% if @wrapping_tag %>
6
4
  <%= content_tag(@wrapping_tag, class: Array(@wrapping_classes) + [action.key]) do %>
7
- <%= result %>
5
+ <%= action %>
8
6
  <% end %>
9
7
  <% else %>
10
- <%= result %>
8
+ <%= action %>
11
9
  <% end %>
12
10
  <% end %>
13
11
  <% end %>
@@ -4,9 +4,14 @@ module Blacklight
4
4
  module Document
5
5
  # Render a bookmark widget to bookmark / unbookmark a document
6
6
  class ActionsComponent < ::ViewComponent::Base
7
+ renders_many :actions, (lambda do |action:, component: nil, **kwargs|
8
+ component ||= action.component || Blacklight::Document::ActionComponent
9
+ component.new(action: action, document: @document, options: @options, url_opts: @url_opts, link_classes: @link_classes, **kwargs)
10
+ end)
11
+
7
12
  # @param [Blacklight::Document] document
8
13
  # 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)
14
+ 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
15
  @document = document
11
16
  @actions = actions
12
17
  @tag = tag
@@ -15,11 +20,20 @@ module Blacklight
15
20
  @url_opts = url_opts
16
21
  @wrapping_tag = wrapping_tag
17
22
  @wrapping_classes = wrapping_classes
23
+ @link_classes = link_classes
18
24
  end
19
25
  # rubocop:enable Metrics/ParameterLists
20
26
 
27
+ def before_render
28
+ return if actions.present?
29
+
30
+ @actions.each do |a|
31
+ action(component: a.component, action: a)
32
+ end
33
+ end
34
+
21
35
  def render?
22
- @actions.any?
36
+ actions.present?
23
37
  end
24
38
  end
25
39
  end
@@ -12,16 +12,13 @@
12
12
  <%= body %>
13
13
  <% else %>
14
14
  <div class="document-main-section">
15
- <header class="documentHeader row">
16
- <%= content_tag @title_component, class: 'index_title document-title-heading' do %>
17
- <%= before_title %><%= title %><%= after_title %>
18
- <% end %>
19
- <%= actions %>
20
- </header>
21
-
15
+ <%= title %>
22
16
  <%= embed %>
23
17
  <%= content %>
24
18
  <%= metadata %>
19
+ <% metadata_sections.each do |section| %>
20
+ <%= section %>
21
+ <% end %>
25
22
  </div>
26
23
 
27
24
  <%= thumbnail %>
@@ -2,12 +2,64 @@
2
2
 
3
3
  module Blacklight
4
4
  class DocumentComponent < ::ViewComponent::Base
5
- # Available content areas; some have defaults provided by
6
- # the accessors below.
7
- with_content_areas :header, :body, :footer,
8
- :before_title, :title, :after_title,
9
- :actions, :embed, :metadata, :thumbnail,
10
- :partials
5
+ include Blacklight::ContentAreasShim
6
+
7
+ # Content appearing before the document
8
+ renders_one :header
9
+
10
+ # Content appearing after the document
11
+ renders_one :footer
12
+
13
+ # Content appearing instead of the regularly rendered document; its use is discouraged, but is a stop-gap until
14
+ # the ecosystem fully adopts view components.
15
+ renders_one :body
16
+
17
+ # The document title with some reasonable default behavior
18
+ renders_one :title, (lambda do |*args, component: nil, **kwargs|
19
+ component ||= Blacklight::DocumentTitleComponent
20
+
21
+ component.new(*args, counter: @counter, document: @document, presenter: @presenter, as: @title_component, link_to_document: !@show, document_component: self, **kwargs)
22
+ end)
23
+
24
+ renders_one :embed, (lambda do |static_content = nil, *args, component: nil, **kwargs|
25
+ next static_content if static_content.present?
26
+ next unless component
27
+
28
+ Deprecation.warn('Pass the presenter to the DocumentComponent') if @presenter.nil?
29
+
30
+ component.new(*args, document: @document, presenter: @presenter, document_counter: @document_counter, **kwargs)
31
+ end)
32
+
33
+ # The primary metadata section
34
+ renders_one :metadata, (lambda do |static_content = nil, *args, component: nil, fields: nil, **kwargs|
35
+ next static_content if static_content.present?
36
+
37
+ Deprecation.warn('Pass the presenter to the DocumentComponent') if !fields && @presenter.nil?
38
+
39
+ component ||= Blacklight::DocumentMetadataComponent
40
+
41
+ component.new(*args, fields: fields || @presenter&.field_presenters || [], **kwargs)
42
+ end)
43
+
44
+ # Additional metadata sections
45
+ renders_many :metadata_sections
46
+
47
+ renders_one :thumbnail, (lambda do |image_options_or_static_content = {}, *args, component: nil, **kwargs|
48
+ next image_options_or_static_content if image_options_or_static_content.is_a? String
49
+
50
+ component ||= @presenter&.view_config&.thumbnail_component || Blacklight::Document::ThumbnailComponent
51
+ Deprecation.warn('Pass the presenter to the DocumentComponent') if !component && @presenter.nil?
52
+
53
+ component.new(*args, presenter: @presenter, counter: @counter, image_options: image_options_or_static_content, **kwargs)
54
+ end)
55
+
56
+ # A container for partials rendered using the view config partials configuration. Its use is discouraged, but necessary until
57
+ # the ecosystem fully adopts view components.
58
+ renders_many :partials
59
+
60
+ # Backwards compatibility
61
+ renders_one :actions
62
+
11
63
  with_collection_parameter :document
12
64
 
13
65
  # rubocop:disable Metrics/ParameterLists
@@ -23,10 +75,10 @@ module Blacklight
23
75
  # @param counter_offset [Number] with `document_counter`, the offset of the start of that collection counter to the overall result set
24
76
  # @param show [Boolean] are we showing only a single document (vs a list of search results); used for backwards-compatibility
25
77
  def initialize(document: nil, presenter: nil,
26
- id: nil, classes: [], component: :article, title_component: :h4,
27
- metadata_component: Blacklight::DocumentMetadataComponent,
78
+ id: nil, classes: [], component: :article, title_component: nil,
79
+ metadata_component: nil,
28
80
  embed_component: nil,
29
- thumbnail_component: Blacklight::Document::ThumbnailComponent,
81
+ thumbnail_component: nil,
30
82
  counter: nil, document_counter: nil, counter_offset: 0,
31
83
  show: false)
32
84
  if presenter.nil? && document.nil?
@@ -41,9 +93,14 @@ module Blacklight
41
93
  @id = id || ('document' if show)
42
94
  @classes = classes
43
95
 
96
+ Deprecation.warn('Passing embed_component is deprecated') if @embed_component.present?
44
97
  @embed_component = embed_component
45
- @metadata_component = metadata_component
46
- @thumbnail_component = thumbnail_component
98
+
99
+ Deprecation.warn('Passing metadata_component is deprecated') if @metadata_component.present?
100
+ @metadata_component = metadata_component || Blacklight::DocumentMetadataComponent
101
+
102
+ Deprecation.warn('Passing thumbnail_component is deprecated') if @thumbnail_component.present?
103
+ @thumbnail_component = thumbnail_component || Blacklight::Document::ThumbnailComponent
47
104
 
48
105
  @document_counter = document_counter
49
106
  @counter = counter
@@ -63,72 +120,15 @@ module Blacklight
63
120
  ].compact.flatten
64
121
  end
65
122
 
66
- # Content for the document title area; should be an inline element
67
- def title
68
- return super if block_given?
69
-
70
- @title || if show?
71
- content_tag('span', presenter.heading, itemprop: "name")
72
- else
73
- @view_context.link_to_document @document, counter: @counter, itemprop: 'name'
74
- end
75
- end
76
-
77
- # Content for the document actions area
78
- def actions
79
- return super if block_given?
80
-
81
- return if @show
82
-
83
- @actions ||
84
- @view_context.render_index_doc_actions(@document, wrapping_class: "index-document-functions col-sm-3 col-lg-2")
85
- end
86
-
87
- # Content for the document thumbnail area
88
- def thumbnail(image_options = {})
89
- return super if block_given?
90
- return @thumbnail if @thumbnail
91
-
92
- return if @show
93
-
94
- component = @thumbnail_component || presenter.view_config.thumbnail_component
95
- render(component.new(presenter: presenter, counter: @counter, image_options: image_options))
96
- end
97
-
98
- # Content for the document metadata area
99
- def metadata
100
- return super if block_given?
101
-
102
- @metadata || @view_context.render(@metadata_component.new(fields: presenter.field_presenters, show: show?))
103
- end
104
-
105
- # Content that goes before the document title (e.g. the counter)
106
- def before_title
107
- return super if block_given?
108
-
109
- @before_title || counter
110
- end
111
-
112
- def embed
113
- return @embed if @embed
114
-
115
- component = @embed_component || presenter.view_config.embed_component
116
-
117
- return unless component
118
-
119
- @view_context.render(component.new(document: @document, presenter: presenter, document_counter: @document_counter))
123
+ def before_render
124
+ set_slot(:title) unless title
125
+ set_slot(:thumbnail, component: @thumbnail_component || presenter.view_config&.thumbnail_component) unless thumbnail || show?
126
+ set_slot(:metadata, component: @metadata_component, fields: presenter.field_presenters) unless metadata
127
+ set_slot(:embed, component: @embed_component || presenter.view_config&.embed_component) unless embed
120
128
  end
121
129
 
122
130
  private
123
131
 
124
- def counter
125
- return unless @counter
126
-
127
- content_tag :span, class: 'document-counter' do
128
- t('blacklight.search.documents.counter', counter: @counter)
129
- end
130
- end
131
-
132
132
  def presenter
133
133
  @presenter ||= @view_context.document_presenter(@document)
134
134
  end