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 +4 -4
- data/README.md +10 -15
- data/app/models/faceted_search/facets/default_list.rb +48 -0
- data/app/models/faceted_search/facets/list.rb +14 -0
- data/app/models/faceted_search/facets/{search.rb → text.rb} +1 -1
- data/app/models/faceted_search/facets/tree.rb +25 -0
- data/app/models/faceted_search/facets.rb +11 -7
- data/app/views/faceted_search/_facets.html.erb +1 -1
- data/app/views/faceted_search/facets/_list.html.erb +11 -0
- data/app/views/faceted_search/facets/{_search.html.erb → _text.html.erb} +1 -1
- data/app/views/faceted_search/facets/_tree.html.erb +26 -0
- data/lib/faceted_search/version.rb +1 -1
- metadata +14 -28
- data/app/assets/javascripts/faceted_search/Tree.js +0 -139
- data/app/assets/javascripts/faceted_search.js +0 -7
- data/app/assets/stylesheets/faceted_search/nestable.sass +0 -64
- data/app/assets/stylesheets/faceted_search.sass +0 -1
- data/app/models/faceted_search/facets/filter.rb +0 -95
- data/app/views/faceted_search/facets/_filter.html.erb +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 579f5857155cd830b339c6aa99c86ea05f12d50dd905782ad36798673cfe3df9
|
4
|
+
data.tar.gz: c4bf2c97ee9d1ce84fed8836929ad2ee15a1d12374890b9a87d4ac9d3d2a98f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
38
|
+
filter_with_text :title
|
39
|
+
filter_with_list :products, {
|
40
|
+
find_by: :title,
|
41
|
+
habtm: true
|
47
42
|
}
|
48
|
-
|
49
|
-
|
43
|
+
filter_with_list :kinds, {
|
44
|
+
habtm: true
|
50
45
|
}
|
51
|
-
|
52
|
-
|
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
|
@@ -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
|
-
|
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
|
45
|
-
|
44
|
+
def filter_with_text(value, options = {})
|
45
|
+
add_facet Text, value, options
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
49
|
-
|
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
|
57
|
-
@list <<
|
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-
|
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="
|
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>
|
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:
|
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-
|
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:
|
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:
|
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:
|
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/
|
146
|
-
- app/models/faceted_search/facets/
|
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/
|
149
|
-
- app/views/faceted_search/facets/
|
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
|
-
|
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,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 %>
|