activeadmin-ajax_filter 0.4.4 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +1 -2
- data/Gemfile.lock +69 -53
- data/README.md +18 -0
- data/activeadmin-ajax_filter.gemspec +2 -0
- data/app/assets/javascripts/activeadmin-ajax_filter.js.coffee +6 -4
- data/lib/active_admin/ajax_filter.rb +26 -4
- data/lib/active_admin/ajax_filter/version.rb +1 -1
- data/lib/active_admin/inputs/ajax_core.rb +8 -3
- metadata +31 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f9fa8d4a1c3de2cacf75f9e29a0e8adddef65db1eb09704f4b079bdac96670c
|
4
|
+
data.tar.gz: f9398372f1435943d3716dbf5498ceeb705dd2e59b2f2ab980a3658f0e57d488
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f244bf70e1fb6dc726e865e0b7fec4766a75af1b72c1cac071a240a59f353a9b775450474161da3191b818c0506cbcea04d94e8458e131d64a090a7e2626be1f
|
7
|
+
data.tar.gz: 93fa5babb8c7b4b840865b26c7a31cbe23d2f3070c7843e0be9238a8e5eb7745b683186acdd871c4b8a8e7f34465bfa7a28d7b6def4f603ccad9c6f0e612d175
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.6.
|
1
|
+
2.6.5
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
activeadmin-ajax_filter (0.4.
|
4
|
+
activeadmin-ajax_filter (0.4.6)
|
5
5
|
activeadmin (>= 1.0)
|
6
6
|
coffee-rails (>= 4.1.0)
|
7
7
|
has_scope (>= 0.6.0)
|
@@ -11,21 +11,21 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
actionmailer (4.2.11)
|
15
|
-
actionpack (= 4.2.11)
|
16
|
-
actionview (= 4.2.11)
|
17
|
-
activejob (= 4.2.11)
|
14
|
+
actionmailer (4.2.11.1)
|
15
|
+
actionpack (= 4.2.11.1)
|
16
|
+
actionview (= 4.2.11.1)
|
17
|
+
activejob (= 4.2.11.1)
|
18
18
|
mail (~> 2.5, >= 2.5.4)
|
19
19
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
20
|
-
actionpack (4.2.11)
|
21
|
-
actionview (= 4.2.11)
|
22
|
-
activesupport (= 4.2.11)
|
20
|
+
actionpack (4.2.11.1)
|
21
|
+
actionview (= 4.2.11.1)
|
22
|
+
activesupport (= 4.2.11.1)
|
23
23
|
rack (~> 1.6)
|
24
24
|
rack-test (~> 0.6.2)
|
25
25
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
26
26
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
27
|
-
actionview (4.2.11)
|
28
|
-
activesupport (= 4.2.11)
|
27
|
+
actionview (4.2.11.1)
|
28
|
+
activesupport (= 4.2.11.1)
|
29
29
|
builder (~> 3.1)
|
30
30
|
erubis (~> 2.7.0)
|
31
31
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
@@ -42,17 +42,17 @@ GEM
|
|
42
42
|
ransack (>= 1.8.7)
|
43
43
|
sass (~> 3.1)
|
44
44
|
sprockets (< 4.1)
|
45
|
-
activejob (4.2.11)
|
46
|
-
activesupport (= 4.2.11)
|
45
|
+
activejob (4.2.11.1)
|
46
|
+
activesupport (= 4.2.11.1)
|
47
47
|
globalid (>= 0.3.0)
|
48
|
-
activemodel (4.2.11)
|
49
|
-
activesupport (= 4.2.11)
|
48
|
+
activemodel (4.2.11.1)
|
49
|
+
activesupport (= 4.2.11.1)
|
50
50
|
builder (~> 3.1)
|
51
|
-
activerecord (4.2.11)
|
52
|
-
activemodel (= 4.2.11)
|
53
|
-
activesupport (= 4.2.11)
|
51
|
+
activerecord (4.2.11.1)
|
52
|
+
activemodel (= 4.2.11.1)
|
53
|
+
activesupport (= 4.2.11.1)
|
54
54
|
arel (~> 6.0)
|
55
|
-
activesupport (4.2.11)
|
55
|
+
activesupport (4.2.11.1)
|
56
56
|
i18n (~> 0.7)
|
57
57
|
minitest (~> 5.1)
|
58
58
|
thread_safe (~> 0.3, >= 0.3.4)
|
@@ -61,7 +61,7 @@ GEM
|
|
61
61
|
arbre (1.2.1)
|
62
62
|
activesupport (>= 3.0.0)
|
63
63
|
arel (6.0.4)
|
64
|
-
builder (3.2.
|
64
|
+
builder (3.2.4)
|
65
65
|
capybara (2.7.1)
|
66
66
|
addressable
|
67
67
|
mime-types (>= 1.16)
|
@@ -72,6 +72,7 @@ GEM
|
|
72
72
|
cliver (0.3.2)
|
73
73
|
codeclimate-test-reporter (0.4.8)
|
74
74
|
simplecov (>= 0.7.1, < 1.0.0)
|
75
|
+
coderay (1.1.2)
|
75
76
|
coffee-rails (4.2.2)
|
76
77
|
coffee-script (>= 2.2.0)
|
77
78
|
railties (>= 4.0.0)
|
@@ -79,8 +80,8 @@ GEM
|
|
79
80
|
coffee-script-source
|
80
81
|
execjs
|
81
82
|
coffee-script-source (1.12.2)
|
82
|
-
concurrent-ruby (1.1.
|
83
|
-
crass (1.0.
|
83
|
+
concurrent-ruby (1.1.6)
|
84
|
+
crass (1.0.6)
|
84
85
|
database_cleaner (1.5.3)
|
85
86
|
diff-lcs (1.2.5)
|
86
87
|
docile (1.1.5)
|
@@ -112,56 +113,60 @@ GEM
|
|
112
113
|
has_scope (~> 0.6)
|
113
114
|
railties (>= 4.2, < 5.3)
|
114
115
|
responders
|
115
|
-
jquery-rails (4.
|
116
|
+
jquery-rails (4.4.0)
|
116
117
|
rails-dom-testing (>= 1, < 3)
|
117
118
|
railties (>= 4.2.0)
|
118
119
|
thor (>= 0.14, < 2.0)
|
119
120
|
json (1.8.6)
|
120
|
-
kaminari (1.
|
121
|
+
kaminari (1.2.0)
|
121
122
|
activesupport (>= 4.1.0)
|
122
|
-
kaminari-actionview (= 1.
|
123
|
-
kaminari-activerecord (= 1.
|
124
|
-
kaminari-core (= 1.
|
125
|
-
kaminari-actionview (1.
|
123
|
+
kaminari-actionview (= 1.2.0)
|
124
|
+
kaminari-activerecord (= 1.2.0)
|
125
|
+
kaminari-core (= 1.2.0)
|
126
|
+
kaminari-actionview (1.2.0)
|
126
127
|
actionview
|
127
|
-
kaminari-core (= 1.
|
128
|
-
kaminari-activerecord (1.
|
128
|
+
kaminari-core (= 1.2.0)
|
129
|
+
kaminari-activerecord (1.2.0)
|
129
130
|
activerecord
|
130
|
-
kaminari-core (= 1.
|
131
|
-
kaminari-core (1.
|
131
|
+
kaminari-core (= 1.2.0)
|
132
|
+
kaminari-core (1.2.0)
|
132
133
|
launchy (2.4.3)
|
133
134
|
addressable (~> 2.3)
|
134
|
-
loofah (2.
|
135
|
+
loofah (2.4.0)
|
135
136
|
crass (~> 1.0.2)
|
136
137
|
nokogiri (>= 1.5.9)
|
137
138
|
mail (2.7.1)
|
138
139
|
mini_mime (>= 0.1.1)
|
140
|
+
method_source (1.0.0)
|
139
141
|
mime-types (3.2.2)
|
140
142
|
mime-types-data (~> 3.2015)
|
141
143
|
mime-types-data (3.2018.0812)
|
142
144
|
mini_mime (1.0.2)
|
143
145
|
mini_portile2 (2.4.0)
|
144
|
-
minitest (5.
|
145
|
-
nokogiri (1.10.
|
146
|
+
minitest (5.14.0)
|
147
|
+
nokogiri (1.10.9)
|
146
148
|
mini_portile2 (~> 2.4.0)
|
147
149
|
phantomjs (2.1.1.0)
|
148
150
|
poltergeist (1.10.0)
|
149
151
|
capybara (~> 2.1)
|
150
152
|
cliver (~> 0.3.1)
|
151
153
|
websocket-driver (>= 0.2.0)
|
152
|
-
|
154
|
+
pry (0.13.1)
|
155
|
+
coderay (~> 1.1)
|
156
|
+
method_source (~> 1.0)
|
157
|
+
rack (1.6.13)
|
153
158
|
rack-test (0.6.3)
|
154
159
|
rack (>= 1.0)
|
155
|
-
rails (4.2.11)
|
156
|
-
actionmailer (= 4.2.11)
|
157
|
-
actionpack (= 4.2.11)
|
158
|
-
actionview (= 4.2.11)
|
159
|
-
activejob (= 4.2.11)
|
160
|
-
activemodel (= 4.2.11)
|
161
|
-
activerecord (= 4.2.11)
|
162
|
-
activesupport (= 4.2.11)
|
160
|
+
rails (4.2.11.1)
|
161
|
+
actionmailer (= 4.2.11.1)
|
162
|
+
actionpack (= 4.2.11.1)
|
163
|
+
actionview (= 4.2.11.1)
|
164
|
+
activejob (= 4.2.11.1)
|
165
|
+
activemodel (= 4.2.11.1)
|
166
|
+
activerecord (= 4.2.11.1)
|
167
|
+
activesupport (= 4.2.11.1)
|
163
168
|
bundler (>= 1.3.0, < 2.0)
|
164
|
-
railties (= 4.2.11)
|
169
|
+
railties (= 4.2.11.1)
|
165
170
|
sprockets-rails
|
166
171
|
rails-deprecated_sanitizer (1.0.3)
|
167
172
|
activesupport (>= 4.2.0.alpha)
|
@@ -169,11 +174,11 @@ GEM
|
|
169
174
|
activesupport (>= 4.2.0, < 5.0)
|
170
175
|
nokogiri (~> 1.6)
|
171
176
|
rails-deprecated_sanitizer (>= 1.0.1)
|
172
|
-
rails-html-sanitizer (1.0
|
173
|
-
loofah (~> 2.
|
174
|
-
railties (4.2.11)
|
175
|
-
actionpack (= 4.2.11)
|
176
|
-
activesupport (= 4.2.11)
|
177
|
+
rails-html-sanitizer (1.3.0)
|
178
|
+
loofah (~> 2.3)
|
179
|
+
railties (4.2.11.1)
|
180
|
+
actionpack (= 4.2.11.1)
|
181
|
+
activesupport (= 4.2.11.1)
|
177
182
|
rake (>= 0.8.7)
|
178
183
|
thor (>= 0.18.1, < 2.0)
|
179
184
|
rake (10.5.0)
|
@@ -182,8 +187,8 @@ GEM
|
|
182
187
|
activerecord (>= 3.0, < 5.2)
|
183
188
|
activesupport (>= 3.0, < 5.2)
|
184
189
|
i18n
|
185
|
-
rb-fsevent (0.10.
|
186
|
-
rb-inotify (0.10.
|
190
|
+
rb-fsevent (0.10.4)
|
191
|
+
rb-inotify (0.10.1)
|
187
192
|
ffi (~> 1.0)
|
188
193
|
request_store (1.4.1)
|
189
194
|
rack (>= 1.4)
|
@@ -216,6 +221,14 @@ GEM
|
|
216
221
|
sass-listen (4.0.0)
|
217
222
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
218
223
|
rb-inotify (~> 0.9, >= 0.9.7)
|
224
|
+
sassc (2.2.1)
|
225
|
+
ffi (~> 1.9)
|
226
|
+
sassc-rails (2.1.2)
|
227
|
+
railties (>= 4.0.0)
|
228
|
+
sassc (>= 2.0)
|
229
|
+
sprockets (> 3.0)
|
230
|
+
sprockets-rails
|
231
|
+
tilt
|
219
232
|
selectize-rails (0.12.6)
|
220
233
|
simplecov (0.11.1)
|
221
234
|
docile (~> 1.1.0)
|
@@ -233,9 +246,10 @@ GEM
|
|
233
246
|
temping (3.3.0)
|
234
247
|
activerecord (>= 3.1)
|
235
248
|
activesupport (>= 3.1)
|
236
|
-
thor (0.
|
249
|
+
thor (1.0.1)
|
237
250
|
thread_safe (0.3.6)
|
238
|
-
|
251
|
+
tilt (2.0.10)
|
252
|
+
tzinfo (1.2.6)
|
239
253
|
thread_safe (~> 0.1)
|
240
254
|
websocket-driver (0.6.4)
|
241
255
|
websocket-extensions (>= 0.1.0)
|
@@ -257,9 +271,11 @@ DEPENDENCIES
|
|
257
271
|
launchy (~> 2.4.3)
|
258
272
|
phantomjs (~> 2.1.1)
|
259
273
|
poltergeist (~> 1.10.0)
|
274
|
+
pry
|
260
275
|
rake (~> 10.0)
|
261
276
|
rspec (~> 3.3, >= 3.3.0)
|
262
277
|
rspec-rails (~> 3.3)
|
278
|
+
sassc-rails
|
263
279
|
selectize-rails (>= 0.11.2)
|
264
280
|
sqlite3 (~> 1.3, >= 1.3.11)
|
265
281
|
temping (~> 3.3, >= 3.3.0)
|
data/README.md
CHANGED
@@ -96,6 +96,24 @@ You can use next parameters in `data` hash:
|
|
96
96
|
* `static_ransack` - hash of ransack predicates which will be applied statically and independently from current input field value
|
97
97
|
* `min_chars_count_to_request` - minimal count of chars in the input field to make an AJAX request
|
98
98
|
|
99
|
+
### Filter by belongs_to relation fields
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
class Patient < ApplicationRecord
|
103
|
+
belongs_to :user
|
104
|
+
# ...
|
105
|
+
end
|
106
|
+
|
107
|
+
f.input :patient, as: :ajax_select, collection: [], data: {
|
108
|
+
display_fields: ['id', 'user.name'],
|
109
|
+
search_fields: ['user.name'],
|
110
|
+
ordering: 'id ASC',
|
111
|
+
url: :filter_admin_patients_path
|
112
|
+
}
|
113
|
+
```
|
114
|
+
Ordering by related fields doesn't work, e.g. this will not work: `ordering: 'user.name ASC'`
|
115
|
+
|
116
|
+
|
99
117
|
## Caveats
|
100
118
|
|
101
119
|
### Ransack _cont on Integer column
|
@@ -24,6 +24,7 @@ Gem::Specification.new do |gem|
|
|
24
24
|
gem.add_dependency 'coffee-rails', '>= 4.1.0'
|
25
25
|
gem.add_dependency 'selectize-rails', '>= 0.12.6'
|
26
26
|
gem.add_dependency 'has_scope', '>= 0.6.0' # Force Ruby 2.1.5 support
|
27
|
+
gem.add_development_dependency 'sassc-rails'
|
27
28
|
gem.add_development_dependency 'bundler', '~> 1.10'
|
28
29
|
gem.add_development_dependency 'rake', '~> 10.0'
|
29
30
|
gem.add_development_dependency 'rspec', '~> 3.3', '>= 3.3.0'
|
@@ -38,4 +39,5 @@ Gem::Specification.new do |gem|
|
|
38
39
|
gem.add_development_dependency 'selectize-rails', '>= 0.11.2'
|
39
40
|
gem.add_development_dependency 'database_cleaner', '~> 1.5.0'
|
40
41
|
gem.add_development_dependency 'launchy', '~> 2.4.3'
|
42
|
+
gem.add_development_dependency 'pry'
|
41
43
|
end
|
@@ -30,6 +30,7 @@ $ ->
|
|
30
30
|
q: q
|
31
31
|
limit: select.data('limit')
|
32
32
|
order: ordering
|
33
|
+
searchFields: searchFields
|
33
34
|
error: ->
|
34
35
|
callback()
|
35
36
|
success: (res) ->
|
@@ -87,16 +88,17 @@ $ ->
|
|
87
88
|
onInitialize: ->
|
88
89
|
selectize = this
|
89
90
|
selectedValue = select.data('selected-value')
|
90
|
-
selectedRansack = "#{valueField}
|
91
|
+
selectedRansack = "#{valueField}_in"
|
91
92
|
|
92
93
|
if selectedValue
|
93
94
|
q = {}
|
94
|
-
q[selectedRansack] = selectedValue
|
95
|
+
q[selectedRansack] = String(selectedValue).split(' ')
|
95
96
|
|
96
97
|
loadOptions(q, (res)->
|
97
98
|
if res && res.length
|
98
|
-
|
99
|
-
|
99
|
+
for item in res
|
100
|
+
selectize.addOption(item)
|
101
|
+
selectize.addItem(item[valueField])
|
100
102
|
)
|
101
103
|
|
102
104
|
ajaxFields.forEach (field) ->
|
@@ -14,10 +14,32 @@ module ActiveAdmin
|
|
14
14
|
def included(dsl)
|
15
15
|
dsl.instance_eval do
|
16
16
|
collection_action :filter, method: :get do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
scope = find_collection(except: [:pagination, :collection_decorator])
|
18
|
+
.order(params[:order])
|
19
|
+
.limit(params[:limit] || 10)
|
20
|
+
.distinct
|
21
|
+
|
22
|
+
search_fields = Array(params[:searchFields])
|
23
|
+
|
24
|
+
related_table_search_fields = search_fields
|
25
|
+
.select { |f| f.include?('.') }
|
26
|
+
.map { |f| f.split('.') }
|
27
|
+
|
28
|
+
related_table_search_fields.each do |related_table, _|
|
29
|
+
scope = scope.preload(related_table)
|
30
|
+
end
|
31
|
+
|
32
|
+
res = apply_collection_decorator(scope).map do |item|
|
33
|
+
item_json = item.as_json
|
34
|
+
|
35
|
+
related_table_search_fields.each do |related_table, search_field|
|
36
|
+
item_json[related_table + '.' + search_field] = item.send(related_table).send(search_field)
|
37
|
+
end
|
38
|
+
|
39
|
+
item_json
|
40
|
+
end
|
41
|
+
|
42
|
+
render plain: res.to_json
|
21
43
|
end
|
22
44
|
end
|
23
45
|
end
|
@@ -40,7 +40,7 @@ module ActiveAdmin
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def display_fields
|
43
|
-
ajax_data[:display_fields] || search_fields
|
43
|
+
ajax_data[:display_fields] || search_fields.take(1)
|
44
44
|
end
|
45
45
|
|
46
46
|
def search_fields
|
@@ -52,11 +52,11 @@ module ActiveAdmin
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def ordering
|
55
|
-
ajax_data[:ordering] || "#{
|
55
|
+
ajax_data[:ordering] || "#{display_fields.first} ASC"
|
56
56
|
end
|
57
57
|
|
58
58
|
def ransack
|
59
|
-
ajax_data[:ransack] || "#{search_fields.join('_or_')}_cont"
|
59
|
+
ajax_data[:ransack] || "#{ransackify(search_fields).join('_or_')}_cont"
|
60
60
|
end
|
61
61
|
|
62
62
|
def static_ransack
|
@@ -67,6 +67,11 @@ module ActiveAdmin
|
|
67
67
|
ajax_data[:min_chars_count_to_request] || 1
|
68
68
|
end
|
69
69
|
|
70
|
+
def ransackify(field_names)
|
71
|
+
# Map fields refer to related tables user.name -> user_name
|
72
|
+
field_names.map { |f| f.to_s.sub('.', '_') }
|
73
|
+
end
|
74
|
+
|
70
75
|
def url
|
71
76
|
case (url = ajax_data[:url])
|
72
77
|
when nil then "#{method.to_s.pluralize}/filter"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activeadmin-ajax_filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Emelyanov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activeadmin
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.6.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: sassc-rails
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: bundler
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -294,6 +308,20 @@ dependencies:
|
|
294
308
|
- - "~>"
|
295
309
|
- !ruby/object:Gem::Version
|
296
310
|
version: 2.4.3
|
311
|
+
- !ruby/object:Gem::Dependency
|
312
|
+
name: pry
|
313
|
+
requirement: !ruby/object:Gem::Requirement
|
314
|
+
requirements:
|
315
|
+
- - ">="
|
316
|
+
- !ruby/object:Gem::Version
|
317
|
+
version: '0'
|
318
|
+
type: :development
|
319
|
+
prerelease: false
|
320
|
+
version_requirements: !ruby/object:Gem::Requirement
|
321
|
+
requirements:
|
322
|
+
- - ">="
|
323
|
+
- !ruby/object:Gem::Version
|
324
|
+
version: '0'
|
297
325
|
description: Allows to define form inputs and filters by relation for ActiveAdmin
|
298
326
|
resource pages using Ransacker to dynamicaly load items while user is typing symbols
|
299
327
|
in filter
|
@@ -344,7 +372,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
344
372
|
- !ruby/object:Gem::Version
|
345
373
|
version: '0'
|
346
374
|
requirements: []
|
347
|
-
rubygems_version: 3.0.
|
375
|
+
rubygems_version: 3.0.3
|
348
376
|
signing_key:
|
349
377
|
specification_version: 4
|
350
378
|
summary: AJAX filters for ActiveAdmin
|