diff --git a/app/blueprints/contribution_type_filter_option_blueprint.rb b/app/blueprints/contribution_type_filter_option_blueprint.rb new file mode 100644 index 00000000..67ab6929 --- /dev/null +++ b/app/blueprints/contribution_type_filter_option_blueprint.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class ContributionTypeFilterOptionBlueprint < Blueprinter::Base + identifier :id do |filter_option| + "ContributionType[#{filter_option}]" + end + + field :name do |filter_option| + filter_option.titleize + end +end diff --git a/app/blueprints/filter_group_blueprint.rb b/app/blueprints/filter_group_blueprint.rb new file mode 100644 index 00000000..8438a66f --- /dev/null +++ b/app/blueprints/filter_group_blueprint.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class FilterGroupBlueprint < Blueprinter::Base + field :filter_grouping_name, name: :name + + association :filter_options, blueprint: ->(filter_options) do + if filter_options == ContributionTypeFilter.filter_options + ContributionTypeFilterOptionBlueprint + else + FilterOptionBlueprint + end + end +end diff --git a/app/filters/category_filter.rb b/app/filters/category_filter.rb index 6f745171..cfb4d78a 100644 --- a/app/filters/category_filter.rb +++ b/app/filters/category_filter.rb @@ -1,10 +1,10 @@ class CategoryFilter < BaseFilter - def self.filter_grouping - { - name: "Categories", - # Currently only filtering by top-level categories - filter_options: FilterOptionBlueprint.render_as_hash(Category.roots) - } + def self.filter_grouping_name + 'Categories' + end + + def self.filter_options + Category.roots end def filter(scope) diff --git a/app/filters/contact_method_filter.rb b/app/filters/contact_method_filter.rb index bb949704..5d17a352 100644 --- a/app/filters/contact_method_filter.rb +++ b/app/filters/contact_method_filter.rb @@ -1,9 +1,10 @@ class ContactMethodFilter < BaseFilter - def self.filter_grouping - { - name: 'Contact Methods', - filter_options: FilterOptionBlueprint.render_as_hash(ContactMethod.enabled.distinct(:name)) - } + def self.filter_grouping_name + 'Contact Methods' + end + + def self.filter_options + ContactMethod.enabled.distinct(:name) end def filter(scope) diff --git a/app/filters/contribution_type_filter.rb b/app/filters/contribution_type_filter.rb index 6176a5d9..cda973e6 100644 --- a/app/filters/contribution_type_filter.rb +++ b/app/filters/contribution_type_filter.rb @@ -1,11 +1,12 @@ class ContributionTypeFilter < BaseFilter - def self.filter_grouping - {name: 'Contribution Types', filter_options: [ - {id: 'ContributionType[Ask]', name: 'Ask'}, - {id: 'ContributionType[Offer]', name: 'Offer'}, - {id: 'ContributionType[CommunityResource]', name: 'Community Resource'} - ]} + def self.filter_grouping_name + 'Contribution Types' end + + def self.filter_options + ALL_ALLOWED_TYPES + end + ALL_ALLOWED_TYPES = %w[Ask Offer CommunityResource].freeze def filter(scope) diff --git a/app/filters/service_area_filter.rb b/app/filters/service_area_filter.rb index ed16289a..7b03d060 100644 --- a/app/filters/service_area_filter.rb +++ b/app/filters/service_area_filter.rb @@ -1,9 +1,10 @@ class ServiceAreaFilter < BaseFilter - def self.filter_grouping - { - name: 'Service Areas', - filter_options: FilterOptionBlueprint.render_as_hash(ServiceArea.i18n) - } + def self.filter_grouping_name + 'Service Areas' + end + + def self.filter_options + ServiceArea.i18n end def filter(scope) diff --git a/app/models/browse_filter.rb b/app/models/browse_filter.rb index 54bbfa48..7eb1d860 100644 --- a/app/models/browse_filter.rb +++ b/app/models/browse_filter.rb @@ -18,7 +18,7 @@ class BrowseFilter attr_reader :parameters def self.filter_groupings_json - FILTER_CLASSES.map(&:filter_grouping).to_json + FilterGroupBlueprint.render(FILTER_CLASSES) end def initialize(parameters)