active_admin-sortable_tree 0.0.1 → 0.1.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/.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
|
+
[](http://badge.fury.io/rb/active_admin-sortable_tree)
|
3
4
|
[](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
|
+

|
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
|