blacklight 8.3.0 → 8.4.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.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +9 -5
  3. data/.rubocop.yml +3 -0
  4. data/.rubocop_todo.yml +22 -55
  5. data/Gemfile +2 -10
  6. data/README.md +2 -2
  7. data/VERSION +1 -1
  8. data/app/assets/javascripts/blacklight/blacklight.esm.js +5 -1
  9. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
  10. data/app/assets/javascripts/blacklight/blacklight.js +5 -1
  11. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
  12. data/app/assets/stylesheets/blacklight/_balanced_list.scss +1 -1
  13. data/app/assets/stylesheets/blacklight/_bookmark.scss +30 -0
  14. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +0 -4
  15. data/app/assets/stylesheets/blacklight/_constraints.scss +15 -9
  16. data/app/assets/stylesheets/blacklight/_controls.scss +0 -1
  17. data/app/assets/stylesheets/blacklight/_facets.scss +33 -37
  18. data/app/assets/stylesheets/blacklight/_header.scss +2 -35
  19. data/app/assets/stylesheets/blacklight/_icons.scss +3 -2
  20. data/app/assets/stylesheets/blacklight/_layout.scss +3 -0
  21. data/app/assets/stylesheets/blacklight/_mixins.scss +4 -4
  22. data/app/assets/stylesheets/blacklight/_search_form.scss +3 -8
  23. data/app/assets/stylesheets/blacklight/_search_history.scss +5 -5
  24. data/app/assets/stylesheets/blacklight/_search_results.scss +5 -2
  25. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +16 -10
  26. data/app/components/blacklight/advanced_search_form_component.html.erb +1 -1
  27. data/app/components/blacklight/advanced_search_form_component.rb +6 -0
  28. data/app/components/blacklight/constraint_layout_component.html.erb +2 -9
  29. data/app/components/blacklight/constraint_layout_component.rb +8 -0
  30. data/app/components/blacklight/constraints_component.rb +3 -3
  31. data/app/components/blacklight/document/action_component.rb +2 -1
  32. data/app/components/blacklight/document/bookmark_component.html.erb +2 -1
  33. data/app/components/blacklight/document/bookmark_component.rb +6 -0
  34. data/app/components/blacklight/document/page_header_component.html.erb +7 -0
  35. data/app/components/blacklight/document/page_header_component.rb +85 -0
  36. data/app/components/blacklight/document_component.rb +1 -1
  37. data/app/components/blacklight/facet_component.rb +1 -1
  38. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +1 -1
  39. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  40. data/app/components/blacklight/facet_field_inclusive_constraint_component.html.erb +1 -1
  41. data/app/components/blacklight/facet_field_list_component.html.erb +1 -1
  42. data/app/components/blacklight/facet_item_component.rb +1 -1
  43. data/app/components/blacklight/icons/bookmark_icon_component.rb +17 -0
  44. data/app/components/blacklight/icons/icon_component.rb +9 -4
  45. data/app/components/blacklight/icons/remove_component.rb +16 -0
  46. data/app/components/blacklight/metadata_field_component.html.erb +1 -1
  47. data/app/components/blacklight/metadata_field_component.rb +5 -0
  48. data/app/components/blacklight/response/facet_group_component.rb +1 -1
  49. data/app/components/blacklight/response/pagination_component.html.erb +1 -1
  50. data/app/components/blacklight/response/sort_component.html.erb +1 -6
  51. data/app/components/blacklight/response/sort_component.rb +15 -0
  52. data/app/components/blacklight/search/per_page_component.html.erb +2 -0
  53. data/app/components/blacklight/search/per_page_component.rb +50 -0
  54. data/app/components/blacklight/search_bar_component.html.erb +1 -1
  55. data/app/components/blacklight/search_context/server_item_pagination_component.html.erb +4 -7
  56. data/app/components/blacklight/skip_link_component.html.erb +7 -0
  57. data/app/components/blacklight/skip_link_component.rb +17 -0
  58. data/app/components/blacklight/system/dropdown_button_component.rb +18 -0
  59. data/app/components/blacklight/system/dropdown_component.rb +3 -6
  60. data/app/components/blacklight/system/flash_message_component.html.erb +1 -1
  61. data/app/components/blacklight/top_navbar_component.html.erb +2 -2
  62. data/app/components/blacklight/top_navbar_component.rb +4 -0
  63. data/app/helpers/blacklight/catalog_helper_behavior.rb +2 -0
  64. data/app/helpers/blacklight/component_helper_behavior.rb +4 -4
  65. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -0
  66. data/app/javascript/blacklight/checkbox_submit.js +5 -1
  67. data/app/models/concerns/blacklight/document/semantic_fields.rb +1 -1
  68. data/app/presenters/blacklight/facet_checkbox_item_presenter.rb +11 -0
  69. data/app/presenters/blacklight/facet_field_presenter.rb +9 -1
  70. data/app/services/blacklight/search_service.rb +9 -1
  71. data/app/views/catalog/_per_page_widget.html.erb +1 -10
  72. data/app/views/catalog/_search_results.html.erb +1 -1
  73. data/app/views/catalog/_show_main_content.html.erb +1 -1
  74. data/app/views/catalog/show.html.erb +0 -2
  75. data/app/views/catalog/suggest.html.erb +1 -1
  76. data/app/views/kaminari/blacklight/_page.html.erb +14 -8
  77. data/app/views/layouts/blacklight/base.html.erb +3 -4
  78. data/blacklight.gemspec +4 -0
  79. data/{docker-compose.yml → compose.yaml} +1 -1
  80. data/config/locales/blacklight.ar.yml +3 -0
  81. data/config/locales/blacklight.de.yml +3 -0
  82. data/config/locales/blacklight.en.yml +216 -229
  83. data/config/locales/blacklight.es.yml +3 -0
  84. data/config/locales/blacklight.fr.yml +3 -0
  85. data/config/locales/blacklight.hu.yml +3 -0
  86. data/config/locales/blacklight.it.yml +3 -0
  87. data/config/locales/blacklight.nl.yml +3 -0
  88. data/config/locales/blacklight.pt-BR.yml +3 -0
  89. data/config/locales/blacklight.sq.yml +3 -0
  90. data/config/locales/blacklight.zh.yml +3 -0
  91. data/lib/blacklight/abstract_repository.rb +6 -0
  92. data/lib/blacklight/configuration.rb +32 -19
  93. data/lib/blacklight/parameters.rb +1 -1
  94. data/lib/blacklight/solr/repository.rb +11 -4
  95. data/lib/blacklight/solr/response/params.rb +1 -1
  96. data/lib/blacklight/solr/response.rb +0 -12
  97. data/lib/blacklight/solr/search_builder_behavior.rb +1 -1
  98. data/lib/blacklight/solr.rb +0 -6
  99. data/lib/blacklight.rb +4 -14
  100. data/lib/generators/blacklight/assets/propshaft_generator.rb +2 -2
  101. data/lib/generators/blacklight/models_generator.rb +1 -1
  102. data/package.json +1 -1
  103. data/spec/components/blacklight/document/action_component_spec.rb +1 -1
  104. data/spec/components/blacklight/document/page_header_component_spec.rb +92 -0
  105. data/spec/components/blacklight/document_component_spec.rb +20 -0
  106. data/spec/components/blacklight/icons/icon_component_spec.rb +42 -0
  107. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +1 -1
  108. data/spec/controllers/blacklight/catalog_spec.rb +1 -1
  109. data/spec/controllers/catalog_controller_spec.rb +5 -5
  110. data/spec/features/advanced_search_spec.rb +16 -2
  111. data/spec/features/bookmarks_spec.rb +15 -0
  112. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +2 -2
  113. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +1 -1
  114. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +1 -1
  115. data/spec/models/blacklight/configuration_spec.rb +12 -12
  116. data/spec/models/blacklight/solr/document_spec.rb +2 -2
  117. data/spec/models/blacklight/solr/repository_spec.rb +31 -13
  118. data/spec/models/blacklight/solr/response/facets_spec.rb +2 -2
  119. data/spec/models/blacklight/solr/response/group_spec.rb +1 -1
  120. data/spec/models/blacklight/solr/response_spec.rb +2 -2
  121. data/spec/models/blacklight/solr/search_builder_behavior_spec.rb +1 -1
  122. data/spec/models/bookmark_spec.rb +1 -1
  123. data/spec/presenters/blacklight/document_presenter_spec.rb +2 -2
  124. data/spec/presenters/blacklight/facet_checkbox_item_presenter_spec.rb +42 -0
  125. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +14 -0
  126. data/spec/requests/load_suggestions_spec.rb +5 -5
  127. data/spec/services/blacklight/search_service_spec.rb +2 -2
  128. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  129. data/tasks/blacklight.rake +5 -5
  130. metadata +76 -4
@@ -31,7 +31,7 @@ module Blacklight::Document
31
31
  # but extensions should call super and modify hash returned, to avoid
32
32
  # unintentionally erasing values provided by other extensions.
33
33
  def to_semantic_values
34
- @semantic_value_hash ||= self.class.field_semantics.each_with_object(Hash.new([])) do |(key, field_names), hash|
34
+ @semantic_value_hash ||= self.class.field_semantics.each_with_object(Hash.new { |hash, key| hash[key] = [] }) do |(key, field_names), hash|
35
35
  ##
36
36
  # Handles single string field_name or an array of field_names
37
37
  value = Array.wrap(field_names).map { |field_name| self[field_name] }.flatten.compact
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class FacetCheckboxItemPresenter < Blacklight::FacetItemPresenter
5
+ # Check if the query parameters have any inclusive facets with the given value
6
+ # @return [Boolean]
7
+ def selected?
8
+ search_state.filter(facet_config).values(except: [:filters, :missing]).flatten.include?(value)
9
+ end
10
+ end
11
+ end
@@ -19,7 +19,15 @@ module Blacklight
19
19
  end
20
20
 
21
21
  def active?
22
- search_state.filter(facet_field).any?
22
+ if in_advanced_search?
23
+ search_state.filter(facet_field).values(except: [:filters, :missing]).any?
24
+ else
25
+ search_state.filter(facet_field).any?
26
+ end
27
+ end
28
+
29
+ def in_advanced_search?
30
+ search_state.params[:action] == "advanced_search"
23
31
  end
24
32
 
25
33
  def in_modal?
@@ -148,7 +148,15 @@ module Blacklight
148
148
  .merge(blacklight_config.fetch_many_document_params)
149
149
  .merge(extra_controller_params)
150
150
 
151
- solr_response = repository.search(query)
151
+ # find_many was introduced in Blacklight 8.4. Before that, we used the
152
+ # regular search method (possibly with a find-many specific `qt` parameter).
153
+ # In order to support Repository implementations that may not have a find_many,
154
+ # we'll fall back to search if find_many isn't available.
155
+ solr_response = if repository.respond_to?(:find_many)
156
+ repository.find_many(query)
157
+ else
158
+ repository.search(query)
159
+ end
152
160
 
153
161
  solr_response.documents
154
162
  end
@@ -1,10 +1 @@
1
- <% if show_sort_and_per_page? %>
2
- <span class="sr-only visually-hidden"><%= t('blacklight.search.per_page.title') %></span>
3
- <%= render(Blacklight::System::DropdownComponent.new(
4
- param: :per_page,
5
- choices: per_page_options_for_select,
6
- id: 'per_page-dropdown',
7
- search_state: search_state,
8
- selected: current_per_page,
9
- interpolation: :count)) %>
10
- <% end %>
1
+ <%= render Blacklight::Search::PerPageComponent.new(search_state:, blacklight_config:, response: @response) %>
@@ -8,7 +8,7 @@
8
8
  <% end %>
9
9
 
10
10
  <% content_for(:skip_links) do -%>
11
- <%= link_to t('blacklight.skip_links.first_result'), '#documents', class: 'element-invisible element-focusable rounded-bottom py-2 px-3', data: { turbolinks: 'false' } %>
11
+ <%= link_to t('blacklight.skip_links.first_result'), '#documents', class: 'd-inline-flex p-2 m-1', data: { turbolinks: 'false' } %>
12
12
  <% end %>
13
13
 
14
14
  <% content_for(:container_header) do -%>
@@ -1,4 +1,4 @@
1
- <%= render blacklight_config.track_search_session.item_pagination_component.new(search_context: @search_context, search_session: search_session, current_document: @document) if blacklight_config.track_search_session.item_pagination_component %>
1
+ <%= render blacklight_config.view_config(:show).document_header_component.new(document: @document, search_context: @search_context, search_session: search_session) %>
2
2
  <% @page_title = t('blacklight.search.show.title', document_title: document_presenter(@document).html_title, application_name: application_name).html_safe %>
3
3
  <% content_for(:head) { render_link_rel_alternates } %>
4
4
 
@@ -1,5 +1,3 @@
1
- <%= render blacklight_config.track_search_session.applied_params_component.new if blacklight_config.track_search_session.applied_params_component %>
2
-
3
1
  <%= render 'show_main_content' %>
4
2
 
5
3
  <% content_for(:sidebar) do %>
@@ -1,3 +1,3 @@
1
1
  <% @suggestions.each do |suggestion| %>
2
- <li role="option"><span><%= suggestion['term'] %></span></li>
2
+ <li role="option" class="dropdown-item"><span><%= suggestion['term'] %></span></li>
3
3
  <% end %>
@@ -8,12 +8,18 @@
8
8
  remote: data-remote
9
9
  -%>
10
10
  <% page_display = number_with_delimiter(page.to_s) %>
11
-
12
- <li class="page-item <%= 'active' if page.current? %>">
13
- <% if page.current? %>
14
- <span class="page-link" aria-current="true"><%= page_display %><span class="sr-only visually-hidden"> <%= t('views.pagination.aria.current_page', page: page_display) %></span></span>
15
- <% else %>
16
- <%= link_to page_display, url, :remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil, class: 'page-link', aria: { label: t('views.pagination.aria.go_to_page', page: page_display) } %>
11
+ <% link_attrs = {
12
+ remote: remote,
13
+ rel: page.next? ? 'next' : page.prev? ? 'prev' : nil,
14
+ class: 'page-link',
15
+ }
16
+ %>
17
+ <% if page.current? %>
18
+ <%= tag.li class: class_names('page-item', 'active'), aria_current: 'page' do %>
19
+ <%= link_to page_display, url, link_attrs.merge(aria: { label: t('views.pagination.aria.current_page', page: page_display) }) %>
17
20
  <% end %>
18
- </li>
19
-
21
+ <% else %>
22
+ <%= tag.li class: 'page-item' do %>
23
+ <%= link_to page_display, url, link_attrs.merge(aria: { label: t('views.pagination.aria.go_to_page', page: page_display) }) %>
24
+ <% end %>
25
+ <% end %>
@@ -28,11 +28,10 @@
28
28
  <%= content_for(:head) %>
29
29
  </head>
30
30
  <body class="<%= render_body_class %>">
31
- <nav id="skip-link" role="navigation" aria-label="<%= t('blacklight.skip_links.label') %>">
32
- <%= link_to t('blacklight.skip_links.search_field'), '#search_field', class: 'element-invisible element-focusable rounded-bottom py-2 px-3', data: { turbolinks: 'false' } %>
33
- <%= link_to t('blacklight.skip_links.main_content'), '#main-container', class: 'element-invisible element-focusable rounded-bottom py-2 px-3', data: { turbolinks: 'false' } %>
31
+ <%= render blacklight_config.skip_link_component.new do %>
34
32
  <%= content_for(:skip_links) %>
35
- </nav>
33
+ <% end %>
34
+
36
35
  <%= render partial: 'shared/header_navbar' %>
37
36
 
38
37
  <main id="main-container" class="<%= container_classes %>" role="main" aria-label="<%= t('blacklight.main.aria.main_container') %>">
data/blacklight.gemspec CHANGED
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.add_dependency "i18n", '>= 1.7.0' # added named parameters
33
33
  s.add_dependency "ostruct", '>= 0.3.2'
34
34
  s.add_dependency "view_component", '>= 2.66', '< 4'
35
+ s.add_dependency "zeitwerk"
35
36
 
36
37
  s.add_development_dependency "rsolr", ">= 1.0.6", "< 3" # Library for interacting with rSolr.
37
38
  s.add_development_dependency "rspec-rails", "~> 6.1"
@@ -45,6 +46,9 @@ Gem::Specification.new do |s|
45
46
  s.add_development_dependency "rubocop", '~> 1.0'
46
47
  s.add_development_dependency "rubocop-rails"
47
48
  s.add_development_dependency "rubocop-rspec"
49
+ s.add_development_dependency "rubocop-capybara"
50
+ s.add_development_dependency "rubocop-rspec_rails"
51
+ s.add_development_dependency "rubocop-factory_bot"
48
52
  s.add_development_dependency "i18n-tasks"
49
53
  s.add_development_dependency "solr_wrapper"
50
54
  end
@@ -7,7 +7,7 @@ services:
7
7
  - ALPINE_RUBY_VERSION
8
8
  # mounting . is causing seg-fault on macosx
9
9
  #volumes:
10
- #- .:/app
10
+ #- .:/app
11
11
  depends_on:
12
12
  - solr
13
13
  ports:
@@ -215,6 +215,9 @@ ar:
215
215
  email: بريد إلكتروني
216
216
  sms: إرسله كرسالة نصية قصيرة
217
217
  title: أدوات
218
+ top_navbar:
219
+ aria:
220
+ container_label: التنقل الرئيسي
218
221
  welcome: مرحبًا!
219
222
  views:
220
223
  pagination:
@@ -202,6 +202,9 @@ de:
202
202
  email: E-Mail
203
203
  sms: SMS
204
204
  title: Werkzeuge
205
+ top_navbar:
206
+ aria:
207
+ container_label: Hauptnavigation
205
208
  welcome: Willkommen!
206
209
  views:
207
210
  pagination: