forty_facets 0.0.6 → 0.0.7
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/README.md +19 -0
- data/lib/forty_facets/facet_search.rb +5 -5
- data/lib/forty_facets/filter.rb +24 -4
- data/lib/forty_facets/filter/attribute_filter_definition.rb +4 -2
- data/lib/forty_facets/filter/belongs_to_filter_definition.rb +2 -13
- data/lib/forty_facets/version.rb +1 -1
- data/test/smoke_test.rb +7 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d9c32f0c9730c55259649e32b7b38909d24da00
|
4
|
+
data.tar.gz: 0b38e2588247108aa332113e2a50907bf89ca8d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1260c88aba045ed9c89e1f8209e154b45cbef190f67183e13625705de727dc6bd54c3057075b5d1f4ab31dc93d540475a904cf14868dec24cce1416628e10909
|
7
|
+
data.tar.gz: de80f703356346a84b8a2c3c776e8a23e70935ad31512e3ad7a94de9bdcc92961b8e78f85937a3ad7d05aa4c9235ceecd833bbbf52bd35a5b801ecf8d10aba95
|
data/README.md
CHANGED
@@ -99,6 +99,25 @@ Use the search object to display further narrowing options to the user
|
|
99
99
|
= link_to genre.name, filter.add(genre).path
|
100
100
|
%span.count= "(#{facet_value.count})"
|
101
101
|
```
|
102
|
+
## API
|
103
|
+
|
104
|
+
### Base class
|
105
|
+
|
106
|
+
To create a custom search subclass `FortyFacets::FacetSearch`.
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
class MySearch
|
110
|
+
model 'MyActiveRecordModel' # replace this with an class name from your models folder
|
111
|
+
end
|
112
|
+
```
|
113
|
+
|
114
|
+
### Available declaration methods
|
115
|
+
| keyword | options | |
|
116
|
+
|---------|---------------|-------------------------------------------------------------------------------------------------------------------------|
|
117
|
+
| text | prefix:true | creates a filter to limit search result to entities containing the filter value in the given field |
|
118
|
+
| facet | | creates a facetted filter on the specified model attribute (attribute or belongs_to) |
|
119
|
+
| range | | creates a range filter (param format 'FROM - TO') limiting result to entities with values in that range |
|
120
|
+
| orders | | takes a hash mapping a label to an argument that the active record `order` method can be called with to sort the result |
|
102
121
|
|
103
122
|
## FAQ
|
104
123
|
|
@@ -32,11 +32,11 @@ module FortyFacets
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def facet(model_field, opts = {})
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
if self.root_scope.reflect_on_association(model_field)
|
36
|
+
definitions << BelongsToFilterDefinition.new(self, model_field, opts)
|
37
|
+
else
|
38
|
+
definitions << AttributeFilterDefinition.new(self, model_field, opts)
|
39
|
+
end
|
40
40
|
end
|
41
41
|
|
42
42
|
def orders(name_and_order_options)
|
data/lib/forty_facets/filter.rb
CHANGED
@@ -7,10 +7,6 @@ module FortyFacets
|
|
7
7
|
filter_definition.options[:name] || filter_definition.model_field
|
8
8
|
end
|
9
9
|
|
10
|
-
def values
|
11
|
-
@values ||= Array.wrap(value).sort.uniq
|
12
|
-
end
|
13
|
-
|
14
10
|
def empty?
|
15
11
|
value.nil? || value == '' || value == []
|
16
12
|
end
|
@@ -24,5 +20,29 @@ module FortyFacets
|
|
24
20
|
search_instance.class.new_unwrapped(new_params)
|
25
21
|
end
|
26
22
|
end
|
23
|
+
|
24
|
+
# Base class for filter with multiple values and grouped facet values
|
25
|
+
class FacetFilter < Filter
|
26
|
+
def values
|
27
|
+
@values ||= Array.wrap(value).sort.uniq
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def order_facet!(facet)
|
33
|
+
order_accessor = filter_definition.options[:order]
|
34
|
+
if order_accessor
|
35
|
+
if order_accessor.is_a?(Proc)
|
36
|
+
facet.sort_by!{|facet_value| order_accessor.call(facet_value.entity) }
|
37
|
+
else
|
38
|
+
facet.sort_by!{|facet_value| facet_value.entity.send(order_accessor) }
|
39
|
+
end
|
40
|
+
else
|
41
|
+
facet.sort_by!{|facet_value| -facet_value.count }
|
42
|
+
end
|
43
|
+
facet
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
27
47
|
end
|
28
48
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module FortyFacets
|
2
2
|
class AttributeFilterDefinition < FilterDefinition
|
3
|
-
class AttributeFilter <
|
3
|
+
class AttributeFilter < FacetFilter
|
4
4
|
def selected
|
5
5
|
entity = search_instance.class.root_class
|
6
6
|
column = entity.columns_hash[filter_definition.model_field.to_s]
|
@@ -15,10 +15,12 @@ module FortyFacets
|
|
15
15
|
def facet
|
16
16
|
my_column = filter_definition.model_field
|
17
17
|
counts = without.result.reorder('').select("#{my_column} AS facet_value, count(#{my_column}) as occurrences").group(my_column)
|
18
|
-
counts.map do |c|
|
18
|
+
facet = counts.map do |c|
|
19
19
|
is_selected = selected.include?(c.facet_value)
|
20
20
|
FacetValue.new(c.facet_value, c.occurrences, is_selected)
|
21
21
|
end
|
22
|
+
|
23
|
+
order_facet!(facet)
|
22
24
|
end
|
23
25
|
|
24
26
|
def remove(value)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module FortyFacets
|
2
2
|
class BelongsToFilterDefinition < FilterDefinition
|
3
|
-
class
|
3
|
+
class BelonsToFilter < FacetFilter
|
4
4
|
def association
|
5
5
|
filter_definition.search.root_class.reflect_on_association(filter_definition.model_field)
|
6
6
|
end
|
@@ -48,21 +48,10 @@ module FortyFacets
|
|
48
48
|
search_instance.class.new_unwrapped(new_params)
|
49
49
|
end
|
50
50
|
|
51
|
-
private
|
52
|
-
|
53
|
-
def order_facet!(facet)
|
54
|
-
order_accessor = filter_definition.options[:order]
|
55
|
-
if order_accessor
|
56
|
-
facet.sort_by!{|facet_value| facet_value.entity.send(order_accessor) }
|
57
|
-
else
|
58
|
-
facet.sort_by!{|facet_value| -facet_value.count }
|
59
|
-
end
|
60
|
-
facet
|
61
|
-
end
|
62
51
|
end
|
63
52
|
|
64
53
|
def build_filter(search_instance, param_value)
|
65
|
-
|
54
|
+
BelonsToFilter.new(self, search_instance, param_value)
|
66
55
|
end
|
67
56
|
|
68
57
|
end
|
data/lib/forty_facets/version.rb
CHANGED
data/test/smoke_test.rb
CHANGED
@@ -39,7 +39,7 @@ class MovieSearch < FortyFacets::FacetSearch
|
|
39
39
|
|
40
40
|
text :title, name: 'Title'
|
41
41
|
facet :studio, name: 'Studio'
|
42
|
-
|
42
|
+
facet :year, order: Proc.new {|year| -year}
|
43
43
|
range :price, name: 'Price'
|
44
44
|
end
|
45
45
|
|
@@ -116,4 +116,10 @@ class SmokeTest < Minitest::Test
|
|
116
116
|
assert_equal movies_with_studio.size, first_facet_value.count
|
117
117
|
end
|
118
118
|
|
119
|
+
def test_sort_by_proc
|
120
|
+
blank_search = MovieSearch.new
|
121
|
+
facet_entities = blank_search.filter(:year).facet.map(&:entity)
|
122
|
+
assert_equal Movie.all.map(&:year).sort.uniq.reverse, facet_entities
|
123
|
+
end
|
124
|
+
|
119
125
|
end
|