Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 23 additions & 18 deletions app/assets/stylesheets/partials/_panels.scss
Original file line number Diff line number Diff line change
Expand Up @@ -105,26 +105,31 @@
border: 0;
padding: 2rem;
padding-top: 1.5rem;
display: flex;
.hd-filter-summary {
margin-right: 2rem;
padding-top: 0.3rem;
}
a {
font-size: $fs-small;
text-decoration: none;
padding: .5rem;
&::before {
font-family: FontAwesome;
content: '\f00d';
padding-right: .25rem;
.list-filter-summary {
display: flex;
.hd-filter-summary {
margin-right: 2rem;
padding-top: 0.3rem;
}
&:hover,
&:focus {
color: $white;
background-color: $black;
.applied-filter {
font-size: $fs-small;
text-decoration: none;
padding: .5rem;
&::before {
font-family: FontAwesome;
content: '\f00d';
padding-right: .25rem;
}
&:hover,
&:focus {
color: $white;
background-color: $black;
}
margin-right: 2rem;
}
margin-right: 2rem;
}
.clear-filters {
padding-top: 1rem;
}
@media (max-width: $bp-screen-md) {
display: block;
Expand Down
15 changes: 13 additions & 2 deletions app/helpers/filter_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,26 @@ def remove_filter(query, filter, term)
new_query
end

def remove_all_filters(query)
new_query = query.deep_dup
new_query[:page] = 1

applied_filters(query).each do |filter|
filter.each_key { |filter_key| new_query.delete(filter_key) if new_query[filter_key].present? }
end

new_query
end

def filter_applied?(terms, term)
return if terms.blank?

terms.include?(term)
end

def applied_filters
def applied_filters(query)
filters = []
@enhanced_query.map do |param, values|
query.map do |param, values|
next unless param.to_s.include? 'Filter'

values.each { |value| filters << { param => value } }
Expand Down
41 changes: 25 additions & 16 deletions app/views/search/_search_summary.html.erb
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
<% return unless applied_filters.any? %>
<% return unless applied_filters(@enhanced_query).any? %>

<div class="filter-summary">
<h2 class="hd-filter-summary hd-5">Applied filters: </h2>
<ul class="list-filter-summary list-inline">
<% applied_filters.each do |filter| %>
<li>
<a href="<%= results_path(remove_filter(@enhanced_query, filter.keys[0], filter.values[0])) %>">
<%= "#{nice_labels[filter.keys[0]] || filter.keys[0]}:" %>
<% if Flipflop.enabled?(:gdt) %>
<%= "#{gdt_sources(filter.values[0], filter.keys[0])}" %>
<% else %>
<%= "#{filter.values[0]}" %>
<% end %>
<span class="sr">Remove applied filter?</span>
</a>
</li>
<div class="list-filter-summary">
<h2 class="hd-filter-summary hd-5">Applied filters: </h2>
<ul class="list-inline">
<% applied_filters(@enhanced_query).each do |filter| %>
<li>
<a class="applied-filter"
href="<%= results_path(remove_filter(@enhanced_query, filter.keys[0], filter.values[0])) %>">
<%= "#{nice_labels[filter.keys[0]] || filter.keys[0]}:" %>
<% if Flipflop.enabled?(:gdt) %>
<%= "#{gdt_sources(filter.values[0], filter.keys[0])}" %>
<% else %>
<%= "#{filter.values[0]}" %>
<% end %>
<span class="sr">Remove applied filter?</span>
</a>
</li>
<% end %>
</ul>
</div>
<% if applied_filters(@enhanced_query).length > 1 %>
<div class="clear-filters">
<a class="btn button-primary"
href="<%= results_path(remove_all_filters(@enhanced_query)) %>">Clear all filters</a>
</div>
<% end %>
</ul>
</div>
39 changes: 39 additions & 0 deletions test/controllers/search_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -471,4 +471,43 @@ def source_filter_count(controller)
end
end
end

test 'clear all filters button does not appear with zero filters in query' do
VCR.use_cassette('data basic controller',
allow_playback_repeats: true,
match_requests_on: %i[method uri body]) do
get '/results?q=data'
assert_response :success
assert_select '.clear-filters', count: 0
end
end

test 'clear all filters button does not appear with one filter in query' do
VCR.use_cassette('filter one',
allow_playback_repeats: true,
match_requests_on: %i[method uri body]) do
query = {
q: 'data',
sourceFilter: ['Woods Hole Open Access Server']
}.to_query
get "/results?#{query}"
assert_response :success
assert_select '.clear-filters', count: 0
end
end

test 'clear all filters button appears with more than filter in query' do
VCR.use_cassette('filter multiple',
allow_playback_repeats: true,
match_requests_on: %i[method uri body]) do
query = {
q: 'data',
contentTypeFilter: ['dataset'],
contributorsFilter: ['Woods Hole Open Access Server']
}.to_query
get "/results?#{query}"
assert_response :success
assert_select '.clear-filters', count: 1
end
end
end
55 changes: 47 additions & 8 deletions test/helpers/filter_helper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,39 +148,39 @@ class FilterHelperTest < ActionView::TestCase
end

test 'applied_filters returns all currently applied filters' do
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thoughts on a controller test confirming the button does not show up (or at least isn't visible) unless the expected conditions are met? I would be okay with not including it, but I also think it may be helpful to confirm at that level.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that makes sense and should be easily testable.

@enhanced_query = {
query = {
contentTypeFilter: ['dataset'],
sourceFilter: ['my imagination']
}
assert_equal [{ contentTypeFilter: 'dataset' }, { sourceFilter: 'my imagination' }], applied_filters
assert_equal [{ contentTypeFilter: 'dataset' }, { sourceFilter: 'my imagination' }], applied_filters(query)
end

test 'applied_filters collects separately terms in the same filter category' do
@enhanced_query = {
query = {
contentTypeFilter: ['dataset'],
sourceFilter: ['my imagination']
}
assert_equal [{ contentTypeFilter: 'dataset' }, { sourceFilter: 'my imagination' }], applied_filters
assert_equal [{ contentTypeFilter: 'dataset' }, { sourceFilter: 'my imagination' }], applied_filters(query)
end

test 'applied_filters does not return search term params' do
@enhanced_query = {
query = {
q: 'jazz',
advanced: true,
title: 'undercurrent',
contributors: ['evans, bill', 'hall, jim'],
contentTypeFilter: ['lp']
}
assert_equal [{ contentTypeFilter: 'lp' }], applied_filters
assert_equal [{ contentTypeFilter: 'lp' }], applied_filters(query)
end

test 'applied_filters does not return other unwanted parts of the enhanced query' do
@enhanced_query = {
query = {
page: 2,
advanced: true,
contentTypeFilter: ['dataset']
}
assert_equal [{ contentTypeFilter: 'dataset' }], applied_filters
assert_equal [{ contentTypeFilter: 'dataset' }], applied_filters(query)
end

test 'gdt_sources returns the source label we want for MIT stuff' do
Expand All @@ -199,4 +199,43 @@ class FilterHelperTest < ActionView::TestCase
assert_equal 'me', gdt_sources('me', :contributorsFilter)
assert_equal 'GIS', gdt_sources('GIS', :subjectsFilter)
end

test 'remove_all_filters removes one filter' do
query = {
q: 'jazz',
contributorsFilter: ['evans, bill', 'hall, jim'],
}
assert_equal({ q: 'jazz', page: 1 }, remove_all_filters(query))
end

test 'remove_all_filters removes multiple filters' do
query = {
q: 'jazz',
contributorsFilter: ['evans, bill', 'hall, jim'],
contentTypeFilter: ['lp'],
accessToFilesFilter: ['no authentication required']
}
assert_equal({ q: 'jazz', page: 1 }, remove_all_filters(query))
end

test 'remove_all_filters resets the page number' do
query = {
q: 'jazz',
contributorsFilter: ['evans, bill', 'hall, jim'],
page: 22
}
assert_equal({ q: 'jazz', page: 1 }, remove_all_filters(query))
end

test 'remove_all_filters does not change non-filter search terms' do
query = {
q: 'jazz',
advanced: true,
title: 'undercurrent',
contributors: ['evans, bill', 'hall, jim'],
contentTypeFilter: ['lp']
}
assert_equal({ q: 'jazz', advanced: true, title: 'undercurrent', contributors: ['evans, bill', 'hall, jim'],
page: 1 }, remove_all_filters(query))
end
end
90 changes: 90 additions & 0 deletions test/vcr_cassettes/filter_multiple.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading