activeadmin-searchable_select 1.0.0 → 1.2.1

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
- SHA1:
3
- metadata.gz: e45366aab36050f1bacd26cf7c7e083f73366337
4
- data.tar.gz: 41b977d5f33c903293d2cccccfcabf2de910c71a
2
+ SHA256:
3
+ metadata.gz: 0f06a7e42bdf09260f9581eb93b9b53254410068c9f0748d958621b75b47a1d9
4
+ data.tar.gz: 7a735aed9e7a2bd6da9c7702407a318dd0740f1b3d519bf220513163ddf848a9
5
5
  SHA512:
6
- metadata.gz: 48d3f353accca041a2bc5d533cc8574d6f895f7b04fca7354b5d10e6fc73c3ae276b555ed031ea8226bcfc0a68f70c49657f737df9c51fb0f6f316700d34c2a4
7
- data.tar.gz: 1114951d8895a4a25a1e56162d099c9fc60592241ec79b9ee8c573fed3db93e427b3137f41d555c3a658eef3f0df6cecf2a3f4034e8102a8a4280cfa97336a8e
6
+ metadata.gz: 10cf476611bc7d46a2c39d8db812c1638de6d4484e6cd522962ab951a97ffb1353fc23313df5bf47cbb417176f0d3df9bb2de5557f5e7f33d650df4e27366bcb
7
+ data.tar.gz: 2bb155897e057ca7c073677cc232ccfdde3c761e463ee261382fed82f020921fa2b80e26a10dd8494650b21b0d1b0696934762a9f9e2d817d0f79a4bc9274dad
@@ -10,7 +10,8 @@ cache:
10
10
 
11
11
  gemfile:
12
12
  - gemfiles/rails_4.2_active_admin_1.0.0.pre4.gemfile
13
- - gemfiles/rails_5.1_active_admin_1.0.gemfile
14
- - gemfiles/rails_5.1_active_admin_1.1.gemfile
13
+ - gemfiles/rails_5.1_active_admin_1.x.gemfile
14
+ - gemfiles/rails_5.x_active_admin_1.x.gemfile
15
+ - gemfiles/rails_5.x_active_admin_2.x.gemfile
15
16
 
16
17
  script: bundle exec rspec
data/Appraisals CHANGED
@@ -2,14 +2,20 @@ appraise 'rails-4.2-active-admin-1.0.0.pre4' do
2
2
  gem 'rails', '~> 4.2'
3
3
  gem 'activeadmin', '1.0.0.pre4'
4
4
  gem 'jquery-ui-rails', '~> 5.0'
5
+ gem 'sqlite3', '~> 1.3.6'
5
6
  end
6
7
 
7
- appraise 'rails-5.1-active-admin-1.0' do
8
- gem 'rails', '~> 5.1'
8
+ appraise 'rails-5.1-active-admin-1.x' do
9
+ gem 'rails', '~> 5.1.0'
9
10
  gem 'activeadmin', '~> 1.0'
10
11
  end
11
12
 
12
- appraise 'rails-5.1-active-admin-1.1' do
13
- gem 'rails', '~> 5.1'
14
- gem 'activeadmin', '~> 1.1'
13
+ appraise 'rails-5.x-active-admin-1.x' do
14
+ gem 'rails', '~> 5.2'
15
+ gem 'activeadmin', '~> 1.0'
15
16
  end
17
+
18
+ appraise 'rails-5.x-active-admin-2.x' do
19
+ gem 'rails', '~> 5.2'
20
+ gem 'activeadmin', '~> 2.0'
21
+ end
@@ -1,7 +1,25 @@
1
1
  # CHANGELOG
2
2
 
3
- ### Version 1.0.0
3
+ ### Version 1.2.1
4
4
 
5
- 2017-10-23
5
+ 2020-12-08
6
6
 
7
- - Initial release.
7
+ [Compare changes](https://github.com/codevise/activeadmin-searchable_select/compare/v1.2.0...v1.2.1)
8
+
9
+ - Fix ajax url when active admin namespace is set to false
10
+ ([#22](https://github.com/codevise/activeadmin-searchable_select/pull/22))
11
+
12
+ ### Version 1.2.0
13
+
14
+ 2019-05-10
15
+
16
+ [Compare changes](https://github.com/codevise/activeadmin-searchable_select/compare/1-1-stable...v1.2.0)
17
+
18
+ - Add support for Active Admin 2.0
19
+ ([#13](https://github.com/codevise/activeadmin-searchable_select/pull/13))
20
+ - Improve Appraisal setup
21
+ ([#12](https://github.com/codevise/activeadmin-searchable_select/pull/12))
22
+
23
+ See
24
+ [1-1-stable branch](https://github.com/codevise/activeadmin-searchable_select/blob/1-1-stable/CHANGELOG.md)
25
+ for previous changes.
data/Gemfile CHANGED
@@ -1,3 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ # Required for select2-rails to work with Active Admin 1.1
4
+ # see https://github.com/activeadmin/activeadmin/issues/5226
5
+ gem 'sass-rails'
6
+
3
7
  gemspec
data/README.md CHANGED
@@ -23,8 +23,8 @@ Import stylesheets and require javascripts:
23
23
  ```
24
24
 
25
25
  ```coffee
26
- # active_admin.js.coffee
27
- #= require active_admin/searchable_select
26
+ // active_admin.js
27
+ //= require active_admin/searchable_select
28
28
  ```
29
29
 
30
30
  ## Usage
@@ -50,6 +50,15 @@ This also works for filters:
50
50
  end
51
51
  ```
52
52
 
53
+ By default, you can only select one at a time for a filter. You can
54
+ specify a multi-select with:
55
+
56
+ ```ruby
57
+ ActiveAdmin.register Product do
58
+ filter(:category, as: :searchable_select, multiple: true)
59
+ end
60
+ ```
61
+
53
62
  ### Fetching Options via Ajax
54
63
 
55
64
  For large collections, rendering the whole set of options can be to
@@ -138,7 +147,7 @@ based on the input attribute name, you can pass an object with a
138
147
  end
139
148
  ```
140
149
 
141
- #### Mutlple Options Endpoints per Resource
150
+ #### Multiple Options Endpoints per Resource
142
151
 
143
152
  A single ActiveAdmin resource can define multiple options endpoints:
144
153
 
@@ -167,6 +176,23 @@ To specify which collection to use, pass an object with a
167
176
  end
168
177
  ```
169
178
 
179
+ #### Querying Multiple Attributes
180
+
181
+ ActiveAdmin Searchable Select querying is performed by Ransack. As such, you can
182
+ build your query in a way that it can query multiple attributes at once.
183
+
184
+ ```ruby
185
+ ActiveAdmin.register User do
186
+ searchable_select_options(scope: User.all,
187
+ text_attribute: :username,
188
+ filter: lambda do |term, scope|
189
+ scope.ransack(email_or_username_cont: term).result
190
+ end)
191
+ end
192
+ ```
193
+
194
+ In this example, the `all` scope will query `email OR username`.
195
+
170
196
  #### Passing Parameters
171
197
 
172
198
  You can pass additional parameters to the options endpoint:
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  lib = File.expand_path('../lib', __FILE__)
4
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
3
  require 'activeadmin/searchable_select/version'
@@ -22,7 +20,7 @@ Gem::Specification.new do |spec|
22
20
  spec.add_development_dependency 'rake'
23
21
  spec.add_development_dependency 'appraisal', '~> 2.2'
24
22
  spec.add_development_dependency 'rspec-rails', '~> 3.6'
25
- spec.add_development_dependency 'combustion', '~> 0.7.0'
23
+ spec.add_development_dependency 'combustion', '~> 1.0'
26
24
  spec.add_development_dependency 'database_cleaner', '~> 1.6'
27
25
  spec.add_development_dependency 'sqlite3', '~> 1.3'
28
26
  spec.add_development_dependency 'capybara', '~> 2.15'
@@ -31,7 +29,7 @@ Gem::Specification.new do |spec|
31
29
  spec.add_development_dependency 'semmy', '~> 1.0'
32
30
  spec.add_development_dependency 'rails'
33
31
 
34
- spec.add_runtime_dependency 'activeadmin', '~> 1.x'
32
+ spec.add_runtime_dependency 'activeadmin', ['>= 1.x', '< 3']
35
33
  spec.add_runtime_dependency 'jquery-rails', ['>= 3.0', '< 5']
36
34
  spec.add_runtime_dependency 'select2-rails', '~> 4.0'
37
35
  end
@@ -0,0 +1,3 @@
1
+ //= require select2
2
+
3
+ //= require_tree ./searchable_select
@@ -0,0 +1,46 @@
1
+ (function() {
2
+ function initSearchableSelects(inputs, extra) {
3
+ inputs.each(function() {
4
+ var item = $(this);
5
+
6
+ // reading from data allows <input data-searchable_select='{"tags": ['some']}'>
7
+ // to be passed to select2
8
+ var options = $.extend(extra || {}, item.data('searchableSelect'));
9
+ var url = item.data('ajaxUrl');
10
+
11
+ if (url) {
12
+ $.extend(options, {
13
+ ajax: {
14
+ url: url,
15
+ dataType: 'json',
16
+
17
+ data: function (params) {
18
+ return {
19
+ term: params.term,
20
+ page: pageParamWithBaseZero(params)
21
+ };
22
+ }
23
+ }
24
+ });
25
+ }
26
+
27
+ item.select2(options);
28
+ });
29
+ }
30
+
31
+ function pageParamWithBaseZero(params) {
32
+ return params.page ? params.page - 1 : undefined;
33
+ }
34
+
35
+ $(document).on('has_many_add:after', '.has_many_container', function(e, fieldset) {
36
+ initSearchableSelects(fieldset.find('.searchable-select-input'));
37
+ });
38
+
39
+ $(document).on('page:load turbolinks:load', function() {
40
+ initSearchableSelects($(".searchable-select-input"), {placeholder: ""});
41
+ });
42
+
43
+ $(function() {
44
+ initSearchableSelects($(".searchable-select-input"));
45
+ });
46
+ }());
@@ -2,8 +2,10 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "sass-rails"
5
6
  gem "rails", "~> 4.2"
6
7
  gem "activeadmin", "1.0.0.pre4"
7
8
  gem "jquery-ui-rails", "~> 5.0"
9
+ gem "sqlite3", "~> 1.3.6"
8
10
 
9
11
  gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sass-rails"
6
+ gem "rails", "~> 5.1.0"
7
+ gem "activeadmin", "~> 1.0"
8
+
9
+ gemspec path: "../"
@@ -2,7 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 5.1"
5
+ gem "sass-rails"
6
+ gem "rails", "~> 5.2"
6
7
  gem "activeadmin", "~> 1.0"
7
8
 
8
9
  gemspec path: "../"
@@ -2,7 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rails", "~> 5.1"
6
- gem "activeadmin", "~> 1.1"
5
+ gem "sass-rails"
6
+ gem "rails", "~> 5.2"
7
+ gem "activeadmin", "~> 2.0"
7
8
 
8
9
  gemspec path: "../"
@@ -45,7 +45,7 @@ module ActiveAdmin
45
45
 
46
46
  def ajax_url
47
47
  return unless options[:ajax]
48
- template.polymorphic_path([:admin, ajax_resource_class],
48
+ template.polymorphic_path([template.active_admin_namespace.route_prefix, ajax_resource_class],
49
49
  action: option_collection.collection_action_name,
50
50
  **ajax_params)
51
51
  end
@@ -57,23 +57,23 @@ module ActiveAdmin
57
57
  end
58
58
 
59
59
  def selected_value_collection
60
- [selected_value_option].compact
61
- end
62
-
63
- def selected_value_option
64
- option_for_record(selected_record) if selected_record
60
+ selected_records.collect { |s| option_for_record(s) }
65
61
  end
66
62
 
67
63
  def option_for_record(record)
68
64
  [option_collection.display_text(record), record.id]
69
65
  end
70
66
 
71
- def selected_record
72
- @selected_record ||=
73
- selected_value && option_collection_scope.find_by_id(selected_value)
67
+ def selected_records
68
+ @selected_records ||=
69
+ if selected_values
70
+ option_collection_scope.where(id: selected_values)
71
+ else
72
+ []
73
+ end
74
74
  end
75
75
 
76
- def selected_value
76
+ def selected_values
77
77
  @object.send(input_name) if @object
78
78
  end
79
79
 
@@ -1,5 +1,5 @@
1
1
  module ActiveAdmin
2
2
  module SearchableSelect
3
- VERSION = '1.0.0'.freeze
3
+ VERSION = '1.2.1'.freeze
4
4
  end
5
5
  end
@@ -24,35 +24,42 @@ RSpec.describe 'end to end', type: :feature, js: true do
24
24
  end
25
25
 
26
26
  describe 'index page with searchable select filter' do
27
- before(:each) do
28
- music_category = Category.create(name: 'Music')
29
- travel_category = Category.create(name: 'Travel')
30
-
31
- Post.create(title: 'Best songs',
32
- category: music_category)
33
- Post.create(title: 'Best places',
34
- category: travel_category)
35
- end
36
-
37
27
  it 'loads filter input options' do
28
+ Category.create(name: 'Music')
29
+ Category.create(name: 'Travel')
30
+
38
31
  visit '/admin/posts'
39
32
 
40
33
  expand_select_box
34
+ wait_for_ajax
41
35
 
42
36
  expect(select_box_items).to eq(%w(Music Travel))
43
37
  end
44
38
 
45
39
  it 'allows filtering options by term' do
40
+ Category.create(name: 'Music')
41
+ Category.create(name: 'Travel')
42
+
46
43
  visit '/admin/posts'
47
44
 
48
45
  expand_select_box
49
-
50
- wait_for_ajax do
51
- enter_search_term('T')
52
- end
46
+ enter_search_term('T')
47
+ wait_for_ajax
53
48
 
54
49
  expect(select_box_items).to eq(%w(Travel))
55
50
  end
51
+
52
+ it 'loads more items when scrolling down' do
53
+ 15.times { |i| Category.create(name: "Category #{i}") }
54
+ visit '/admin/posts'
55
+
56
+ expand_select_box
57
+ wait_for_ajax
58
+ scroll_select_box_list
59
+ wait_for_ajax
60
+
61
+ expect(select_box_items.size).to eq(15)
62
+ end
56
63
  end
57
64
 
58
65
  def expand_select_box
@@ -63,21 +70,22 @@ RSpec.describe 'end to end', type: :feature, js: true do
63
70
  find('.select2-dropdown input').send_keys(term)
64
71
  end
65
72
 
73
+ def scroll_select_box_list
74
+ page.execute_script '$(".select2-container ul").scrollTop(1000)'
75
+ end
76
+
66
77
  def select_box_items
67
78
  all('.select2-dropdown li').map(&:text)
68
79
  end
69
80
 
70
- def wait_for_ajax(count = 1)
71
- page.execute_script 'window._ajaxCalls = 0'
72
- page.execute_script 'window._ajaxCompleteCounter = function() { window._ajaxCalls += 1; }'
73
- page.execute_script '$(document).ajaxComplete(window._ajaxCompleteCounter)'
74
-
75
- yield
76
-
77
- sleep(0.5) until finished_all_ajax_requests?(count)
81
+ def wait_for_ajax
82
+ Timeout.timeout(Capybara.default_max_wait_time) do
83
+ sleep 0.1
84
+ loop until finished_all_ajax_requests?
85
+ end
78
86
  end
79
87
 
80
- def finished_all_ajax_requests?(count)
81
- page.evaluate_script('window._ajaxCalls') == count
88
+ def finished_all_ajax_requests?
89
+ page.evaluate_script('jQuery.active').zero?
82
90
  end
83
91
  end
@@ -188,4 +188,54 @@ RSpec.describe 'filter input', type: :request do
188
188
  text: 'Travel')
189
189
  end
190
190
  end
191
+
192
+ describe 'with the multiple option set to true' do
193
+ before(:each) do
194
+ ActiveAdminHelpers.setup do
195
+ ActiveAdmin.register(Category) do
196
+ searchable_select_options(scope: Category, text_attribute: :name)
197
+ end
198
+
199
+ ActiveAdmin.register(Post) do
200
+ filter(:category,
201
+ as: :searchable_select,
202
+ ajax: true,
203
+ multiple: true)
204
+ end
205
+ end
206
+ end
207
+
208
+ it 'renders select input with searchable-select-input css class and the multiple attribute' do
209
+ get '/admin/posts'
210
+
211
+ expect(response.body).to have_selector("select.searchable-select-input[multiple='multiple']")
212
+ end
213
+
214
+ it 'does not render options statically' do
215
+ Category.create!(name: 'Travel')
216
+
217
+ get '/admin/posts'
218
+
219
+ expect(response.body).not_to have_selector('.searchable-select-input option',
220
+ text: 'Travel')
221
+ end
222
+
223
+ it 'sets data-ajax-url attribute' do
224
+ get '/admin/posts'
225
+
226
+ expect(response.body).to have_selector('.searchable-select-input[data-ajax-url]')
227
+ end
228
+
229
+ it 'renders the filter for multiple values selected' do
230
+ category1 = Category.create!(name: 'Travel')
231
+ category2 = Category.create!(name: 'Leisure')
232
+
233
+ get "/admin/posts?q[category_id_in][]=#{category1.id}&q[category_id_in][]=#{category2.id}"
234
+
235
+ expect(response.body).to have_selector('.searchable-select-input option[selected]',
236
+ text: 'Travel')
237
+ expect(response.body).to have_selector('.searchable-select-input option[selected]',
238
+ text: 'Leisure')
239
+ end
240
+ end
191
241
  end
@@ -1,2 +1,4 @@
1
1
  @import "active_admin/mixins";
2
2
  @import "active_admin/base";
3
+
4
+ @import "active_admin/searchable_select";
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeadmin-searchable_select
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Codevise Solutions Ltd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-23 00:00:00.000000000 Z
11
+ date: 2020-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.7.0
75
+ version: '1.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.7.0
82
+ version: '1.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: database_cleaner
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -182,16 +182,22 @@ dependencies:
182
182
  name: activeadmin
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - "~>"
185
+ - - ">="
186
186
  - !ruby/object:Gem::Version
187
187
  version: 1.x
188
+ - - "<"
189
+ - !ruby/object:Gem::Version
190
+ version: '3'
188
191
  type: :runtime
189
192
  prerelease: false
190
193
  version_requirements: !ruby/object:Gem::Requirement
191
194
  requirements:
192
- - - "~>"
195
+ - - ">="
193
196
  - !ruby/object:Gem::Version
194
197
  version: 1.x
198
+ - - "<"
199
+ - !ruby/object:Gem::Version
200
+ version: '3'
195
201
  - !ruby/object:Gem::Dependency
196
202
  name: jquery-rails
197
203
  requirement: !ruby/object:Gem::Requirement
@@ -244,13 +250,14 @@ files:
244
250
  - README.md
245
251
  - Rakefile
246
252
  - activeadmin-searchable_select.gemspec
247
- - app/assets/javascripts/active_admin/searchable_select.js.coffee
248
- - app/assets/javascripts/active_admin/searchable_select/init.js.coffee
253
+ - app/assets/javascripts/active_admin/searchable_select.js
254
+ - app/assets/javascripts/active_admin/searchable_select/init.js
249
255
  - app/assets/stylesheets/active_admin/searchable_select.scss
250
256
  - bin/rspec
251
257
  - gemfiles/rails_4.2_active_admin_1.0.0.pre4.gemfile
252
- - gemfiles/rails_5.1_active_admin_1.0.gemfile
253
- - gemfiles/rails_5.1_active_admin_1.1.gemfile
258
+ - gemfiles/rails_5.1_active_admin_1.x.gemfile
259
+ - gemfiles/rails_5.x_active_admin_1.x.gemfile
260
+ - gemfiles/rails_5.x_active_admin_2.x.gemfile
254
261
  - lib/activeadmin-searchable_select.rb
255
262
  - lib/activeadmin/inputs/filters/searchable_select_input.rb
256
263
  - lib/activeadmin/inputs/searchable_select_input.rb
@@ -304,7 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
304
311
  version: '0'
305
312
  requirements: []
306
313
  rubyforge_project:
307
- rubygems_version: 2.6.8
314
+ rubygems_version: 2.7.5
308
315
  signing_key:
309
316
  specification_version: 4
310
317
  summary: Use searchable selects based on Select2 in Active Admin forms and filters.
@@ -1,3 +0,0 @@
1
- #= require select2
2
-
3
- #= require_tree ./searchable_select
@@ -1,29 +0,0 @@
1
- 'use strict';
2
-
3
- initSearchableSelects = (inputs, extra = {}) ->
4
- inputs.each ->
5
- item = $(this)
6
- # reading from data allows <input data-searchable_select='{"tags": ['some']}'>
7
- # to be passed to select2
8
- options = $.extend(extra, item.data('searchableSelect'))
9
- url = item.data('ajaxUrl');
10
-
11
- if url
12
- $.extend(
13
- options,
14
- ajax: {
15
- url: url,
16
- dataType: 'json'
17
- }
18
- )
19
-
20
- item.select2(options)
21
-
22
- $(document).on 'has_many_add:after', '.has_many_container', (e, fieldset) ->
23
- initSearchableSelects(fieldset.find('.searchable-select-input'))
24
-
25
- $(document).on 'page:load turbolinks:load', ->
26
- initSearchableSelects($(".searchable-select-input"), placeholder: "")
27
- return
28
-
29
- $(-> initSearchableSelects($(".searchable-select-input")))