activeadmin-ajax_filter 0.2.2 → 0.3.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 +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
|