activeadmin-ajax_filter 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -0
- data/app/assets/javascripts/activeadmin-ajax_filter.js.coffee +26 -2
- data/app/assets/stylesheets/activeadmin-ajax_filter.css +20 -0
- data/lib/active_admin/ajax_filter.rb +2 -0
- data/lib/active_admin/ajax_filter/version.rb +1 -1
- data/lib/active_admin/inputs/ajax_core.rb +71 -0
- data/lib/active_admin/inputs/ajax_select_input.rb +7 -0
- data/lib/active_admin/inputs/filters/ajax_select_input.rb +1 -51
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63324cc53660dfec34a886466480f787eb108d04
|
4
|
+
data.tar.gz: 1abc7df986952ceadf6e36ef10d8bc62dde92744
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 931319352afd8da9f10b6778d857d48afeaf9f82bf11669704a28eb968e72e2ed999848db9334bddf4c6eafaed985d665eabfd7d29e95397601e0bb32e02911f
|
7
|
+
data.tar.gz: 0dd71b339caa76438d8b327b52e655109a3d3be66ed9391de088346565d4535dd36f478c0e4c3b0843ac426360ffcdf6b37163b7b0b8750c3a7341869e58a735
|
data/README.md
CHANGED
@@ -54,10 +54,20 @@ ActiveAdmin.register User do
|
|
54
54
|
end
|
55
55
|
|
56
56
|
# Main resource
|
57
|
+
# As a filter
|
57
58
|
ActiveAdmin.register Invoice do
|
58
59
|
filter :user, as: :ajax_select, data: { search_fields: [:email, :customer_uid], limit: 7 }
|
59
60
|
# ...
|
60
61
|
end
|
62
|
+
|
63
|
+
# As a form input
|
64
|
+
ActiveAdmin.register Invoice do
|
65
|
+
form do |f|
|
66
|
+
f.input :language # used by ajax_search_fields
|
67
|
+
f.input :user, as: :ajax_select, data: { search_fields: [:name], static_ransack: { active_eq: true }, ajax_search_fields: [:language_id] }
|
68
|
+
# ...
|
69
|
+
end
|
70
|
+
end
|
61
71
|
```
|
62
72
|
|
63
73
|
You can use next parameters in `data` hash:
|
@@ -68,6 +78,8 @@ You can use next parameters in `data` hash:
|
|
68
78
|
* `ordering` - sort string like `email ASC, customer_uid DESC`, by default it uses first value of `search_fields` with `ASC` direction
|
69
79
|
* `ransack` - ransack query which will be applied, by default it's builded from `search_fields` with `or` and `contains` clauses, e.g.: `email_or_customer_uid_cont`
|
70
80
|
* `url` - url for AJAX query by default is builded from field name
|
81
|
+
* `ajax_search_fields` - array of field names. `ajax_select` input depends on `ajax_search_fields` values: e.g. you can scope user by languages.
|
82
|
+
* `static_ransack` - hash of ransack predicates which will be applied statically and independently from current input field value
|
71
83
|
|
72
84
|
## Development
|
73
85
|
|
@@ -1,8 +1,16 @@
|
|
1
1
|
$ ->
|
2
|
-
$('.filter_ajax_select select').each (_, select) ->
|
2
|
+
$('.filter_ajax_select select, .ajax_select select').each (_, select) ->
|
3
3
|
select = $(select)
|
4
4
|
valueField = select.data('value-field')
|
5
5
|
searchFields = select.data('search-fields').split(' ')
|
6
|
+
staticRansack = select.data('static-ransack')
|
7
|
+
|
8
|
+
ajaxFields = select.data('ajax-search-fields')
|
9
|
+
if ajaxFields
|
10
|
+
ajaxFields = ajaxFields.split(' ')
|
11
|
+
else
|
12
|
+
ajaxFields = []
|
13
|
+
|
6
14
|
ordering = select.data('ordering')
|
7
15
|
url = select.data('url')
|
8
16
|
|
@@ -20,6 +28,9 @@ $ ->
|
|
20
28
|
success: (res) ->
|
21
29
|
callback(res)
|
22
30
|
|
31
|
+
relatedInput = (field) ->
|
32
|
+
$("[name*=#{field}]", select.parents('form'))
|
33
|
+
|
23
34
|
select.selectize
|
24
35
|
valueField: valueField
|
25
36
|
labelField: searchFields[0]
|
@@ -47,6 +58,15 @@ $ ->
|
|
47
58
|
if query.length
|
48
59
|
q = {}
|
49
60
|
q[select.data('ransack')] = query
|
61
|
+
|
62
|
+
ajaxFields.forEach (field) ->
|
63
|
+
q["#{field}_eq"] = relatedInput(field).val()
|
64
|
+
# clear cache because it wrong with changing values of ajaxFields
|
65
|
+
select.loadedSearches = {}
|
66
|
+
|
67
|
+
for ransack, value of staticRansack
|
68
|
+
q[ransack] = value
|
69
|
+
|
50
70
|
loadOptions(q, callback)
|
51
71
|
else
|
52
72
|
callback()
|
@@ -64,4 +84,8 @@ $ ->
|
|
64
84
|
if res.length
|
65
85
|
selectize.addOption(res[0])
|
66
86
|
selectize.addItem(res[0][valueField])
|
67
|
-
)
|
87
|
+
)
|
88
|
+
|
89
|
+
ajaxFields.forEach (field) ->
|
90
|
+
relatedInput(field).change ->
|
91
|
+
selectize.clearOptions()
|
@@ -10,4 +10,24 @@
|
|
10
10
|
.primary, .secondary {
|
11
11
|
display: block;
|
12
12
|
}
|
13
|
+
}
|
14
|
+
|
15
|
+
.ajax_select {
|
16
|
+
.selectize-input {
|
17
|
+
width: 70%;
|
18
|
+
}
|
19
|
+
|
20
|
+
.selectize-dropdown {
|
21
|
+
.item {
|
22
|
+
border-bottom: light-gray 1px solid;
|
23
|
+
}
|
24
|
+
|
25
|
+
.primary {
|
26
|
+
font-weight: bold;
|
27
|
+
}
|
28
|
+
|
29
|
+
.primary, .secondary {
|
30
|
+
display: block;
|
31
|
+
}
|
32
|
+
}
|
13
33
|
}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'active_admin'
|
2
2
|
require 'active_admin/ajax_filter/engine'
|
3
3
|
require 'active_admin/ajax_filter/version'
|
4
|
+
require 'active_admin/inputs/ajax_core'
|
5
|
+
require 'active_admin/inputs/ajax_select_input'
|
4
6
|
require 'active_admin/inputs/filters/ajax_select_input'
|
5
7
|
|
6
8
|
module ActiveAdmin
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module Inputs
|
3
|
+
module AjaxCore
|
4
|
+
DEFAULT_LIMIT = 5
|
5
|
+
|
6
|
+
def pluck_column
|
7
|
+
klass.reorder("#{method} asc").limit(collection_limit).uniq.pluck(method)
|
8
|
+
end
|
9
|
+
|
10
|
+
# def collection_from_association
|
11
|
+
# super.limit(collection_limit)
|
12
|
+
# end
|
13
|
+
|
14
|
+
def input_html_options
|
15
|
+
super.merge(
|
16
|
+
'data-limit' => collection_limit,
|
17
|
+
'data-value-field' => value_field,
|
18
|
+
'data-search-fields' => search_fields,
|
19
|
+
'data-ajax-search-fields' => ajax_search_fields,
|
20
|
+
'data-ordering' => ordering,
|
21
|
+
'data-ransack' => ransack,
|
22
|
+
'data-static-ransack' => static_ransack,
|
23
|
+
'data-selected-value' => selected_value,
|
24
|
+
'data-url' => url,
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def ajax_data
|
29
|
+
options[:data] || {}
|
30
|
+
end
|
31
|
+
|
32
|
+
def collection_limit
|
33
|
+
ajax_data[:limit] || DEFAULT_LIMIT
|
34
|
+
end
|
35
|
+
|
36
|
+
def value_field
|
37
|
+
ajax_data[:value_field] || :id
|
38
|
+
end
|
39
|
+
|
40
|
+
def search_fields
|
41
|
+
ajax_data[:search_fields] || raise(ArgumentError, 'search_fields in required')
|
42
|
+
end
|
43
|
+
|
44
|
+
def ajax_search_fields
|
45
|
+
ajax_data[:ajax_search_fields]
|
46
|
+
end
|
47
|
+
|
48
|
+
def ordering
|
49
|
+
ajax_data[:ordering] || "#{search_fields.first} ASC"
|
50
|
+
end
|
51
|
+
|
52
|
+
def ransack
|
53
|
+
ajax_data[:ransack] || "#{search_fields.join('_or_')}_cont"
|
54
|
+
end
|
55
|
+
|
56
|
+
def static_ransack
|
57
|
+
ajax_data.fetch(:static_ransack, {}).to_json
|
58
|
+
end
|
59
|
+
|
60
|
+
def url
|
61
|
+
ajax_data[:url] || "#{method.to_s.pluralize}/filter"
|
62
|
+
end
|
63
|
+
|
64
|
+
def selected_value
|
65
|
+
if @object
|
66
|
+
@object.try(:send, input_name)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -2,61 +2,11 @@ module ActiveAdmin
|
|
2
2
|
module Inputs
|
3
3
|
module Filters
|
4
4
|
class AjaxSelectInput < SelectInput
|
5
|
-
|
6
|
-
|
7
|
-
def pluck_column
|
8
|
-
klass.reorder("#{method} asc").limit(collection_limit).uniq.pluck(method)
|
9
|
-
end
|
5
|
+
include ActiveAdmin::Inputs::AjaxCore
|
10
6
|
|
11
7
|
def collection_from_association
|
12
8
|
super.limit(collection_limit)
|
13
9
|
end
|
14
|
-
|
15
|
-
def input_html_options
|
16
|
-
super.merge(
|
17
|
-
'data-limit' => collection_limit,
|
18
|
-
'data-value-field' => value_field,
|
19
|
-
'data-search-fields' => search_fields,
|
20
|
-
'data-ordering' => ordering,
|
21
|
-
'data-ransack' => ransack,
|
22
|
-
'data-selected-value' => selected_value,
|
23
|
-
'data-url' => url,
|
24
|
-
)
|
25
|
-
end
|
26
|
-
|
27
|
-
def ajax_data
|
28
|
-
options[:data] || {}
|
29
|
-
end
|
30
|
-
|
31
|
-
def collection_limit
|
32
|
-
ajax_data[:limit] || DEFAULT_LIMIT
|
33
|
-
end
|
34
|
-
|
35
|
-
def value_field
|
36
|
-
ajax_data[:value_field] || :id
|
37
|
-
end
|
38
|
-
|
39
|
-
def search_fields
|
40
|
-
ajax_data[:search_fields] || raise(ArgumentError, 'search_fields in required')
|
41
|
-
end
|
42
|
-
|
43
|
-
def ordering
|
44
|
-
ajax_data[:ordering] || "#{search_fields.first} ASC"
|
45
|
-
end
|
46
|
-
|
47
|
-
def ransack
|
48
|
-
ajax_data[:ransack] || "#{search_fields.join('_or_')}_cont"
|
49
|
-
end
|
50
|
-
|
51
|
-
def url
|
52
|
-
ajax_data[:url] || "#{method.to_s.pluralize}/filter"
|
53
|
-
end
|
54
|
-
|
55
|
-
def selected_value
|
56
|
-
if @object
|
57
|
-
@object.try(:send, input_name)
|
58
|
-
end
|
59
|
-
end
|
60
10
|
end
|
61
11
|
end
|
62
12
|
end
|
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
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Emelyanov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activeadmin
|
@@ -178,6 +178,8 @@ files:
|
|
178
178
|
- lib/active_admin/ajax_filter.rb
|
179
179
|
- lib/active_admin/ajax_filter/engine.rb
|
180
180
|
- lib/active_admin/ajax_filter/version.rb
|
181
|
+
- lib/active_admin/inputs/ajax_core.rb
|
182
|
+
- lib/active_admin/inputs/ajax_select_input.rb
|
181
183
|
- lib/active_admin/inputs/filters/ajax_select_input.rb
|
182
184
|
- lib/activeadmin-ajax_filter.rb
|
183
185
|
homepage: https://github.com/holyketzer/activeadmin-ajax_filter
|