app/models/spotlight/blacklight_configuration.rb in blacklight-spotlight-0.4.1 vs app/models/spotlight/blacklight_configuration.rb in blacklight-spotlight-0.5.0

- old
+ new

@@ -1,12 +1,16 @@ require 'blacklight/utils' module Spotlight + ## + # Exhibit-specific blacklight configuration model + # rubocop:disable Metrics/ClassLength class BlacklightConfiguration < ActiveRecord::Base belongs_to :exhibit, touch: true serialize :facet_fields, Hash serialize :index_fields, Hash + serialize :search_fields, Hash serialize :sort_fields, Hash serialize :default_solr_params, Hash serialize :show, Hash serialize :index, Hash serialize :per_page, Array @@ -15,77 +19,78 @@ include Spotlight::BlacklightConfigurationDefaults include Spotlight::ImageDerivatives # get rid of empty values before_validation do |model| + model.index_fields.each do |_k, v| + v[:enabled] ||= v.any? { |_k1, v1| !v1.blank? } - model.index_fields.each do |k,v| - v[:enabled] ||= v.any? { |k1, v1| !v1.blank? } - default_blacklight_config.view.keys.each do |view| v[view] &&= value_to_boolean(v[view]) end v[:show] &&= value_to_boolean(v[:show]) - - v.reject! { |k, v1| v1.blank? and !v1 === false } + v.reject! { |_k, v1| v1.blank? && v1 != false } end if model.index_fields - model.facet_fields.each do |k,v| + model.facet_fields.each do |_k, v| v[:show] &&= value_to_boolean(v[:show]) v[:show] ||= true if v[:show].nil? - v.reject! { |k, v1| v1.blank? and !v1 === false } + v.reject! { |_k, v1| v1.blank? && v1 != false } end if model.facet_fields - model.sort_fields.each do |k,v| + model.search_fields.each do |k, v| v[:enabled] &&= value_to_boolean(v[:enabled]) v[:enabled] ||= true if v[:enabled].nil? - v[:label] = default_blacklight_config.sort_fields[k][:label] unless v[:label].present? - v.reject! { |k, v1| v1.blank? and !v1 === false } + v[:label] = default_blacklight_config.search_fields[k][:label] if default_blacklight_config.search_fields[k] && !v[:label].present? + v.reject! { |_k, v1| v1.blank? && v1 != false } + end if model.search_fields + + model.sort_fields.each do |k, v| + v[:enabled] &&= value_to_boolean(v[:enabled]) + v[:enabled] ||= true if v[:enabled].nil? + v[:label] = default_blacklight_config.sort_fields[k][:label] if default_blacklight_config.sort_fields[k] && !v[:label].present? + v.reject! { |_k, v1| v1.blank? && v1 != false } end if model.sort_fields model.per_page.reject!(&:blank?) if model.per_page model.document_index_view_types.reject!(&:blank?) if model.document_index_view_types end ## - # Serialize this configuration to a Blacklight::Configuration object + # Serialize this configuration to a Blacklight::Configuration object # appropriate to the current view. If a value isn't set in this record, # it will use the configuration set upstream (in default_blacklight_config) # @param [String] view the configuration may be different depending on the index view selected + # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize def blacklight_config @blacklight_config ||= begin # Create a new config based on the defaults config = default_blacklight_config.inheritable_copy + config.search_builder_class.send(:include, Spotlight::Catalog::AccessControlsEnforcement::SearchBuilder) + config.show.merge! show unless show.blank? config.index.merge! index unless index.blank? config.index.thumbnail_field ||= Spotlight::Engine.config.thumbnail_field - unless exhibit.searchable? - config.navbar.partials[:saved_searches].if = false - config.navbar.partials[:search_history].if = false - end - config.add_results_collection_tool 'save_search', if: :render_save_this_search? config.default_solr_params = config.default_solr_params.merge(default_solr_params) config.view.embed.partials ||= ['openseadragon'] config.view.embed.if = false - config.view.embed.locals ||= { osd_container_class: "" } + config.view.embed.locals ||= { osd_container_class: '' } - # Add any custom fields config.index_fields.merge! custom_index_fields - config.index_fields = Hash[config.index_fields.sort_by { |k,v| field_weight(index_fields, k) }] - config.index_fields.reject! { |k,v| v.if == false } + config.index_fields = Hash[config.index_fields.sort_by { |k, _v| field_weight(index_fields, k) }] + config.index_fields.reject! { |_k, v| v.if == false } # Update with customizations config.index_fields.each do |k, v| - if index_fields[k] v.merge! index_fields[k].symbolize_keys elsif custom_index_fields[k] set_custom_field_defaults(v) else @@ -96,14 +101,13 @@ v.normalize! config v.validate! end - - config.show_fields.reject! { |k,v| v.if == false } + config.show_fields.reject! { |_k, v| v.if == false } - config.show_fields.reject { |k,v| config.index_fields[k] }.each do |k,v| + config.show_fields.reject { |k, _v| config.index_fields[k] }.each do |k, v| config.index_fields[k] = v if index_fields[k] v.merge! index_fields[k].symbolize_keys else @@ -114,15 +118,29 @@ v.if = :field_enabled? v.normalize! config v.validate! end - + config.show_fields = config.index_fields + unless search_fields.blank? + config.search_fields = Hash[config.search_fields.sort_by { |k, _v| field_weight(search_fields, k) }] + + config.search_fields.each do |k, v| + v.upstream_if = v.if unless v.if.nil? + v.if = :field_enabled? + next if search_fields[k].blank? + + v.merge! search_fields[k].symbolize_keys + v.normalize! config + v.validate! + end + end + unless sort_fields.blank? - config.sort_fields = Hash[config.sort_fields.sort_by { |k,v| field_weight(sort_fields, k) }] + config.sort_fields = Hash[config.sort_fields.sort_by { |k, _v| field_weight(sort_fields, k) }] config.sort_fields.each do |k, v| v.upstream_if = v.if unless v.if.nil? v.if = :field_enabled? next if sort_fields[k].blank? @@ -130,14 +148,14 @@ v.merge! sort_fields[k].symbolize_keys v.normalize! config v.validate! end end - + config.facet_fields.merge! custom_facet_fields unless facet_fields.blank? - config.facet_fields = Hash[config.facet_fields.sort_by { |k,v| field_weight(facet_fields, k) }] + config.facet_fields = Hash[config.facet_fields.sort_by { |k, _v| field_weight(facet_fields, k) }] config.facet_fields.each do |k, v| next if facet_fields[k].blank? v.merge! facet_fields[k].symbolize_keys @@ -148,37 +166,43 @@ v.validate! end end config.per_page = (config.per_page & per_page) unless per_page.blank? - + if default_per_page config.per_page.delete(default_per_page) config.per_page.unshift(default_per_page) end - config.view.each do |k,v| + config.view.each do |k, v| v.key = k v.upstream_if = v.if unless v.if.nil? v.if = :enabled_in_spotlight_view_type_configuration? end unless document_index_view_types.blank? + if config.search_fields.blank? + config.navbar.partials[:saved_searches].if = false if config.navbar.partials.key? :saved_searches + config.navbar.partials[:search_history].if = false if config.navbar.partials.key? :search_history + end + config end end + # rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity def custom_index_fields - Hash[exhibit.custom_fields.map do |x| + Hash[exhibit.custom_fields.map do |x| field = Blacklight::Configuration::IndexField.new x.configuration.merge(field: x.field) - [x.field, field] + [x.field, field] end] end def custom_facet_fields - Hash[exhibit.custom_fields.vocab.map do |x| + Hash[exhibit.custom_fields.vocab.map do |x| field = Blacklight::Configuration::FacetField.new x.configuration.merge(field: x.field, show: false) - [x.field, field] + [x.field, field] end] end ## # Get the "upstream" blacklight configuration to use @@ -188,73 +212,127 @@ add_exhibit_specific_fields(config) config end end + # Parse params checkbox arrays into simple arrays. + # A group of checkboxes on a form returns values like this: + # {"list"=>"1", "gallery"=>"1", "map"=>"0"} + # where, "list" and "gallery" are selected and "map" is not. This function + # digests that hash into a list of selected values. e.g.: + # ["list", "gallery"] + def document_index_view_types=(hash_or_array) + if hash_or_array.is_a? Hash + super(hash_or_array.select { |_, checked| checked == '1' }.keys) + else + super(hash_or_array) + end + end + + # @return [OpenStructWithHashAccess] keys are view types; value is 1 if enabled + # A group of checkboxes on a form needs values like this: + # {"list"=>"1", "gallery"=>"1", "map"=>"0"} + # where, "list" and "gallery" are selected and "map" is not. This function + # takes ["list", "gallery"] and turns it into the above. + def document_index_view_types_selected_hash + selected_view_types = document_index_view_types + avail_view_types = default_blacklight_config.view.select { |_k, v| v.if != false }.keys + Blacklight::OpenStructWithHashAccess.new.tap do |s| + avail_view_types.each do |k| + s[k] = selected_view_types.include?(k.to_s) + end + end + end + protected - def add_exhibit_specific_fields config - config.add_show_field :exhibit_tags, field: Spotlight::SolrDocument.solr_field_for_tagger(exhibit), link_to_search: true unless config.show_fields.include? :exhibit_tags - config.add_facet_field :exhibit_tags, field: Spotlight::SolrDocument.solr_field_for_tagger(exhibit) unless config.facet_fields.include? :exhibit_tags - exhibit.uploaded_resource_fields.each do |f| - key = Array(f.solr_field || f.field_name).first.to_s + def add_exhibit_specific_fields(config) + add_exhibit_tags_fields(config) + add_uploaded_resource_fields(config) + add_autocomplete_field(config) + end - unless config.index_fields.any? { |k,v| v.field == key } - options = {} - options.merge! f.blacklight_options if f.blacklight_options - options[:label] = f.label if f.label + def add_exhibit_tags_fields(config) + # rubocop:disable Style/GuardClause + unless config.show_fields.include? :exhibit_tags + config.add_show_field :exhibit_tags, field: Spotlight::SolrDocument.solr_field_for_tagger(exhibit), link_to_search: true + end - config.add_index_field key, options - end + unless config.facet_fields.include? :exhibit_tags + config.add_facet_field :exhibit_tags, field: Spotlight::SolrDocument.solr_field_for_tagger(exhibit) end + # rubocop:enable Style/GuardClause + end - if Spotlight::Engine.config.autocomplete_search_field and !config.search_fields[Spotlight::Engine.config.autocomplete_search_field] - config.add_search_field(Spotlight::Engine.config.autocomplete_search_field) do |field| - field.include_in_simple_select = false - field.solr_parameters = Spotlight::Engine.config.default_autocomplete_params.deep_dup - field.solr_parameters[:fl] ||= "" - field.solr_parameters[:fl] += " #{config.document_model.unique_key} #{config.view_config(:show).title_field} #{spotlight_image_version_fields.join(' ')}" - end + def add_uploaded_resource_fields(config) + exhibit.uploaded_resource_fields.each do |f| + add_uploaded_resource_field(config, f) end end + def add_uploaded_resource_field(config, f) + key = Array(f.solr_field || f.field_name).first.to_s + + return if config.index_fields.any? { |_k, v| v.field == key } + + options = f.blacklight_options || {} + options[:label] = f.label if f.label + + config.add_index_field key, options + end + + def add_autocomplete_field(config) + return unless Spotlight::Engine.config.autocomplete_search_field && !config.search_fields[Spotlight::Engine.config.autocomplete_search_field] + + config.add_search_field(Spotlight::Engine.config.autocomplete_search_field) do |field| + field.include_in_simple_select = false + field.solr_parameters = Spotlight::Engine.config.default_autocomplete_params.deep_dup + field.solr_parameters[:fl] ||= default_autocomplete_field_list(config) + end + end + + def default_autocomplete_field_list(config) + "#{config.document_model.unique_key} #{config.view_config(:show).title_field} #{spotlight_image_version_fields.join(' ')}" + end + def spotlight_image_version_fields spotlight_image_derivatives.map do |version| version[:field] end end - def set_index_field_defaults field - if index_fields.blank? - views = default_blacklight_config.view.keys | [:show, :enabled] - field.merge! Hash[views.map { |v| [v, true] }] - end + # rubocop:disable Style/AccessorMethodName + def set_index_field_defaults(field) + return unless index_fields.blank? + + views = default_blacklight_config.view.keys | [:show, :enabled] + field.merge! Hash[views.map { |v| [v, true] }] end - def set_show_field_defaults field - if index_fields.blank? - views = default_blacklight_config.view.keys - field.merge! Hash[views.map { |v| [v, false] }] - field.enabled = true - field.show = true - end + def set_show_field_defaults(field) + return unless index_fields.blank? + views = default_blacklight_config.view.keys + field.merge! Hash[views.map { |v| [v, false] }] + field.enabled = true + field.show = true end - def set_custom_field_defaults field + def set_custom_field_defaults(field) field.show = true field.enabled = true end + # rubocop:enable Style/AccessorMethodName # @return [Integer] the weight (sort order) for this field - def field_weight fields, index - if fields[index] and fields[index][:weight] + def field_weight(fields, index) + if fields[index] && fields[index][:weight] fields[index][:weight].to_i else 100 + (fields.keys.index(index) || fields.keys.length) end end - def value_to_boolean v + def value_to_boolean(v) if defined? ActiveRecord::Type # Rails 4.2+ ActiveRecord::Type::Boolean.new.type_cast_from_database v else ActiveRecord::ConnectionAdapters::Column.value_to_boolean v