mtoros-mega_menus 0.4.9
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +22 -0
- data/README +30 -0
- data/Rakefile +20 -0
- data/lib/mega_menus/editor.rb +195 -0
- data/lib/mega_menus/view_helpers.rb +5 -0
- data/lib/mega_menus.rb +22 -0
- data/mega_menus.gemspec +33 -0
- data/rails_generators/menu/USAGE +1 -0
- data/rails_generators/menu/menu_generator.rb +25 -0
- data/rails_generators/menu/templates/controllers/menu_controller.rb +36 -0
- data/rails_generators/menu/templates/helpers/menu_helper.rb +108 -0
- data/rails_generators/menu/templates/models/create_menus.rb +20 -0
- data/rails_generators/menu/templates/models/menu.rb +3 -0
- data/rails_generators/menu/templates/views/_menu.html.erb +2 -0
- data/rails_generators/menu/templates/views/add_menu.rjs +1 -0
- data/rails_generators/menu/templates/views/add_menu_form.rjs +2 -0
- data/rails_generators/menu/templates/views/delete_menu.rjs +1 -0
- data/rails_generators/menu/templates/views/down_menu.rjs +1 -0
- data/rails_generators/menu/templates/views/edit_menu.rjs +1 -0
- data/rails_generators/menu/templates/views/edit_menu_form.rjs +1 -0
- data/rails_generators/menu/templates/views/up_menu.rjs +1 -0
- data/test/test_editor.rb +50 -0
- metadata +90 -0
data/Manifest
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Manifest
|
2
|
+
README
|
3
|
+
Rakefile
|
4
|
+
lib/mega_menus.rb
|
5
|
+
lib/mega_menus/editor.rb
|
6
|
+
lib/mega_menus/view_helpers.rb
|
7
|
+
test/test_editor.rb
|
8
|
+
rails_generators/menu/USAGE
|
9
|
+
rails_generators/menu/menu_generator.rb
|
10
|
+
rails_generators/menu/templates/controllers/menu_controller.rb
|
11
|
+
rails_generators/menu/templates/views/add_menu_form.rjs
|
12
|
+
rails_generators/menu/templates/views/add_menu.rjs
|
13
|
+
rails_generators/menu/templates/views/delete_menu.rjs
|
14
|
+
rails_generators/menu/templates/views/edit_menu_form.rjs
|
15
|
+
rails_generators/menu/templates/views/edit_menu.rjs
|
16
|
+
rails_generators/menu/templates/views/up_menu.rjs
|
17
|
+
rails_generators/menu/templates/views/down_menu.rjs
|
18
|
+
rails_generators/menu/templates/views/_menu.html.erb
|
19
|
+
rails_generators/menu/templates/helpers/menu_helper.rb
|
20
|
+
rails_generators/menu/templates/models/create_menus.rb
|
21
|
+
rails_generators/menu/templates/models/menu.rb
|
22
|
+
test/test_editor.rb
|
data/README
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
= MegaMenus
|
2
|
+
|
3
|
+
== DESCRIPTION:
|
4
|
+
|
5
|
+
This gem makes working with menu structures in Rails easier.
|
6
|
+
|
7
|
+
== FEATURES/PROBLEMS:
|
8
|
+
The current version creates
|
9
|
+
-a controller for editing the menu
|
10
|
+
-views associated to methods written in rjs
|
11
|
+
-a partial for rendering the menu
|
12
|
+
-a helper to configure its working in normal mode and edit mode
|
13
|
+
-a model for storing the menu with a field absolute_position to improve performance when the menu is in normal mode
|
14
|
+
-a generator for rails to ease the developers work for using this gem
|
15
|
+
|
16
|
+
== STATUS
|
17
|
+
Currently writing tests to ensure proper working for future versions.
|
18
|
+
|
19
|
+
|
20
|
+
== REQUIREMENTS:
|
21
|
+
Rails 2.2
|
22
|
+
|
23
|
+
== NOTES:
|
24
|
+
The menu is located in "<div id=\"mega_menus\">"
|
25
|
+
The selected menu is located in "<div id=\"selected_mega_menu\">"
|
26
|
+
|
27
|
+
|
28
|
+
== INSTALL:
|
29
|
+
script/generate menu menu_name
|
30
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#require './lib/mega_menus.rb'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'echoe'
|
7
|
+
|
8
|
+
Echoe.new('mega_menus', '0.4.9') do |p|
|
9
|
+
p.summary = "Treeview menu Gem for Rails"
|
10
|
+
p.description = "Adds a model, controller to perform the tasks in order to have a treeview menu. To use this gem simply install it and write script/generate menu name_of_the_menu"
|
11
|
+
p.author = ['Marko Toros', 'Rails Core']
|
12
|
+
p.email = "mtoros@gmail.com"
|
13
|
+
#p.url = ""
|
14
|
+
end
|
15
|
+
rescue LoadError => boom
|
16
|
+
puts "You are missing a dependency required for meta-operations on this gem."
|
17
|
+
puts "#{boom.to_s.capitalize}."
|
18
|
+
end
|
19
|
+
|
20
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
@@ -0,0 +1,195 @@
|
|
1
|
+
module MegaMenus
|
2
|
+
module Editor
|
3
|
+
#here we want a class method!
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def acts_as_menu
|
10
|
+
self.send :extend, MenuClassMethods
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
module MenuClassMethods
|
15
|
+
def check_menus
|
16
|
+
#title, id, parent_id, link
|
17
|
+
cn=self.column_names
|
18
|
+
if(!cn.include?("id"))
|
19
|
+
return FALSE
|
20
|
+
end
|
21
|
+
if(!cn.include?("title"))
|
22
|
+
return FALSE
|
23
|
+
end
|
24
|
+
if(!cn.include?("parent_id"))
|
25
|
+
return FALSE
|
26
|
+
end
|
27
|
+
if(!cn.include?("link"))
|
28
|
+
return FALSE
|
29
|
+
end
|
30
|
+
if(!cn.include?("position"))
|
31
|
+
return FALSE
|
32
|
+
end
|
33
|
+
if(!cn.include?("absolute_position"))
|
34
|
+
return FALSE
|
35
|
+
end
|
36
|
+
if(!cn.include?("depth"))
|
37
|
+
return FALSE
|
38
|
+
end
|
39
|
+
#model correct
|
40
|
+
return TRUE
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_child(menu_id, title, link)
|
44
|
+
position=assign_position(menu_id)
|
45
|
+
child = self.new( "title" => title,
|
46
|
+
"link" => link,
|
47
|
+
"parent_id" => menu_id,
|
48
|
+
"position" => position)
|
49
|
+
child.save!
|
50
|
+
end
|
51
|
+
|
52
|
+
def assign_position(parent_id)
|
53
|
+
c=children(parent_id)
|
54
|
+
if(!c.empty?)
|
55
|
+
position= (c.max {|c1,c2| c1.position <=> c2.position}).position + 1
|
56
|
+
else
|
57
|
+
position=1
|
58
|
+
end
|
59
|
+
return position
|
60
|
+
end
|
61
|
+
|
62
|
+
def children(menu_id)
|
63
|
+
self.find(:all, :order=> "position" ,:conditions => { :parent_id=>menu_id})
|
64
|
+
end
|
65
|
+
|
66
|
+
def all_children(menu_id)
|
67
|
+
#to be written
|
68
|
+
end
|
69
|
+
|
70
|
+
def parent_menu(menu_id)
|
71
|
+
m=self.find(menu_id)
|
72
|
+
self.find(:first,:conditions => { :id=>m.parent_id})
|
73
|
+
end
|
74
|
+
|
75
|
+
def siblings(menu_id)
|
76
|
+
p=parent_menu(menu_id)
|
77
|
+
ac=children(p.id)
|
78
|
+
i=0
|
79
|
+
ac.each do |c|
|
80
|
+
if(c.id==menu_id)
|
81
|
+
ac.delete_at(i)
|
82
|
+
break
|
83
|
+
end
|
84
|
+
i=i+1
|
85
|
+
end
|
86
|
+
return ac
|
87
|
+
end
|
88
|
+
|
89
|
+
#sorry..for the spin word...:)
|
90
|
+
def get_menu(parent_id, position)
|
91
|
+
self.find(:first,:conditions => { :parent_id=>parent_id, :position => position})
|
92
|
+
end
|
93
|
+
|
94
|
+
def switch_menu_positions(parent_id, position1, position2)
|
95
|
+
menu1=get_menu(parent_id,position1)
|
96
|
+
menu2=get_menu(parent_id,position2)
|
97
|
+
menu1.position,menu2.position =menu2.position,menu1.position
|
98
|
+
menu1.save!
|
99
|
+
menu2.save!
|
100
|
+
end
|
101
|
+
|
102
|
+
def position_up(id)
|
103
|
+
menu=self.find(id)
|
104
|
+
if(menu.position>1)
|
105
|
+
switch_menu_positions(menu.parent_id, menu.position, menu.position-1)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def position_down(id)
|
110
|
+
menu=self.find(id)
|
111
|
+
if(menu.position< (siblings(id).max {|c1,c2| c1.position <=> c2.position}).position)
|
112
|
+
switch_menu_positions(menu.parent_id, menu.position, menu.position+1)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def edit(menu_id, new_parent_id, title, link)
|
117
|
+
menu=self.find(menu_id)
|
118
|
+
menu.update_attributes!(:title=> title,:link=> link)
|
119
|
+
if(menu.parent_id != new_parent_id)
|
120
|
+
position=assign_position(new_parent_id)
|
121
|
+
newmenu=self.new(:title=>title, :link=>link, :parent_id=>new_parent_id, :position=>position)
|
122
|
+
newmenu.save!
|
123
|
+
children(menu.id).each do |c|
|
124
|
+
c.parent_id=newmenu.id
|
125
|
+
end
|
126
|
+
siblings(menu).each do |s|
|
127
|
+
if(s.position>menu.position)
|
128
|
+
s.decrement(:position)
|
129
|
+
s.save!
|
130
|
+
end
|
131
|
+
end
|
132
|
+
self.delete(menu_id)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def delete_item(menu_id)
|
137
|
+
menu=self.find(menu_id)
|
138
|
+
if(children(menu_id).empty?)
|
139
|
+
siblings(menu_id).each do |s|
|
140
|
+
if(s.position>menu.position)
|
141
|
+
s.decrement(:position)
|
142
|
+
s.save!
|
143
|
+
end
|
144
|
+
end
|
145
|
+
else
|
146
|
+
siblings(menu.id).each do |s|
|
147
|
+
if(s.position>menu.position)
|
148
|
+
s.position+=children(menu.id).count - 1
|
149
|
+
s.save!
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
#actual move
|
154
|
+
children(menu.id).each do |c|
|
155
|
+
c.position+=menu.position-1
|
156
|
+
c.parent_id=menu.parent_id
|
157
|
+
c.save!
|
158
|
+
end
|
159
|
+
self.delete(menu_id)
|
160
|
+
end
|
161
|
+
|
162
|
+
def determine_abs_position_and_depth
|
163
|
+
roots=self.find(:all,:order=>"position",:conditions => {:parent_id=>1} )
|
164
|
+
ap=0
|
165
|
+
depth=1
|
166
|
+
roots.each do |r|
|
167
|
+
ap+=1
|
168
|
+
r.absolute_position=ap
|
169
|
+
r.depth=depth
|
170
|
+
r.save!
|
171
|
+
ap,depth=recursive_dapad(r,ap,depth)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def recursive_dapad(rp,ap,depth)
|
176
|
+
depth+=1
|
177
|
+
children(rp.id).each do |m|
|
178
|
+
ap+=1
|
179
|
+
m.absolute_position=ap
|
180
|
+
m.depth=depth
|
181
|
+
m.save!
|
182
|
+
ap,depth=recursive_dapad(m,ap,depth)
|
183
|
+
end
|
184
|
+
depth-=1
|
185
|
+
return ap,depth
|
186
|
+
end
|
187
|
+
|
188
|
+
def delete_children(menu_id)
|
189
|
+
#need to implement all_children first
|
190
|
+
#self.find(menu_id).all_children.each do |c|
|
191
|
+
# self.delete(c.id)
|
192
|
+
#end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
data/lib/mega_menus.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module MegaMenus
|
2
|
+
class << self
|
3
|
+
def enable
|
4
|
+
enable_actionpack
|
5
|
+
enable_activerecord
|
6
|
+
end
|
7
|
+
|
8
|
+
def enable_actionpack
|
9
|
+
# require 'mega_menus/view_helpers'
|
10
|
+
# ActionView::Base.send :include, ViewHelpers
|
11
|
+
end
|
12
|
+
|
13
|
+
def enable_activerecord
|
14
|
+
require 'mega_menus/editor'
|
15
|
+
ActiveRecord::Base.send :include, Editor
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
if defined?(Rails) and defined?(ActiveRecord) and defined?(ActionController)
|
21
|
+
MegaMenus.enable
|
22
|
+
end
|
data/mega_menus.gemspec
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = %q{mega_menus}
|
3
|
+
s.version = "0.4.9"
|
4
|
+
|
5
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
6
|
+
s.authors = ["Marko Toros, Rails Core"]
|
7
|
+
s.date = %q{2008-11-10}
|
8
|
+
s.description = %q{Adds a model, controller to perform the tasks in order to have a treeview menu. To use this gem simply install it and write script/generate menu name_of_the_menu}
|
9
|
+
s.email = %q{mtoros@gmail.com}
|
10
|
+
s.extra_rdoc_files = ["README", "lib/mega_menus.rb", "lib/mega_menus/editor.rb", "lib/mega_menus/view_helpers.rb"]
|
11
|
+
s.files = ["Manifest", "README", "Rakefile", "lib/mega_menus.rb", "lib/mega_menus/editor.rb", "lib/mega_menus/view_helpers.rb", "test/test_editor.rb", "rails_generators/menu/USAGE", "rails_generators/menu/menu_generator.rb", "rails_generators/menu/templates/controllers/menu_controller.rb", "rails_generators/menu/templates/views/add_menu_form.rjs", "rails_generators/menu/templates/views/add_menu.rjs", "rails_generators/menu/templates/views/delete_menu.rjs", "rails_generators/menu/templates/views/edit_menu_form.rjs", "rails_generators/menu/templates/views/edit_menu.rjs", "rails_generators/menu/templates/views/up_menu.rjs", "rails_generators/menu/templates/views/down_menu.rjs", "rails_generators/menu/templates/views/_menu.html.erb", "rails_generators/menu/templates/helpers/menu_helper.rb", "rails_generators/menu/templates/models/create_menus.rb", "rails_generators/menu/templates/models/menu.rb", "mega_menus.gemspec"]
|
12
|
+
s.has_rdoc = true
|
13
|
+
s.homepage = %q{}
|
14
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Mega_menus", "--main", "README"]
|
15
|
+
s.require_paths = ["lib"]
|
16
|
+
s.rubyforge_project = %q{mega_menus}
|
17
|
+
s.rubygems_version = %q{1.2.0}
|
18
|
+
s.summary = %q{Treeview menu Gem for Rails}
|
19
|
+
s.test_files = ["test/test_editor.rb"]
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
|
+
s.specification_version = 2
|
24
|
+
|
25
|
+
if current_version >= 3 then
|
26
|
+
s.add_development_dependency(%q<echoe>, [">= 0"])
|
27
|
+
else
|
28
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
29
|
+
end
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Write script/generate menu <name_of_menu> in the root folder of your rails application in order to use this generator.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class MenuGenerator < Rails::Generator::NamedBase
|
2
|
+
def manifest
|
3
|
+
record do |m|
|
4
|
+
#create the menu controller
|
5
|
+
m.template "controllers/menu_controller.rb", "app/controllers/#{file_name}editor_controller.rb"
|
6
|
+
#create the views
|
7
|
+
m.directory File.join('app/views/', "#{file_name}editor")
|
8
|
+
m.template "views/add_menu_form.rjs", "app/views/#{file_name}editor/add_menu_form.rjs"
|
9
|
+
m.template "views/add_menu.rjs", "app/views/#{file_name}editor/add_menu.rjs"
|
10
|
+
m.template "views/delete_menu.rjs", "app/views/#{file_name}editor/delete_menu.rjs"
|
11
|
+
m.template "views/edit_menu_form.rjs", "app/views/#{file_name}editor/edit_menu_form.rjs"
|
12
|
+
m.template "views/edit_menu.rjs", "app/views/#{file_name}editor/edit_menu.rjs"
|
13
|
+
m.template "views/up_menu.rjs", "app/views/#{file_name}editor/up_menu.rjs"
|
14
|
+
m.template "views/down_menu.rjs", "app/views/#{file_name}editor/down_menu.rjs"
|
15
|
+
m.template "views/_menu.html.erb", "app/views/#{file_name}editor/_#{file_name}.html.erb"
|
16
|
+
#create the helper
|
17
|
+
m.template "helpers/menu_helper.rb", "app/helpers/#{file_name}_helper.rb"
|
18
|
+
#create the models
|
19
|
+
m.directory 'db/migrate/'
|
20
|
+
m.template "models/create_menus.rb", "db/migrate/#{Time.now.strftime("%Y%m%d%H%M%S")}_create_#{file_name}s.rb"
|
21
|
+
m.template "models/menu.rb", "app/models/#{file_name}.rb"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class <%= "#{file_name.capitalize+ "editor" + "Controller"}" %> < ApplicationController
|
2
|
+
|
3
|
+
def add_menu_form
|
4
|
+
@menu_id=params[:menu_id]
|
5
|
+
end
|
6
|
+
|
7
|
+
def add_menu
|
8
|
+
<%= file_name.capitalize %>.add_child(params[:menu_id].to_i, params[:title], params[:link])
|
9
|
+
<%= file_name.capitalize %>.determine_abs_position_and_depth
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
def delete_menu
|
14
|
+
<%= file_name.capitalize %>.delete_item(params[:menu_id].to_i)
|
15
|
+
<%= file_name.capitalize %>.determine_abs_position_and_depth
|
16
|
+
end
|
17
|
+
|
18
|
+
def edit_menu_form
|
19
|
+
@menu_id=params[:menu_id]
|
20
|
+
end
|
21
|
+
|
22
|
+
def edit_menu
|
23
|
+
<%= file_name.capitalize %>.edit(params[:menu_id].to_i, params[:parent_id].to_i, params[:title], params[:link])
|
24
|
+
<%= file_name.capitalize %>.determine_abs_position_and_depth
|
25
|
+
end
|
26
|
+
|
27
|
+
def up_menu
|
28
|
+
<%= file_name.capitalize %>.position_up(params[:menu_id].to_i)
|
29
|
+
<%= file_name.capitalize %>.determine_abs_position_and_depth
|
30
|
+
end
|
31
|
+
|
32
|
+
def down_menu
|
33
|
+
<%= file_name.capitalize %>.position_down(params[:menu_id].to_i)
|
34
|
+
<%= file_name.capitalize %>.determine_abs_position_and_depth
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module <%= "#{file_name.capitalize}Helper" %>
|
2
|
+
def mega_menus(menu_model, menu_controller, admin_condition)
|
3
|
+
#Checks
|
4
|
+
if(!menu_checks(menu_model))
|
5
|
+
return nil
|
6
|
+
end
|
7
|
+
|
8
|
+
#HTML generation
|
9
|
+
html_generation(menu_model, menu_controller,admin_condition)
|
10
|
+
end
|
11
|
+
|
12
|
+
def menu_checks(menu_model)
|
13
|
+
if(!defined?(menu_model.check_menus))
|
14
|
+
concat "Are you sure you have called acts_as_menu"
|
15
|
+
return FALSE
|
16
|
+
end
|
17
|
+
if(!menu_model.check_menus)
|
18
|
+
concat "You have not set correctly up the model."
|
19
|
+
return FALSE
|
20
|
+
end
|
21
|
+
return TRUE
|
22
|
+
end
|
23
|
+
|
24
|
+
def html_generation(menu_model, menu_controller,admin_condition)
|
25
|
+
concat "<div id=\"mega_menus\">"
|
26
|
+
if(admin_condition)
|
27
|
+
concat "Add Root:"
|
28
|
+
concat link_to_remote "Add", {:url => {:controller => menu_controller, :action => 'add_menu_form', :menu_id => 1,:menu_model=>menu_model, :menu_controller=>menu_controller } }, {:class => "menu_links", :id => "add_child_link_#{1}"}
|
29
|
+
add_menu_form(menu_model, menu_controller,1)
|
30
|
+
end
|
31
|
+
menu_list(menu_model, menu_controller,admin_condition)
|
32
|
+
concat "</div>"
|
33
|
+
end
|
34
|
+
|
35
|
+
def menu_list(menu_model, menu_controller,admin_condition)
|
36
|
+
allmenus=menu_model.find(:all, :order => "absolute_position")
|
37
|
+
concat "<ul>"
|
38
|
+
#mdp...previous menu depth
|
39
|
+
pmd=1
|
40
|
+
allmenus.each do |m|
|
41
|
+
if(m.id!=1)
|
42
|
+
if(m.depth > pmd)
|
43
|
+
pmd.upto(m.depth-1) {concat "<ul>"}
|
44
|
+
end
|
45
|
+
if(m.depth < pmd)
|
46
|
+
pmd.downto(m.depth+1) {concat "</ul>"}
|
47
|
+
end
|
48
|
+
pmd=m.depth
|
49
|
+
#write the actual menu line for each record
|
50
|
+
concat "<li>"
|
51
|
+
#make the selected view appear nicer
|
52
|
+
if(m.id==params[:menu_id].to_i or m.link==request.request_uri)
|
53
|
+
concat "<div id=\"selected_mega_menu\">"
|
54
|
+
end
|
55
|
+
concat link_to "#{m.title} #{m.id} ", m.link
|
56
|
+
if(m.id==params[:menu_id].to_i or m.link==request.request_uri)
|
57
|
+
concat "</div>"
|
58
|
+
end
|
59
|
+
if(admin_condition)
|
60
|
+
concat link_to_remote "Add", {:url => {:controller => menu_controller, :action => 'add_menu_form', :menu_id => m.id,:menu_model=>menu_model, :menu_controller=>menu_controller}}, {:class => "menu_links", :id => "add_menu_link_#{m.id}"}
|
61
|
+
concat link_to_remote "Delete", {:url => {:controller => menu_controller, :action => 'delete_menu', :menu_id => m.id,:menu_model=>menu_model, :menu_controller=>menu_controller}}, {:class => "menu_links", :id => "delete_menu_link_#{m.id}"}
|
62
|
+
concat link_to_remote "Edit", {:url => {:controller => menu_controller, :action => 'edit_menu_form', :menu_id => m.id,:menu_model=>menu_model, :menu_controller=>menu_controller}}, {:class => "menu_links", :id => "edit_menu_link_#{m.id}"}
|
63
|
+
concat link_to_remote "Up", {:url => {:controller => menu_controller, :action => 'up_menu', :menu_id => m.id,:menu_model=>menu_model, :menu_controller=>menu_controller}}, {:class => "menu_links",:id => "up_menu_link_#{m.id}"}
|
64
|
+
concat link_to_remote "Down", {:url => {:controller => menu_controller, :action => 'down_menu', :menu_id => m.id,:menu_model=>menu_model, :menu_controller=>menu_controller}}, {:class => "menu_links", :id => "down_menu_link_#{m.id}"}
|
65
|
+
add_menu_form(menu_model, menu_controller,m.id)
|
66
|
+
edit_menu_form(menu_model, menu_controller,m)
|
67
|
+
end
|
68
|
+
concat "</li>"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
concat "<\ul>"
|
72
|
+
|
73
|
+
return nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def add_menu_form(menu_model, menu_controller, menu_id)
|
77
|
+
form_remote_tag :url => {:controller=>menu_controller, :action=> 'add_menu'}, :html => {:id => "add_menu_form_#{menu_id}", :style=>"display: none"} do
|
78
|
+
concat "<div>"
|
79
|
+
concat "Title:"
|
80
|
+
concat text_field_tag "title", "title"
|
81
|
+
concat "Link:"
|
82
|
+
concat text_field_tag "link", "link"
|
83
|
+
concat hidden_field_tag :menu_id, menu_id
|
84
|
+
#content_tag :button, "Submit", {:type=>"submit", :class=>"button-submit"}
|
85
|
+
concat submit_tag "Add"
|
86
|
+
concat "</div>"
|
87
|
+
end
|
88
|
+
return nil
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
def edit_menu_form(menu_model, menu_controller,m)
|
93
|
+
form_remote_tag :url => {:controller=>menu_controller, :action=> 'edit_menu'}, :html => {:id => "edit_menu_form_#{m.id}", :style=>"display: none"} do
|
94
|
+
concat "<div>"
|
95
|
+
concat "Title:"
|
96
|
+
concat text_field_tag "title", m.title
|
97
|
+
concat "Link:"
|
98
|
+
concat text_field_tag "link", m.link
|
99
|
+
concat "Parent:"
|
100
|
+
concat text_field_tag "parent_id", m.parent_id
|
101
|
+
concat hidden_field_tag :menu_id, m.id
|
102
|
+
#concat content_tag :button, "Submit", {:type=>"submit", :class=>"button-submit"}
|
103
|
+
concat submit_tag "Edit"
|
104
|
+
concat "</div>"
|
105
|
+
end
|
106
|
+
return nil
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class <%= "#{'Create' + file_name.capitalize + 's'}" %> < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table <%= ":#{file_name + 's'}" %> do |t|
|
4
|
+
t.string :title
|
5
|
+
t.string :link
|
6
|
+
t.integer :parent_id
|
7
|
+
t.integer :position
|
8
|
+
t.integer :absolute_position
|
9
|
+
t.integer :depth
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
|
13
|
+
<%= file_name.capitalize %>.create :id => 1
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def self.down
|
18
|
+
drop_table <%= ":#{file_name + 's'}" %>
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
page.replace_html "mega_menus", :partial => <%= "'#{file_name}editor/#{file_name}'" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
page.replace_html "mega_menus", :partial => <%= "'#{file_name}editor/#{file_name}'" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
page.replace_html "mega_menus", :partial => <%= "'#{file_name}editor/#{file_name}'" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
page.replace_html "mega_menus", :partial => <%= "'#{file_name}editor/#{file_name}'" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
page.toggle "edit_menu_form_#{@menu_id}"
|
@@ -0,0 +1 @@
|
|
1
|
+
page.replace_html "mega_menus", :partial => <%= "'#{file_name}editor/#{file_name}'" %>
|
data/test/test_editor.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
gem 'activerecord'
|
5
|
+
require 'active_record'
|
6
|
+
|
7
|
+
require "#{File.dirname(__FILE__)}/../lib/mega_menus"
|
8
|
+
require 'mega_menus'
|
9
|
+
MegaMenus.enable_activerecord
|
10
|
+
|
11
|
+
def setup_db
|
12
|
+
ActiveRecord::Schema.define(:version => 1) do
|
13
|
+
create_table :topics do |t|
|
14
|
+
t.column :pos, :integer
|
15
|
+
t.column :parent_id, :integer
|
16
|
+
t.column :created_at, :datetime
|
17
|
+
t.column :updated_at, :datetime
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown_db
|
23
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
24
|
+
ActiveRecord::Base.connection.drop_table(table)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class Topic < ActiveRecord::Base
|
29
|
+
acts_as_menu
|
30
|
+
end
|
31
|
+
|
32
|
+
class TestEditor < Test::Unit::TestCase
|
33
|
+
def setup
|
34
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
|
35
|
+
setup_db
|
36
|
+
(1..5).each { |counter| Topic.create! :pos => counter, :parent_id => counter }
|
37
|
+
end
|
38
|
+
|
39
|
+
def teardown
|
40
|
+
teardown_db
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_small
|
44
|
+
assert_equal 5, Topic.count
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_other
|
48
|
+
end
|
49
|
+
#add root, add menu, delete menu, ..., change position,...
|
50
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mtoros-mega_menus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.9
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Marko Toros, Rails Core
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-11-10 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: echoe
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
version:
|
24
|
+
description: Adds a model, controller to perform the tasks in order to have a treeview menu. To use this gem simply install it and write script/generate menu name_of_the_menu
|
25
|
+
email: mtoros@gmail.com
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files:
|
31
|
+
- README
|
32
|
+
- lib/mega_menus.rb
|
33
|
+
- lib/mega_menus/editor.rb
|
34
|
+
- lib/mega_menus/view_helpers.rb
|
35
|
+
files:
|
36
|
+
- Manifest
|
37
|
+
- README
|
38
|
+
- Rakefile
|
39
|
+
- lib/mega_menus.rb
|
40
|
+
- lib/mega_menus/editor.rb
|
41
|
+
- lib/mega_menus/view_helpers.rb
|
42
|
+
- test/test_editor.rb
|
43
|
+
- rails_generators/menu/USAGE
|
44
|
+
- rails_generators/menu/menu_generator.rb
|
45
|
+
- rails_generators/menu/templates/controllers/menu_controller.rb
|
46
|
+
- rails_generators/menu/templates/views/add_menu_form.rjs
|
47
|
+
- rails_generators/menu/templates/views/add_menu.rjs
|
48
|
+
- rails_generators/menu/templates/views/delete_menu.rjs
|
49
|
+
- rails_generators/menu/templates/views/edit_menu_form.rjs
|
50
|
+
- rails_generators/menu/templates/views/edit_menu.rjs
|
51
|
+
- rails_generators/menu/templates/views/up_menu.rjs
|
52
|
+
- rails_generators/menu/templates/views/down_menu.rjs
|
53
|
+
- rails_generators/menu/templates/views/_menu.html.erb
|
54
|
+
- rails_generators/menu/templates/helpers/menu_helper.rb
|
55
|
+
- rails_generators/menu/templates/models/create_menus.rb
|
56
|
+
- rails_generators/menu/templates/models/menu.rb
|
57
|
+
- mega_menus.gemspec
|
58
|
+
has_rdoc: true
|
59
|
+
homepage: ""
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options:
|
62
|
+
- --line-numbers
|
63
|
+
- --inline-source
|
64
|
+
- --title
|
65
|
+
- Mega_menus
|
66
|
+
- --main
|
67
|
+
- README
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: "0"
|
75
|
+
version:
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: "1.2"
|
81
|
+
version:
|
82
|
+
requirements: []
|
83
|
+
|
84
|
+
rubyforge_project: mega_menus
|
85
|
+
rubygems_version: 1.2.0
|
86
|
+
signing_key:
|
87
|
+
specification_version: 2
|
88
|
+
summary: Treeview menu Gem for Rails
|
89
|
+
test_files:
|
90
|
+
- test/test_editor.rb
|