blacklight 8.3.0 → 8.4.0

Sign up to get free protection for your applications and to get access to all the features.
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: