fixed_activeadmin_sortable_table 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +15 -0
  5. data/.travis.yml +29 -0
  6. data/CHANGELOG.md +16 -0
  7. data/Gemfile +11 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +109 -0
  10. data/Rakefile +27 -0
  11. data/activeadmin_sortable_table.gemspec +30 -0
  12. data/app/assets/javascripts/activeadmin_sortable_table.js +48 -0
  13. data/app/assets/stylesheets/activeadmin_sortable_table.css +13 -0
  14. data/lib/active_admin/sortable_table.rb +43 -0
  15. data/lib/active_admin/sortable_table/engine.rb +9 -0
  16. data/lib/active_admin/sortable_table/handle_column.rb +66 -0
  17. data/lib/active_admin/sortable_table/version.rb +6 -0
  18. data/lib/activeadmin_sortable_table.rb +1 -0
  19. data/spec/dummy/README.rdoc +28 -0
  20. data/spec/dummy/Rakefile +6 -0
  21. data/spec/dummy/app/admin/categories.rb +13 -0
  22. data/spec/dummy/app/admin/dashboard.rb +32 -0
  23. data/spec/dummy/app/assets/images/.keep +0 -0
  24. data/spec/dummy/app/assets/javascripts/active_admin.js +3 -0
  25. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  26. data/spec/dummy/app/assets/javascripts/jquery.simulate.drag-sortable.js +235 -0
  27. data/spec/dummy/app/assets/stylesheets/active_admin.scss +17 -0
  28. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  29. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  30. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/mailers/.keep +0 -0
  33. data/spec/dummy/app/models/.keep +0 -0
  34. data/spec/dummy/app/models/category.rb +3 -0
  35. data/spec/dummy/app/models/concerns/.keep +0 -0
  36. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  37. data/spec/dummy/bin/bundle +3 -0
  38. data/spec/dummy/bin/rails +4 -0
  39. data/spec/dummy/bin/rake +4 -0
  40. data/spec/dummy/bin/setup +29 -0
  41. data/spec/dummy/config.ru +4 -0
  42. data/spec/dummy/config/application.rb +30 -0
  43. data/spec/dummy/config/boot.rb +5 -0
  44. data/spec/dummy/config/database.yml +25 -0
  45. data/spec/dummy/config/environment.rb +5 -0
  46. data/spec/dummy/config/environments/development.rb +41 -0
  47. data/spec/dummy/config/environments/production.rb +79 -0
  48. data/spec/dummy/config/environments/test.rb +42 -0
  49. data/spec/dummy/config/initializers/active_admin.rb +262 -0
  50. data/spec/dummy/config/initializers/assets.rb +11 -0
  51. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  52. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  53. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  54. data/spec/dummy/config/initializers/inflections.rb +16 -0
  55. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  56. data/spec/dummy/config/initializers/session_store.rb +3 -0
  57. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  58. data/spec/dummy/config/locales/en.yml +23 -0
  59. data/spec/dummy/config/routes.rb +3 -0
  60. data/spec/dummy/config/secrets.yml +22 -0
  61. data/spec/dummy/db/development.sqlite3 +0 -0
  62. data/spec/dummy/db/migrate/20150910072150_create_active_admin_comments.rb +19 -0
  63. data/spec/dummy/db/migrate/20150910072505_create_categories.rb +7 -0
  64. data/spec/dummy/db/schema.rb +36 -0
  65. data/spec/dummy/lib/assets/.keep +0 -0
  66. data/spec/dummy/log/.keep +0 -0
  67. data/spec/dummy/public/404.html +67 -0
  68. data/spec/dummy/public/422.html +67 -0
  69. data/spec/dummy/public/500.html +66 -0
  70. data/spec/dummy/public/favicon.ico +0 -0
  71. data/spec/features/drag_and_drop_spec.rb +158 -0
  72. data/spec/features/move_to_top_spec.rb +55 -0
  73. data/spec/rails_helper.rb +62 -0
  74. data/spec/spec_helper.rb +92 -0
  75. data/spec/support/wait_for_ajax.rb +20 -0
  76. metadata +305 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 20c81aea75523dcfcb51564c1e26aeb1664daebace8fe10f89f10929faf7d51c
4
+ data.tar.gz: 612672399b7ccb86476c8d09ad2dbd572321760a415dfdaa7dd9004fe0a0303a
5
+ SHA512:
6
+ metadata.gz: ed246864dea02ade91c658df5be1f20a3d170dc255739abf9fb34cead27b7610a70aaeecadd792f631aeac8554094843e67dfff7a8ec9bbf21f640fe738a303c
7
+ data.tar.gz: adfa43dca3b1b4eed74e10e4c030f84ea57811c753a7988497e86cfdade55c8062ff44130c16aa9c254e82050e3215b53ca4812fdbaf3e02b7d1349a26b3a6b9
@@ -0,0 +1,22 @@
1
+ spec/dummy/log/*.log
2
+ spec/dummy/tmp/
3
+ spec/dummy/public/assets
4
+ spec/dummy/.sass-cache
5
+ spec/dummy/db/test.sqlite3
6
+ *.gem
7
+ *.rbc
8
+ .bundle
9
+ .config
10
+ .yardoc
11
+ InstalledFiles
12
+ _yardoc
13
+ coverage
14
+ doc/
15
+ lib/bundler/man
16
+ pkg
17
+ rdoc
18
+ spec/reports
19
+ test/tmp
20
+ test/version_tmp
21
+ tmp
22
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require rails_helper
@@ -0,0 +1,15 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2015-09-29 11:38:23 +0300 using RuboCop version 0.34.2.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ AllCops:
10
+ Exclude:
11
+ - spec/dummy/**/*
12
+
13
+ # Configuration parameters: AllowURI, URISchemes.
14
+ Metrics/LineLength:
15
+ Max: 120
@@ -0,0 +1,29 @@
1
+ sudo: false
2
+ language: ruby
3
+
4
+ rvm:
5
+ - 2.3.7
6
+ - 2.4.4
7
+ - 2.5.1
8
+
9
+ env:
10
+ matrix:
11
+ - RAILS_VERSION=4.2.10
12
+ - RAILS_VERSION=5.2.1
13
+
14
+ matrix:
15
+ allow_failures:
16
+ - rvm: ruby-head
17
+ fast_finish: true
18
+
19
+ before_install: gem update --remote bundler
20
+ install:
21
+ - bundle install --retry=3
22
+ script:
23
+ - bundle exec rake dummy:prepare
24
+ - bundle exec rspec
25
+ - bundle exec rubocop
26
+
27
+ addons:
28
+ code_climate:
29
+ repo_token: 085c9fc58ac3efcd9a8b311ee77bcec0b5c048575cde8a2234f7c63550910969
@@ -0,0 +1,16 @@
1
+ 1.3.0
2
+
3
+ * Test against latest supported ruby versions: 2.3.7, 2.4.4, 2.5.1 and rails versions: 4.2.10, 5.2.1.
4
+ * Add Rails 5 support
5
+
6
+ 1.2.0
7
+
8
+ * **Feature**. Now it is possible to specify an acts_as_list column other than position @faucct
9
+
10
+ 1.1.3
11
+
12
+ * **Fix**. Reordering was broken.
13
+
14
+ 1.1.2
15
+
16
+ * **Fix**. Reload page after drug-and-dropping rows, so it recalculates positions properly.
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'activeadmin'
6
+ gem 'coffee-script'
7
+ gem 'puma'
8
+ gem 'rails', *ENV['RAILS_VERSION']
9
+ gem 'sqlite3'
10
+ gem 'acts_as_list'
11
+ gem 'rubocop', '0.34.2'
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Adam McCrea
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,109 @@
1
+ [![Build Status](https://travis-ci.org/bolshakov/activeadmin_sortable_table.svg?branch=master)](https://travis-ci.org/bolshakov/activeadmin_sortable_table)
2
+ [![Test Coverage](https://codeclimate.com/github/bolshakov/activeadmin_sortable_table/badges/coverage.svg)](https://codeclimate.com/github/bolshakov/activeadmin_sortable_table/coverage)
3
+ [![Code Climate](https://codeclimate.com/github/bolshakov/activeadmin_sortable_table/badges/gpa.svg)](https://codeclimate.com/github/bolshakov/activeadmin_sortable_table)
4
+ [![Gem Version](https://badge.fury.io/rb/activeadmin_sortable_table.svg)](http://badge.fury.io/rb/activeadmin_sortable_table)
5
+
6
+ # Active Admin Sortable Table
7
+
8
+ This gem extends ActiveAdmin so that your index page's table rows can be
9
+ orderable via a drag-and-drop interface.
10
+
11
+ ## Improvements over the @neo version
12
+
13
+ 1. Test coverage
14
+ 2. Configurable labels for handler
15
+ 3. Move to top button allows to push any item from any page to the top of the list
16
+ 4. Sorting works on all pages ( not only on the first one)
17
+
18
+ ## Prerequisites
19
+
20
+ This extension assumes that you're using [acts_as_list](https://github.com/swanandp/acts_as_list) on any model you want to be sortable.
21
+
22
+ ```ruby
23
+ class Page < ActiveRecord::Base
24
+ acts_as_list
25
+ end
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ Add it to your Gemfile
31
+
32
+ ```ruby
33
+ gem "activeadmin_sortable_table"
34
+ ```
35
+
36
+ Include the JavaScript in `active_admin.js.coffee`
37
+
38
+ ```coffeescript
39
+ #= require activeadmin_sortable_table
40
+ ```
41
+
42
+ Include the Stylesheet in `active_admin.css.scss`
43
+
44
+ ```scss
45
+ @import "activeadmin_sortable_table"
46
+ ```
47
+
48
+ ### Configure your ActiveAdmin Resource
49
+
50
+ ```ruby
51
+ ActiveAdmin.register Page do
52
+ include ActiveAdmin::SortableTable # creates the controller action which handles the sorting
53
+ config.sort_order = 'position_asc' # assumes you are using 'position' for your acts_as_list column
54
+
55
+ index do
56
+ handle_column
57
+ end
58
+
59
+ show do |c|
60
+ attributes_table do
61
+ row :id
62
+ row :name
63
+ end
64
+
65
+ panel 'Contents' do
66
+ table_for c.collection_memberships do
67
+ handle_column
68
+ column :position
69
+ column :collectable
70
+ end
71
+ end
72
+ end
73
+ end
74
+ ```
75
+
76
+ ### Configure handler
77
+
78
+ You can override handler column symbol using handle_column options:
79
+
80
+ You can configure `sort_url` using handle column options by providing static value, symbolized instance method name, or blocks.
81
+
82
+ ```ruby
83
+ handle_column sort_url: ->(category) { compute_url_for_category(category) }
84
+ handle_column sort_url: '/admin/categories/1/sort'
85
+ handle_column sort_url: :sort_category
86
+ ```
87
+
88
+ The same options available for `move_to_top_url`:
89
+
90
+ ```ruby
91
+ handle_column move_to_top_url: '/admin/categories/1/move_to_top
92
+ ```
93
+
94
+ It's also possible to override handle lables:
95
+
96
+ ```ruby
97
+ handle_column sort_handle: '&#9776;'.html_safe
98
+ handle_column move_to_top_handle: 'Move to top'
99
+ ```
100
+
101
+ ## Contributing
102
+
103
+ 1. Fork it
104
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
105
+ 3. Prepare tests database (`bundle exec rake dummy:prepare`)
106
+ 4. Make your changes and runs specs (`bundle exec rspec`)
107
+ 5. Commit your changes (`git commit -am 'Add some feature'`)
108
+ 6. Push to the branch (`git push origin my-new-feature`)
109
+ 7. Create Pull Request
@@ -0,0 +1,27 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task default: ['dummy:prepare', :spec]
6
+
7
+ require 'rake/clean'
8
+ CLEAN.include 'spec/dummy/db/*sqlite3', 'spec/dummy/log/*', 'spec/dummy/public/assets/*', 'spec/dummy/tmp/**/*'
9
+
10
+ namespace :dummy do
11
+ desc 'Setup dummy app database'
12
+ task :prepare do
13
+ # File.expand_path is executed directory of generated Rails app
14
+ rakefile = File.expand_path('Rakefile', dummy_path)
15
+ command = format("rake -f '%s' db:schema:load RAILS_ENV=test", rakefile)
16
+ sh(command) unless ENV['DISABLE_CREATE']
17
+ end
18
+
19
+ def dummy_path
20
+ rel_path = ENV['DUMMY_APP_PATH'] || 'spec/dummy'
21
+ if @current_path.to_s.include?(rel_path)
22
+ @current_path
23
+ else
24
+ @current_path = File.expand_path(rel_path)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'active_admin/sortable_table/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'fixed_activeadmin_sortable_table'
8
+ gem.version = ActiveAdmin::SortableTable::VERSION
9
+ gem.authors = ['Adam McCrea', 'Jonathan Gertig', 'Artyom Bolshakov']
10
+ gem.email = ['adam@adamlogic.com', 'jcgertig@gmail.com', 'abolshakov@spbtv.com']
11
+ gem.description = 'Drag and drop reordering interface for ActiveAdmin tables'
12
+ gem.summary = 'Drag and drop reordering interface for ActiveAdmin tables'
13
+ gem.license = 'MIT'
14
+ gem.homepage = 'https://github.com/bolshakov/activeadmin_sortable_table'
15
+
16
+ gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ['lib']
20
+
21
+ gem.add_dependency 'activeadmin', '>= 1.0.0.pre1'
22
+ gem.add_dependency 'uber', '0.0.15'
23
+ gem.add_development_dependency 'rails', '~> 4.2'
24
+ gem.add_development_dependency 'capybara'
25
+ gem.add_development_dependency 'rspec-rails', '~> 3.3'
26
+ gem.add_development_dependency 'phantomjs'
27
+ gem.add_development_dependency 'poltergeist'
28
+ gem.add_development_dependency 'database_cleaner'
29
+ gem.add_development_dependency 'launchy'
30
+ end
@@ -0,0 +1,48 @@
1
+ (function($) {
2
+ $(document).ready(function() {
3
+ $('.handle').closest('tbody').activeAdminSortableTable();
4
+ });
5
+
6
+ $.fn.activeAdminSortableTable = function() {
7
+ this.sortable({
8
+ handle: ".handle",
9
+ update: function(event, ui) {
10
+ var item = ui.item.find('[data-sort-url]');
11
+ var url = item.data('sort-url');
12
+ var customParams = {};
13
+ if (typeof item.data('sort-custom-params') === 'object') {
14
+ customParams = item.data('sort-custom-params');
15
+ }
16
+
17
+ var nextElement = ui.item[0].nextElementSibling;
18
+
19
+ var nextPosition = $(nextElement).find('[data-position]').data('position');
20
+ var currentPosition = ui.item.find('[data-position]').data('position');
21
+ var authToken = $('meta[name=csrf-token]').attr('content');
22
+
23
+ if(nextPosition === undefined || nextPosition > currentPosition) {
24
+ // moved down
25
+ var previousElement = ui.item[0].previousElementSibling;
26
+ var previousPosition = $(previousElement).find('[data-position]').data('position');
27
+ var newPosition = previousPosition;
28
+ } else {
29
+ // moved up
30
+ var newPosition = nextPosition;
31
+ }
32
+
33
+ $.ajax({
34
+ url: url,
35
+ type: 'post',
36
+ data: $.extend(customParams, { position: newPosition, authenticity_token: authToken }),
37
+ error: function () { console.error('Saving sortable error'); },
38
+ success: function () {
39
+ location.href = location.href;
40
+ },
41
+ async: false
42
+ });
43
+ }
44
+ });
45
+
46
+ this.disableSelection();
47
+ }
48
+ })(jQuery);
@@ -0,0 +1,13 @@
1
+ .activeadmin_sortable_table .handle {
2
+ cursor: ns-resize;
3
+ font-size: 1.5em;
4
+ }
5
+
6
+ .activeadmin_sortable_table .move_to_top {
7
+ padding-left: 1em;
8
+ /*cursor: pointer;*/
9
+ text-decoration: none;
10
+ font-size: 1.5em;
11
+ color: rgb(51, 51, 51);
12
+ }
13
+
@@ -0,0 +1,43 @@
1
+ require 'activeadmin'
2
+
3
+ module ActiveAdmin
4
+ # Include this module to registered page to enable
5
+ # ActiveAdmin Sortable Table extension
6
+ # @example
7
+ #
8
+ # ActiveAdmin.register Category do
9
+ # include ActiveAdmin::SortableTable
10
+ # config.sort_order = 'position_asc'
11
+ # permit_params :position
12
+ #
13
+ # index do
14
+ # handle_column
15
+ # id_column
16
+ # end
17
+ # end
18
+ #
19
+ module SortableTable
20
+ require 'active_admin/sortable_table/version'
21
+ require 'active_admin/sortable_table/engine'
22
+ require 'active_admin/sortable_table/handle_column'
23
+
24
+ class << self
25
+ # @param [ActiveAdmin::DSL] dsl
26
+ # @return [void]
27
+ #
28
+ def included(dsl) # rubocop:disable Metrics/AbcSize
29
+ dsl.instance_eval do
30
+ member_action :sort, method: :post do
31
+ resource.insert_at params[:position].to_i
32
+ head 200
33
+ end
34
+
35
+ member_action :move_to_top, method: :post do
36
+ resource.move_to_top
37
+ redirect_to request.headers['HTTP_REFERER'] || collection_path
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ require 'rails/engine'
2
+
3
+ module ActiveAdmin
4
+ module SortableTable
5
+ # Including an Engine tells Rails that this gem contains assets
6
+ class Engine < ::Rails::Engine
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,66 @@
1
+ require 'uber/options'
2
+
3
+ module ActiveAdmin
4
+ #
5
+ module SortableTable
6
+ # Adds `handle_column` method to `TableFor` dsl.
7
+ # @example on index page
8
+ # index do
9
+ # handle_column
10
+ # id_column
11
+ # # other columns...
12
+ # end
13
+ #
14
+ # @example table_for
15
+ # table_for c.collection_memberships do
16
+ # handle_column
17
+ # # other columns...
18
+ # end
19
+ #
20
+ module HandleColumn
21
+ DEFAULT_OPTIONS = {
22
+ move_to_top_url: ->(resource) { url_for([:move_to_top, :admin, resource]) },
23
+ move_to_top_handle: '&#10514;'.html_safe,
24
+ show_move_to_top_handle: ->(resource) { !resource.first? },
25
+ sort_url: ->(resource) { url_for([:sort, :admin, resource]) },
26
+ sort_handle: '&#9776;'.html_safe
27
+ }
28
+
29
+ # @param [Hash] arguments
30
+ # @option arguments [Symbol, Proc, String] :sort_url
31
+ # @option arguments [Symbol, Proc, String] :sort_handle
32
+ # @option arguments [Symbol, Proc, String] :move_to_top_url
33
+ # @option arguments [Symbol, Proc, String] :move_to_top_handle
34
+ #
35
+ def handle_column(arguments = {})
36
+ defined_options = Uber::Options.new(DEFAULT_OPTIONS.merge(arguments))
37
+
38
+ column '', class: 'activeadmin_sortable_table' do |resource|
39
+ options = defined_options.evaluate(self, resource)
40
+
41
+ sort_handle(options, resource.send(resource.position_column)) + move_to_top_handle(options)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def sort_handle(options, position)
48
+ content_tag(:span, options[:sort_handle],
49
+ class: 'handle',
50
+ 'data-sort-url' => options[:sort_url],
51
+ 'data-position' => position,
52
+ title: 'Drag to reorder'
53
+ )
54
+ end
55
+
56
+ def move_to_top_handle(options)
57
+ link_to_if(options[:show_move_to_top_handle], options[:move_to_top_handle], options[:move_to_top_url],
58
+ method: :post,
59
+ class: 'move_to_top',
60
+ title: 'Move to top') { '' }
61
+ end
62
+ end
63
+
64
+ ::ActiveAdmin::Views::TableFor.send(:include, HandleColumn)
65
+ end
66
+ end