blacklight 7.6.0 → 7.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.docker/app/Dockerfile +26 -0
  3. data/.docker/app/entrypoint.sh +6 -0
  4. data/.env +5 -0
  5. data/.gitignore +1 -1
  6. data/.rubocop_todo.yml +13 -13
  7. data/.travis.yml +15 -23
  8. data/Gemfile +4 -1
  9. data/README.md +4 -0
  10. data/VERSION +1 -1
  11. data/app/assets/stylesheets/blacklight/_facets.scss +20 -4
  12. data/app/assets/stylesheets/blacklight/_pagination.scss +4 -0
  13. data/app/components/blacklight/constraint_layout_component.html.erb +23 -0
  14. data/app/components/blacklight/constraint_layout_component.rb +16 -0
  15. data/app/components/blacklight/facet_field_component.html.erb +25 -0
  16. data/app/components/blacklight/facet_field_component.rb +11 -0
  17. data/app/components/blacklight/facet_field_list_component.html.erb +18 -0
  18. data/app/components/blacklight/facet_field_list_component.rb +22 -0
  19. data/app/components/blacklight/facet_field_no_layout_component.rb +13 -0
  20. data/app/components/blacklight/facet_item_component.rb +120 -0
  21. data/app/components/blacklight/facet_item_pivot_component.rb +84 -0
  22. data/app/helpers/blacklight/catalog_helper_behavior.rb +2 -2
  23. data/app/helpers/blacklight/configuration_helper_behavior.rb +3 -2
  24. data/app/helpers/blacklight/facets_helper_behavior.rb +95 -49
  25. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +64 -33
  26. data/app/javascript/blacklight/modal.js +1 -1
  27. data/app/models/blacklight/icon.rb +12 -10
  28. data/app/models/concerns/blacklight/document.rb +0 -10
  29. data/app/models/concerns/blacklight/document/extensions.rb +3 -0
  30. data/app/models/concerns/blacklight/document/semantic_fields.rb +0 -4
  31. data/app/presenters/blacklight/document_presenter.rb +2 -1
  32. data/app/presenters/blacklight/facet_field_presenter.rb +57 -0
  33. data/app/presenters/blacklight/facet_item_presenter.rb +81 -0
  34. data/app/views/catalog/_citation.html.erb +1 -1
  35. data/app/views/catalog/_constraints.html.erb +2 -2
  36. data/app/views/catalog/_constraints_element.html.erb +5 -24
  37. data/app/views/catalog/_email_form.html.erb +1 -1
  38. data/app/views/catalog/_facet_layout.html.erb +8 -17
  39. data/app/views/catalog/_facet_limit.html.erb +3 -12
  40. data/app/views/catalog/_facet_pagination.html.erb +2 -2
  41. data/app/views/catalog/_facet_pivot.html.erb +3 -18
  42. data/app/views/catalog/_previous_next_doc.html.erb +5 -5
  43. data/app/views/catalog/_search_form.html.erb +1 -1
  44. data/app/views/catalog/_sms_form.html.erb +1 -1
  45. data/app/views/layouts/blacklight/base.html.erb +1 -1
  46. data/blacklight.gemspec +1 -0
  47. data/config/locales/blacklight.ar.yml +32 -25
  48. data/config/locales/blacklight.de.yml +3 -0
  49. data/config/locales/blacklight.en.yml +3 -0
  50. data/config/locales/blacklight.es.yml +3 -0
  51. data/config/locales/blacklight.fr.yml +3 -0
  52. data/config/locales/blacklight.hu.yml +3 -0
  53. data/config/locales/blacklight.it.yml +3 -0
  54. data/config/locales/blacklight.nl.yml +3 -0
  55. data/config/locales/blacklight.pt-BR.yml +3 -0
  56. data/config/locales/blacklight.sq.yml +3 -0
  57. data/config/locales/blacklight.zh.yml +3 -0
  58. data/docker-compose.yml +35 -0
  59. data/lib/blacklight/configuration.rb +35 -8
  60. data/lib/blacklight/configuration/facet_field.rb +1 -0
  61. data/lib/blacklight/engine.rb +2 -6
  62. data/lib/blacklight/search_state.rb +52 -0
  63. data/lib/blacklight/solr/response/facets.rb +2 -0
  64. data/lib/generators/blacklight/assets_generator.rb +10 -0
  65. data/lib/generators/blacklight/templates/catalog_controller.rb +1 -1
  66. data/package.json +2 -2
  67. data/spec/{views/catalog/_constraints_element.html.erb_spec.rb → components/blacklight/constraint_layout_component_spec.rb} +22 -12
  68. data/spec/components/blacklight/facet_field_list_component_spec.rb +108 -0
  69. data/spec/components/blacklight/facet_item_component_spec.rb +50 -0
  70. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +66 -0
  71. data/spec/features/facets_spec.rb +21 -1
  72. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +3 -0
  73. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +57 -12
  74. data/spec/helpers/blacklight/render_constraints_helper_behavior_spec.rb +4 -23
  75. data/spec/lib/blacklight/search_state_spec.rb +50 -0
  76. data/spec/models/blacklight/configuration_spec.rb +4 -0
  77. data/spec/models/blacklight/icon_spec.rb +11 -10
  78. data/spec/models/blacklight/solr/response/facets_spec.rb +30 -1
  79. data/spec/presenters/blacklight/document_presenter_spec.rb +10 -1
  80. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +109 -0
  81. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +92 -0
  82. data/spec/spec_helper.rb +3 -0
  83. data/spec/support/presenter_test_helpers.rb +11 -0
  84. data/spec/views/catalog/_facet_group.html.erb_spec.rb +1 -0
  85. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +18 -0
  86. data/tasks/blacklight.rake +30 -23
  87. metadata +48 -8
  88. data/Vagrantfile +0 -79
  89. data/package-lock.json +0 -2793
  90. data/provision.sh +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '087bb21bf2c345072d1fade572f09741ab819c5f44e8b563c6818530c1da6da8'
4
- data.tar.gz: eebaefbf5c6ec5b3f245ef17ce59c006ac09ffefb047f336aa185cace7bd293e
3
+ metadata.gz: 0b7f2fb6980380cf12a51209225c105a4553f662015935c12335f7f0092086d6
4
+ data.tar.gz: fa8de265b2adfc5ca3e1bc6c8f94e6ed7cdbbd3d465b70516924c30aaf6d3a4b
5
5
  SHA512:
6
- metadata.gz: edce2eb3d01ea8ea635515c70db1b9e584ea96d4a360378897bc8340a94919f9ffa6f7be6824aa644c07929b3623f0f90f14280eef71b180f0d2022da8f0f677
7
- data.tar.gz: ac8cc8d0432746cc80b01d330cc6bad45fc54ac4a2386a11c7c54285a1202ced0cd5b0f51f603e0281c4e33520565514ffadc8f549fa66ca0fb45533afe8c774
6
+ metadata.gz: 3b2a6adc3e2affcfb8e0a193493b37e5b1fac9ccf98c5145a985b4bd8166b1cf2e525d7f603eb1fbca7170ea6f1c32823e9acd6b0f55fa103fe637cba5628ccb
7
+ data.tar.gz: 126dff3afa6c1db27e4b707952b9ce82926ca66c5882164739e0a5ba63a95c1f8af9c069a151fd0f031705d8757dac57c9013b9c7c64dbd6d6a4ec05fbbff4ab
@@ -0,0 +1,26 @@
1
+ ARG ALPINE_RUBY_VERSION
2
+
3
+ FROM ruby:${ALPINE_RUBY_VERSION}-alpine
4
+
5
+ RUN apk add --update --no-cache \
6
+ bash \
7
+ build-base \
8
+ git \
9
+ libxml2-dev \
10
+ libxslt-dev \
11
+ nodejs \
12
+ sqlite-dev \
13
+ tzdata
14
+
15
+ RUN mkdir /app
16
+ WORKDIR /app
17
+
18
+ RUN gem update --system && \
19
+ gem install bundler && \
20
+ bundle config build.nokogiri --use-system-libraries
21
+
22
+ COPY . .
23
+
24
+ EXPOSE 3000
25
+
26
+ CMD [".docker/app/entrypoint.sh"]
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ rm -f /app/.internal_test_app/tmp/pids/server.pid
5
+ bundle install
6
+ exec bundle exec rake blacklight:server["-p 3000 -b 0.0.0.0"]
data/.env ADDED
@@ -0,0 +1,5 @@
1
+ ALPINE_RUBY_VERSION=2.6.5
2
+ RAILS_VERSION=5.2.4.1
3
+ SOLR_PORT=8983
4
+ SOLR_URL=http://solr:8983/solr/blacklight-core
5
+ SOLR_VERSION=latest
data/.gitignore CHANGED
@@ -14,6 +14,6 @@ log/*
14
14
  tmp/*
15
15
  pkg/*
16
16
  .internal_test_app
17
- .vagrant
18
17
  /spec/examples.txt
19
18
  node_modules/*
19
+ package-lock.json
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2020-02-03 11:07:48 -0800 using RuboCop version 0.63.1.
3
+ # on 2020-03-30 10:03:33 -0700 using RuboCop version 0.63.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -177,7 +177,7 @@ Lint/UselessComparison:
177
177
  Exclude:
178
178
  - 'spec/models/blacklight/document/active_model_shim_spec.rb'
179
179
 
180
- # Offense count: 59
180
+ # Offense count: 60
181
181
  Metrics/AbcSize:
182
182
  Max: 49
183
183
 
@@ -201,20 +201,20 @@ Metrics/ClassLength:
201
201
  Metrics/CyclomaticComplexity:
202
202
  Max: 11
203
203
 
204
- # Offense count: 54
204
+ # Offense count: 56
205
205
  # Configuration parameters: CountComments, ExcludedMethods.
206
206
  Metrics/MethodLength:
207
- Max: 31
207
+ Max: 30
208
208
 
209
209
  # Offense count: 8
210
210
  # Configuration parameters: CountComments.
211
211
  Metrics/ModuleLength:
212
212
  Max: 212
213
213
 
214
- # Offense count: 2
214
+ # Offense count: 5
215
215
  # Configuration parameters: CountKeywordArgs.
216
216
  Metrics/ParameterLists:
217
- Max: 6
217
+ Max: 7
218
218
 
219
219
  # Offense count: 16
220
220
  Metrics/PerceivedComplexity:
@@ -287,7 +287,7 @@ RSpec/BeforeAfterAll:
287
287
  RSpec/ContextWording:
288
288
  Enabled: false
289
289
 
290
- # Offense count: 55
290
+ # Offense count: 56
291
291
  RSpec/DescribeClass:
292
292
  Enabled: false
293
293
 
@@ -297,7 +297,7 @@ RSpec/EmptyExampleGroup:
297
297
  Exclude:
298
298
  - 'spec/models/blacklight/solr/search_builder_spec.rb'
299
299
 
300
- # Offense count: 129
300
+ # Offense count: 130
301
301
  # Configuration parameters: Max.
302
302
  RSpec/ExampleLength:
303
303
  Enabled: false
@@ -321,7 +321,7 @@ RSpec/FilePath:
321
321
  - 'spec/presenters/pipeline_spec.rb'
322
322
  - 'spec/presenters/thumbnail_presenter_spec.rb'
323
323
 
324
- # Offense count: 192
324
+ # Offense count: 191
325
325
  # Configuration parameters: AssignmentOnly.
326
326
  RSpec/InstanceVariable:
327
327
  Enabled: false
@@ -371,12 +371,12 @@ RSpec/MessageSpies:
371
371
  - 'spec/presenters/blacklight/field_presenter_spec.rb'
372
372
  - 'spec/presenters/thumbnail_presenter_spec.rb'
373
373
 
374
- # Offense count: 340
374
+ # Offense count: 343
375
375
  # Configuration parameters: AggregateFailuresByDefault.
376
376
  RSpec/MultipleExpectations:
377
377
  Max: 16
378
378
 
379
- # Offense count: 337
379
+ # Offense count: 341
380
380
  # Configuration parameters: IgnoreSharedExamples.
381
381
  RSpec/NamedSubject:
382
382
  Enabled: false
@@ -412,7 +412,7 @@ RSpec/SubjectStub:
412
412
  - 'spec/models/blacklight/search_builder_spec.rb'
413
413
  - 'spec/services/blacklight/search_service_spec.rb'
414
414
 
415
- # Offense count: 120
415
+ # Offense count: 118
416
416
  # Configuration parameters: IgnoreNameless, IgnoreSymbolicNames.
417
417
  RSpec/VerifiedDoubles:
418
418
  Enabled: false
@@ -497,7 +497,7 @@ Style/ConditionalAssignment:
497
497
  Exclude:
498
498
  - 'lib/blacklight/solr/response/spelling.rb'
499
499
 
500
- # Offense count: 94
500
+ # Offense count: 99
501
501
  Style/Documentation:
502
502
  Enabled: false
503
503
 
@@ -1,50 +1,42 @@
1
1
  dist: bionic
2
+
2
3
  addons:
3
4
  chrome: stable
4
- language: ruby
5
5
 
6
- notifications:
7
- email: false
6
+ language: ruby
8
7
 
9
8
  matrix:
10
9
  include:
11
10
  - rvm: 2.7.0
12
- env: "RAILS_VERSION=6.0.2.1"
11
+ env: "RAILS_VERSION=6.0.2.2"
13
12
  - rvm: 2.6.5
14
- env: "RAILS_VERSION=6.0.2.1 ENGINE_CART_RAILS_OPTIONS=\"--skip-webpack-install\""
13
+ env: "RAILS_VERSION=6.0.2.2"
15
14
  - rvm: 2.6.5
16
- env: "RAILS_VERSION=5.2.4.1"
15
+ env: "RAILS_VERSION=5.2.4.2"
17
16
  - rvm: 2.5.7
18
- env: "RAILS_VERSION=5.2.4.1 BLACKLIGHT_API_TEST=true ENGINE_CART_RAILS_OPTIONS=\"--api --skip-git --skip-bundle --skip-listen --skip-spring --skip-yarn --skip-keeps --skip-action-cable --skip-coffee --skip-test\""
17
+ env: "RAILS_VERSION=5.2.4.2 BLACKLIGHT_API_TEST=true ENGINE_CART_RAILS_OPTIONS=\"--api --skip-git --skip-bundle --skip-listen --skip-spring --skip-yarn --skip-keeps --skip-action-cable --skip-coffee --skip-test\""
19
18
  - rvm: 2.4.9
20
- env: "RAILS_VERSION=5.2.4.1"
19
+ env: "RAILS_VERSION=5.2.4.2"
21
20
  - rvm: jruby-9.2.8.0
22
- env: "RAILS_VERSION=5.2.4.1 JRUBY_OPTS=\"-J-Xms512m -J-Xmx1024m\""
21
+ env: "RAILS_VERSION=5.2.4.2 JRUBY_OPTS=\"-J-Xms512m -J-Xmx1024m\""
23
22
  allow_failures:
24
23
  - rvm: jruby-9.2.8.0
25
24
  fast_finish: true
26
25
 
27
26
  before_install:
28
- - docker pull solr:7
29
- - docker run -d -p 8983:8983 -v $PWD/lib/generators/blacklight/templates/solr/conf:/myconfig solr:7 solr-create -c blacklight-core -d /myconfig
30
- - docker ps -a
31
27
  - google-chrome-stable --headless --disable-gpu --no-sandbox --remote-debugging-port=9222 http://localhost &
32
28
 
33
- notifications:
34
- irc: "irc.freenode.org#blacklight"
35
- email:
36
- - blacklight-commits@googlegroups.com
37
-
38
- global_env:
39
- - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
40
- - ENGINE_CART_RAILS_OPTIONS='--skip-git --skip-listen --skip-spring --skip-keeps --skip-action-cable --skip-coffee --skip-test'
41
- - CC_TEST_REPORTER_ID=5042c7358c96b0b926088a4cda3e132fffe7a66ce8047cdb1dc6f0b4b6676b79
42
-
43
- jdk: openjdk11
29
+ env:
30
+ global:
31
+ - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
32
+ - ENGINE_CART_RAILS_OPTIONS='--skip-git --skip-listen --skip-spring --skip-keeps --skip-action-cable --skip-coffee --skip-test'
33
+ - CC_TEST_REPORTER_ID=5042c7358c96b0b926088a4cda3e132fffe7a66ce8047cdb1dc6f0b4b6676b79
44
34
 
45
35
  before_script:
46
36
  - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
47
37
  - chmod +x ./cc-test-reporter
48
38
  - ./cc-test-reporter before-build
39
+
49
40
  after_script:
50
41
  - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
42
+ - docker-compose build app || travis_terminate 1 # validates application Dockerfile
data/Gemfile CHANGED
@@ -34,7 +34,10 @@ else
34
34
  end
35
35
 
36
36
  case ENV['RAILS_VERSION']
37
- when /^5.[12]/, /^6.0/
37
+ when /^6.0/
38
+ gem 'sass-rails', '>= 6'
39
+ gem 'webpacker', '~> 4.0'
40
+ when /^5.[12]/
38
41
  gem 'sass-rails', '~> 5.0'
39
42
  when /^4.2/
40
43
  gem 'responders', '~> 2.0'
data/README.md CHANGED
@@ -38,6 +38,10 @@ rails generate blacklight:install
38
38
  * Bundler
39
39
  * Rails 5.1+
40
40
 
41
+ ## Contributing Code
42
+
43
+ Code contributions are always welcome, instructions for contributing can be found at [CONTRIBUTING.md](https://github.com/projectblacklight/blacklight/blob/master/CONTRIBUTING.md).
44
+
41
45
  ## Configuring Apache Solr
42
46
  You'll also want some information about how Blacklight expects [Apache Solr](http://lucene.apache.org/solr ) to run, which you can find in [README_SOLR](https://github.com/projectblacklight/blacklight/wiki/README_SOLR)
43
47
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 7.6.0
1
+ 7.10.0
@@ -150,10 +150,26 @@
150
150
 
151
151
  .pivot-facet {
152
152
  @extend .list-unstyled;
153
+ @extend .py-1;
154
+ @extend .px-4;
155
+ }
156
+
157
+ .facet-leaf-node {
158
+ margin-left: 1rem;
159
+ padding-right: 1rem;
160
+ margin-top: -1.5rem;
161
+ }
153
162
 
154
- ul, .pivot-facet {
155
- @extend .list-unstyled;
156
- @extend .py-1;
157
- @extend .px-3;
163
+ .facet-toggle-handle {
164
+ margin: 0;
165
+ margin-left: -5px;
166
+ padding: 0;
167
+
168
+ &.collapsed {
169
+ .show { display: block; }
170
+ .hide { display: none; }
158
171
  }
172
+
173
+ .show { display: none; }
174
+ .hide { display: block; }
159
175
  }
@@ -5,6 +5,10 @@
5
5
  padding-left: 0;
6
6
  }
7
7
 
8
+ .record-padding {
9
+ margin-top: $spacer / 2;
10
+ }
11
+
8
12
  .pagination {
9
13
  @media (max-width: breakpoint-max(sm)) {
10
14
  flex-wrap: wrap;
@@ -0,0 +1,23 @@
1
+ <span class="btn-group applied-filter constraint <%= @classes %>">
2
+ <span class="constraint-value btn btn-outline-secondary">
3
+ <% if @label.present? %>
4
+ <span class="filter-name"><%= @label %></span>
5
+ <% end %>
6
+ <% if @value.present? %>
7
+ <%= content_tag :span, @value, class: 'filter-value', title: strip_tags(@value) %>
8
+ <% end %>
9
+ </span>
10
+ <% if @remove_path.present? %>
11
+ <%= link_to(@remove_path, class: 'btn btn-outline-secondary remove') do %>
12
+ <span class="remove-icon">✖</span>
13
+ <span class="sr-only">
14
+ <%= if @label.blank?
15
+ t('blacklight.search.filters.remove.value', value: @value)
16
+ else
17
+ t('blacklight.search.filters.remove.label_value', label: @label, value: @value)
18
+ end
19
+ %>
20
+ </span>
21
+ <% end %>
22
+ <% end %>
23
+ </span>
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class ConstraintLayoutComponent < ::ViewComponent::Base
5
+ def initialize(value:, label: nil, remove_path: nil, classes: nil)
6
+ @value = value
7
+ @label = label
8
+ @remove_path = remove_path
9
+ @classes = Array(classes).join(' ')
10
+ end
11
+
12
+ def render?
13
+ @value.present?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,25 @@
1
+ <div class="card facet-limit blacklight-<%= @facet_field.key %> <%= 'facet-limit-active' if @facet_field.active? %>">
2
+ <h3 class="card-header p-0 facet-field-heading" id="<%= @facet_field.html_id %>-header">
3
+ <button
4
+ class="btn btn-block p-2 text-left collapse-toggle <%= "collapsed" if @facet_field.collapsed? %>"
5
+ data-toggle="collapse"
6
+ data-target="#<%= @facet_field.html_id %>"
7
+ aria-expanded="<%= @facet_field.collapsed? ? 'false' : 'true' %>"
8
+ >
9
+ <%= label %>
10
+ </button>
11
+ </h3>
12
+ <div id="<%= @facet_field.html_id %>" aria-labelledby="<%= @facet_field.html_id %>-header" class="panel-collapse facet-content collapse <%= "show" unless @facet_field.collapsed? %>">
13
+ <div class="card-body">
14
+ <%= body %>
15
+
16
+ <% if @facet_field.modal_path %>
17
+ <div class="more_facets">
18
+ <%= link_to t("more_#{@facet_field.key}_html", scope: 'blacklight.search.facets', default: :more_html, field_name: @facet_field.label),
19
+ @facet_field.modal_path,
20
+ data: { blacklight_modal: 'trigger' } %>
21
+ </div>
22
+ <% end %>
23
+ </div>
24
+ </div>
25
+ </div>
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class FacetFieldComponent < ::ViewComponent::Base
5
+ with_content_areas :label, :body
6
+
7
+ def initialize(facet_field:)
8
+ @facet_field = facet_field
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ <%= render(@layout.new(facet_field: @facet_field)) do |component| %>
2
+ <% component.with(:label) do %>
3
+ <%= @facet_field.label %>
4
+ <% end %>
5
+ <% component.with(:body) do %>
6
+ <ul class="facet-values list-unstyled">
7
+ <%= render_facet_limit_list @facet_field.paginator, @facet_field.key %>
8
+ </ul>
9
+ <%# backwards compatibility, ugh %>
10
+ <% if @layout == Blacklight::FacetFieldNoLayoutComponent && !@facet_field.in_modal? && @facet_field.modal_path %>
11
+ <div class="more_facets">
12
+ <%= link_to t("more_#{@facet_field.key}_html", scope: 'blacklight.search.facets', default: :more_html, field_name: @facet_field.label),
13
+ @facet_field.modal_path,
14
+ data: { blacklight_modal: 'trigger' } %>
15
+ </div>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class FacetFieldListComponent < ::ViewComponent::Base
5
+ def initialize(facet_field:, layout: nil)
6
+ @facet_field = facet_field
7
+ @layout = layout == false ? FacetFieldNoLayoutComponent : Blacklight::FacetFieldComponent
8
+ end
9
+
10
+ # Here for backwards compatibility only.
11
+ # @private
12
+ def render_facet_limit_list(*args)
13
+ Deprecation.silence(Blacklight::FacetsHelperBehavior) do
14
+ @view_context.render_facet_limit_list(*args)
15
+ end
16
+ end
17
+
18
+ def render?
19
+ @facet_field.paginator.items.any?
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class FacetFieldNoLayoutComponent < ::ViewComponent::Base
5
+ with_content_areas :label, :body
6
+
7
+ def initialize(**); end
8
+
9
+ def call
10
+ body
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class FacetItemComponent < ::ViewComponent::Base
5
+ with_collection_parameter :facet_item
6
+
7
+ def initialize(facet_item:, wrapping_element: 'li', suppress_link: false)
8
+ @facet_item = facet_item
9
+ @label = facet_item.label
10
+ @hits = facet_item.hits
11
+ @href = facet_item.href
12
+ @selected = facet_item.selected?
13
+ @wrapping_element = wrapping_element
14
+ @suppress_link = suppress_link
15
+ end
16
+
17
+ def call
18
+ # if the downstream app has overridden the helper methods we'd usually call,
19
+ # use the helpers to preserve compatibility
20
+ content = if overridden_helper_methods?
21
+ content_from_legacy_view_helper
22
+ elsif @selected
23
+ render_selected_facet_value
24
+ else
25
+ render_facet_value
26
+ end
27
+
28
+ return if content.blank?
29
+ return content unless @wrapping_element
30
+
31
+ content_tag @wrapping_element, content
32
+ end
33
+
34
+ # This is a little shim to let us call the render methods below outside the
35
+ # usual component rendering cycle (for backward compatibility)
36
+ # @private
37
+ # @deprecated
38
+ def with_view_context(view_context)
39
+ @view_context = view_context
40
+ self
41
+ end
42
+
43
+ # Check if the downstream application has overridden these methods
44
+ # @deprecated
45
+ # @private
46
+ def overridden_helper_methods?
47
+ return false if explicit_component_configuration?
48
+
49
+ @view_context.method(:render_facet_item).owner != Blacklight::FacetsHelperBehavior ||
50
+ @view_context.method(:render_facet_value).owner != Blacklight::FacetsHelperBehavior ||
51
+ @view_context.method(:render_selected_facet_value).owner != Blacklight::FacetsHelperBehavior
52
+ end
53
+
54
+ # Call out to the helper method equivalent of this component
55
+ # @deprecated
56
+ # @private
57
+ def content_from_legacy_view_helper
58
+ Deprecation.warn('Calling out to the #render_facet_item helper for backwards compatibility.')
59
+ Deprecation.silence(Blacklight::FacetsHelperBehavior) do
60
+ @view_context.render_facet_item(@facet_item.facet_field, @facet_item.facet_item)
61
+ end
62
+ end
63
+
64
+ ##
65
+ # Standard display of a facet value in a list. Used in both _facets sidebar
66
+ # partial and catalog/facet expanded list. Will output facet value name as
67
+ # a link to add that to your restrictions, with count in parens.
68
+ #
69
+ # @param [Blacklight::Solr::Response::Facets::FacetField] facet_field
70
+ # @param [Blacklight::Solr::Response::Facets::FacetItem] item
71
+ # @param [Hash] options
72
+ # @option options [Boolean] :suppress_link display the facet, but don't link to it
73
+ # @return [String]
74
+ # @private
75
+ def render_facet_value
76
+ content_tag(:span, class: "facet-label") do
77
+ link_to_unless(@suppress_link, @label, @href, class: "facet-select")
78
+ end + render_facet_count
79
+ end
80
+
81
+ ##
82
+ # Standard display of a SELECTED facet value (e.g. without a link and with a remove button)
83
+ # @see #render_facet_value
84
+ # @param [Blacklight::Solr::Response::Facets::FacetField] facet_field
85
+ # @param [String] item
86
+ # @private
87
+ def render_selected_facet_value
88
+ content_tag(:span, class: "facet-label") do
89
+ content_tag(:span, @label, class: "selected") +
90
+ # remove link
91
+ link_to(@href, class: "remove") do
92
+ content_tag(:span, '✖', class: "remove-icon") +
93
+ content_tag(:span, '[remove]', class: 'sr-only')
94
+ end
95
+ end + render_facet_count(classes: ["selected"])
96
+ end
97
+
98
+ ##
99
+ # Renders a count value for facet limits. Can be over-ridden locally
100
+ # to change style. And can be called by plugins to get consistent display.
101
+ #
102
+ # @param [Integer] num number of facet results
103
+ # @param [Hash] options
104
+ # @option options [Array<String>] an array of classes to add to count span.
105
+ # @return [String]
106
+ # @private
107
+ def render_facet_count(options = {})
108
+ return @view_context.render_facet_count(@hits, options) unless @view_context.method(:render_facet_count).owner == Blacklight::FacetsHelperBehavior || explicit_component_configuration?
109
+
110
+ classes = (options[:classes] || []) << "facet-count"
111
+ content_tag("span", t('blacklight.search.facets.count', number: number_with_delimiter(@hits)), class: classes)
112
+ end
113
+
114
+ private
115
+
116
+ def explicit_component_configuration?
117
+ @facet_item.facet_config.item_component.present?
118
+ end
119
+ end
120
+ end