Class: Blacklight::DocumentComponent

Inherits:
Component
  • Object
show all
Includes:
ContentAreasShim
Defined in:
app/components/blacklight/document_component.rb

Overview

Note:

when subclassing this component, if you override the initializer, you must explicitly specify the counter variable ‘document_counter` even if you don’t use it. Otherwise view_component will not provide the count value when calling the component.

A component for rendering a single document

Examples:

class MyDocumentComponent < Blacklight::DocumentComponent
  def initialize(document_counter: nil, **kwargs)
    super
    ... custom code ...
  end
end

See Also:

Constant Summary collapse

COLLECTION_INDEX_OFFSET =

ViewComponent 3 changes iteration counters to begin at 0 rather than 1

ViewComponent::VERSION::MAJOR < 3 ? 0 : 1

Constants inherited from Component

Component::EXCLUDE_VARIABLES

Instance Method Summary collapse

Methods included from ContentAreasShim

#with

Methods inherited from Component

compiler, config, #inspect

Constructor Details

#initialize(document: nil, presenter: nil, id: nil, classes: [], component: :article, title_component: nil, metadata_component: nil, embed_component: nil, thumbnail_component: nil, counter: nil, document_counter: nil, counter_offset: 0, show: false, **args) ⇒ DocumentComponent

rubocop:disable Metrics/ParameterLists

Parameters:

  • document (Blacklight::Document) (defaults to: nil)
  • presenter (Blacklight::DocumentPresenter) (defaults to: nil)
  • id (String) (defaults to: nil)

    HTML id for the root element

  • classes (Array, String) (defaults to: [])

    additional HTML classes for the root element

  • component (Symbol, String) (defaults to: :article)

    HTML tag type to use for the root element

  • title_component (Symbol, String) (defaults to: nil)

    HTML tag type to use for the title element

  • counter (Number, nil) (defaults to: nil)

    a pre-computed counter for the position of this document in a search result set

  • document_counter (Number, nil) (defaults to: nil)

    alternatively, the document’s position in a collection and,

  • counter_offset (Number) (defaults to: 0)

    with ‘document_counter`, the offset of the start of that collection counter to the overall result set

  • show (Boolean) (defaults to: false)

    are we showing only a single document (vs a list of search results); used for backwards-compatibility



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'app/components/blacklight/document_component.rb', line 99

def initialize(document: nil, presenter: nil,
               id: nil, classes: [], component: :article, title_component: nil,
               metadata_component: nil,
               embed_component: nil,
               thumbnail_component: nil,
               counter: nil, document_counter: nil, counter_offset: 0,
               show: false, **args)
  if presenter.nil? && document.nil?
    raise ArgumentError, 'missing keyword: :document or :presenter'
  end

  @document = document || presenter&.document || args[self.class.collection_parameter]
  @presenter = presenter

  @component = component
  @title_component = title_component
  @id = id || ('document' if show)
  @classes = classes

  Deprecation.warn(Blacklight::DocumentComponent, 'Passing embed_component is deprecated') if @embed_component.present?
  @embed_component = embed_component

  Deprecation.warn(Blacklight::DocumentComponent, 'Passing metadata_component is deprecated') if @metadata_component.present?
  @metadata_component = 

  Deprecation.warn(Blacklight::DocumentComponent, 'Passing thumbnail_component is deprecated') if @thumbnail_component.present?
  @thumbnail_component = thumbnail_component

  @counter = counter
  @document_counter = document_counter || args.fetch(self.class.collection_counter_parameter, nil)
  @counter ||= @document_counter + COLLECTION_INDEX_OFFSET + counter_offset if @document_counter.present?

  @show = show
end

Instance Method Details

#before_renderObject



145
146
147
148
149
150
# File 'app/components/blacklight/document_component.rb', line 145

def before_render
  set_slot(:title, nil) unless title
  set_slot(:thumbnail, nil, component: @thumbnail_component || presenter.view_config&.thumbnail_component) unless thumbnail || show?
  set_slot(:metadata, nil, component: @metadata_component || presenter&.view_config&., fields: presenter.field_presenters) unless 
  set_slot(:embed, nil, component: @embed_component || presenter.view_config&.embed_component) unless embed
end

#classesObject

HTML classes to apply to the root element



136
137
138
139
140
141
142
143
# File 'app/components/blacklight/document_component.rb', line 136

def classes
  [
    @classes,
    helpers.render_document_class(@document),
    'document',
    ("document-position-#{@counter}" if @counter)
  ].compact.flatten
end