faceted_search 2.2.0 → 3.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f82d1b15fdbb630bd290e8d915b5dd109b7e07ad17561c959043a44a13af4ade
4
- data.tar.gz: c958ae79ef81325ae652ebe54a0c9fdfebe7ebd0ce8b60a30188c0bb3de3a062
3
+ metadata.gz: 579f5857155cd830b339c6aa99c86ea05f12d50dd905782ad36798673cfe3df9
4
+ data.tar.gz: c4bf2c97ee9d1ce84fed8836929ad2ee15a1d12374890b9a87d4ac9d3d2a98f6
5
5
  SHA512:
6
- metadata.gz: 91a8751b4523d08c0dff7112a05d5d87eebd6ed69c1c7ace85d438093d521c5421e860adeee41beeb931c0833143ced6a45f2f0f0fc16dcbbffdbdec861f4bc9
7
- data.tar.gz: cd64b29320ff0a978e436a5df1b48f8f98319d512c3c9984756bc352d6f74d911b1ea2bbc48dbffc4bf17382eed3e95275dd1375b69f8ba54060e0a4364ce178
6
+ metadata.gz: b0a21b9eaba7960fd61785bba72752f966ef89a2a08f66351cdb88a375a7aa3f349f89ec1e8fd279d523b2b02d0932dccf2cbb93d9ed83625bf10acd3cbcff48
7
+ data.tar.gz: 71771e3c03cfba3c103729785e677cec5ba76653578cb9ed433c631e2030ab8fab76dc6cbcc92dffacb536537253f52a8db0add2e98ad8115c35ea4ddb4c3ad7
data/README.md CHANGED
@@ -22,16 +22,11 @@ $ gem install faceted_search
22
22
 
23
23
  ## Getting started
24
24
 
25
- Add to your `app/assets/stylesheets/application.sass`
25
+ Add Bootstrap and Font Awesome to your `app/assets/stylesheets/application.sass`
26
26
  ```
27
+ @import 'bootstrap'
27
28
  @import 'font-awesome-sprockets'
28
29
  @import 'font-awesome'
29
- @import 'faceted_search'
30
- ```
31
-
32
- And to your `app/assets/javascripts/application.js`
33
- ```
34
- //= require faceted_search
35
30
  ```
36
31
 
37
32
  Create a model defining your facets:
@@ -40,16 +35,16 @@ Create a model defining your facets:
40
35
  def initialize(params)
41
36
  super
42
37
  @model = Item.all
43
- search :title
44
- filter :products, {
45
- find_by: :title,
46
- habtm: true
38
+ filter_with_text :title
39
+ filter_with_list :products, {
40
+ find_by: :title,
41
+ habtm: true
47
42
  }
48
- filter :kinds, {
49
- habtm: true
43
+ filter_with_list :kinds, {
44
+ habtm: true
50
45
  }
51
- filter :categories, {
52
- habtm: true
46
+ filter_with_tree :categories, {
47
+ habtm: true
53
48
  }
54
49
  end
55
50
  end
@@ -0,0 +1,48 @@
1
+ module FacetedSearch
2
+ class Facets::DefaultList < Facets::Default
3
+
4
+ def display_method
5
+ @options[:display_method] ||= Proc.new { |object| object.to_s }
6
+ end
7
+
8
+ def find_by
9
+ @options[:find_by] || :id
10
+ end
11
+
12
+ def source
13
+ @options[:source] || name.to_s.singularize.titleize.constantize.send(:all)
14
+ end
15
+
16
+ # Adds a scope corresponding to this facet
17
+ # to the scope sent as an argument
18
+ # and return the modified scope
19
+ def add_scope(scope)
20
+ return scope if params_array.blank?
21
+
22
+ habtm? ? scope.joins(name).where(name => { find_by => params_array })
23
+ : scope.where(name => params_array)
24
+ end
25
+
26
+ def value_selected?(value)
27
+ value.to_s.in? params_array
28
+ end
29
+
30
+ def path_for(value)
31
+ value = value.to_s
32
+ custom_params = params_array.dup
33
+ value_selected?(value) ? custom_params.delete(value)
34
+ : custom_params.push(value)
35
+ path(custom_params.join(','))
36
+ end
37
+
38
+ protected
39
+
40
+ def params_array
41
+ @params_array ||= @params.to_s.split(',')
42
+ end
43
+
44
+ def habtm?
45
+ @options[:habtm]
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,14 @@
1
+ module FacetedSearch
2
+ class Facets::List < Facets::DefaultList
3
+
4
+ # Show all values that have corresponding results.
5
+ # This is a regular SQL inner join.
6
+ def values
7
+ unless @values
8
+ joined_table = facets.model_table_name.to_sym
9
+ @values = source.all.joins(joined_table).where(joined_table => { id: facets.model }).distinct
10
+ end
11
+ @values
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  module FacetedSearch
2
- class Facets::Search < Facets::Default
2
+ class Facets::Text < Facets::Default
3
3
 
4
4
  def placeholder
5
5
  @options[:placeholder]
@@ -0,0 +1,25 @@
1
+ module FacetedSearch
2
+ class Facets::Tree < Facets::DefaultList
3
+
4
+ def selected_objects
5
+ source.where(find_by => params_array)
6
+ end
7
+
8
+ def selected_object
9
+ selected_objects.last
10
+ end
11
+
12
+ # All values, not filtered
13
+ # Otherwise, we would need to search all the children to do a good filtering
14
+ def values
15
+ root? ? source.root
16
+ : selected_object.children
17
+ end
18
+
19
+ protected
20
+
21
+ def root?
22
+ params_array.empty?
23
+ end
24
+ end
25
+ end
@@ -20,7 +20,7 @@ module FacetedSearch
20
20
 
21
21
  def path_for(facet, value)
22
22
  p = path
23
- @list.each do |current_facet|
23
+ list.each do |current_facet|
24
24
  p += current_facet == facet ? current_facet.path_for(value)
25
25
  : current_facet.path
26
26
  end
@@ -41,20 +41,24 @@ module FacetedSearch
41
41
 
42
42
  protected
43
43
 
44
- def search(value, options = {})
45
- add(Search.new(value, params_for(value), self, options))
44
+ def filter_with_text(value, options = {})
45
+ add_facet Text, value, options
46
46
  end
47
47
 
48
- def filter(value, options = {})
49
- add(Filter.new(value, params_for(value), self, options))
48
+ def filter_with_list(value, options = {})
49
+ add_facet List, value, options
50
+ end
51
+
52
+ def filter_with_tree(value, options = {})
53
+ add_facet Tree, value, options
50
54
  end
51
55
 
52
56
  def params_for(value)
53
57
  @params[value] if @params.has_key? value
54
58
  end
55
59
 
56
- def add(facet)
57
- @list << facet
60
+ def add_facet(kind, value, options)
61
+ @list << kind.new(value, params_for(value), self, options)
58
62
  end
59
63
  end
60
64
  end
@@ -10,5 +10,5 @@ anchor ||= ''
10
10
  <%= render facet.kind.underscore, facet: facet, anchor: anchor %>
11
11
  </li>
12
12
  <% end %>
13
- <li class="faceted__facet__reinit"><a href="<%= facets.path%>"><i class="fas fa-backspace"></i></a></li>
13
+ <li class="faceted__facet__reinit"><a href="<%= facets.path%>"><i class="fas fa-ban"></i></a></li>
14
14
  </ul>
@@ -0,0 +1,11 @@
1
+ <ol class="faceted__facet__list list-unstyled">
2
+ <% facet.values.each do |value| %>
3
+ <%
4
+ identifier = value.send facet.find_by
5
+ display_value = facet.display_method.call(value)
6
+ %>
7
+ <li class="faceted__facet__list__value<%= '--selected' if facet.value_selected?(identifier) %>">
8
+ <%= link_to display_value, facet.facets.path_for(facet, identifier) + anchor %>
9
+ </li>
10
+ <% end %>
11
+ </ol>
@@ -1,5 +1,5 @@
1
1
  <% value = params[:facets][facet.name] if params[:facets] && params[:facets].has_key?(facet.name) %>
2
- <form action="<%= anchor %>" class="faceted__facet__search form-inline">
2
+ <form action="<%= anchor %>" class="faceted__facet__text form-inline">
3
3
  <% facet.facets.list.each do |f| %>
4
4
  <% next if f == facet %>
5
5
  <% next if f.params.blank? %>
@@ -0,0 +1,26 @@
1
+ <div class="faceted__facet__tree<% if facet.selected_object %> faceted__facet__tree--selected<% end %>">
2
+ <% if facet.selected_object %>
3
+ <%
4
+ display_value = facet.display_method.call(facet.selected_object)
5
+ identifier = facet.selected_object.send facet.find_by
6
+ path = facet.facets.path_for(facet, identifier)
7
+ %>
8
+ <div class="faceted__facet__tree__back">
9
+ <%= link_to path do %>
10
+ <i class="fas fa-arrow-left"></i> <%= display_value %>
11
+ <% end %>
12
+ </div>
13
+ <% end %>
14
+
15
+ <ol class="faceted__facet__tree__values list-unstyled ">
16
+ <% facet.values.each do |value| %>
17
+ <%
18
+ display_value = facet.display_method.call(value)
19
+ identifier = value.send facet.find_by
20
+ path = facet.facets.path_for(facet, identifier)
21
+ %>
22
+ <li class="faceted__facet__tree__value">
23
+ <%= link_to display_value, path %>
24
+ </li>
25
+ <% end %>
26
+ </div>
@@ -1,3 +1,3 @@
1
1
  module FacetedSearch
2
- VERSION = '2.2.0'
2
+ VERSION = '3.0.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faceted_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arnaud Levy
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-03-28 00:00:00.000000000 Z
13
+ date: 2019-04-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -40,20 +40,6 @@ dependencies:
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
- - !ruby/object:Gem::Dependency
44
- name: nestable-rails
45
- requirement: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: '0'
50
- type: :runtime
51
- prerelease: false
52
- version_requirements: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: '0'
57
43
  - !ruby/object:Gem::Dependency
58
44
  name: pg
59
45
  requirement: !ruby/object:Gem::Requirement
@@ -83,7 +69,7 @@ dependencies:
83
69
  - !ruby/object:Gem::Version
84
70
  version: '0'
85
71
  - !ruby/object:Gem::Dependency
86
- name: simple_form
72
+ name: bootstrap
87
73
  requirement: !ruby/object:Gem::Requirement
88
74
  requirements:
89
75
  - - ">="
@@ -97,7 +83,7 @@ dependencies:
97
83
  - !ruby/object:Gem::Version
98
84
  version: '0'
99
85
  - !ruby/object:Gem::Dependency
100
- name: bootstrap
86
+ name: kaminari
101
87
  requirement: !ruby/object:Gem::Requirement
102
88
  requirements:
103
89
  - - ">="
@@ -111,7 +97,7 @@ dependencies:
111
97
  - !ruby/object:Gem::Version
112
98
  version: '0'
113
99
  - !ruby/object:Gem::Dependency
114
- name: kaminari
100
+ name: font-awesome-sass
115
101
  requirement: !ruby/object:Gem::Requirement
116
102
  requirements:
117
103
  - - ">="
@@ -136,17 +122,16 @@ files:
136
122
  - MIT-LICENSE
137
123
  - README.md
138
124
  - Rakefile
139
- - app/assets/javascripts/faceted_search.js
140
- - app/assets/javascripts/faceted_search/Tree.js
141
- - app/assets/stylesheets/faceted_search.sass
142
- - app/assets/stylesheets/faceted_search/nestable.sass
143
125
  - app/models/faceted_search/facets.rb
144
126
  - app/models/faceted_search/facets/default.rb
145
- - app/models/faceted_search/facets/filter.rb
146
- - app/models/faceted_search/facets/search.rb
127
+ - app/models/faceted_search/facets/default_list.rb
128
+ - app/models/faceted_search/facets/list.rb
129
+ - app/models/faceted_search/facets/text.rb
130
+ - app/models/faceted_search/facets/tree.rb
147
131
  - app/views/faceted_search/_facets.html.erb
148
- - app/views/faceted_search/facets/_filter.html.erb
149
- - app/views/faceted_search/facets/_search.html.erb
132
+ - app/views/faceted_search/facets/_list.html.erb
133
+ - app/views/faceted_search/facets/_text.html.erb
134
+ - app/views/faceted_search/facets/_tree.html.erb
150
135
  - lib/faceted_search.rb
151
136
  - lib/faceted_search/engine.rb
152
137
  - lib/faceted_search/railtie.rb
@@ -171,7 +156,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
171
156
  - !ruby/object:Gem::Version
172
157
  version: '0'
173
158
  requirements: []
174
- rubygems_version: 3.0.1
159
+ rubyforge_project:
160
+ rubygems_version: 2.7.6
175
161
  signing_key:
176
162
  specification_version: 4
177
163
  summary: Faceted search with Active Record
@@ -1,139 +0,0 @@
1
- /*global window, document, $ */
2
-
3
- window.facetedSearch = window.facetedSearch || {};
4
-
5
- window.facetedSearch.Tree = function Tree(wrapper) {
6
- "use strict";
7
- this.wrapper = wrapper;
8
- this.data = [];
9
- };
10
-
11
- window.facetedSearch.Tree.prototype.unflatten = function (list) {
12
- "use strict";
13
- var map = {},
14
- node,
15
- roots = [],
16
- i;
17
-
18
- for (i = 0; i < list.length; i += 1) {
19
- map[list[i].id] = i;
20
- list[i].children = [];
21
- }
22
-
23
- for (i = 0; i < list.length; i += 1) {
24
- node = list[i];
25
- if (node.parentId !== 0) {
26
- list[map[node.parentId]].children.push(node);
27
- } else {
28
- roots.push(node);
29
- }
30
- }
31
-
32
- return roots;
33
- };
34
-
35
- window.facetedSearch.Tree.prototype.generateItem = function (item) {
36
- "use strict";
37
-
38
- var liNode = document.createElement('li');
39
-
40
- liNode.className = item.selected ? "dd-item dd-item--selected"
41
- : "dd-item";
42
-
43
- var iconNode = null;
44
- iconNode = document.createElement('i');
45
- iconNode.className = "back-link fas fa-arrow-left";
46
- var titleNode = document.createTextNode(item.title);
47
-
48
- var itemContent = document.createDocumentFragment();
49
- if (item.back === "true") {
50
- itemContent.appendChild(iconNode);
51
- }
52
- itemContent.appendChild(titleNode);
53
-
54
- if (item.url !== "") {
55
- var aNode = document.createElement('a');
56
- aNode.setAttribute("href", item.url);
57
- aNode.appendChild(itemContent);
58
- liNode.appendChild(aNode);
59
- } else {
60
- liNode.appendChild(itemContent);
61
- }
62
-
63
-
64
- if (item.children.length > 0) {
65
- var olNode = this.generateList(item.children);
66
- liNode.appendChild(olNode);
67
- }
68
-
69
-
70
- return liNode;
71
- };
72
-
73
- window.facetedSearch.Tree.prototype.generateList = function (array) {
74
- "use strict";
75
-
76
- var olNode = document.createElement('ol'),
77
- liNode,
78
- i;
79
-
80
- olNode.className = "faceted__facet__filter--tree__level dd-list";
81
-
82
- for (i = 0; i < array.length; i += 1) {
83
- liNode = this.generateItem(array[i]);
84
- olNode.appendChild(liNode);
85
- }
86
-
87
- return olNode;
88
- };
89
-
90
- window.facetedSearch.Tree.prototype.initDOM = function () {
91
- "use strict";
92
-
93
- var listElements = Array.prototype.slice.call(this.wrapper.querySelectorAll('li'));
94
- var listData = listElements.map(function (elt) {
95
- return {
96
- id: parseInt(elt.getAttribute('data-id'), 10),
97
- parentId: parseInt(elt.getAttribute('data-parent'), 10),
98
- selected: elt.getAttribute('data-selected') === "true",
99
- resultsCount: parseInt(elt.getAttribute('data-count'), 10),
100
- url: elt.getAttribute('data-url'),
101
- back: elt.getAttribute('data-back'),
102
- title: elt.textContent.trim()
103
- };
104
- });
105
-
106
- this.data = this.unflatten(listData);
107
- var treeNode = this.generateList(this.data);
108
-
109
- var rootElt = document.createElement('div');
110
- rootElt.className = 'dd';
111
- rootElt.appendChild(treeNode);
112
-
113
- while (this.wrapper.firstChild) {
114
- this.wrapper.removeChild(this.wrapper.firstChild);
115
- }
116
- this.wrapper.appendChild(rootElt);
117
- };
118
-
119
- window.facetedSearch.Tree.prototype.initNestable = function () {
120
- "use strict";
121
-
122
- $('.dd', this.wrapper).nestable({
123
- expandBtnHTML: '',
124
- collapseBtnHTML: ''
125
- }).data("nestable");
126
- };
127
-
128
- window.addEventListener('DOMContentLoaded', function () {
129
- "use strict";
130
- var facetedTreeElts = document.querySelectorAll('.faceted__facet__filter--tree'),
131
- facetedTree,
132
- i;
133
-
134
- for (i = 0; i < facetedTreeElts.length; i += 1) {
135
- facetedTree = new window.facetedSearch.Tree(facetedTreeElts[i]);
136
- facetedTree.initDOM();
137
- facetedTree.initNestable();
138
- }
139
- });
@@ -1,7 +0,0 @@
1
- //= require nestable-rails
2
- //= require_self
3
- //= require_tree ./faceted_search
4
-
5
- /*global window */
6
-
7
- window.facetedSearch = {};
@@ -1,64 +0,0 @@
1
- .dd, .dd-list
2
- position: relative
3
- display: block
4
- margin: 0
5
- padding: 0
6
- list-style: none
7
- font-size: 13px
8
- line-height: 20px
9
-
10
- .dd-list .dd-list
11
- padding-left: 26px
12
-
13
- .dd-collapsed .dd-list
14
- display: none
15
-
16
- .dd-item
17
- display: block
18
- position: relative
19
- margin: 3px 0 0
20
- padding: 0
21
- min-height: 20px
22
- font-size: 13px
23
- line-height: 20px
24
-
25
-
26
- a
27
- color: #8c8c8c
28
- &:hover
29
- color: #000
30
-
31
- i.back-link
32
- margin-right: 5px
33
-
34
- &--selected > a
35
- color: #000
36
-
37
- & > button
38
- display: block
39
- position: relative
40
- cursor: pointer
41
- float: left
42
- width: 26px
43
- height: 20px
44
- margin: 0
45
- padding: 0
46
- text-indent: 100%
47
- white-space: nowrap
48
- overflow: hidden
49
- border: 0
50
- background: transparent
51
- font-size: 16px
52
- line-height: 1
53
- text-align: center
54
- font-weight: bold
55
- .fas
56
- position: absolute
57
- top: 2px
58
- left: -14px
59
- &.dd-collapse-btn .fas
60
- left: -16px
61
-
62
- #nestable-menu
63
- padding: 0
64
- margin: 10px 0 20px 0
@@ -1 +0,0 @@
1
- @import "faceted_search/*"
@@ -1,95 +0,0 @@
1
- module FacetedSearch
2
- class Facets::Filter < Facets::Default
3
-
4
- def tree?
5
- @options[:tree]
6
- end
7
-
8
- def display_method
9
- @options[:display_method] ||= Proc.new { |object| object.to_s }
10
- end
11
-
12
- # Adds a scope corresponding to this facet
13
- # to the scope sent as an argument
14
- # and return the modified scope
15
- def add_scope(scope)
16
- return scope if params_array.blank?
17
-
18
- identifiers = params_array.dup
19
- identifiers << selected_objects.first.descendents if tree?
20
- identifiers.flatten!
21
-
22
- habtm? ? scope.joins(name).where(name => { find_by => identifiers })
23
- : scope.where(name => identifiers)
24
- end
25
-
26
- def find_by
27
- @options[:find_by] || :id
28
- end
29
-
30
- def selected_objects
31
- values.where(find_by => params_array)
32
- end
33
-
34
- # Show all values that have corresponding results.
35
- # This is a regular SQL inner join.
36
- def values
37
- @values ||= get_values
38
- end
39
-
40
- def tree_values
41
- return values.select { |obj| obj.root? } if params_array.empty?
42
-
43
- selected_object = selected_objects.first
44
- return [] if selected_object.nil?
45
-
46
- array = []
47
- array << values.find { |obj| obj.id == selected_object.parent_id } if selected_object.has_parent? # parent
48
- array << values.select { |obj| obj.parent_id == selected_object.parent_id } # selected & siblings
49
- array << values.select { |obj| obj.parent_id == selected_object.id } if selected_object.has_children? # selected object's children
50
- array.flatten.compact
51
- end
52
-
53
- def value_selected?(value)
54
- value.to_s.in? params_array
55
- end
56
-
57
- def path_for(value)
58
- value = value.to_s
59
- return path_for_tree(value) if tree?
60
-
61
- custom_params = params_array.dup
62
- value_selected?(value) ? custom_params.delete(value)
63
- : custom_params.push(value)
64
- path(custom_params.join(','))
65
- end
66
-
67
- def source
68
- @options[:source] || name.to_s.singularize.titleize.constantize.send(:all)
69
- end
70
-
71
- def has_params?
72
- params_array.any?
73
- end
74
-
75
- protected
76
-
77
- def get_values
78
- joined_table = facets.model_table_name.to_sym
79
- source.all.joins(joined_table).where(joined_table => { id: facets.model }).distinct
80
- end
81
-
82
- def path_for_tree(value)
83
- value_selected?(value) ? path('')
84
- : path(value)
85
- end
86
-
87
- def params_array
88
- @params_array ||= @params.to_s.split(',')
89
- end
90
-
91
- def habtm?
92
- @options[:habtm]
93
- end
94
- end
95
- end
@@ -1,45 +0,0 @@
1
- <% if facet.tree? %>
2
- <div class="faceted__facet__filter--tree">
3
- <div class="dd">
4
- <ol class="faceted__facet__filter--tree__level dd-list">
5
- <% facet.tree_values.each_with_index do |object, index| %>
6
- <%
7
- identifier = object.send facet.find_by
8
- selected = facet.value_selected?(identifier)
9
- facet_url = selected ? '' : facet.facets.path_for(facet, identifier)
10
- back = index == 0 && !selected && facet.has_params?
11
- display_value = facet.display_method.call(object)
12
- parent_id = object.parent_id.nil? ? 0 : object.parent_id
13
- %>
14
- <% if index == 0 && selected %>
15
- <li data-parent="0"
16
- data-id="-1"
17
- data-back="true"
18
- data-selected="false"
19
- data-url="<%= facet.facets.path_for(facet, '') %>">
20
- </li>
21
- <% end %>
22
- <li data-parent="<%= back ? 0 : parent_id %>"
23
- data-id="<%= object.id %>"
24
- data-back="<%= back %>"
25
- data-selected="<%= selected %>"
26
- data-url="<%= facet_url %>">
27
- <%= display_value %>
28
- </li>
29
- <% end %>
30
- </ol>
31
- </div>
32
- </div>
33
- <% else %>
34
- <ul class="faceted__facet__filter list-unstyled">
35
- <% facet.values.each do |value| %>
36
- <%
37
- identifier = value.send facet.find_by
38
- display_value = facet.display_method.call(value)
39
- %>
40
- <li class="faceted__facet__filter__value<%= '--selected' if facet.value_selected?(identifier) %>">
41
- <%= link_to display_value, facet.facets.path_for(facet, identifier) + anchor %>
42
- </li>
43
- <% end %>
44
- </ul>
45
- <% end %>