blacklight 8.11.0 → 9.0.0.beta2
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.
- checksums.yaml +4 -4
- data/.env +3 -3
- data/.github/matrix.json +11 -42
- data/.github/pull_request_template.md +7 -0
- data/.github/workflows/main.yml +0 -2
- data/.github/workflows/release_7_x_scheduled.yml +39 -0
- data/.github/workflows/release_8_x_scheduled.yml +39 -0
- data/.github/workflows/test.yml +0 -5
- data/.rubocop.yml +71 -3
- data/.rubocop_todo.yml +43 -76
- data/.solr_wrapper.yml +2 -0
- data/README.md +30 -8
- data/VERSION +1 -1
- data/app/assets/builds/blacklight.css +452 -0
- data/app/assets/javascripts/blacklight/blacklight.esm.js +6 -76
- data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
- data/app/assets/javascripts/blacklight/blacklight.js +6 -76
- data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
- data/app/assets/stylesheets/blacklight/_balanced_list.scss +1 -4
- data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -3
- data/app/assets/stylesheets/blacklight/_bookmark.scss +44 -41
- data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +0 -25
- data/app/assets/stylesheets/blacklight/_constraints.scss +15 -24
- data/app/assets/stylesheets/blacklight/_controls.scss +2 -18
- data/app/assets/stylesheets/blacklight/_facets.scss +17 -84
- data/app/assets/stylesheets/blacklight/_group.scss +2 -5
- data/app/assets/stylesheets/blacklight/_header.scss +8 -11
- data/app/assets/stylesheets/blacklight/_icons.scss +0 -8
- data/app/assets/stylesheets/blacklight/_modal.scss +1 -1
- data/app/assets/stylesheets/blacklight/_pagination.scss +0 -4
- data/app/assets/stylesheets/blacklight/_search_form.scss +0 -1
- data/app/assets/stylesheets/blacklight/_search_history.scss +0 -8
- data/app/assets/stylesheets/blacklight/_search_results.scss +1 -15
- data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +9 -14
- data/app/assets/stylesheets/blacklight/build.scss +4 -0
- data/app/components/blacklight/advanced_search_form_component.rb +3 -3
- data/app/components/blacklight/constraint_component.rb +1 -1
- data/app/components/blacklight/constraint_layout_component.html.erb +2 -2
- data/app/components/blacklight/constraints_component.html.erb +2 -2
- data/app/components/blacklight/constraints_component.rb +3 -3
- data/app/components/blacklight/document/bookmark_component.html.erb +3 -3
- data/app/components/blacklight/document/bookmark_component.rb +2 -2
- data/app/components/blacklight/document/group_component.html.erb +1 -1
- data/app/components/blacklight/document/more_like_this_component.rb +2 -2
- data/app/components/blacklight/document/page_header_component.rb +1 -1
- data/app/components/blacklight/document/sidebar_component.rb +5 -5
- data/app/components/blacklight/document/thumbnail_component.html.erb +3 -7
- data/app/components/blacklight/document/thumbnail_component.rb +7 -6
- data/app/components/blacklight/document_component.rb +12 -16
- data/app/components/blacklight/document_title_component.rb +5 -11
- data/app/components/blacklight/facet_field_checkboxes_component.rb +2 -20
- data/app/components/blacklight/facet_field_component.rb +2 -17
- data/app/components/blacklight/facet_field_filter_component.rb +2 -21
- data/app/components/blacklight/facet_field_inclusive_constraint_component.rb +4 -25
- data/app/components/blacklight/facet_field_list_component.rb +2 -50
- data/app/components/blacklight/facet_field_no_layout_component.rb +2 -10
- data/app/components/blacklight/facet_item_component.rb +2 -74
- data/app/components/blacklight/facet_item_pivot_component.rb +3 -3
- data/app/components/blacklight/facets/checkboxes_component.rb +26 -0
- data/app/components/blacklight/facets/count_component.rb +23 -0
- data/app/components/blacklight/{facet_field_component.html.erb → facets/field_component.html.erb} +4 -4
- data/app/components/blacklight/facets/field_component.rb +23 -0
- data/app/components/blacklight/facets/filters_component.html.erb +4 -0
- data/app/components/blacklight/facets/filters_component.rb +27 -0
- data/app/components/blacklight/{facet_field_inclusive_constraint_component.html.erb → facets/inclusive_constraint_component.html.erb} +1 -1
- data/app/components/blacklight/facets/inclusive_constraint_component.rb +31 -0
- data/app/components/blacklight/{facet_field_filter_component.html.erb → facets/index_navigation_component.html.erb} +1 -1
- data/app/components/blacklight/facets/index_navigation_component.rb +32 -0
- data/app/components/blacklight/facets/item_component.rb +73 -0
- data/app/components/blacklight/facets/list_component.html.erb +11 -0
- data/app/components/blacklight/facets/list_component.rb +38 -0
- data/app/components/blacklight/facets/no_layout_component.rb +16 -0
- data/app/components/blacklight/facets/selected_value_component.rb +29 -0
- data/app/components/blacklight/facets/suggest_component.html.erb +12 -0
- data/app/components/blacklight/facets/suggest_component.rb +22 -0
- data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +2 -2
- data/app/components/blacklight/response/facet_group_component.html.erb +3 -18
- data/app/components/blacklight/response/facet_group_component.rb +11 -23
- data/app/components/blacklight/response/facet_toggle_button_component.html.erb +16 -0
- data/app/components/blacklight/response/facet_toggle_button_component.rb +14 -0
- data/app/components/blacklight/response/pagination_component.html.erb +1 -1
- data/app/components/blacklight/response/pagination_component.rb +2 -1
- data/app/components/blacklight/response/sort_component.rb +1 -0
- data/app/components/blacklight/response/view_type_button_component.html.erb +1 -1
- data/app/components/blacklight/response/view_type_component.html.erb +1 -1
- data/app/components/blacklight/search/per_page_component.html.erb +1 -1
- data/app/components/blacklight/search/per_page_component.rb +1 -0
- data/app/components/blacklight/search/sidebar_component.html.erb +1 -1
- data/app/components/blacklight/search/sidebar_component.rb +1 -1
- data/app/components/blacklight/search_bar_component.html.erb +3 -3
- data/app/components/blacklight/search_bar_component.rb +2 -2
- data/app/components/blacklight/search_button_component.rb +2 -2
- data/app/components/blacklight/search_context/server_applied_params_component.html.erb +2 -2
- data/app/components/blacklight/search_context/server_applied_params_component.rb +9 -0
- data/app/components/blacklight/skip_link_component.html.erb +1 -1
- data/app/components/blacklight/skip_link_component.rb +2 -1
- data/app/components/blacklight/top_navbar_component.html.erb +2 -2
- data/app/controllers/concerns/blacklight/bookmarks.rb +3 -3
- data/app/controllers/concerns/blacklight/catalog.rb +9 -23
- data/app/controllers/concerns/blacklight/controller.rb +1 -1
- data/app/controllers/concerns/blacklight/facetable.rb +34 -0
- data/app/controllers/concerns/blacklight/search_context.rb +0 -12
- data/app/controllers/concerns/blacklight/searchable.rb +1 -1
- data/app/helpers/blacklight/blacklight_helper_behavior.rb +0 -6
- data/app/helpers/blacklight/catalog_helper_behavior.rb +0 -10
- data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -14
- data/app/helpers/blacklight/document_helper_behavior.rb +3 -27
- data/app/helpers/blacklight/facets_helper_behavior.rb +9 -0
- data/app/helpers/blacklight/icon_helper_behavior.rb +3 -11
- data/app/helpers/blacklight/layout_helper_behavior.rb +2 -2
- data/app/helpers/blacklight/render_partials_helper_behavior.rb +0 -14
- data/app/helpers/blacklight/url_helper_behavior.rb +1 -1
- data/app/javascript/{blacklight → blacklight-frontend}/bookmark_toggle.js +1 -1
- data/app/javascript/{blacklight → blacklight-frontend}/checkbox_submit.js +3 -0
- data/app/javascript/{blacklight → blacklight-frontend}/core.js +2 -10
- data/app/javascript/{blacklight → blacklight-frontend}/facet_suggest.js +1 -3
- data/app/javascript/blacklight-frontend/index.js +16 -0
- data/app/javascript/{blacklight → blacklight-frontend}/modal.js +1 -5
- data/app/models/concerns/blacklight/document.rb +0 -11
- data/app/models/concerns/blacklight/user.rb +1 -1
- data/app/models/facet_search_builder.rb +5 -0
- data/app/presenters/blacklight/facet_field_presenter.rb +3 -3
- data/app/presenters/blacklight/rendering/helper_method.rb +4 -4
- data/app/presenters/blacklight/rendering/join.rb +2 -2
- data/app/services/blacklight/facet_search_service.rb +44 -0
- data/app/services/blacklight/field_retriever.rb +1 -1
- data/app/services/blacklight/search_params_yaml_coder.rb +0 -2
- data/app/services/blacklight/search_service.rb +6 -6
- data/app/values/blacklight/types.rb +2 -2
- data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +0 -2
- data/app/views/bookmarks/index.html.erb +1 -1
- data/app/views/catalog/_facet_pivot.html.erb +1 -1
- data/app/views/catalog/_home_text.html.erb +2 -2
- data/app/views/catalog/_results_pagination.html.erb +2 -5
- data/app/views/catalog/_search_results.html.erb +3 -3
- data/app/views/catalog/_search_results_header.html.erb +1 -1
- data/app/views/catalog/_sort_and_per_page.html.erb +1 -1
- data/app/views/catalog/_sort_widget.html.erb +1 -0
- data/app/views/catalog/facet.html.erb +4 -6
- data/app/views/catalog/show.html.erb +2 -3
- data/app/views/kaminari/blacklight/_paginator.html.erb +1 -2
- data/app/views/layouts/blacklight/base.html.erb +3 -7
- data/app/views/search_history/index.html.erb +0 -2
- data/blacklight.gemspec +4 -4
- data/config/importmap.rb +1 -1
- data/config/locales/blacklight.ar.yml +2 -2
- data/config/locales/blacklight.ca.yml +124 -124
- data/config/locales/blacklight.de.yml +2 -2
- data/config/locales/blacklight.en.yml +14 -14
- data/config/locales/blacklight.es.yml +2 -2
- data/config/locales/blacklight.fr.yml +2 -2
- data/config/locales/blacklight.hu.yml +2 -2
- data/config/locales/blacklight.it.yml +1 -1
- data/config/locales/blacklight.nl.yml +2 -2
- data/config/locales/blacklight.pt-BR.yml +1 -1
- data/config/locales/blacklight.sq.yml +2 -2
- data/config/locales/blacklight.zh.yml +2 -2
- data/lib/blacklight/abstract_repository.rb +2 -2
- data/lib/blacklight/abstract_search_builder.rb +154 -0
- data/lib/blacklight/configuration/context.rb +3 -3
- data/lib/blacklight/configuration/display_field.rb +1 -1
- data/lib/blacklight/configuration/facet_field.rb +6 -6
- data/lib/blacklight/configuration/field.rb +4 -4
- data/lib/blacklight/configuration/fields.rb +3 -4
- data/lib/blacklight/configuration/search_field.rb +1 -1
- data/lib/blacklight/configuration/view_config.rb +2 -4
- data/lib/blacklight/configuration.rb +11 -18
- data/lib/blacklight/engine.rb +0 -6
- data/lib/blacklight/facet_search_builder.rb +18 -0
- data/lib/blacklight/nested_open_struct_with_hash_access.rb +1 -1
- data/lib/blacklight/open_struct_with_hash_access.rb +5 -5
- data/lib/blacklight/search_builder.rb +1 -159
- data/lib/blacklight/search_state/filter_field.rb +2 -2
- data/lib/blacklight/search_state/pivot_filter_field.rb +4 -4
- data/lib/blacklight/solr/abstract_filter_query_builder.rb +77 -0
- data/lib/blacklight/solr/default_filter_query_builder.rb +20 -0
- data/lib/blacklight/solr/facet_search_builder_behavior.rb +62 -0
- data/lib/blacklight/solr/repository.rb +8 -9
- data/lib/blacklight/solr/request.rb +1 -7
- data/lib/blacklight/solr/response/facets.rb +2 -2
- data/lib/blacklight/solr/response/group_response.rb +2 -2
- data/lib/blacklight/solr/response/params.rb +0 -4
- data/lib/blacklight/solr/response.rb +5 -1
- data/lib/blacklight/solr/search_builder_behavior.rb +17 -132
- data/lib/blacklight.rb +2 -2
- data/lib/generators/blacklight/assets/importmap_generator.rb +6 -24
- data/lib/generators/blacklight/assets/propshaft_generator.rb +1 -1
- data/lib/generators/blacklight/assets_generator.rb +3 -3
- data/lib/generators/blacklight/controller_generator.rb +3 -3
- data/lib/generators/blacklight/search_builder_generator.rb +1 -1
- data/lib/generators/blacklight/templates/.solr_wrapper.yml +2 -0
- data/lib/generators/blacklight/templates/catalog_controller.rb +3 -1
- data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +0 -4
- data/lib/generators/blacklight/user_generator.rb +9 -10
- data/package.json +15 -5
- data/rollup.config.js +1 -1
- data/spec/components/blacklight/advanced_search_form_component_spec.rb +18 -22
- data/spec/components/blacklight/constraint_layout_component_spec.rb +8 -8
- data/spec/components/blacklight/constraints_component_spec.rb +11 -11
- data/spec/components/blacklight/document/action_component_spec.rb +21 -17
- data/spec/components/blacklight/document/group_component_spec.rb +10 -15
- data/spec/components/blacklight/document/page_header_component_spec.rb +35 -28
- data/spec/components/blacklight/document/sidebar_component_spec.rb +9 -30
- data/spec/components/blacklight/document_component_spec.rb +98 -65
- data/spec/components/blacklight/facet_component_spec.rb +12 -8
- data/spec/components/blacklight/facet_item_pivot_component_spec.rb +12 -12
- data/spec/components/blacklight/{facet_field_checkboxes_component_spec.rb → facets/checkboxes_component_spec.rb} +14 -14
- data/spec/components/blacklight/facets/filters_component_spec.rb +36 -0
- data/spec/components/blacklight/facets/index_navigation_component_spec.rb +40 -0
- data/spec/components/blacklight/{facet_item_component_spec.rb → facets/item_component_spec.rb} +10 -10
- data/spec/components/blacklight/{facet_field_list_component_spec.rb → facets/list_component_spec.rb} +24 -24
- data/spec/components/blacklight/facets/suggest_component_spec.rb +68 -0
- data/spec/components/blacklight/header_component_spec.rb +2 -4
- data/spec/components/blacklight/hidden_search_state_component_spec.rb +7 -7
- data/spec/components/blacklight/metadata_field_component_spec.rb +17 -15
- data/spec/components/blacklight/response/facet_group_component_spec.rb +37 -0
- data/spec/components/blacklight/response/pagination_component_spec.rb +1 -1
- data/spec/components/blacklight/response/spellcheck_component_spec.rb +1 -1
- data/spec/components/blacklight/search_bar_component_spec.rb +5 -5
- data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +2 -2
- data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +3 -5
- data/spec/components/blacklight/skip_link_component_spec.rb +8 -11
- data/spec/components/blacklight/start_over_button_component_spec.rb +4 -4
- data/spec/components/blacklight/system/flash_message_component_spec.rb +7 -11
- data/spec/controllers/catalog_controller_spec.rb +11 -19
- data/spec/features/axe_spec.rb +6 -11
- data/spec/features/bookmarks_spec.rb +48 -11
- data/spec/features/facets_spec.rb +58 -63
- data/spec/features/search_context_spec.rb +1 -2
- data/spec/features/search_filters_spec.rb +6 -6
- data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +0 -9
- data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +10 -0
- data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +1 -1
- data/spec/lib/blacklight/configuration/facet_field_spec.rb +2 -2
- data/spec/models/blacklight/configuration_spec.rb +32 -28
- data/spec/models/blacklight/facet_search_builder_spec.rb +19 -0
- data/spec/models/blacklight/search_builder_spec.rb +1 -11
- data/spec/models/blacklight/solr/default_filter_query_builder_spec.rb +72 -0
- data/spec/models/blacklight/solr/document_spec.rb +0 -4
- data/spec/models/blacklight/solr/facet_search_builder_behavior_spec.rb +929 -0
- data/spec/models/blacklight/solr/repository_spec.rb +31 -29
- data/spec/models/blacklight/solr/request_spec.rb +7 -0
- data/spec/models/blacklight/solr/response/facets_spec.rb +86 -40
- data/spec/models/blacklight/solr/response/group_response_spec.rb +8 -5
- data/spec/models/blacklight/solr/response/group_spec.rb +9 -5
- data/spec/models/blacklight/solr/response_spec.rb +96 -64
- data/spec/models/blacklight/solr/search_builder_behavior_spec.rb +2 -227
- data/spec/models/solr_document_spec.rb +5 -1
- data/spec/services/blacklight/search_service_spec.rb +5 -26
- data/spec/spec_helper.rb +0 -1
- data/spec/support/view_component_test_helpers.rb +0 -18
- data/spec/views/catalog/facet.html.erb_spec.rb +10 -11
- data/spec/views/catalog/index.atom.builder_spec.rb +6 -3
- data/spec/views/catalog/index.html.erb_spec.rb +8 -3
- data/spec/views/catalog/show.html.erb_spec.rb +1 -0
- data/tasks/blacklight.rake +8 -5
- metadata +76 -81
- data/app/assets/stylesheets/blacklight/_autocomplete.scss +0 -25
- data/app/assets/stylesheets/blacklight/_mixins.scss +0 -20
- data/app/components/blacklight/facet_field_list_component.html.erb +0 -19
- data/app/components/blacklight/icons/legacy_icon_component.rb +0 -30
- data/app/components/blacklight/search/facet_suggest_input.html.erb +0 -12
- data/app/components/blacklight/search/facet_suggest_input.rb +0 -20
- data/app/javascript/blacklight/index.js +0 -18
- data/app/javascript/blacklight/modalForm.js +0 -60
- data/app/views/catalog/_constraints.html.erb +0 -1
- data/app/views/catalog/_facet_index_navigation.html.erb +0 -1
- data/app/views/catalog/_facet_layout.html.erb +0 -8
- data/app/views/catalog/_facet_pagination.html.erb +0 -1
- data/app/views/catalog/_facets.html.erb +0 -5
- data/app/views/catalog/_search_form.html.erb +0 -7
- data/app/views/catalog/_search_header.html.erb +0 -1
- data/app/views/catalog/_show_sidebar.html.erb +0 -3
- data/app/views/catalog/_show_tools.html.erb +0 -2
- data/app/views/catalog/_start_over.html.erb +0 -1
- data/app/views/shared/_header_navbar.html.erb +0 -1
- data/lib/generators/blacklight/assets/sprockets_generator.rb +0 -68
- data/spec/components/blacklight/document_metadata_component_spec.rb +0 -0
- data/spec/components/blacklight/search/facet_suggest_input_spec.rb +0 -57
- data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +0 -43
- data/spec/views/catalog/_facet_layout.html.erb_spec.rb +0 -41
- data/spec/views/catalog/_search_header.erb_spec.rb +0 -14
- data/spec/views/catalog/_show_sidebar.erb_spec.rb +0 -24
- data/spec/views/catalog/_show_tools.html.erb_spec.rb +0 -37
- /data/app/components/blacklight/{facet_field_checkboxes_component.html.erb → facets/checkboxes_component.html.erb} +0 -0
- /data/app/javascript/{blacklight → blacklight-frontend}/button_focus.js +0 -0
- /data/app/javascript/{blacklight → blacklight-frontend}/debounce.js +0 -0
- /data/app/javascript/{blacklight → blacklight-frontend}/search_context.js +0 -0
@@ -92,7 +92,7 @@ es:
|
|
92
92
|
close: Ocultar facetas
|
93
93
|
open: Mostrar facetas
|
94
94
|
missing: "[Falta]"
|
95
|
-
more_html: más <span class="
|
95
|
+
more_html: más <span class="visually-hidden">%{field_name}</span> »
|
96
96
|
pivot:
|
97
97
|
hide: Cerrar
|
98
98
|
show: Abierto
|
@@ -141,7 +141,7 @@ es:
|
|
141
141
|
aria_label: Navegación de resultados
|
142
142
|
button_label: "%{count} por página"
|
143
143
|
button_label_html: '%{count}<span class="d-none d-sm-inline"> por página</span>'
|
144
|
-
label: '%{count}<span class="
|
144
|
+
label: '%{count}<span class="visually-hidden"> por página</span>'
|
145
145
|
submit: Actualización
|
146
146
|
title: El número de resultados a mostrar por página
|
147
147
|
rss_feed: RSS de los resultados
|
@@ -92,7 +92,7 @@ fr:
|
|
92
92
|
close: Masquer les facettes
|
93
93
|
open: Afficher les facettes
|
94
94
|
missing: "[manquante]"
|
95
|
-
more_html: plus <span class="
|
95
|
+
more_html: plus <span class="visually-hidden">%{field_name}</span> »
|
96
96
|
pivot:
|
97
97
|
hide: Fermer
|
98
98
|
show: Ouvrir
|
@@ -141,7 +141,7 @@ fr:
|
|
141
141
|
aria_label: Navigation dans les résultats
|
142
142
|
button_label: "%{count} par page"
|
143
143
|
button_label_html: '%{count}<span class="d-none d-sm-inline"> par page</span>'
|
144
|
-
label: '%{count}<span class="
|
144
|
+
label: '%{count}<span class="visually-hidden"> par page</span>'
|
145
145
|
submit: mettre à jour
|
146
146
|
title: Nombre de résultats à afficher par page
|
147
147
|
rss_feed: RSS pour les résultats
|
@@ -90,7 +90,7 @@ hu:
|
|
90
90
|
close: Fazetek elrejtése
|
91
91
|
open: Szempontok megjelenítése
|
92
92
|
missing: "[Hiányzó]"
|
93
|
-
more_html: több <span class="
|
93
|
+
more_html: több <span class="visually-hidden">%{field_name}</span> »
|
94
94
|
pivot:
|
95
95
|
hide: Bezárás
|
96
96
|
show: Megnyitás
|
@@ -139,7 +139,7 @@ hu:
|
|
139
139
|
aria_label: Eredmények navigáció
|
140
140
|
button_label: "%{count} oldalanként"
|
141
141
|
button_label_html: '%{count}<span class="d-none d-sm-inline"> oldalanként</span>'
|
142
|
-
label: '%{count}<span class="
|
142
|
+
label: '%{count}<span class="visually-hidden"> oldalanként</span>'
|
143
143
|
submit: Frissítés
|
144
144
|
title: Az eredmények száma oldalanként
|
145
145
|
rss_feed: Eredmények RSS-ként
|
@@ -142,7 +142,7 @@ it:
|
|
142
142
|
aria_label: Navigazione dei risultati
|
143
143
|
button_label: "%{count} per pagina"
|
144
144
|
button_label_html: '%{count}<span class="d-none d-sm-inline"> per pagina</span>'
|
145
|
-
label: '%{count}<span class="
|
145
|
+
label: '%{count}<span class="visually-hidden"> per pagina</span>'
|
146
146
|
submit: Aggiorna
|
147
147
|
title: Risultati per pagina
|
148
148
|
rss_feed: RSS per i risultati
|
@@ -90,7 +90,7 @@ nl:
|
|
90
90
|
close: Verberg facetten
|
91
91
|
open: Toon facetten
|
92
92
|
missing: "[Ontbrekend]"
|
93
|
-
more_html: Meer <span class="
|
93
|
+
more_html: Meer <span class="visually-hidden">%{field_name}</span> »
|
94
94
|
pivot:
|
95
95
|
hide: Sluiten
|
96
96
|
show: Openen
|
@@ -139,7 +139,7 @@ nl:
|
|
139
139
|
aria_label: Resultaten navigatie
|
140
140
|
button_label: "%{count} per pagina"
|
141
141
|
button_label_html: '%{count}<span class="d-none d-sm-inline"> per pagina</span>'
|
142
|
-
label: '%{count}<span class="
|
142
|
+
label: '%{count}<span class="visually-hidden"> per pagina</span>'
|
143
143
|
submit: Update
|
144
144
|
title: Toon aantal zoekresultaten per pagina
|
145
145
|
rss_feed: RSS voor zoekresultaten
|
@@ -90,7 +90,7 @@ sq:
|
|
90
90
|
close: Fshih aspektet
|
91
91
|
open: Trego aspektet
|
92
92
|
missing: "[Mungon]"
|
93
|
-
more_html: Më shumë <span class="
|
93
|
+
more_html: Më shumë <span class="visually-hidden">%{field_name}</span> »
|
94
94
|
pivot:
|
95
95
|
hide: Mbylle
|
96
96
|
show: Hape
|
@@ -139,7 +139,7 @@ sq:
|
|
139
139
|
aria_label: Rezultatet e lundrimit
|
140
140
|
button_label: "%{count} për faqe"
|
141
141
|
button_label_html: '%{count}<span class="d-none d-sm-inline"> për faqe</span>'
|
142
|
-
label: '%{count}<span class="
|
142
|
+
label: '%{count}<span class="visually-hidden"> për faqe</span>'
|
143
143
|
submit: Përditëso
|
144
144
|
title: Numri i rezultateve që do të shfaqen për faqe
|
145
145
|
rss_feed: RSS për rezultatet
|
@@ -90,7 +90,7 @@ zh:
|
|
90
90
|
close: 隐藏方面
|
91
91
|
open: 显示方面
|
92
92
|
missing: "[未找到]"
|
93
|
-
more_html: 更多 <span class="
|
93
|
+
more_html: 更多 <span class="visually-hidden">%{field_name}</span> »
|
94
94
|
pivot:
|
95
95
|
hide: 关
|
96
96
|
show: 打开
|
@@ -139,7 +139,7 @@ zh:
|
|
139
139
|
aria_label: 结果导航
|
140
140
|
button_label: "%{count} 每页"
|
141
141
|
button_label_html: '%{count}<span class="d-none d-sm-inline"> 每页</span>'
|
142
|
-
label: '%{count}<span class="
|
142
|
+
label: '%{count}<span class="visually-hidden"> 每页</span>'
|
143
143
|
submit: 更新
|
144
144
|
title: 每页显示结果数
|
145
145
|
rss_feed: 搜索结果RSS
|
@@ -0,0 +1,154 @@
|
|
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
|
@@ -24,16 +24,16 @@ module Blacklight
|
|
24
24
|
#
|
25
25
|
# @param [#if,#unless] config an object that responds to if/unless
|
26
26
|
# @return [Boolean]
|
27
|
-
def evaluate_if_unless_configuration(config, *
|
27
|
+
def evaluate_if_unless_configuration(config, *)
|
28
28
|
return config if config == true || config == false
|
29
29
|
|
30
30
|
if_value = !config.respond_to?(:if) ||
|
31
31
|
config.if.nil? ||
|
32
|
-
evaluate_configuration_conditional(config.if, config, *
|
32
|
+
evaluate_configuration_conditional(config.if, config, *)
|
33
33
|
|
34
34
|
unless_value = !config.respond_to?(:unless) ||
|
35
35
|
config.unless.nil? ||
|
36
|
-
!evaluate_configuration_conditional(config.unless, config, *
|
36
|
+
!evaluate_configuration_conditional(config.unless, config, *)
|
37
37
|
|
38
38
|
if_value && unless_value
|
39
39
|
end
|
@@ -59,15 +59,15 @@ module Blacklight
|
|
59
59
|
# @!attribute item_presenter
|
60
60
|
# @return [Blacklight::FacetItemPresenter]
|
61
61
|
# @!attribute component
|
62
|
-
# @return [Blacklight::
|
62
|
+
# @return [Blacklight::Facets::ListComponent]
|
63
63
|
# @!attribute item_component
|
64
|
-
# @return [Blacklight::
|
64
|
+
# @return [Blacklight::Facets::ItemComponent]
|
65
65
|
# @!attribute partial
|
66
66
|
# @return [String] Rails view partial used to render the facet field
|
67
67
|
|
68
68
|
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
69
69
|
def normalize! blacklight_config = nil
|
70
|
-
query
|
70
|
+
query&.stringify_keys!
|
71
71
|
|
72
72
|
normalize_pivot_config! if pivot
|
73
73
|
self.collapse = true if collapse.nil?
|
@@ -76,9 +76,9 @@ module Blacklight
|
|
76
76
|
self.index_range = 'A'..'Z' if index_range == true
|
77
77
|
self.presenter ||= Blacklight::FacetFieldPresenter
|
78
78
|
self.item_presenter ||= Blacklight::FacetItemPresenter
|
79
|
-
self.component = Blacklight::
|
80
|
-
self.advanced_search_component ||= Blacklight::
|
81
|
-
self.item_component ||= Blacklight::
|
79
|
+
self.component = Blacklight::Facets::ListComponent if component.nil? || component == true
|
80
|
+
self.advanced_search_component ||= Blacklight::Facets::CheckboxesComponent
|
81
|
+
self.item_component ||= Blacklight::Facets::ItemComponent
|
82
82
|
super
|
83
83
|
|
84
84
|
if single && tag.blank? && ex.blank?
|
@@ -33,13 +33,13 @@ module Blacklight
|
|
33
33
|
raise ArgumentError, "Must supply a field name" if self.field.nil?
|
34
34
|
end
|
35
35
|
|
36
|
-
def display_label(context = nil, **
|
36
|
+
def display_label(context = nil, **)
|
37
37
|
field_label(
|
38
38
|
(:"blacklight.search.fields.#{context}.#{key}" if context),
|
39
39
|
:"blacklight.search.fields.#{key}",
|
40
40
|
label,
|
41
41
|
default_label,
|
42
|
-
**
|
42
|
+
**
|
43
43
|
)
|
44
44
|
end
|
45
45
|
|
@@ -65,10 +65,10 @@ module Blacklight
|
|
65
65
|
# before falling back to the label
|
66
66
|
# @param [Symbol] any number of additional keys
|
67
67
|
# @param [Symbol] ...
|
68
|
-
def field_label
|
68
|
+
def field_label(*i18n_keys, **)
|
69
69
|
first, *rest = i18n_keys.compact
|
70
70
|
|
71
|
-
I18n.t(first, default: rest, **
|
71
|
+
I18n.t(first, default: rest, **)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
@@ -81,7 +81,7 @@ module Blacklight
|
|
81
81
|
#
|
82
82
|
# add_blacklight_field :index_field, [{ :field => 'format', :label => 'Format' }, IndexField.new(:field => 'date', :label => 'Date')]
|
83
83
|
#
|
84
|
-
def add_blacklight_field
|
84
|
+
def add_blacklight_field(config_key, *args, &)
|
85
85
|
field_config = case args.first
|
86
86
|
when String
|
87
87
|
field_config_from_key_and_hash(config_key, *args)
|
@@ -89,7 +89,7 @@ module Blacklight
|
|
89
89
|
args[0] = args[0].to_s
|
90
90
|
field_config_from_key_and_hash(config_key, *args)
|
91
91
|
when Array
|
92
|
-
field_config_from_array(config_key, *args, &
|
92
|
+
field_config_from_array(config_key, *args, &)
|
93
93
|
return # we've iterated over the array above.
|
94
94
|
else
|
95
95
|
field_config_from_field_or_hash(config_key, *args)
|
@@ -101,7 +101,7 @@ module Blacklight
|
|
101
101
|
|
102
102
|
# look up any dynamic fields
|
103
103
|
if field_config.match
|
104
|
-
handle_matching_fields(config_key, field_config, &
|
104
|
+
handle_matching_fields(config_key, field_config, &)
|
105
105
|
return
|
106
106
|
end
|
107
107
|
|
@@ -145,7 +145,6 @@ module Blacklight
|
|
145
145
|
end
|
146
146
|
|
147
147
|
@table[:reflected_fields] ||= Rails.cache.fetch("blacklight_configuration/admin/reflected_fields", expires_in: 1.hour) do
|
148
|
-
repository = repository_class.new(self)
|
149
148
|
repository.reflect_fields
|
150
149
|
rescue => e
|
151
150
|
Blacklight.logger&.warn "Error retrieving field metadata: #{e}"
|
@@ -14,7 +14,7 @@ module Blacklight
|
|
14
14
|
self.if = include_in_simple_select if self.if.nil?
|
15
15
|
|
16
16
|
super
|
17
|
-
self.qt ||= blacklight_config.default_solr_params[:qt] if blacklight_config
|
17
|
+
self.qt ||= blacklight_config.default_solr_params[:qt] if blacklight_config&.default_solr_params
|
18
18
|
|
19
19
|
self
|
20
20
|
end
|
@@ -4,8 +4,6 @@ class Blacklight::Configuration
|
|
4
4
|
class ViewConfig < Blacklight::OpenStructWithHashAccess
|
5
5
|
# @!attribute template
|
6
6
|
# @return [String] partial to render around the documents
|
7
|
-
# @!attribute partials
|
8
|
-
# @return [Array<String>] partials to render for each document(see #render_document_partials)
|
9
7
|
# @!attribute document_presenter_class
|
10
8
|
# @return [Class] document presenter class used by helpers and views
|
11
9
|
# @!attribute document_component
|
@@ -26,7 +24,7 @@ class Blacklight::Configuration
|
|
26
24
|
# @return [Class] component class used to render the search bar
|
27
25
|
# @!attribute search_header_component
|
28
26
|
# @return [Class] component class used to render the header above the documents
|
29
|
-
def display_label(**
|
27
|
+
def display_label(**)
|
30
28
|
I18n.t(
|
31
29
|
:"blacklight.search.view_title.#{key}",
|
32
30
|
default: [
|
@@ -35,7 +33,7 @@ class Blacklight::Configuration
|
|
35
33
|
title,
|
36
34
|
key.to_s.humanize
|
37
35
|
],
|
38
|
-
**
|
36
|
+
**
|
39
37
|
)
|
40
38
|
end
|
41
39
|
|
@@ -66,9 +66,6 @@ module Blacklight
|
|
66
66
|
|
67
67
|
# === Single document request configuration
|
68
68
|
|
69
|
-
# @!attribute document_solr_request_handler
|
70
|
-
# @return [String] The solr request handler to use when requesting only a single document
|
71
|
-
property :document_solr_request_handler, default: nil
|
72
69
|
# @!attribute document_solr_path
|
73
70
|
# @since v5.2.0
|
74
71
|
# @return [String] The url path (relative to the solr base url) to use when requesting only a single document
|
@@ -99,12 +96,12 @@ module Blacklight
|
|
99
96
|
##
|
100
97
|
# == Response models
|
101
98
|
|
102
|
-
# @!attribute repository_class
|
103
|
-
# @return [Class] Class for sending and receiving requests from a search index
|
104
|
-
property :repository_class, default: Blacklight::Solr::Repository
|
105
99
|
# @!attribute search_builder_class
|
106
100
|
# @return [Class] class for converting Blacklight parameters to request parameters for the repository_class
|
107
101
|
property :search_builder_class, default: ::SearchBuilder
|
102
|
+
# @!attribute search_builder_class
|
103
|
+
# @return [Class] class for converting Blacklight parameters to request parameters for the repository_class
|
104
|
+
property :facet_search_builder_class, default: ::FacetSearchBuilder
|
108
105
|
# @!attribute response_model
|
109
106
|
# model that maps index responses to the blacklight response model
|
110
107
|
# @return [Class]
|
@@ -138,8 +135,8 @@ module Blacklight
|
|
138
135
|
# @!attribute bookmark_icon_component
|
139
136
|
# @since v8.3.1
|
140
137
|
# component class used to render a document
|
141
|
-
# set to
|
142
|
-
property :bookmark_icon_component, default:
|
138
|
+
# set to nil if a checkbox is prefered to the icon
|
139
|
+
property :bookmark_icon_component, default: Blacklight::Icons::BookmarkIconComponent
|
143
140
|
|
144
141
|
# @!attribute index
|
145
142
|
# General configuration for all views
|
@@ -157,8 +154,6 @@ module Blacklight
|
|
157
154
|
display_type_field: nil,
|
158
155
|
# the "field access" key to use to look up the document display fields
|
159
156
|
document_fields_key: :index_fields,
|
160
|
-
# partials to render for each document(see #render_document_partials)
|
161
|
-
partials: [],
|
162
157
|
document_actions: NestedOpenStructWithHashAccess.new(ToolConfig),
|
163
158
|
collection_actions: NestedOpenStructWithHashAccess.new(ToolConfig),
|
164
159
|
# what field, if any, to use to render grouped results
|
@@ -166,7 +161,9 @@ module Blacklight
|
|
166
161
|
# additional response formats for search results
|
167
162
|
respond_to: OpenStructWithHashAccess.new,
|
168
163
|
# component class used to render the facet grouping
|
169
|
-
facet_group_component:
|
164
|
+
facet_group_component: Blacklight::Response::FacetGroupComponent,
|
165
|
+
# component class used to render the facet pagination
|
166
|
+
facet_pagination_component: Blacklight::FacetFieldPaginationComponent,
|
170
167
|
# component class used to render search constraints
|
171
168
|
constraints_component: Blacklight::ConstraintsComponent,
|
172
169
|
# component class used to render the search bar
|
@@ -184,9 +181,7 @@ module Blacklight
|
|
184
181
|
# document presenter class used by helpers and views
|
185
182
|
document_presenter_class: nil,
|
186
183
|
document_component: Blacklight::DocumentComponent,
|
187
|
-
|
188
|
-
# be Blacklight::Document::ShowToolsComponent
|
189
|
-
show_tools_component: nil,
|
184
|
+
show_tools_component: Blacklight::Document::ShowToolsComponent,
|
190
185
|
show_header_tools_component: nil,
|
191
186
|
document_header_component: Blacklight::Document::PageHeaderComponent,
|
192
187
|
sidebar_component: Blacklight::Document::SidebarComponent,
|
@@ -197,8 +192,6 @@ module Blacklight
|
|
197
192
|
# Set this to a hash with additional arguments to merge into the route,
|
198
193
|
# or set `controller: :current` to route to the current controller.
|
199
194
|
route: nil,
|
200
|
-
# partials to render for each document(see #render_document_partials)
|
201
|
-
partials: [],
|
202
195
|
document_actions: NestedOpenStructWithHashAccess.new(ToolConfig),
|
203
196
|
header_actions: NestedOpenStructWithHashAccess.new(ToolConfig)
|
204
197
|
)
|
@@ -386,7 +379,7 @@ module Blacklight
|
|
386
379
|
|
387
380
|
# @return [Blacklight::Repository]
|
388
381
|
def repository
|
389
|
-
repository_class.new(self)
|
382
|
+
Blacklight.repository_class.new(self)
|
390
383
|
end
|
391
384
|
|
392
385
|
# @return [String] The destination for the link around the logo in the header
|
@@ -585,7 +578,7 @@ module Blacklight
|
|
585
578
|
|
586
579
|
##
|
587
580
|
# Add a section of config that only applies to documents with a matching display type
|
588
|
-
def for_display_type
|
581
|
+
def for_display_type(display_type, &)
|
589
582
|
fields_for_type[display_type] ||= self.class.new
|
590
583
|
|
591
584
|
fields_for_type[display_type].tap do |conf|
|
data/lib/blacklight/engine.rb
CHANGED
@@ -72,12 +72,6 @@ module Blacklight
|
|
72
72
|
outer_window: 2
|
73
73
|
}
|
74
74
|
|
75
|
-
# Blacklight 9 moves the next button after the page numbers. This behavior can be configured
|
76
|
-
# in Blacklight 8 by setting the next_button_position to :after
|
77
|
-
bl_global_config.paginator = {
|
78
|
-
next_button_position: :before
|
79
|
-
}
|
80
|
-
|
81
75
|
bl_global_config.search_params_permitted_classes = [ActiveSupport::HashWithIndifferentAccess, Symbol]
|
82
76
|
|
83
77
|
# Anything that goes into Blacklight::Engine.config is stored as a class
|
@@ -0,0 +1,18 @@
|
|
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
|
@@ -53,19 +53,19 @@ module Blacklight
|
|
53
53
|
self.class.new @table.deep_dup
|
54
54
|
end
|
55
55
|
|
56
|
-
def deep_transform_values(&
|
57
|
-
self.class.new @table.deep_transform_values(&
|
56
|
+
def deep_transform_values(&)
|
57
|
+
self.class.new @table.deep_transform_values(&)
|
58
58
|
end
|
59
59
|
|
60
|
-
def try(method_name = nil,
|
60
|
+
def try(method_name = nil, *, &)
|
61
61
|
if method_name.nil? && block_given?
|
62
62
|
if b.arity.zero?
|
63
|
-
instance_eval(&
|
63
|
+
instance_eval(&)
|
64
64
|
else
|
65
65
|
yield self
|
66
66
|
end
|
67
67
|
elsif respond_to?(method_name)
|
68
|
-
public_send(method_name,
|
68
|
+
public_send(method_name, *, &b)
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|