blacklight 7.31.0 → 7.33.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/app/assets/stylesheets/blacklight/_controls.scss +5 -12
- data/app/assets/stylesheets/blacklight/_facets.scss +24 -0
- data/app/assets/stylesheets/blacklight/_header.scss +4 -7
- data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +2 -0
- data/app/components/blacklight/constraint_component.html.erb +1 -1
- data/app/components/blacklight/search_bar_component.html.erb +6 -7
- data/app/components/blacklight/search_bar_component.rb +6 -1
- data/app/components/blacklight/search_button_component.rb +17 -0
- data/app/controllers/concerns/blacklight/bookmarks.rb +3 -5
- data/app/helpers/blacklight/component_helper_behavior.rb +10 -12
- data/app/models/concerns/blacklight/document.rb +7 -0
- data/app/presenters/blacklight/clause_presenter.rb +4 -0
- data/app/presenters/blacklight/document_presenter.rb +5 -0
- data/app/presenters/blacklight/facet_item_presenter.rb +8 -0
- data/app/views/catalog/index.json.jbuilder +2 -0
- data/app/views/catalog/show.json.jbuilder +2 -0
- data/app/views/layouts/blacklight/base.html.erb +5 -2
- data/blacklight.gemspec +1 -1
- data/lib/blacklight/component.rb +20 -0
- data/package.json +1 -2
- data/spec/components/blacklight/search_bar_component_spec.rb +82 -0
- data/spec/controllers/catalog_controller_spec.rb +2 -2
- data/spec/features/bookmarks_spec.rb +9 -0
- data/spec/helpers/catalog_helper_spec.rb +1 -1
- data/spec/models/blacklight/suggest_search_spec.rb +1 -1
- data/spec/models/solr_document_spec.rb +11 -0
- data/spec/presenters/blacklight/document_presenter_spec.rb +6 -0
- data/spec/presenters/blacklight/facet_item_presenter_spec.rb +7 -0
- data/spec/views/catalog/index.json.jbuilder_spec.rb +3 -17
- data/spec/views/catalog/show.json.jbuilder_spec.rb +2 -9
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cddd27d147401ca52ab08c98094933b5327eff0fb3e160eaa960975a9697246f
|
4
|
+
data.tar.gz: f714a77235467a6088f021d4b44e2d1826a407a5cf922eb53d78ac163a470f6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab11dc139997c5398b1c83cc72ddf1142598bf3e50f8bdca34d2e74fb7e9159b209237ad11a60cc23fe8313eab0436f03615e81ae204480a2552173d24b967d8
|
7
|
+
data.tar.gz: 7a1b670887503b620af4b36ce44504c155f494b3d1c1e35ed57d8f90471c7e7aeb1be5fb815d383baf98de89d2924ec481a2ba4c3567b9a0ed222f02a47f5596
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
7.
|
1
|
+
7.33.0
|
@@ -23,19 +23,12 @@
|
|
23
23
|
cursor: pointer;
|
24
24
|
}
|
25
25
|
|
26
|
-
.no-js
|
27
|
-
|
28
|
-
|
26
|
+
.no-js {
|
27
|
+
.btn-group:focus-within {
|
28
|
+
.dropdown-menu {
|
29
|
+
@extend .show;
|
30
|
+
}
|
29
31
|
}
|
30
|
-
.dropdown-menu {
|
31
|
-
background: none;
|
32
|
-
box-shadow: none;
|
33
|
-
border: none;
|
34
|
-
position: relative;
|
35
|
-
display: block;
|
36
|
-
float: none;
|
37
|
-
}
|
38
|
-
|
39
32
|
}
|
40
33
|
|
41
34
|
.view-type {
|
@@ -37,6 +37,30 @@
|
|
37
37
|
}
|
38
38
|
}
|
39
39
|
|
40
|
+
.no-js {
|
41
|
+
@include media-breakpoint-down(lg) {
|
42
|
+
#sidebar {
|
43
|
+
order: 6 !important;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
.facet-content.collapse {
|
48
|
+
display: block;
|
49
|
+
}
|
50
|
+
|
51
|
+
.facet-toggle-handle {
|
52
|
+
display: none;
|
53
|
+
}
|
54
|
+
|
55
|
+
.pivot-facet.collapse {
|
56
|
+
display: block;
|
57
|
+
}
|
58
|
+
|
59
|
+
.facets-collapse.collapse {
|
60
|
+
display: block;
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
40
64
|
.facets-header {
|
41
65
|
display: flex;
|
42
66
|
justify-content: space-between;
|
@@ -12,19 +12,16 @@
|
|
12
12
|
.navbar-logo { /* The main logo image for the Blacklight instance */
|
13
13
|
@if $logo-image {
|
14
14
|
background: transparent $logo-image no-repeat top left;
|
15
|
+
background-size: $logo-width $logo-height;
|
15
16
|
}
|
16
|
-
|
17
17
|
display: inline-block;
|
18
|
-
|
19
|
-
|
20
|
-
margin-right:20px;
|
18
|
+
height: $logo-height;
|
19
|
+
margin-right: 20px;
|
21
20
|
margin-top: -0.4rem;
|
22
21
|
overflow: hidden;
|
23
|
-
padding-left: 0;
|
24
|
-
padding-right: 0;
|
25
22
|
text-indent: 100%;
|
26
23
|
white-space: nowrap;
|
27
|
-
width:
|
24
|
+
width: $logo-width;
|
28
25
|
}
|
29
26
|
|
30
27
|
.navbar-search {
|
@@ -1,6 +1,8 @@
|
|
1
1
|
/* Warning! If you want to change these, just copy them into your own theme css. But you want to remove the !default, which only will set them if not already set. */
|
2
2
|
|
3
3
|
$logo-image: image_url('blacklight/logo.png') !default;
|
4
|
+
$logo-width: 150px !default;
|
5
|
+
$logo-height: 50px !default;
|
4
6
|
|
5
7
|
/* label (field names) */
|
6
8
|
$field_name_color: $text-muted !default;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= render(@layout.new(
|
2
2
|
classes: (Array(@classes) + ["filter-#{@facet_item_presenter.key.parameterize}"]).join(' '),
|
3
3
|
label: @facet_item_presenter.field_label,
|
4
|
-
value: @facet_item_presenter.
|
4
|
+
value: @facet_item_presenter.constraint_label,
|
5
5
|
remove_path: @facet_item_presenter.remove_href)) %>
|
@@ -1,8 +1,11 @@
|
|
1
|
-
<%= form_tag @url, method: @method, class: @classes.join(' '), role: 'search',
|
1
|
+
<%= form_tag @url, method: @method, class: @classes.join(' '), role: 'search', aria: { label: scoped_t('submit') }, **@form_options do %>
|
2
2
|
<%= render_hash_as_hidden_fields(@params) %>
|
3
3
|
<% if search_fields.length > 1 %>
|
4
4
|
<label for="search_field" class="sr-only visually-hidden"><%= scoped_t('search_field.label') %></label>
|
5
5
|
<% end %>
|
6
|
+
<% before_input_groups.each do |input_group| %>
|
7
|
+
<%= input_group %>
|
8
|
+
<% end %>
|
6
9
|
<div class="input-group">
|
7
10
|
<%= prepend %>
|
8
11
|
|
@@ -17,15 +20,11 @@
|
|
17
20
|
<% end %>
|
18
21
|
|
19
22
|
<label for="<%= @prefix %><%= @query_param %>" class="sr-only visually-hidden"><%= scoped_t('search.label') %></label>
|
20
|
-
<%= text_field_tag @query_param, @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", id: "#{@prefix}q", autocomplete: autocomplete_path.present? ? "off" : "", autofocus: @autofocus, data: { autocomplete_enabled: autocomplete_path.present?, autocomplete_path: autocomplete_path } %>
|
23
|
+
<%= text_field_tag @query_param, @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", id: "#{@prefix}q", autocomplete: autocomplete_path.present? ? "off" : "", autofocus: @autofocus, aria: { label: scoped_t('search.label') }, data: { autocomplete_enabled: autocomplete_path.present?, autocomplete_path: autocomplete_path } %>
|
21
24
|
|
22
25
|
<span class="input-group-append">
|
23
26
|
<%= append %>
|
24
|
-
|
25
|
-
<button type="submit" class="btn btn-primary search-btn" id="<%= @prefix %>search">
|
26
|
-
<span class="submit-search-text"><%= scoped_t('submit') %></span>
|
27
|
-
<%= blacklight_icon :search, aria_hidden: true %>
|
28
|
-
</button>
|
27
|
+
<%= search_button || render(Blacklight::SearchButtonComponent.new(id: "#{@prefix}search", text: scoped_t('submit'))) %>
|
29
28
|
</span>
|
30
29
|
</div>
|
31
30
|
<% end %>
|
@@ -6,6 +6,8 @@ module Blacklight
|
|
6
6
|
|
7
7
|
renders_one :append
|
8
8
|
renders_one :prepend
|
9
|
+
renders_one :search_button
|
10
|
+
renders_many :before_input_groups
|
9
11
|
|
10
12
|
# rubocop:disable Metrics/ParameterLists
|
11
13
|
def initialize(
|
@@ -14,7 +16,8 @@ module Blacklight
|
|
14
16
|
classes: ['search-query-form'], prefix: nil,
|
15
17
|
method: 'GET', q: nil, query_param: :q,
|
16
18
|
search_field: nil, search_fields: nil, autocomplete_path: nil,
|
17
|
-
autofocus: nil, i18n: { scope: 'blacklight.search.form' }
|
19
|
+
autofocus: nil, i18n: { scope: 'blacklight.search.form' },
|
20
|
+
form_options: {}
|
18
21
|
)
|
19
22
|
@url = url
|
20
23
|
@advanced_search_url = advanced_search_url
|
@@ -29,6 +32,8 @@ module Blacklight
|
|
29
32
|
@autofocus = autofocus
|
30
33
|
@search_fields = search_fields
|
31
34
|
@i18n = i18n
|
35
|
+
@form_options = form_options
|
36
|
+
|
32
37
|
return if presenter.nil?
|
33
38
|
|
34
39
|
Deprecation.warn(self, 'SearchBarComponent no longer uses a SearchBarPresenter, the presenter: param will be removed in 8.0. ' \
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Blacklight
|
4
|
+
class SearchButtonComponent < ::ViewComponent::Base
|
5
|
+
def initialize(text:, id:)
|
6
|
+
@text = text
|
7
|
+
@id = id
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
tag.button(class: 'btn btn-primary search-btn', type: 'submit', id: @id) do
|
12
|
+
tag.span(@text, class: "submit-search-text") +
|
13
|
+
blacklight_icon(:search, aria_hidden: true)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -58,11 +58,9 @@ module Blacklight::Bookmarks
|
|
58
58
|
create
|
59
59
|
end
|
60
60
|
|
61
|
-
# For adding a single bookmark, suggest use PUT
|
62
|
-
# /bookmarks
|
63
|
-
#
|
64
|
-
# creating multiple bookmarks at once, by posting with keys
|
65
|
-
# such as bookmarks[n][document_id], bookmarks[n][title].
|
61
|
+
# For adding a single bookmark, suggest use PUT to /bookmarks/:document_id instead (triggering the #update method).
|
62
|
+
# This method, accessed via POST to /bookmarks, can be used for creating multiple bookmarks at once, by posting
|
63
|
+
# with keys such as bookmarks[n][document_id], bookmarks[n][title].
|
66
64
|
# It can also be used for creating a single bookmark by including keys
|
67
65
|
# bookmark[title] and bookmark[document_id], but in that case #update
|
68
66
|
# is simpler.
|
@@ -38,28 +38,26 @@ module Blacklight
|
|
38
38
|
# (normally renders next to title in the list view)
|
39
39
|
#
|
40
40
|
# @param [SolrDocument] document
|
41
|
-
# @param [
|
42
|
-
# @
|
41
|
+
# @param [String] wrapping_class ("index-document-functions")
|
42
|
+
# @param [Class] component (Blacklight::Document::ActionsComponent)
|
43
43
|
# @return [String]
|
44
|
-
def render_index_doc_actions(document,
|
45
|
-
actions = filter_partials(blacklight_config.view_config(document_index_view_type).document_actions, { document: document }
|
46
|
-
wrapping_class = options.delete(:wrapping_class) || "index-document-functions"
|
44
|
+
def render_index_doc_actions(document, wrapping_class: "index-document-functions", component: Blacklight::Document::ActionsComponent)
|
45
|
+
actions = filter_partials(blacklight_config.view_config(document_index_view_type).document_actions, { document: document }).map { |_k, v| v }
|
47
46
|
|
48
|
-
render(
|
47
|
+
render(component.new(document: document, actions: actions, classes: wrapping_class))
|
49
48
|
end
|
50
49
|
|
51
50
|
##
|
52
51
|
# Render "collection actions" area for search results view
|
53
52
|
# (normally renders next to pagination at the top of the result set)
|
54
53
|
#
|
55
|
-
# @param [
|
56
|
-
# @
|
54
|
+
# @param [String] wrapping_class ("search-widgets")
|
55
|
+
# @param [Class] component (Blacklight::Document::ActionsComponent)
|
57
56
|
# @return [String]
|
58
|
-
def render_results_collection_tools(
|
59
|
-
actions = filter_partials(blacklight_config.view_config(document_index_view_type).collection_actions,
|
60
|
-
wrapping_class = options.delete(:wrapping_class) || "search-widgets"
|
57
|
+
def render_results_collection_tools(wrapping_class: "search-widgets", component: Blacklight::Document::ActionsComponent)
|
58
|
+
actions = filter_partials(blacklight_config.view_config(document_index_view_type).collection_actions, {}).map { |_k, v| v }
|
61
59
|
|
62
|
-
render(
|
60
|
+
render(component.new(actions: actions, classes: wrapping_class))
|
63
61
|
end
|
64
62
|
|
65
63
|
##
|
@@ -26,6 +26,8 @@ module Blacklight::Document
|
|
26
26
|
extend ActiveModel::Naming
|
27
27
|
include Blacklight::Document::Extensions
|
28
28
|
include GlobalID::Identification
|
29
|
+
|
30
|
+
class_attribute :inspector_fields, default: [:_source]
|
29
31
|
end
|
30
32
|
|
31
33
|
attr_reader :response, :_source
|
@@ -82,6 +84,11 @@ module Blacklight::Document
|
|
82
84
|
Array(self[key]).first
|
83
85
|
end
|
84
86
|
|
87
|
+
def inspect
|
88
|
+
fields = inspector_fields.map { |field| "#{field}: #{public_send(field)}" }.join(", ")
|
89
|
+
"#<#{self.class.name}:#{object_id} #{fields}>"
|
90
|
+
end
|
91
|
+
|
85
92
|
def to_partial_path
|
86
93
|
'catalog/document'
|
87
94
|
end
|
@@ -66,6 +66,14 @@ module Blacklight
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
# Get the displayable version of the facet's value for use
|
70
|
+
# in e.g. the constraints widget
|
71
|
+
#
|
72
|
+
# @return [String]
|
73
|
+
def constraint_label
|
74
|
+
label
|
75
|
+
end
|
76
|
+
|
69
77
|
def value
|
70
78
|
if facet_item.respond_to? :value
|
71
79
|
facet_item.value
|
@@ -17,6 +17,8 @@ json.data do
|
|
17
17
|
json.id document.id
|
18
18
|
json.type doc_presenter.display_type.first
|
19
19
|
json.attributes do
|
20
|
+
json.title doc_presenter.heading unless doc_presenter.fields_to_render.any? { |field_name, _field, _field_presenter| field_name.to_s == 'title' }
|
21
|
+
|
20
22
|
doc_presenter.fields_to_render.each do |field_name, field, field_presenter|
|
21
23
|
json.partial! 'field', field: field,
|
22
24
|
field_name: field_name,
|
@@ -11,6 +11,8 @@ json.data do
|
|
11
11
|
json.id @document.id
|
12
12
|
json.type doc_presenter.display_type.first
|
13
13
|
json.attributes do
|
14
|
+
json.title doc_presenter.heading unless doc_presenter.fields_to_render.any? { |field_name, _field, _field_presenter| field_name.to_s == 'title' }
|
15
|
+
|
14
16
|
doc_presenter.fields_to_render.each do |field_name, field, field_presenter|
|
15
17
|
json.partial! 'field', field: field,
|
16
18
|
field_name: field_name,
|
@@ -9,10 +9,13 @@
|
|
9
9
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
10
10
|
|
11
11
|
<title><%= render_page_title %></title>
|
12
|
+
<script>
|
13
|
+
document.querySelector('html').classList.remove('no-js');
|
14
|
+
</script>
|
12
15
|
<%= opensearch_description_tag application_name, opensearch_catalog_url(format: 'xml') %>
|
13
16
|
<%= favicon_link_tag %>
|
14
|
-
<%= stylesheet_link_tag "application", media: "all" %>
|
15
|
-
<%= javascript_include_tag "application" %>
|
17
|
+
<%= stylesheet_link_tag "application", media: "all", "data-turbo-track": "reload" %>
|
18
|
+
<%= javascript_include_tag "application", "data-turbo-track": "reload" %>
|
16
19
|
|
17
20
|
<%= csrf_meta_tags %>
|
18
21
|
<%= content_for(:head) %>
|
data/blacklight.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
s.add_dependency "deprecation"
|
33
33
|
s.add_dependency "i18n", '>= 1.7.0' # added named parameters
|
34
34
|
s.add_dependency "ostruct", '>= 0.3.2'
|
35
|
-
s.add_dependency "view_component", '~> 2.
|
35
|
+
s.add_dependency "view_component", '~> 2.66'
|
36
36
|
s.add_dependency 'hashdiff'
|
37
37
|
|
38
38
|
s.add_development_dependency "rsolr", ">= 1.0.6", "< 3" # Library for interacting with rSolr.
|
data/lib/blacklight/component.rb
CHANGED
@@ -3,6 +3,11 @@
|
|
3
3
|
module Blacklight
|
4
4
|
class Component < ViewComponent::Base
|
5
5
|
class << self
|
6
|
+
# Workaround for https://github.com/ViewComponent/view_component/issues/1565
|
7
|
+
def config
|
8
|
+
@config ||= ViewComponent::Config.defaults.merge(ViewComponent::Base.config)
|
9
|
+
end
|
10
|
+
|
6
11
|
# rubocop:disable Naming/MemoizedInstanceVariableName
|
7
12
|
def compiler
|
8
13
|
@__vc_compiler ||= EngineCompiler.new(self)
|
@@ -12,6 +17,21 @@ module Blacklight
|
|
12
17
|
alias sidecar_files _sidecar_files unless ViewComponent::Base.respond_to? :sidecar_files
|
13
18
|
end
|
14
19
|
|
20
|
+
EXCLUDE_VARIABLES = [
|
21
|
+
:@lookup_context, :@view_renderer, :@view_flow, :@view_context,
|
22
|
+
:@tag_builder, :@current_template,
|
23
|
+
:@__vc_set_slots, :@__vc_original_view_context,
|
24
|
+
:@__vc_variant, :@__vc_content_evaluated,
|
25
|
+
:@__vc_render_in_block, :@__vc_content, :@__vc_helpers
|
26
|
+
].freeze
|
27
|
+
|
28
|
+
def inspect
|
29
|
+
# Exclude variables added by render_in
|
30
|
+
render_variables = instance_variables - EXCLUDE_VARIABLES
|
31
|
+
fields = render_variables.map { |ivar| "#{ivar}:#{instance_variable_get(ivar).inspect}" }.join(', ')
|
32
|
+
"#<#{self.class.name}:#{object_id} #{fields}>"
|
33
|
+
end
|
34
|
+
|
15
35
|
class EngineCompiler < ::ViewComponent::Compiler
|
16
36
|
# ViewComponent::Compiler locates and caches templates from sidecar files to the component source file.
|
17
37
|
# While this is sensible in a Rails application, it prevents component templates defined in an Engine
|
data/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "blacklight-frontend",
|
3
|
-
"version": "7.
|
3
|
+
"version": "7.32.0",
|
4
4
|
"description": "[![Build Status](https://travis-ci.com/projectblacklight/blacklight.png?branch=main)](https://travis-ci.com/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=main)](https://coveralls.io/github/projectblacklight/blacklight?branch=main)",
|
5
5
|
"main": "app/assets/javascripts/blacklight",
|
6
6
|
"scripts": {
|
@@ -28,7 +28,6 @@
|
|
28
28
|
},
|
29
29
|
"browserslist": "> 0.25%, not dead",
|
30
30
|
"dependencies": {
|
31
|
-
"bloodhound-js": "^1.2.3",
|
32
31
|
"bootstrap": ">=4.3.1 <6.0.0",
|
33
32
|
"jquery": "^3.5.1",
|
34
33
|
"typeahead.js": "^0.11.1"
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Blacklight::SearchBarComponent, type: :component do
|
6
|
+
let(:instance) { described_class.new(url: search_action_url, params: params_for_search) }
|
7
|
+
|
8
|
+
let(:search_action_url) { '/catalog' }
|
9
|
+
let(:params_for_search) { { q: 'testParamValue' } }
|
10
|
+
let(:blacklight_config) do
|
11
|
+
Blacklight::Configuration.new.configure do |config|
|
12
|
+
config.view = { list: nil, abc: nil }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
before do
|
17
|
+
allow(controller).to receive(:blacklight_config).and_return(blacklight_config)
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with the default button' do
|
21
|
+
subject(:render) { render_inline(instance) }
|
22
|
+
|
23
|
+
it 'renders the search field and a button' do
|
24
|
+
expect(render.css("input[aria-label='#{I18n.t('blacklight.search.form.search.label')}']")).to be_present
|
25
|
+
expect(render.css("button#search")).to be_present
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when a button is passed in' do
|
30
|
+
subject(:render) do
|
31
|
+
render_inline(instance) do |c|
|
32
|
+
c.search_button do
|
33
|
+
controller.view_context.tag.button "hello", id: 'custom_search'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'renders the search field and a button' do
|
39
|
+
expect(render.css("input[aria-label='#{I18n.t('blacklight.search.form.search.label')}']")).to be_present
|
40
|
+
expect(render.css("button#search")).not_to be_present
|
41
|
+
expect(render.css("button#custom_search")).to be_present
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with prepend' do
|
46
|
+
subject(:render) do
|
47
|
+
render_inline(instance) do |c|
|
48
|
+
c.with_prepend { 'stuff before' }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'renders the prepended value' do
|
53
|
+
expect(render.to_html).to include 'stuff before'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with append' do
|
58
|
+
subject(:render) do
|
59
|
+
render_inline(instance) do |c|
|
60
|
+
c.with_append { 'stuff after' }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'renders the appended value' do
|
65
|
+
expect(render.to_html).to include 'stuff after'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'with extra inputs' do
|
70
|
+
subject(:render) do
|
71
|
+
render_inline(instance) do |c|
|
72
|
+
c.with_before_input_group { controller.view_context.tag.input name: 'foo' }
|
73
|
+
c.with_before_input_group { controller.view_context.tag.input name: 'bar' }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'renders the extra inputs' do
|
78
|
+
expect(render.css("input[name='foo']")).to be_present
|
79
|
+
expect(render.css("input[name='bar']")).to be_present
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -151,7 +151,7 @@ RSpec.describe CatalogController, api: true do
|
|
151
151
|
it "gets the documents" do
|
152
152
|
expect(docs).to have(10).documents
|
153
153
|
expect(docs.first['attributes'].keys).to match_array(
|
154
|
-
%w[author_tsim format language_ssim lc_callnum_ssim published_ssim title_tsim]
|
154
|
+
%w[author_tsim format language_ssim lc_callnum_ssim published_ssim title title_tsim]
|
155
155
|
)
|
156
156
|
expect(docs.first['links']['self']).to eq solr_document_url(id: docs.first['id'])
|
157
157
|
end
|
@@ -327,7 +327,7 @@ RSpec.describe CatalogController, api: true do
|
|
327
327
|
json = JSON.parse response.body
|
328
328
|
expect(json["data"]["attributes"].keys).to match_array(
|
329
329
|
%w[author_tsim format isbn_ssim language_ssim lc_callnum_ssim
|
330
|
-
published_ssim subtitle_tsim title_tsim url_suppl_ssim]
|
330
|
+
published_ssim subtitle_tsim title title_tsim url_suppl_ssim]
|
331
331
|
)
|
332
332
|
end
|
333
333
|
end
|
@@ -40,6 +40,15 @@ RSpec.describe "Bookmarks" do
|
|
40
40
|
expect(page).to have_content 'Successfully removed bookmark.'
|
41
41
|
end
|
42
42
|
|
43
|
+
it 'shows bookmarks as checkboxes', js: true do
|
44
|
+
visit solr_document_path('2007020969')
|
45
|
+
check 'Bookmark'
|
46
|
+
|
47
|
+
visit solr_document_path('2007020969')
|
48
|
+
expect(page).to have_css('input[type="checkbox"]:checked')
|
49
|
+
uncheck 'In Bookmarks'
|
50
|
+
end
|
51
|
+
|
43
52
|
it "adds bookmarks after a user logs in" do
|
44
53
|
visit solr_document_path('2007020969')
|
45
54
|
click_button 'Bookmark'
|
@@ -243,7 +243,7 @@ RSpec.describe CatalogHelper do
|
|
243
243
|
end
|
244
244
|
|
245
245
|
it "calls thumbnail presenter with provided values" do
|
246
|
-
expect(thumbnail_presenter).to receive(:thumbnail_tag).with({}, suppress_link: true)
|
246
|
+
expect(thumbnail_presenter).to receive(:thumbnail_tag).with({}, { suppress_link: true })
|
247
247
|
helper.render_thumbnail_tag document, {}, suppress_link: true
|
248
248
|
end
|
249
249
|
end
|
@@ -8,7 +8,7 @@ RSpec.describe Blacklight::SuggestSearch, api: true do
|
|
8
8
|
|
9
9
|
describe '#suggestions' do
|
10
10
|
it 'delegates to the repository' do
|
11
|
-
expect(repository).to receive(:suggestions).with(q: 'test').and_return(response)
|
11
|
+
expect(repository).to receive(:suggestions).with({ q: 'test' }).and_return(response)
|
12
12
|
expect(suggest_search.suggestions).to eq response
|
13
13
|
end
|
14
14
|
end
|
@@ -29,6 +29,17 @@ RSpec.describe SolrDocument, api: true do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
describe '.inspect' do
|
33
|
+
subject(:inspect) { document.inspect }
|
34
|
+
|
35
|
+
let(:document) do
|
36
|
+
described_class.new(id: '123',
|
37
|
+
title_tesim: ['Good Omens'])
|
38
|
+
end
|
39
|
+
|
40
|
+
it { is_expected.to end_with "_source: {\"id\"=>\"123\", \"title_tesim\"=>[\"Good Omens\"]}>" }
|
41
|
+
end
|
42
|
+
|
32
43
|
describe '.attribute' do
|
33
44
|
subject(:title) { document.title }
|
34
45
|
|
@@ -60,4 +60,10 @@ RSpec.describe Blacklight::DocumentPresenter do
|
|
60
60
|
expect(presenter.thumbnail).to be_a_kind_of custom_presenter_class
|
61
61
|
end
|
62
62
|
end
|
63
|
+
|
64
|
+
describe '#inspect' do
|
65
|
+
subject(:inspect) { presenter.inspect }
|
66
|
+
|
67
|
+
it { is_expected.to start_with '#<Blacklight::DocumentPresenter:' }
|
68
|
+
end
|
63
69
|
end
|
@@ -55,6 +55,13 @@ RSpec.describe Blacklight::FacetItemPresenter, type: :presenter do
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
+
describe '#constraint_label' do
|
59
|
+
it 'provides the label for the constraint' do
|
60
|
+
allow(facet_config).to receive_messages(query: nil, date: nil, helper_method: nil, url_method: nil)
|
61
|
+
expect(presenter.constraint_label).to eq presenter.label
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
58
65
|
describe '#href' do
|
59
66
|
before do
|
60
67
|
allow(search_state).to receive(:has_facet?).and_return(false)
|
@@ -10,7 +10,7 @@ RSpec.describe "catalog/index.json", api: true do
|
|
10
10
|
end
|
11
11
|
let(:config) do
|
12
12
|
Blacklight::Configuration.new do |config|
|
13
|
-
config.
|
13
|
+
config.index.title_field = 'title_tsim'
|
14
14
|
config.add_facet_field :format
|
15
15
|
end
|
16
16
|
end
|
@@ -66,14 +66,7 @@ RSpec.describe "catalog/index.json", api: true do
|
|
66
66
|
id: '123',
|
67
67
|
type: 'Book',
|
68
68
|
attributes: {
|
69
|
-
|
70
|
-
id: 'http://test.host/catalog/123#title',
|
71
|
-
type: 'document_value',
|
72
|
-
attributes: {
|
73
|
-
value: 'Book1',
|
74
|
-
label: 'Title'
|
75
|
-
}
|
76
|
-
}
|
69
|
+
title: 'Book1'
|
77
70
|
},
|
78
71
|
links: { self: 'http://test.host/catalog/123' }
|
79
72
|
},
|
@@ -81,14 +74,7 @@ RSpec.describe "catalog/index.json", api: true do
|
|
81
74
|
id: '456',
|
82
75
|
type: 'Article',
|
83
76
|
attributes: {
|
84
|
-
|
85
|
-
id: 'http://test.host/catalog/456#title',
|
86
|
-
type: 'document_value',
|
87
|
-
attributes: {
|
88
|
-
value: 'Article1',
|
89
|
-
label: 'Title'
|
90
|
-
}
|
91
|
-
}
|
77
|
+
title: 'Article1'
|
92
78
|
},
|
93
79
|
links: { self: 'http://test.host/catalog/456' }
|
94
80
|
}
|
@@ -6,7 +6,7 @@ RSpec.describe "catalog/show.json" do
|
|
6
6
|
end
|
7
7
|
let(:config) do
|
8
8
|
Blacklight::Configuration.new do |config|
|
9
|
-
config.
|
9
|
+
config.show.title_field = 'title_tsim'
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -27,14 +27,7 @@ RSpec.describe "catalog/show.json" do
|
|
27
27
|
id: '123',
|
28
28
|
type: 'Book',
|
29
29
|
attributes: {
|
30
|
-
'title' =>
|
31
|
-
id: 'http://test.host/catalog/123#title',
|
32
|
-
type: 'document_value',
|
33
|
-
attributes: {
|
34
|
-
value: 'Book1',
|
35
|
-
label: 'Title'
|
36
|
-
}
|
37
|
-
}
|
30
|
+
'title' => 'Book1'
|
38
31
|
}
|
39
32
|
})
|
40
33
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blacklight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.33.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Rochkind
|
@@ -17,7 +17,7 @@ authors:
|
|
17
17
|
autorequire:
|
18
18
|
bindir: exe
|
19
19
|
cert_chain: []
|
20
|
-
date: 2022-
|
20
|
+
date: 2022-12-12 00:00:00.000000000 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: rails
|
@@ -129,14 +129,14 @@ dependencies:
|
|
129
129
|
requirements:
|
130
130
|
- - "~>"
|
131
131
|
- !ruby/object:Gem::Version
|
132
|
-
version: '2.
|
132
|
+
version: '2.66'
|
133
133
|
type: :runtime
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
137
|
- - "~>"
|
138
138
|
- !ruby/object:Gem::Version
|
139
|
-
version: '2.
|
139
|
+
version: '2.66'
|
140
140
|
- !ruby/object:Gem::Dependency
|
141
141
|
name: hashdiff
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -489,6 +489,7 @@ files:
|
|
489
489
|
- app/components/blacklight/response/view_type_component.rb
|
490
490
|
- app/components/blacklight/search_bar_component.html.erb
|
491
491
|
- app/components/blacklight/search_bar_component.rb
|
492
|
+
- app/components/blacklight/search_button_component.rb
|
492
493
|
- app/components/blacklight/search_context_component.html.erb
|
493
494
|
- app/components/blacklight/search_context_component.rb
|
494
495
|
- app/components/blacklight/search_history_constraint_layout_component.rb
|
@@ -792,6 +793,7 @@ files:
|
|
792
793
|
- spec/components/blacklight/hidden_search_state_component_spec.rb
|
793
794
|
- spec/components/blacklight/metadata_field_component_spec.rb
|
794
795
|
- spec/components/blacklight/response/spellcheck_component_spec.rb
|
796
|
+
- spec/components/blacklight/search_bar_component_spec.rb
|
795
797
|
- spec/components/blacklight/start_over_button_component_spec.rb
|
796
798
|
- spec/components/blacklight/system/flash_message_component_spec.rb
|
797
799
|
- spec/controllers/alternate_controller_spec.rb
|
@@ -952,7 +954,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
952
954
|
- !ruby/object:Gem::Version
|
953
955
|
version: '0'
|
954
956
|
requirements: []
|
955
|
-
rubygems_version: 3.
|
957
|
+
rubygems_version: 3.3.7
|
956
958
|
signing_key:
|
957
959
|
specification_version: 4
|
958
960
|
summary: Blacklight provides a discovery interface for any Solr (http://lucene.apache.org/solr)
|
@@ -973,6 +975,7 @@ test_files:
|
|
973
975
|
- spec/components/blacklight/hidden_search_state_component_spec.rb
|
974
976
|
- spec/components/blacklight/metadata_field_component_spec.rb
|
975
977
|
- spec/components/blacklight/response/spellcheck_component_spec.rb
|
978
|
+
- spec/components/blacklight/search_bar_component_spec.rb
|
976
979
|
- spec/components/blacklight/start_over_button_component_spec.rb
|
977
980
|
- spec/components/blacklight/system/flash_message_component_spec.rb
|
978
981
|
- spec/controllers/alternate_controller_spec.rb
|