active_admin-sortable_tree 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/Changelog.md +9 -0
- data/README.md +14 -11
- data/Rakefile +2 -0
- data/app/assets/javascripts/active_admin/sortable.js.coffee +1 -20
- data/app/assets/stylesheets/active_admin/sortable.css.sass +6 -11
- data/gemfiles/4.1.gemfile +10 -0
- data/lib/active_admin/sortable_tree/controller_actions.rb +2 -1
- data/lib/active_admin/sortable_tree/version.rb +1 -1
- data/lib/active_admin/views/index_as_sortable.rb +26 -14
- data/spec/dummy/app/admin/category.rb +1 -1
- data/spec/dummy/app/admin/category_sort_disabled.rb +15 -0
- data/spec/dummy/app/models/category.rb +1 -1
- data/spec/features/sortable_spec.rb +38 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac55f045f6a238adde6b30d6487a128ad22b8c2c
|
4
|
+
data.tar.gz: d8286fb520dec0970a45b4d8fb088a61d6a26c06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c83e8ddf44cb139cfcfc3c1c2fd2a6d8d40fa34efc0f94129b0bfdb54826fe2826b9c535d33cc60f56ccb953118e8f054bf795def3beb8c656379616a12dc7f
|
7
|
+
data.tar.gz: ae9d44a4607574d7cf7ea35ab1bf85cbc0500bc0652d871b853f68c2ba5cbcb58e345f1d7193d9b084a801df6ec28e141af93552bb6c3aad6a3a7367ad123da7
|
data/.travis.yml
CHANGED
data/Changelog.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 0.1.0 - 2014-11-19
|
4
|
+
|
5
|
+
- Add option to disable sorting: `sortable: false`, which causes the index view
|
6
|
+
to be a static tree view.
|
7
|
+
- Ensure the default actions honor authorization checks
|
8
|
+
([#43](https://github.com/nebirhos/activeadmin-sortable-tree/pull/43)).
|
9
|
+
|
data/README.md
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
# ActiveAdmin::SortableTree
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/active_admin-sortable_tree.svg)](http://badge.fury.io/rb/active_admin-sortable_tree)
|
3
4
|
[![Build Status](https://travis-ci.org/zorab47/active_admin-sortable_tree.svg?branch=master)](https://travis-ci.org/zorab47/active_admin-sortable_tree)
|
4
5
|
|
5
6
|
This gem adds a tree and a list view to your ActiveAdmin resource index, both
|
6
7
|
sortable via drag'n'drop.
|
7
8
|
|
9
|
+
![Sortable Tree Demo](http://zorab47.github.io/active_admin-sortable_tree/images/sortable_tree.gif)
|
8
10
|
|
9
11
|
## Installation
|
10
12
|
|
@@ -13,9 +15,6 @@ sortable via drag'n'drop.
|
|
13
15
|
gem "active_admin-sortable_tree"
|
14
16
|
```
|
15
17
|
|
16
|
-
*WARNING!* Not compatible with neo/activeadmin-sortable[https://github.com/neo/activeadmin-sortable]
|
17
|
-
|
18
|
-
|
19
18
|
## Usage (Tree)
|
20
19
|
|
21
20
|
**Admin**:
|
@@ -32,9 +31,9 @@ ActiveAdmin.register Page do
|
|
32
31
|
end
|
33
32
|
```
|
34
33
|
|
35
|
-
**Model**:
|
36
|
-
you have to do is expose a sorting attribute and a few tree methods (
|
37
|
-
|
34
|
+
**Model**: ActiveAdmin::SortableTree is agnostic to the tree implementation. All
|
35
|
+
you have to do is expose a sorting attribute and a few tree methods (`:parent`,
|
36
|
+
`:children` and `:roots`). Let's say you use
|
38
37
|
[Ancestry](https://github.com/stefankroes/ancestry):
|
39
38
|
|
40
39
|
```ruby
|
@@ -54,7 +53,7 @@ ActiveAdmin.register Page do
|
|
54
53
|
children_method: :children,
|
55
54
|
roots_method: :roots,
|
56
55
|
roots_collection: proc { current_user.pages.roots }
|
57
|
-
#
|
56
|
+
# …
|
58
57
|
end
|
59
58
|
```
|
60
59
|
|
@@ -66,6 +65,7 @@ in `roots_method`.
|
|
66
65
|
## Usage (List)
|
67
66
|
|
68
67
|
**Admin**:
|
68
|
+
|
69
69
|
```ruby
|
70
70
|
# app/admin/page.rb
|
71
71
|
ActiveAdmin.register Page do
|
@@ -85,7 +85,7 @@ Of course it's configurable:
|
|
85
85
|
ActiveAdmin.register Page do
|
86
86
|
sortable tree: false, # default
|
87
87
|
sorting_attribute: :my_position_field
|
88
|
-
|
88
|
+
# …
|
89
89
|
end
|
90
90
|
```
|
91
91
|
|
@@ -97,7 +97,6 @@ Currently supports only IndexAsBlock, more to come!
|
|
97
97
|
**Admin**:
|
98
98
|
```ruby
|
99
99
|
# app/admin/page.rb
|
100
|
-
|
101
100
|
ActiveAdmin.register Page do
|
102
101
|
sortable
|
103
102
|
|
@@ -109,7 +108,6 @@ end
|
|
109
108
|
|
110
109
|
**Model**: Same as list view (see above)
|
111
110
|
|
112
|
-
|
113
111
|
## Customization
|
114
112
|
|
115
113
|
### Full options list with defaults
|
@@ -124,6 +122,7 @@ ActiveAdmin.register Page do
|
|
124
122
|
children_method: :children,
|
125
123
|
roots_method: :roots,
|
126
124
|
roots_collection: nil, # proc to specifiy retrieval of roots
|
125
|
+
sortable: true, # Disable sorting (use only 'tree' functionality)
|
127
126
|
collapsible: false, # show +/- buttons to collapse children
|
128
127
|
start_collapsed: false, # when collapsible, start with all roots collapsed
|
129
128
|
end
|
@@ -156,8 +155,12 @@ ActiveAdminSortableEvent.add('ajaxDone', function (){
|
|
156
155
|
})
|
157
156
|
```
|
158
157
|
|
158
|
+
## Alternatives
|
159
|
+
|
160
|
+
- [Active Admin Sortable](https://github.com/neo/activeadmin-sortable)
|
161
|
+
|
159
162
|
## Copyright
|
160
163
|
|
161
164
|
Copyright © 2013 Francesco Disperati, Cantiere Creativo. See the file
|
162
165
|
MIT-LICENSE for details. See the full list list of
|
163
|
-
[contributors](
|
166
|
+
[contributors](http://github.com/zorab47/active_admin-sortable_tree/graphs/contributors).
|
data/Rakefile
CHANGED
@@ -23,28 +23,9 @@ $ ->
|
|
23
23
|
$('.disclose').bind 'click', (event) ->
|
24
24
|
$(this).closest('li').toggleClass('mjs-nestedSortable-collapsed').toggleClass('mjs-nestedSortable-expanded')
|
25
25
|
|
26
|
-
$("[data-sortable-type=plain]").each ->
|
27
|
-
$this = $(@)
|
28
|
-
$this.sortable
|
29
|
-
revert: 250
|
30
|
-
update: ->
|
31
|
-
$this.sortable("disable")
|
32
|
-
$.ajax
|
33
|
-
url: $this.data("sortable-url")
|
34
|
-
type: "post"
|
35
|
-
data: $this.sortable("serialize")
|
36
|
-
.always ->
|
37
|
-
$this.sortable("enable")
|
38
|
-
ActiveAdminSortableEvent.trigger('ajaxAlways')
|
39
|
-
.done ->
|
40
|
-
ActiveAdminSortableEvent.trigger('ajaxDone')
|
41
|
-
.fail ->
|
42
|
-
ActiveAdminSortableEvent.trigger('ajaxFail')
|
43
|
-
|
44
|
-
.disableSelection()
|
45
|
-
|
46
26
|
$(".index_as_sortable [data-sortable-type]").each ->
|
47
27
|
$this = $(@)
|
28
|
+
|
48
29
|
if $this.data('sortable-type') == "tree"
|
49
30
|
max_levels = $this.data('max-levels')
|
50
31
|
tab_hack = 20 # nestedSortable default
|
@@ -6,10 +6,6 @@ $cRowError: rgb(255,87,87)
|
|
6
6
|
@import bourbon
|
7
7
|
|
8
8
|
body.active_admin
|
9
|
-
.index_content
|
10
|
-
.ui-sortable > *
|
11
|
-
cursor: move
|
12
|
-
|
13
9
|
.disclose
|
14
10
|
cursor: pointer
|
15
11
|
width: 10px
|
@@ -46,10 +42,6 @@ body.active_admin
|
|
46
42
|
&.odd
|
47
43
|
background: $cOddRowBackground
|
48
44
|
|
49
|
-
&:hover
|
50
|
-
background-color: $cRowSelected
|
51
|
-
cursor: move
|
52
|
-
|
53
45
|
.cell
|
54
46
|
margin: 0
|
55
47
|
padding: 10px 12px 8px 12px
|
@@ -59,6 +51,11 @@ body.active_admin
|
|
59
51
|
line-height: 14px
|
60
52
|
color: black
|
61
53
|
|
54
|
+
&.ui-sortable
|
55
|
+
li .item:hover
|
56
|
+
cursor: move
|
57
|
+
background-color: $cRowSelected
|
58
|
+
|
62
59
|
> li > ol
|
63
60
|
margin-left: 30px
|
64
61
|
|
@@ -73,7 +70,5 @@ body.active_admin
|
|
73
70
|
li.mjs-nestedSortable-collapsed > div > .disclose > span:before
|
74
71
|
content: '+ '
|
75
72
|
|
76
|
-
li.mjs-nestedSortable-expanded > div > .disclose > span:before
|
73
|
+
li.mjs-nestedSortable-expanded > div > .disclose > span:before
|
77
74
|
content: '- '
|
78
|
-
|
79
|
-
|
@@ -12,7 +12,8 @@ module ActiveAdmin::SortableTree
|
|
12
12
|
:max_levels => 0,
|
13
13
|
:protect_root => false,
|
14
14
|
:collapsible => false, #hides +/- buttons
|
15
|
-
:start_collapsed => false
|
15
|
+
:start_collapsed => false,
|
16
|
+
:sortable => true
|
16
17
|
|
17
18
|
# BAD BAD BAD FIXME: don't pollute original class
|
18
19
|
@sortable_options = options
|
@@ -76,28 +76,40 @@ module ActiveAdmin
|
|
76
76
|
@other_actions = block
|
77
77
|
end
|
78
78
|
|
79
|
-
|
80
79
|
protected
|
81
80
|
|
82
81
|
def build_list
|
83
82
|
resource_selection_toggle_panel if active_admin_config.batch_actions.any?
|
83
|
+
|
84
|
+
ol sortable_data_options do
|
85
|
+
@collection.each do |item|
|
86
|
+
build_nested_item(item)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def sortable_data_options
|
92
|
+
return {} if !sortable?
|
93
|
+
|
84
94
|
sort_url = if (( sort_url_block = options[:sort_url] ))
|
85
95
|
sort_url_block.call(self)
|
86
96
|
else
|
87
97
|
url_for(:action => :sort)
|
88
98
|
end
|
89
|
-
|
90
|
-
"data-sortable-type"
|
91
|
-
"data-sortable-url"
|
99
|
+
{
|
100
|
+
"data-sortable-type" => tree? ? "tree" : "list",
|
101
|
+
"data-sortable-url" => sort_url,
|
102
|
+
"data-max-levels" => options[:max_levels],
|
103
|
+
"data-start-collapsed" => options[:start_collapsed],
|
104
|
+
"data-protect-root" => options[:protect_root],
|
92
105
|
}
|
93
|
-
|
94
|
-
data_options["data-start-collapsed"] = options[:start_collapsed]
|
95
|
-
data_options["data-protect-root"] = true if options[:protect_root]
|
106
|
+
end
|
96
107
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
108
|
+
def sortable?
|
109
|
+
if (sortable = options[:sortable]).respond_to? :call
|
110
|
+
controller.instance_exec(&sortable)
|
111
|
+
else
|
112
|
+
sortable
|
101
113
|
end
|
102
114
|
end
|
103
115
|
|
@@ -134,13 +146,13 @@ module ActiveAdmin
|
|
134
146
|
def build_actions(resource)
|
135
147
|
links = ''.html_safe
|
136
148
|
if @default_actions
|
137
|
-
if controller.action_methods.include?('show')
|
149
|
+
if controller.action_methods.include?('show') && authorized?(ActiveAdmin::Auth::READ, resource)
|
138
150
|
links << link_to(I18n.t('active_admin.view'), resource_path(resource), :class => "member_link view_link")
|
139
151
|
end
|
140
|
-
if controller.action_methods.include?('edit')
|
152
|
+
if controller.action_methods.include?('edit') && authorized?(ActiveAdmin::Auth::UPDATE, resource)
|
141
153
|
links << link_to(I18n.t('active_admin.edit'), edit_resource_path(resource), :class => "member_link edit_link")
|
142
154
|
end
|
143
|
-
if controller.action_methods.include?('destroy')
|
155
|
+
if controller.action_methods.include?('destroy') && authorized?(ActiveAdmin::Auth::DESTROY, resource)
|
144
156
|
links << link_to(I18n.t('active_admin.delete'), resource_path(resource), :method => :delete, :data => {:confirm => I18n.t('active_admin.delete_confirmation')}, :class => "member_link delete_link")
|
145
157
|
end
|
146
158
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
ActiveAdmin.register Category do
|
2
2
|
sortable
|
3
3
|
|
4
|
-
permit_params :name, :ancestry, :description, :position if ENV['RAILS_VERSION']
|
4
|
+
permit_params :name, :ancestry, :description, :position if Float(ENV['RAILS_VERSION']) >= 4.0
|
5
5
|
|
6
6
|
index as: :sortable do
|
7
7
|
label :name
|
@@ -0,0 +1,15 @@
|
|
1
|
+
ActiveAdmin.register Category, as: "CategoryDisabledSort" do
|
2
|
+
sortable sortable: false
|
3
|
+
|
4
|
+
permit_params :name, :ancestry, :description, :position if Float(ENV['RAILS_VERSION']) >= 4.0
|
5
|
+
|
6
|
+
index as: :sortable do
|
7
|
+
label :name
|
8
|
+
actions
|
9
|
+
end
|
10
|
+
|
11
|
+
form do |f|
|
12
|
+
f.inputs :name, :description
|
13
|
+
f.actions
|
14
|
+
end
|
15
|
+
end
|
@@ -51,8 +51,46 @@ RSpec.describe "ActiveAdmin::SortableTree", type: :feature do
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
+
context "with option `sortable: false`" do
|
55
|
+
it "disables sorting by excluding sortable data attributes" do
|
56
|
+
bottom = Category.create! name: "bottom", position: 0
|
57
|
+
top = Category.create! name: "top", position: 1
|
58
|
+
middle = Category.create! name: "middle", position: 2
|
59
|
+
|
60
|
+
visit admin_category_disabled_sorts_path
|
61
|
+
|
62
|
+
expect(page).to have_css(".index_as_sortable")
|
63
|
+
expect(page).not_to have_css("[data-sortable-type]")
|
64
|
+
expect(page).not_to have_css("[data-sortable-url]")
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with a proc returning false as sortable option" do
|
68
|
+
it "disables sorting" do
|
69
|
+
proc_evaluated_within_controller = false
|
70
|
+
|
71
|
+
sortable_options_for("CategoryDisabledSort")[:sortable] = proc do
|
72
|
+
proc_evaluated_within_controller = self.is_a?(ActiveAdmin::ResourceController)
|
73
|
+
false
|
74
|
+
end
|
75
|
+
|
76
|
+
bottom = Category.create! name: "bottom", position: 0
|
77
|
+
|
78
|
+
visit admin_category_disabled_sorts_path
|
79
|
+
|
80
|
+
expect(page).to have_css(".index_as_sortable")
|
81
|
+
expect(page).not_to have_css("[data-sortable-type]")
|
82
|
+
expect(proc_evaluated_within_controller).to be true
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
54
87
|
def drag_element(selector, options)
|
55
88
|
options.reverse_merge! moves: 20
|
56
89
|
page.execute_script(%Q($("#{selector}").simulate("drag", #{options.to_json} )))
|
57
90
|
end
|
91
|
+
|
92
|
+
def sortable_options_for(resource)
|
93
|
+
resource_config = ActiveAdmin.application.namespace(:admin).resource_for(resource)
|
94
|
+
resource_config.dsl.sortable_options
|
95
|
+
end
|
58
96
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_admin-sortable_tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Francesco Disperati
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -134,6 +134,7 @@ extra_rdoc_files: []
|
|
134
134
|
files:
|
135
135
|
- ".gitignore"
|
136
136
|
- ".travis.yml"
|
137
|
+
- Changelog.md
|
137
138
|
- Gemfile
|
138
139
|
- MIT-LICENSE
|
139
140
|
- README.md
|
@@ -144,6 +145,7 @@ files:
|
|
144
145
|
- bin/rails
|
145
146
|
- gemfiles/3.2.gemfile
|
146
147
|
- gemfiles/4.0.gemfile
|
148
|
+
- gemfiles/4.1.gemfile
|
147
149
|
- lib/active_admin/sortable_tree.rb
|
148
150
|
- lib/active_admin/sortable_tree/controller_actions.rb
|
149
151
|
- lib/active_admin/sortable_tree/engine.rb
|
@@ -155,6 +157,7 @@ files:
|
|
155
157
|
- spec/dummy/README.rdoc
|
156
158
|
- spec/dummy/Rakefile
|
157
159
|
- spec/dummy/app/admin/category.rb
|
160
|
+
- spec/dummy/app/admin/category_sort_disabled.rb
|
158
161
|
- spec/dummy/app/admin/category_tree.rb
|
159
162
|
- spec/dummy/app/admin/dashboard.rb
|
160
163
|
- spec/dummy/app/assets/javascripts/active_admin.js
|