blacklight 7.1.0 → 7.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.jshintrc +3 -1
  3. data/.rubocop_todo.yml +8 -8
  4. data/.travis.yml +13 -13
  5. data/CONTRIBUTING.md +3 -1
  6. data/Gemfile +2 -0
  7. data/VERSION +1 -1
  8. data/app/assets/images/blacklight/list.svg +1 -1
  9. data/app/assets/images/blacklight/search.svg +1 -1
  10. data/app/assets/javascripts/blacklight/blacklight.js +82 -70
  11. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +17 -13
  12. data/app/assets/stylesheets/blacklight/_facets.scss +3 -0
  13. data/app/assets/stylesheets/blacklight/_header.scss +26 -0
  14. data/app/assets/stylesheets/blacklight/_icons.scss +6 -6
  15. data/app/assets/stylesheets/blacklight/_mixins.scss +3 -3
  16. data/app/controllers/concerns/blacklight/facet.rb +1 -7
  17. data/app/helpers/blacklight/catalog_helper_behavior.rb +16 -17
  18. data/app/helpers/blacklight/layout_helper_behavior.rb +2 -2
  19. data/app/helpers/blacklight/url_helper_behavior.rb +1 -1
  20. data/app/javascript/blacklight/button_focus.js +9 -0
  21. data/app/javascript/blacklight/facet_load.js +18 -19
  22. data/app/javascript/blacklight/search_context.js +67 -49
  23. data/app/models/blacklight/icon.rb +26 -5
  24. data/app/presenters/blacklight/search_bar_presenter.rb +3 -1
  25. data/app/views/catalog/_bookmark_control.html.erb +11 -13
  26. data/app/views/catalog/_facet_group.html.erb +1 -1
  27. data/app/views/catalog/_facet_layout.html.erb +9 -2
  28. data/app/views/catalog/_facets.html.erb +1 -1
  29. data/app/views/catalog/_per_page_widget.html.erb +1 -1
  30. data/app/views/catalog/_search_form.html.erb +1 -1
  31. data/app/views/catalog/_search_results.html.erb +4 -0
  32. data/app/views/catalog/_sort_widget.html.erb +1 -1
  33. data/app/views/layouts/blacklight.html.erb +2 -2
  34. data/app/views/layouts/blacklight/base.html.erb +14 -8
  35. data/config/locales/blacklight.de.yml +17 -2
  36. data/config/locales/blacklight.en.yml +17 -2
  37. data/config/locales/blacklight.es.yml +17 -2
  38. data/config/locales/blacklight.fr.yml +17 -2
  39. data/config/locales/blacklight.hu.yml +17 -3
  40. data/config/locales/blacklight.it.yml +17 -2
  41. data/config/locales/blacklight.nl.yml +17 -3
  42. data/config/locales/blacklight.pt-BR.yml +17 -2
  43. data/config/locales/blacklight.sq.yml +17 -2
  44. data/config/locales/blacklight.zh.yml +17 -3
  45. data/lib/blacklight/configuration.rb +6 -0
  46. data/lib/blacklight/engine.rb +5 -4
  47. data/lib/blacklight/solr.rb +2 -0
  48. data/{app/models/concerns → lib}/blacklight/solr/document.rb +0 -0
  49. data/{app/models → lib}/blacklight/solr/facet_paginator.rb +0 -0
  50. data/lib/blacklight/solr/response/group_response.rb +10 -0
  51. data/lib/blacklight/solr/response/pagination_methods.rb +12 -0
  52. data/lib/generators/blacklight/assets_generator.rb +4 -1
  53. data/package-lock.json +1 -1
  54. data/package.json +2 -2
  55. data/spec/features/facets_spec.rb +22 -1
  56. data/spec/features/search_filters_spec.rb +25 -5
  57. data/spec/helpers/blacklight/layout_helper_behavior_spec.rb +4 -4
  58. data/spec/helpers/catalog_helper_spec.rb +0 -9
  59. data/spec/models/blacklight/icon_spec.rb +25 -1
  60. data/spec/models/blacklight/solr/response/group_response_spec.rb +13 -0
  61. data/spec/models/blacklight/solr/response_spec.rb +3 -0
  62. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +15 -0
  63. data/spec/views/catalog/_facet_group.html.erb_spec.rb +82 -0
  64. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +1 -1
  65. data/spec/views/catalog/_facets.html.erb_spec.rb +5 -66
  66. metadata +7 -5
  67. data/app/javascript/blacklight/collapsable.js +0 -9
@@ -22,6 +22,10 @@ pt-BR:
22
22
 
23
23
  blacklight:
24
24
  application_name: 'Blacklight'
25
+ skip_links:
26
+ main_content: 'Ir para o conteúdo principal'
27
+ search_field: 'Ir para a pesquisa'
28
+ first_result: 'Ir para o primeiro resultado da pesquisa'
25
29
  header_links:
26
30
  login: 'Acessar'
27
31
  logout: 'Sair'
@@ -144,11 +148,13 @@ pt-BR:
144
148
  invalid_solr_id: "Desculpe, você solicitou um cadastro que não existe."
145
149
  per_page:
146
150
  label: '%{count}<span class="hide-text"> por página</span>'
147
- button_label: '%{count} por página'
151
+ button_label: '%{count} por página' # TODO: Remove during major release
152
+ button_label_html: '%{count}<span class="d-none d-sm-inline"> por página</span>'
148
153
  title: 'Número de resultados para mostrar por página'
149
154
  submit: 'Atualizar'
150
155
  sort:
151
- label: 'Ordenar por %{field}'
156
+ label: 'Ordenar por %{field}' # TODO: Remove during major release
157
+ label_html: 'Ordenar<span class="d-none d-sm-inline"> por %{field}</span>'
152
158
  submit: 'ordenar resultados'
153
159
  form:
154
160
  search_field:
@@ -171,6 +177,9 @@ pt-BR:
171
177
  one: '<strong>1 de 1</strong>'
172
178
  other: '<strong>%{current}</strong> de <strong>%{total}</strong>'
173
179
  documents:
180
+ aria:
181
+ search_results: 'Resultados da Busca'
182
+ limit_search: 'Filtre sua busca'
174
183
  counter: '%{counter}. '
175
184
  facets:
176
185
  title: 'Filtre sua busca'
@@ -217,5 +226,11 @@ pt-BR:
217
226
 
218
227
  entry_name:
219
228
  default: 'registro'
229
+ grouped:
230
+ default: 'resultado agrupado'
220
231
 
221
232
  did_you_mean: 'Você quis dizer: %{options}?'
233
+
234
+ main:
235
+ aria:
236
+ main_container: 'Conteúdo principal'
@@ -12,6 +12,10 @@ sq:
12
12
  next: 'Tjetra &raquo;'
13
13
 
14
14
  blacklight:
15
+ skip_links:
16
+ main_content: 'Shkoni tek përmbajtja kryesore'
17
+ search_field: 'Shkoni në kërkim'
18
+ first_result: 'Shkoni te rezultati i parë i kërkimit'
15
19
  header_links:
16
20
  login: 'Hyr'
17
21
  logout: 'Dil'
@@ -134,11 +138,13 @@ sq:
134
138
  invalid_solr_id: "Na vjen keq, ju keni kërkuar një të dhënë që nuk ekziston."
135
139
  per_page:
136
140
  label: '%{count}<span class="sr-only"> për faqe</span>'
137
- button_label: '%{count} për faqe'
141
+ button_label: '%{count} për faqe' # TODO: Remove during major release
142
+ button_label_html: '%{count}<span class="d-none d-sm-inline"> për faqe</span>'
138
143
  title: 'Numri i rezultateve që do të shfaqen për faqe'
139
144
  submit: 'Përditëso'
140
145
  sort:
141
- label: 'Klasifikoj sipas %{field}'
146
+ label: 'Klasifikoj sipas %{field}' # TODO: Remove during major release
147
+ label_html: 'Klasifikoj<span class="d-none d-sm-inline"> sipas %{field}</span>'
142
148
  submit: 'klasifiko rezultatet'
143
149
  form:
144
150
  search_field:
@@ -161,6 +167,9 @@ sq:
161
167
  one: '<strong>1 prej 1</strong>'
162
168
  other: '<strong>%{current}</strong> prej <strong>%{total}</strong>'
163
169
  documents:
170
+ aria:
171
+ search_results: 'Rezultatet e kërkimit'
172
+ limit_search: 'Kufizo këkimin'
164
173
  counter: '%{counter}. '
165
174
  facets:
166
175
  title: 'Kufizo këkimin'
@@ -206,5 +215,11 @@ sq:
206
215
 
207
216
  entry_name:
208
217
  default: 'entry'
218
+ grouped:
219
+ default: 'rezultat i grupuar'
209
220
 
210
221
  did_you_mean: 'A keni menduar: %{options}?'
222
+
223
+ main:
224
+ aria:
225
+ main_container: 'Përmbajtja kryesore'
@@ -13,7 +13,10 @@ zh:
13
13
 
14
14
  blacklight:
15
15
  application_name: 'Blacklight'
16
-
16
+ skip_links:
17
+ main_content: '转到主要内容'
18
+ search_field: '转到搜索'
19
+ first_result: '转到第一个搜索结果'
17
20
  header_links:
18
21
  login: '登陆'
19
22
  logout: '注销'
@@ -136,11 +139,13 @@ zh:
136
139
  invalid_solr_id: "抱歉,你要找的结果不存在。"
137
140
  per_page:
138
141
  label: '%{count}<span class="sr-only"> 每页</span>'
139
- button_label: '%{count} 每页'
142
+ button_label: '%{count} 每页' # TODO: Remove during major release
143
+ button_label_html: '%{count}<span class="d-none d-sm-inline"> 每页</span>'
140
144
  title: '每页显示结果数'
141
145
  submit: '更新'
142
146
  sort:
143
- label: '按 %{field} 排序'
147
+ label: '按 %{field} 排序' # TODO: Remove during major release
148
+ label_html: '<span class="d-none d-sm-inline">按 %{field} </span>排序'
144
149
  submit: '排序'
145
150
  form:
146
151
  search_field:
@@ -163,6 +168,9 @@ zh:
163
168
  one: '<strong>1 / 1</strong>'
164
169
  other: '<strong>%{current}</strong> / <strong>%{total}</strong>'
165
170
  documents:
171
+ aria:
172
+ search_results: '搜索结果'
173
+ limit_search: '限定搜索'
166
174
  counter: '%{counter}. '
167
175
  facets:
168
176
  title: '限定搜索'
@@ -208,5 +216,11 @@ zh:
208
216
 
209
217
  entry_name:
210
218
  default: '条目'
219
+ grouped:
220
+ default: '分组结果'
211
221
 
212
222
  did_you_mean: '你是要输入: %{options} 吗?'
223
+
224
+ main:
225
+ aria:
226
+ main_container: '主要内容'
@@ -245,6 +245,12 @@ module Blacklight
245
245
  FacetField.new(field: field).normalize!
246
246
  end
247
247
 
248
+ # @param [String] group (nil) a group name of facet fields
249
+ # @return [Array<String>] a list of the facet field names from the configuration
250
+ def facet_field_names(group = nil)
251
+ facet_fields.select { |_facet, opts| group == opts[:group] }.values.map(&:field)
252
+ end
253
+
248
254
  # Add any configured facet fields to the default solr parameters hash
249
255
  # @overload add_facet_fields_to_solr_request!
250
256
  # add all facet fields to the solr request
@@ -39,15 +39,16 @@ module Blacklight
39
39
  'Sprint' => 'messaging.sprintpcs.com',
40
40
  'T Mobile' => 'tmomail.net',
41
41
  'Alltel' => 'message.alltel.com',
42
- 'Cricket' => 'mms.mycricket.com'
42
+ 'Cricket' => 'mms.mycricket.com',
43
+ 'Google Fi' => 'msg.fi.google.com'
43
44
  }
44
45
 
45
46
  config.bookmarks_http_method = :post
46
47
 
47
48
  config.email_regexp = defined?(Devise) ? Devise.email_regexp : /\A[^@\s]+@[^@\s]+\z/
48
49
 
49
- config.action_dispatch.rescue_responses.merge!(
50
- "Blacklight::Exceptions::RecordNotFound" => :not_found
51
- )
50
+ config.action_dispatch.rescue_responses["Blacklight::Exceptions::RecordNotFound"] = :not_found
51
+
52
+ config.enable_search_bar_autofocus = false
52
53
  end
53
54
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
  module Blacklight
3
3
  module Solr
4
+ autoload :Document, 'blacklight/solr/document'
5
+ autoload :FacetPaginator, 'blacklight/solr/facet_paginator'
4
6
  autoload :Repository, 'blacklight/solr/repository'
5
7
  autoload :Request, 'blacklight/solr/request'
6
8
  autoload :Response, 'blacklight/solr/response'
@@ -39,6 +39,16 @@ class Blacklight::Solr::Response::GroupResponse
39
39
  total.zero?
40
40
  end
41
41
 
42
+ ##
43
+ # Overridden from Blacklight::Solr::Response::PaginationMethods to support
44
+ # grouped key specific i18n keys. `key` is the field being grouped
45
+ def entry_name(options)
46
+ I18n.t(
47
+ "blacklight.entry_name.grouped.#{key}",
48
+ default: :'blacklight.entry_name.grouped.default'
49
+ ).pluralize(options[:count])
50
+ end
51
+
42
52
  def method_missing meth, *args, &block
43
53
  if response.respond_to? meth
44
54
  response.send(meth, *args, &block)
@@ -14,4 +14,16 @@ module Blacklight::Solr::Response::PaginationMethods
14
14
  def total_count #:nodoc:
15
15
  total
16
16
  end
17
+
18
+ ##
19
+ # Should return response documents size, not hash size
20
+ def size
21
+ total_count
22
+ end
23
+
24
+ ##
25
+ # Meant to have the same signature as Kaminari::PaginatableArray#entry_name
26
+ def entry_name(options)
27
+ I18n.t('blacklight.entry_name.default').pluralize(options[:count])
28
+ end
17
29
  end
@@ -16,7 +16,6 @@ module Blacklight
16
16
  return if has_blacklight_assets?
17
17
 
18
18
  contents = "\n//\n// Required by Blacklight\n"
19
- contents += "//= require jquery\n"
20
19
  contents += "//= require popper\n"
21
20
  contents += "// Twitter Typeahead for autocomplete\n"
22
21
  contents += "//= require twitter/typeahead\n"
@@ -32,6 +31,10 @@ module Blacklight
32
31
  insert_into_file "app/assets/javascripts/application.js", after: marker do
33
32
  contents
34
33
  end
34
+
35
+ insert_into_file "app/assets/javascripts/application.js", before: '//= require rails-ujs' do
36
+ "//= require jquery3\n"
37
+ end
35
38
  end
36
39
 
37
40
  # This is not a default in Rails 5.1+
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blacklight-frontend",
3
- "version": "7.1.0-alpha",
3
+ "version": "7.1.0",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "blacklight-frontend",
3
- "version": "7.1.0-alpha",
3
+ "version": "7.2.0",
4
4
  "description": "[![Build Status](https://travis-ci.org/projectblacklight/blacklight.png?branch=master)](https://travis-ci.org/projectblacklight/blacklight) [![Gem Version](https://badge.fury.io/rb/blacklight.png)](http://badge.fury.io/rb/blacklight) [![Coverage Status](https://coveralls.io/repos/github/projectblacklight/blacklight/badge.svg?branch=master)](https://coveralls.io/github/projectblacklight/blacklight?branch=master)",
5
5
  "main": "app/assets/javascripts/blacklight",
6
6
  "scripts": {
7
- "js-compile-bundle": "shx cat app/javascript/blacklight/core.js app/javascript/blacklight/autocomplete.js app/javascript/blacklight/bookmark_toggle.js app/javascript/blacklight/checkbox_submit.js app/javascript/blacklight/collapsable.js app/javascript/blacklight/facet_load.js app/javascript/blacklight/modal.js app/javascript/blacklight/search_context.js | shx sed \"s/^(import|export).*//\" | babel --filename app/javascript/blacklight/blacklight.js > app/assets/javascripts/blacklight/blacklight.js"
7
+ "js-compile-bundle": "shx cat app/javascript/blacklight/core.js app/javascript/blacklight/autocomplete.js app/javascript/blacklight/bookmark_toggle.js app/javascript/blacklight/button_focus.js app/javascript/blacklight/checkbox_submit.js app/javascript/blacklight/facet_load.js app/javascript/blacklight/modal.js app/javascript/blacklight/search_context.js | shx sed \"s/^(import|export).*//\" | babel --filename app/javascript/blacklight/blacklight.js > app/assets/javascripts/blacklight/blacklight.js"
8
8
  },
9
9
  "repository": {
10
10
  "type": "git",
@@ -56,13 +56,34 @@ RSpec.describe "Facets" do
56
56
 
57
57
  expect(page).to have_css('#facet-format', visible: false)
58
58
 
59
- page.find('h3.facet-field-heading a', text: 'Format').click
59
+ within('#facets .navbar') do
60
+ page.find('button.navbar-toggler').click
61
+ end
62
+
63
+ page.find('h3.facet-field-heading button', text: 'Format').click
60
64
 
61
65
  sleep(1) # let facet animation finish and wait for it to potentially re-collapse
62
66
 
63
67
  expect(page).to have_css('#facet-format', visible: true) # assert that it didn't re-collapse
64
68
  end
65
69
 
70
+ describe 'heading button focus with Firefox' do
71
+ before do
72
+ Capybara.current_driver = :selenium_headless
73
+ end
74
+
75
+ after do
76
+ Capybara.current_driver = :rack_test
77
+ end
78
+
79
+ it 'changes to the button on button click in Firefox' do
80
+ visit root_path
81
+ page.find('h3.facet-field-heading button', text: 'Format').click
82
+ focused_element_data_target = page.evaluate_script("document.activeElement")['data-target']
83
+ expect(focused_element_data_target).to eq '#facet-format'
84
+ end
85
+ end
86
+
66
87
  describe '"More" links' do
67
88
  it 'has default more link with sr-only text' do
68
89
  visit root_path
@@ -169,22 +169,37 @@ RSpec.describe "Facets" do
169
169
  it "is collapsed when not selected", js: true do
170
170
  skip("Test passes locally but not on Travis.") if ENV['TRAVIS']
171
171
  visit root_path
172
+
173
+ within('#facets .navbar') do
174
+ page.find('button.navbar-toggler').click
175
+ end
176
+
172
177
  within(".blacklight-subject_ssim") do
173
178
  expect(page).not_to have_selector(".card-body", visible: true)
174
179
  end
175
180
  end
176
- it "expands when the heading is clicked", js: true do
181
+ it "expands when the heading button is clicked", js: true do
177
182
  skip("Test passes locally but not on Travis.") if ENV['TRAVIS']
178
183
  visit root_path
184
+
185
+ within('#facets .navbar') do
186
+ page.find('button.navbar-toggler').click
187
+ end
188
+
179
189
  within(".blacklight-subject_ssim") do
180
190
  expect(page).not_to have_selector(".card-body", visible: true)
181
- find(".card-header").click
182
- expect(page).to have_selector(".card-body", visible: true)
191
+ find(".card-header button").click
192
+ expect(page).to have_selector(".card-body", visible: true)
183
193
  end
184
194
  end
185
- it "expands when the anchor is clicked", js: true do
195
+ it "expands when the button is clicked", js: true do
186
196
  skip("Test passes locally but not on Travis.") if ENV['TRAVIS']
187
197
  visit root_path
198
+
199
+ within('#facets .navbar') do
200
+ page.find('button.navbar-toggler').click
201
+ end
202
+
188
203
  within(".blacklight-subject_ssim") do
189
204
  expect(page).not_to have_selector(".card-body", visible: true)
190
205
  find(".card-header").click
@@ -194,8 +209,13 @@ RSpec.describe "Facets" do
194
209
  it "keeps selected facets expanded on page load", js: true do
195
210
  skip("Test passes locally but not on Travis.") if ENV['TRAVIS']
196
211
  visit root_path
212
+
213
+ within('#facets .navbar') do
214
+ page.find('button.navbar-toggler').click
215
+ end
216
+
197
217
  within(".blacklight-subject_ssim") do
198
- click_link "Topic"
218
+ page.find('h3.facet-field-heading', text: 'Topic').click
199
219
  expect(page).to have_selector(".panel-collapse", visible: true)
200
220
  end
201
221
  within(".blacklight-subject_ssim") do
@@ -4,28 +4,28 @@ RSpec.describe Blacklight::LayoutHelperBehavior do
4
4
  describe '#show_content_classes' do
5
5
  it 'returns a string of classes' do
6
6
  expect(helper.show_content_classes).to be_an String
7
- expect(helper.show_content_classes).to eq 'col-md-9 show-document'
7
+ expect(helper.show_content_classes).to eq 'col-lg-9 show-document'
8
8
  end
9
9
  end
10
10
 
11
11
  describe '#show_sidebar_classes' do
12
12
  it 'returns a string of classes' do
13
13
  expect(helper.show_sidebar_classes).to be_an String
14
- expect(helper.show_sidebar_classes).to eq 'page-sidebar col-md-3'
14
+ expect(helper.show_sidebar_classes).to eq 'page-sidebar col-lg-3'
15
15
  end
16
16
  end
17
17
 
18
18
  describe '#main_content_classes' do
19
19
  it 'returns a string of classes' do
20
20
  expect(helper.main_content_classes).to be_an String
21
- expect(helper.main_content_classes).to eq 'col-md-9'
21
+ expect(helper.main_content_classes).to eq 'col-lg-9'
22
22
  end
23
23
  end
24
24
 
25
25
  describe '#sidebar_classes' do
26
26
  it 'returns a string of classes' do
27
27
  expect(helper.sidebar_classes).to be_an String
28
- expect(helper.sidebar_classes).to eq 'page-sidebar col-md-3'
28
+ expect(helper.sidebar_classes).to eq 'page-sidebar col-lg-3'
29
29
  end
30
30
  end
31
31
 
@@ -62,15 +62,6 @@ RSpec.describe CatalogHelper do
62
62
  expect(html).to eq "<strong>1</strong> entry found"
63
63
  expect(html).to be_html_safe
64
64
  end
65
-
66
- it "uses the model_name from the response" do
67
- response = mock_response total: 1
68
- allow(response).to receive(:model_name).and_return(double(human: 'thingy'))
69
-
70
- html = page_entries_info(response)
71
- expect(html).to eq "<strong>1</strong> thingy found"
72
- expect(html).to be_html_safe
73
- end
74
65
  end
75
66
 
76
67
  it "with a single page of results" do
@@ -9,7 +9,31 @@ RSpec.describe Blacklight::Icon do
9
9
  end
10
10
  it 'returns raw svg' do
11
11
  expect(Capybara.string(subject.svg))
12
- .to have_css 'svg title', text: 'Search'
12
+ .to have_css 'svg[width="24"]'
13
+ end
14
+ it 'adds role="image"' do
15
+ expect(Capybara.string(subject.svg))
16
+ .to have_css 'svg[role="image"]'
17
+ end
18
+ it 'adds title' do
19
+ expect(Capybara.string(subject.svg))
20
+ .to have_css 'title[id^="bl-icon-search-"]', text: 'search icon'
21
+ end
22
+ it 'adds aria-labelled-by' do
23
+ expect(Capybara.string(subject.svg))
24
+ .to have_css 'svg[aria-labelled-by^="bl-icon-search-"]'
25
+ end
26
+ context 'when label is false' do
27
+ subject { described_class.new(:search, classes: 'awesome', aria_hidden: true, label: false) }
28
+
29
+ it 'does not add title' do
30
+ expect(Capybara.string(subject.svg))
31
+ .not_to have_css 'title', text: 'search icon'
32
+ end
33
+ it 'does not add aria-labelled-by' do
34
+ expect(Capybara.string(subject.svg))
35
+ .not_to have_css 'svg[aria-labelled-by^="bl-icon-search-"]'
36
+ end
13
37
  end
14
38
  end
15
39