blacklight 9.0.0.beta8 → 9.1.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 (185) hide show
  1. checksums.yaml +4 -4
  2. data/.env +3 -3
  3. data/.github/matrix.json +18 -34
  4. data/.github/workflows/lint.yml +1 -1
  5. data/.github/workflows/test.yml +4 -3
  6. data/.rubocop.yml +72 -7
  7. data/.rubocop_todo.yml +142 -268
  8. data/Gemfile +1 -1
  9. data/README.md +4 -11
  10. data/VERSION +1 -1
  11. data/app/assets/builds/blacklight.css +37 -23
  12. data/app/assets/images/blacklight/logo-dark.svg +184 -0
  13. data/app/assets/images/blacklight/logo.svg +184 -0
  14. data/app/assets/javascripts/blacklight/blacklight.esm.js +134 -48
  15. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
  16. data/app/assets/javascripts/blacklight/blacklight.js +134 -48
  17. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
  18. data/app/assets/stylesheets/blacklight/_balanced_list.scss +1 -1
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +17 -0
  20. data/app/assets/stylesheets/blacklight/_constraints.scss +2 -2
  21. data/app/assets/stylesheets/blacklight/_facets.scss +14 -10
  22. data/app/assets/stylesheets/blacklight/_header.scss +0 -4
  23. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +5 -9
  24. data/app/components/blacklight/facets/filters_component.rb +1 -1
  25. data/app/components/blacklight/facets/inclusive_constraint_component.html.erb +1 -1
  26. data/app/components/blacklight/facets/suggest_component.html.erb +17 -12
  27. data/app/components/blacklight/icons/checkmark_component.rb +16 -0
  28. data/app/components/blacklight/icons/circle_half_component.rb +16 -0
  29. data/app/components/blacklight/icons/moon_stars_component.rb +17 -0
  30. data/app/components/blacklight/icons/sun_component.rb +16 -0
  31. data/app/components/blacklight/metadata_field_component.rb +1 -1
  32. data/app/components/blacklight/search_navbar_component.html.erb +1 -1
  33. data/app/components/blacklight/theme_switcher_component.html.erb +31 -0
  34. data/app/components/blacklight/theme_switcher_component.rb +6 -0
  35. data/app/components/blacklight/top_navbar_component.html.erb +1 -1
  36. data/app/controllers/concerns/blacklight/bookmarks.rb +8 -14
  37. data/app/controllers/concerns/blacklight/catalog.rb +12 -14
  38. data/app/controllers/concerns/blacklight/controller.rb +54 -11
  39. data/app/controllers/concerns/blacklight/guest_user.rb +51 -0
  40. data/app/controllers/concerns/blacklight/search_context.rb +1 -1
  41. data/app/controllers/concerns/blacklight/search_history.rb +3 -1
  42. data/app/controllers/concerns/blacklight/searchable.rb +18 -0
  43. data/app/helpers/blacklight/layout_helper_behavior.rb +7 -0
  44. data/app/javascript/blacklight-frontend/checkbox_submit.js +2 -2
  45. data/app/javascript/blacklight-frontend/color_theme_switcher.js +85 -0
  46. data/app/javascript/blacklight-frontend/facet_suggest.js +4 -1
  47. data/app/javascript/blacklight-frontend/index.js +2 -0
  48. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
  49. data/app/models/concerns/blacklight/document.rb +1 -1
  50. data/app/models/concerns/blacklight/user.rb +36 -0
  51. data/app/presenters/blacklight/field_presenter.rb +1 -1
  52. data/app/presenters/blacklight/rendering/microdata.rb +1 -0
  53. data/app/services/blacklight/bookmarks_search_builder.rb +4 -4
  54. data/app/services/blacklight/search_service.rb +50 -35
  55. data/app/values/blacklight/types.rb +1 -1
  56. data/app/views/catalog/_email_form.html.erb +3 -3
  57. data/app/views/catalog/_home_text.html.erb +1 -1
  58. data/app/views/catalog/_sms_form.html.erb +4 -4
  59. data/app/views/catalog/index.rss.builder +4 -4
  60. data/app/views/catalog/opensearch.json.jbuilder +3 -0
  61. data/app/views/catalog/opensearch.xml.builder +2 -2
  62. data/app/views/layouts/blacklight/base.html.erb +13 -1
  63. data/app/views/shared/_user_util_links.html.erb +18 -5
  64. data/blacklight.gemspec +3 -3
  65. data/config/locales/blacklight.ar.yml +5 -0
  66. data/config/locales/blacklight.ca.yml +5 -0
  67. data/config/locales/blacklight.de.yml +6 -2
  68. data/config/locales/blacklight.en.yml +5 -0
  69. data/config/locales/blacklight.es.yml +5 -0
  70. data/config/locales/blacklight.fr.yml +5 -0
  71. data/config/locales/blacklight.hu.yml +5 -0
  72. data/config/locales/blacklight.it.yml +6 -2
  73. data/config/locales/blacklight.nl.yml +5 -0
  74. data/config/locales/blacklight.pt-BR.yml +6 -2
  75. data/config/locales/blacklight.sq.yml +5 -0
  76. data/config/locales/blacklight.zh.yml +5 -0
  77. data/lib/blacklight/component.rb +1 -1
  78. data/lib/blacklight/configuration/action_config_map_entry.rb +31 -0
  79. data/lib/blacklight/configuration/display_field.rb +1 -0
  80. data/lib/blacklight/configuration/field.rb +6 -6
  81. data/lib/blacklight/configuration/fields.rb +1 -1
  82. data/lib/blacklight/configuration/sort_field.rb +2 -2
  83. data/lib/blacklight/configuration.rb +30 -23
  84. data/lib/blacklight/parameters.rb +1 -1
  85. data/lib/blacklight/routes/searchable.rb +1 -1
  86. data/lib/blacklight/search_builder.rb +208 -10
  87. data/lib/blacklight/search_state.rb +4 -0
  88. data/lib/blacklight/solr/request.rb +8 -1
  89. data/lib/blacklight/solr/response/group_response.rb +1 -1
  90. data/lib/blacklight/solr/response/spelling.rb +8 -8
  91. data/lib/blacklight/solr/response.rb +2 -21
  92. data/lib/blacklight/solr/search_builder_behavior.rb +59 -16
  93. data/lib/blacklight.rb +2 -2
  94. data/lib/generators/blacklight/assets/importmap_generator.rb +2 -2
  95. data/lib/generators/blacklight/assets_generator.rb +1 -1
  96. data/lib/generators/blacklight/controller_generator.rb +1 -1
  97. data/lib/generators/blacklight/document_generator.rb +1 -1
  98. data/lib/generators/blacklight/install_generator.rb +6 -4
  99. data/lib/generators/blacklight/models_generator.rb +1 -1
  100. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  101. data/lib/generators/blacklight/solr_generator.rb +1 -1
  102. data/lib/generators/blacklight/templates/catalog_controller.rb +21 -2
  103. data/lib/generators/blacklight/templates/solr/conf/schema.xml +264 -178
  104. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +6 -14
  105. data/lib/generators/blacklight/test_support_generator.rb +1 -1
  106. data/lib/generators/blacklight/user_generator.rb +66 -5
  107. data/lib/railties/blacklight.rake +4 -4
  108. data/package.json +2 -2
  109. data/spec/components/blacklight/document/action_component_spec.rb +1 -1
  110. data/spec/components/blacklight/document/group_component_spec.rb +1 -1
  111. data/spec/components/blacklight/document_component_spec.rb +9 -9
  112. data/spec/components/blacklight/facet_component_spec.rb +2 -2
  113. data/spec/components/blacklight/facets/filters_component_spec.rb +1 -1
  114. data/spec/components/blacklight/facets/index_navigation_component_spec.rb +1 -2
  115. data/spec/components/blacklight/facets/list_component_spec.rb +1 -1
  116. data/spec/components/blacklight/facets/suggest_component_spec.rb +2 -3
  117. data/spec/components/blacklight/metadata_field_component_spec.rb +26 -0
  118. data/spec/components/blacklight/skip_link_component_spec.rb +2 -2
  119. data/spec/controllers/application_controller_spec.rb +71 -0
  120. data/spec/controllers/bookmarks_controller_spec.rb +18 -5
  121. data/spec/controllers/catalog_controller_spec.rb +7 -5
  122. data/spec/features/advanced_search_spec.rb +29 -16
  123. data/spec/features/alternate_controller_spec.rb +4 -4
  124. data/spec/features/axe_spec.rb +34 -22
  125. data/spec/features/bookmarks_spec.rb +13 -13
  126. data/spec/features/dark_mode_spec.rb +42 -0
  127. data/spec/features/did_you_mean_spec.rb +27 -27
  128. data/spec/features/facet_missing_spec.rb +3 -3
  129. data/spec/features/facets_spec.rb +9 -0
  130. data/spec/features/record_view_spec.rb +14 -14
  131. data/spec/features/search_context_spec.rb +8 -8
  132. data/spec/features/search_filters_spec.rb +16 -16
  133. data/spec/features/search_formats_spec.rb +2 -2
  134. data/spec/features/search_history_spec.rb +11 -11
  135. data/spec/features/search_pagination_spec.rb +17 -17
  136. data/spec/features/search_results_spec.rb +3 -3
  137. data/spec/features/search_sort_spec.rb +4 -4
  138. data/spec/features/search_spec.rb +20 -20
  139. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +15 -15
  140. data/spec/helpers/blacklight_helper_spec.rb +1 -1
  141. data/spec/helpers/catalog_helper_spec.rb +7 -7
  142. data/spec/integration/generators/blacklight/user_generator_spec.rb +60 -0
  143. data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +1 -1
  144. data/spec/models/blacklight/configurable_spec.rb +1 -1
  145. data/spec/models/blacklight/configuration_spec.rb +0 -19
  146. data/spec/models/blacklight/document/dublin_core_spec.rb +2 -2
  147. data/spec/models/blacklight/facet_paginator_spec.rb +1 -1
  148. data/spec/models/blacklight/search_builder_spec.rb +26 -4
  149. data/spec/models/blacklight/solr/repository_spec.rb +10 -2
  150. data/spec/models/blacklight/solr/search_builder_behavior_spec.rb +165 -7
  151. data/spec/models/blacklight/user_spec.rb +32 -5
  152. data/spec/models/bookmark_spec.rb +1 -1
  153. data/spec/models/record_mailer_spec.rb +8 -8
  154. data/spec/models/search_spec.rb +1 -1
  155. data/spec/models/solr_document_spec.rb +4 -0
  156. data/spec/presenters/blacklight/index_presenter_spec.rb +1 -0
  157. data/spec/presenters/blacklight/rendering/pipeline_spec.rb +1 -0
  158. data/spec/presenters/blacklight/show_presenter_spec.rb +1 -0
  159. data/spec/presenters/blacklight/thumbnail_presenter_spec.rb +1 -0
  160. data/spec/services/blacklight/search_service_spec.rb +7 -7
  161. data/spec/spec_helper.rb +3 -12
  162. data/spec/support/features/session_helpers.rb +13 -4
  163. data/spec/support/features/turbo_helpers.rb +13 -0
  164. data/spec/support/features.rb +2 -0
  165. data/spec/support/user_helpers.rb +24 -0
  166. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  167. data/spec/views/catalog/_document.html.erb_spec.rb +4 -4
  168. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +2 -2
  169. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +5 -5
  170. data/spec/views/catalog/index.html.erb_spec.rb +2 -2
  171. data/spec/views/catalog/show.html.erb_spec.rb +3 -4
  172. data/spec/views/shared/_user_util_links.html.erb_spec.rb +56 -0
  173. data/template.demo.rb +2 -1
  174. metadata +30 -29
  175. data/.hound.yml +0 -4
  176. data/.jshintrc +0 -22
  177. data/app/assets/images/blacklight/logo.png +0 -0
  178. data/app/controllers/concerns/blacklight/facetable.rb +0 -34
  179. data/app/models/facet_search_builder.rb +0 -5
  180. data/app/services/blacklight/facet_search_service.rb +0 -44
  181. data/lib/blacklight/abstract_search_builder.rb +0 -154
  182. data/lib/blacklight/facet_search_builder.rb +0 -18
  183. data/lib/blacklight/solr/facet_search_builder_behavior.rb +0 -62
  184. data/spec/models/blacklight/facet_search_builder_spec.rb +0 -19
  185. data/spec/models/blacklight/solr/facet_search_builder_behavior_spec.rb +0 -929
@@ -1,154 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Blacklight
4
- ##
5
- # Blacklight's SearchBuilder converts blacklight request parameters into
6
- # query parameters appropriate for search index. It does so by evaluating a
7
- # chain of processing methods to populate a result hash (see {#to_hash}).
8
- class AbstractSearchBuilder
9
- class_attribute :default_processor_chain
10
- self.default_processor_chain = []
11
-
12
- attr_reader :processor_chain, :search_state, :blacklight_params
13
-
14
- # @overload initialize(scope)
15
- # @param [Object] scope scope the scope where the filter methods reside in.
16
- # @overload initialize(processor_chain, scope)
17
- # @param [List<Symbol>,TrueClass] processor_chain options a list of filter methods to run or true, to use the default methods
18
- # @param [Object] scope the scope where the filter methods reside in.
19
- def initialize(*options)
20
- case options.size
21
- when 1
22
- @processor_chain = default_processor_chain.dup
23
- @scope = options.first
24
- when 2
25
- @processor_chain, @scope = options
26
- else
27
- raise ArgumentError, "wrong number of arguments. (#{options.size} for 1..2)"
28
- end
29
-
30
- @blacklight_params = {}
31
- search_state_class = @scope.try(:search_state_class) || Blacklight::SearchState
32
- @search_state = search_state_class.new(@blacklight_params, @scope&.blacklight_config, @scope)
33
- @additional_filters = {}
34
- @merged_params = {}
35
- @reverse_merged_params = {}
36
- end
37
-
38
- delegate :blacklight_config, to: :scope
39
-
40
- ##
41
- # Set the parameters to pass through the processor chain
42
- def with(blacklight_params_or_search_state = {})
43
- params_will_change!
44
- @search_state = blacklight_params_or_search_state.is_a?(Blacklight::SearchState) ? blacklight_params_or_search_state : @search_state.reset(blacklight_params_or_search_state)
45
- @blacklight_params = @search_state.params.dup
46
- self
47
- end
48
-
49
- # sets the facet that this query pertains to, for the purpose of facet pagination
50
- def facet=(value)
51
- params_will_change!
52
- @facet = value
53
- end
54
-
55
- # @param [Object] value
56
- def facet(value = nil)
57
- if value
58
- self.facet = value
59
- return self
60
- end
61
- @facet
62
- end
63
-
64
- ##
65
- # Merge additional, repository-specific parameters
66
- def merge(extra_params, &)
67
- if extra_params
68
- params_will_change!
69
- @merged_params.merge!(extra_params.to_hash, &)
70
- end
71
- self
72
- end
73
-
74
- ##
75
- # "Reverse merge" additional, repository-specific parameters
76
- def reverse_merge(extra_params, &)
77
- if extra_params
78
- params_will_change!
79
- @reverse_merged_params.reverse_merge!(extra_params.to_hash, &)
80
- end
81
- self
82
- end
83
-
84
- delegate :[], :key?, to: :to_hash
85
-
86
- # a solr query method
87
- # @return [Blacklight::Solr::Response] the solr response object
88
- def to_hash
89
- return @params unless params_need_update?
90
-
91
- @params = processed_parameters
92
- .reverse_merge(@reverse_merged_params)
93
- .merge(@merged_params)
94
- .tap { clear_changes }
95
- end
96
-
97
- alias query to_hash
98
- alias to_h to_hash
99
-
100
- delegate :search_field, to: :search_state
101
-
102
- private
103
-
104
- attr_reader :scope
105
-
106
- def should_add_field_to_request? _field_name, field
107
- field.include_in_request || (field.include_in_request.nil? && blacklight_config.add_field_configuration_to_solr_request)
108
- end
109
-
110
- def request
111
- Blacklight::Solr::Request.new
112
- end
113
-
114
- # The CatalogController #index and #facet actions use this.
115
- # Solr parameters can come from a number of places. From lowest
116
- # precedence to highest:
117
- # 1. General defaults in blacklight config (are trumped by)
118
- # 2. defaults for the particular search field identified by params[:search_field] (are trumped by)
119
- # 3. certain parameters directly on input HTTP query params
120
- # * not just any parameter is grabbed willy nilly, only certain ones are allowed by HTTP input)
121
- # * for legacy reasons, qt in http query does not over-ride qt in search field definition default.
122
- # 4. extra parameters passed in as argument.
123
- #
124
- # spellcheck.q will be supplied with the [:q] value unless specifically
125
- # specified otherwise.
126
- #
127
- # Incoming parameter :f is mapped to :fq solr parameter.
128
- #
129
- # @return a params hash for searching solr.
130
- def processed_parameters
131
- request.tap do |request_parameters|
132
- processor_chain.each do |method_name|
133
- send(method_name, request_parameters)
134
- end
135
- end
136
- end
137
-
138
- def params_will_change!
139
- @dirty = true
140
- end
141
-
142
- def params_changed?
143
- !!@dirty
144
- end
145
-
146
- def clear_changes
147
- @dirty = false
148
- end
149
-
150
- def params_need_update?
151
- params_changed? || @params.nil?
152
- end
153
- end
154
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Blacklight
4
- class FacetSearchBuilder < AbstractSearchBuilder
5
- def facet_suggestion_query=(value)
6
- params_will_change!
7
- @facet_suggestion_query = value
8
- end
9
-
10
- def facet_suggestion_query(value = nil)
11
- if value
12
- self.facet_suggestion_query = value
13
- return self
14
- end
15
- @facet_suggestion_query
16
- end
17
- end
18
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Blacklight::Solr
4
- module FacetSearchBuilderBehavior
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- include Blacklight::Solr::SearchBuilderBehavior
9
- self.default_processor_chain = [:default_solr_parameters,
10
- :add_search_field_default_parameters,
11
- :add_query_to_solr,
12
- :add_facet_fq_to_solr,
13
- :add_facetting_to_solr,
14
- :add_solr_fields_to_query,
15
- :add_additional_filters,
16
- :add_facet_paging_to_solr,
17
- :add_facet_suggestion_parameters]
18
- end
19
-
20
- def add_facet_paging_to_solr(solr_params)
21
- return if facet.blank?
22
-
23
- facet_config = blacklight_config.facet_fields[facet]
24
-
25
- solr_params[:rows] = 0
26
-
27
- limit = if solr_params["facet.limit"]
28
- solr_params["facet.limit"].to_i
29
- else
30
- facet_config.fetch(:more_limit, blacklight_config.default_more_limit)
31
- end
32
-
33
- page = search_state.facet_page
34
- sort = search_state.facet_sort
35
- prefix = search_state.facet_prefix
36
- offset = (page - 1) * limit
37
-
38
- if facet_config.json
39
- add_solr_facet_json_params(solr_parameters, facet, facet_config, limit: limit + 1, offset: offset, sort: sort, prefix: prefix)
40
- return
41
- end
42
-
43
- # Now override with our specific things for fetching facet values
44
- facet_ex = facet_config.respond_to?(:ex) ? facet_config.ex : nil
45
- solr_params[:'facet.field'] = with_ex_local_param(facet_ex, facet_config.field)
46
-
47
- # Need to set as f.facet_field.facet.* to make sure we
48
- # override any field-specific default in the solr request handler.
49
- solr_params[:"f.#{facet_config.field}.facet.limit"] = limit + 1
50
- solr_params[:"f.#{facet_config.field}.facet.offset"] = offset
51
- solr_params[:"f.#{facet_config.field}.facet.sort"] = sort if sort
52
- solr_params[:"f.#{facet_config.field}.facet.prefix"] = prefix if prefix
53
- end
54
-
55
- def add_facet_suggestion_parameters(solr_params)
56
- return if facet.blank? || facet_suggestion_query.blank?
57
-
58
- solr_params[:'facet.contains'] = facet_suggestion_query[0..50]
59
- solr_params[:'facet.contains.ignoreCase'] = true
60
- end
61
- end
62
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Blacklight::FacetSearchBuilder, :api do
4
- subject(:builder) { described_class.new processor_chain, scope }
5
-
6
- let(:processor_chain) { [] }
7
- let(:blacklight_config) { Blacklight::Configuration.new }
8
- let(:scope) { double blacklight_config: blacklight_config, search_state_class: nil }
9
-
10
- describe "#facet_suggestion_query" do
11
- it "is nil if no value is set" do
12
- expect(subject.facet_suggestion_query).to be_nil
13
- end
14
-
15
- it "sets facet_suggestion_query value" do
16
- expect(subject.facet_suggestion_query('antel').facet_suggestion_query).to eq 'antel'
17
- end
18
- end
19
- end