Skip to content

Commit a9d8fe7

Browse files
committed
Merge pull request #1 from maximalink/optgroup
Optgroup
2 parents 1515f1d + 6258c2c commit a9d8fe7

24 files changed

+133
-86
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pkg/*
44
spec/dummy_app/config/database.yml
55
spec/dummy_app/db/*.db
66
spec/dummy_app/log/*.log
7-
.Gemfile.lock
7+
Gemfile.lock
88

99
.DS_Store
1010
*.sublime-workspace

README.md

+23
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ Nested Set + Drag&Drop GUI. Very fast! Best render helper! **2000 nodes/sec**. R
2929

3030
![Indented options](docs/indented_options.jpg)
3131

32+
## Render Optgroup
33+
34+
![Optgroup](docs/optgroup.jpg)
35+
3236
## Expandable tree
3337

3438
![Expandable](docs/expandable.jpg)
@@ -162,6 +166,25 @@ build_server_tree(tree, options)
162166

163167
This uses CSS styling, for indenting with spaces, use **indented_options** instead.
164168

169+
## Render Indented Options Tree
170+
171+
```haml
172+
= select_tag :page_id, indented_options(@pages, :selected => Page.last)
173+
```
174+
175+
**indented_options** is just alias of **build_server_tree(tree, type: :indented_options)**
176+
177+
## Render Optgroup Tree
178+
179+
```haml
180+
= select_tag :page_id, optgroup(@pages, :selected => Page.last)
181+
```
182+
183+
**optgroup** is just alias of **build_server_tree(tree, type: :indented_options)**
184+
The only difference between **indented_options** and **optgroup** is the selectable of parent nodes.
185+
Indented options allows to select parent nodes, but optgroup does not.
186+
187+
165188

166189
## build_server_tree options
167190

app/helpers/jquery_sortable_tree_helper.rb

+10-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ module JquerySortableTreeHelper
66
sortable: RenderSortableTreeHelper,
77
expandable: RenderExpandableTreeHelper,
88
nested_options: RenderNestedOptionsHelper,
9-
indented_options: RenderIndentedOptionsHelper
9+
indented_options: RenderIndentedOptionsHelper,
10+
optgroup: RenderOptgroupHelper
1011
}.freeze
1112

1213
###############################################
@@ -49,6 +50,7 @@ def space(height)
4950
end
5051

5152
def fake_node(options)
53+
options[:title] ||= 'title'
5254
OpenStruct.new(options[:title] => '', id: ':id', children: nil)
5355
end
5456

@@ -82,15 +84,19 @@ def add_new_node_form(options)
8284
end
8385

8486
def nested_options(tree, options = {})
85-
build_server_tree(tree, { type: :nested_options }.merge!(options))
87+
build_server_tree(tree, { type: :nested_options }.merge(options))
8688
end
8789

8890
def indented_options(tree, options = {})
89-
build_server_tree(tree, { type: :indented_options }.merge!(options))
91+
build_server_tree(tree, { type: :indented_options }.merge(options))
9092
end
9193

9294
def expandable_tree(tree, options = {})
93-
build_server_tree(tree, { type: :expandable }.merge!(options))
95+
build_server_tree(tree, { type: :expandable }.merge(options))
96+
end
97+
98+
def optgroup(tree, options = {})
99+
build_server_tree(tree, { type: :optgroup }.merge(options))
94100
end
95101

96102
###############################################

app/helpers/jquery_sortable_tree_helper/render_expandable_tree_helper.rb

-6
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,6 @@
99
module JquerySortableTreeHelper
1010
module RenderExpandableTreeHelper
1111
class Render < JquerySortableTreeHelper::RenderSortableTreeHelper::Render
12-
attr_accessor :h, :options
13-
14-
def initialize(h, options)
15-
@h, @options = h, options
16-
end
17-
1812
def div_item
1913
h.content_tag(:div, handle + expand_button + edit_link + controls, class: :item)
2014
end

app/helpers/jquery_sortable_tree_helper/render_indented_options_helper.rb

+1-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
module JquerySortableTreeHelper
22
module RenderIndentedOptionsHelper
3-
class Render
4-
attr_accessor :h, :options
5-
6-
def initialize(h, options)
7-
@h, @options = h, options
8-
end
9-
3+
class Render < JquerySortableTreeHelper::RenderSortableTreeHelper::Render
104
def render_node
115
h.content_tag(:option, title, tag_options) + children
126
end
@@ -25,10 +19,6 @@ def tag_options
2519
html_options
2620
end
2721

28-
def node
29-
@options[:node]
30-
end
31-
3222
def children
3323
@options[:children].html_safe
3424
end

app/helpers/jquery_sortable_tree_helper/render_nested_options_helper.rb

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
module JquerySortableTreeHelper
22
module RenderNestedOptionsHelper
3-
class Render
4-
attr_accessor :h, :options
5-
6-
def initialize(h, options)
7-
@h, @options = h, options
8-
end
9-
3+
class Render < JquerySortableTreeHelper::RenderSortableTreeHelper::Render
104
def render_node
115
@h.content_tag(:option, options[:node].send(options[:title]), tag_options) + children
126
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module JquerySortableTreeHelper
2+
module RenderOptgroupHelper
3+
class Render < JquerySortableTreeHelper::RenderIndentedOptionsHelper::Render
4+
def tag_options
5+
html_options = super
6+
html_options[:disabled] = 'true' unless options[:children].blank?
7+
html_options
8+
end
9+
end
10+
end
11+
end

app/helpers/jquery_sortable_tree_helper/render_sortable_tree_helper.rb

+8-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def initialize(h, options)
1818
def render_node
1919
return h.content_tag(:li, div_item + children,
2020
class: :node,
21-
data: { node_id: options[:node].id }
21+
data: { node_id: node.id }
2222
)
2323
end
2424

@@ -31,13 +31,13 @@ def handle
3131
end
3232

3333
def edit_link
34-
h.content_tag(:h4, h.link_to(options[:node].send(options[:title]), show_path, class: :edit))
34+
h.content_tag(:h4, h.link_to(node.send(options[:title]), show_path, class: :edit))
3535
end
3636

3737
def show_link
3838
h.content_tag(:h4,
39-
h.link_to(options[:node].send(options[:title]),
40-
h.url_for(options[:namespace] + [options[:node]]))
39+
h.link_to(node.send(options[:title]),
40+
h.url_for(options[:namespace] + [node]))
4141
)
4242
end
4343

@@ -57,6 +57,10 @@ def children
5757
h.content_tag(:ol, options[:children].html_safe, class: :nested_set) unless options[:children].blank?
5858
end
5959

60+
def node
61+
@options[:node]
62+
end
63+
6064
def show_path
6165
h.url_for(controller: (options[:controller] || (options[:klass] && options[:klass].pluralize)), action: :show, id: options[:node].id, format: :json)
6266
end

app/helpers/jquery_sortable_tree_helper/render_tree_helper.rb

-6
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,6 @@
99
module JquerySortableTreeHelper
1010
module RenderTreeHelper
1111
class Render < JquerySortableTreeHelper::RenderSortableTreeHelper::Render
12-
attr_accessor :h, :options
13-
14-
def initialize(h, options)
15-
@h, @options = h, options
16-
end
17-
1812
def div_item
1913
h.content_tag(:div, show_link, class: :item)
2014
end

app/inputs/indented_collection_select_input.rb

-12
This file was deleted.

docs/indented_options.jpg

26.2 KB
Loading

docs/optgroup.jpg

15.6 KB
Loading

jquery_sortable_tree.gemspec

+3
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,7 @@ Gem::Specification.new do |s|
2222
s.add_development_dependency 'sqlite3', '~> 1.3'
2323
s.add_development_dependency 'rspec', '~> 3.0'
2424
s.add_development_dependency 'rspec-rails', '~> 3.0'
25+
s.add_development_dependency 'capybara'
26+
s.add_development_dependency 'faker'
27+
s.add_development_dependency 'awesome_nested_set', '~> 3.0.0.rc5'
2528
end

lib/jquery_sortable_tree/version.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module JquerySortableTree
2-
VERSION = '3.0.0'
2+
VERSION = '3.1.0'
33
end
File renamed without changes.

spec/dummy_app/app/controllers/admin/pages_controller.rb

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
class Admin::PagesController < ApplicationController
22
include JquerySortableTreeController::Rebuild
33

4+
before_action :load_pages, only: [:index, :manage, :nested_options, :indented_options, :optgroup]
5+
46
def index
5-
@pages = Admin::Page.nested_set.select('id, title, content, parent_id').limit(15)
67
end
78

89
def manage
9-
@pages = Admin::Page.nested_set.select('id, title, content, parent_id').limit(15)
1010
end
1111

1212
def nested_options
13-
@pages = Admin::Page.nested_set.select('id, title, content, parent_id').limit(15)
1413
end
1514

1615
def indented_options
17-
@pages = Admin::Page.nested_set.select('id, title, content, parent_id').limit(15)
16+
end
17+
18+
def optgroup
1819
end
1920

2021
def node_manage
@@ -25,6 +26,10 @@ def node_manage
2526

2627
protected
2728

29+
def load_pages
30+
@pages = Admin::Page.nested_set.select('id, title, content, parent_id').limit(15)
31+
end
32+
2833
def sortable_model
2934
Admin::Page
3035
end

spec/dummy_app/app/controllers/pages_controller.rb

+11-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ class PagesController < ApplicationController
22
include JquerySortableTreeController::Rebuild
33
include JquerySortableTreeController::ExpandNode
44

5+
before_action :load_pages, only: [:index, :nested_options, :indented_options, :optgroup]
6+
57
def index
6-
@pages = Page.nested_set.select('id, title, content, parent_id').limit(15)
78
end
89

910
def nested_options
10-
@pages = Page.nested_set.select('id, title, content, parent_id').limit(15)
1111
end
1212

1313
def indented_options
14-
@pages = Page.nested_set.select('id, title, content, parent_id').limit(15)
14+
end
15+
16+
def optgroup
1517
end
1618

1719
def manage
@@ -27,4 +29,10 @@ def node_manage
2729
def expand
2830
@pages = Page.nested_set.roots.select('id, title, content, parent_id')
2931
end
32+
33+
private
34+
35+
def load_pages
36+
@pages = Page.nested_set.select('id, title, content, parent_id').limit(15)
37+
end
3038
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
%p= link_to raw('&larr; back'), '/'
2+
3+
= select_tag :pages, optgroup(@pages, selected: @pages.last)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
%p= link_to raw('&larr; back'), '/'
2+
3+
= select_tag :pages, optgroup(@pages, selected: @pages.last)

spec/dummy_app/app/views/welcome/index.html.haml

+3
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@
88
%li= link_to 'pages/index (just tree)', pages_path
99
%li= link_to 'pages/nested_options', nested_options_pages_path
1010
%li= link_to 'pages/indented_options', indented_options_pages_path
11+
%li= link_to 'pages/optgroup', optgroup_pages_path
1112
%li= link_to 'pages/manage (sortable tree)', manage_pages_path
1213
%li= link_to 'pages/node_manage (sortable tree)', node_manage_pages_path
1314
%li= link_to 'pages/expand (expandable tree)', expand_pages_path
1415

16+
1517
%h5 Admin::Pages (model Admin::Pages + namespace :admin)
1618

1719
%ul
1820
%li= link_to '/admin/pages/index (just tree)', admin_pages_path
1921
%li= link_to '/admin/pages/nested_options', nested_options_admin_pages_path
2022
%li= link_to '/admin/pages/indented_options', indented_options_admin_pages_path
23+
%li= link_to '/admin/pages/optgroup', optgroup_admin_pages_path
2124
%li= link_to '/admin/pages/manage (sortable tree)', manage_admin_pages_path
2225
%li= link_to '/admin/pages/node_manage (sortable tree)', node_manage_admin_pages_path
2326

spec/dummy_app/config/application.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require File.expand_path('../boot', __FILE__)
22

33
require 'rails/all'
4+
require 'awesome_nested_set'
45

56
if defined?(Bundler)
67
# If you precompile assets before deploying to production, use this line

spec/dummy_app/config/routes.rb

+9-17
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
JquerySortableTreeTest::Application.routes.draw do
2-
get "category/index"
3-
4-
get "category/manage"
2+
get 'category/index'
3+
get 'category/manage'
54

65
root to: 'welcome#index'
76

87
resources :pages do
98
collection do
10-
get :nested_options
11-
get :indented_options
12-
get :manage
13-
get :node_manage
14-
get :expand
9+
get :nested_options
10+
get :indented_options
11+
get :optgroup
12+
get :manage
13+
get :node_manage
14+
get :expand
1515

1616
post :rebuild
1717
post :expand_node
@@ -21,7 +21,7 @@
2121
namespace :admin do
2222
resources :pages do
2323
collection do
24-
get :nested_options, :indented_options, :manage, :node_manage
24+
get :nested_options, :indented_options, :optgroup, :manage, :node_manage
2525
post :rebuild
2626
end
2727
end
@@ -42,12 +42,4 @@
4242
end
4343
end
4444
end
45-
46-
# resources :comments do
47-
# collection do
48-
# post :rebuild
49-
# get :manage
50-
# get :comments
51-
# end
52-
# end
5345
end

0 commit comments

Comments
 (0)