Feature #15880 » 0001-introduce-virtual-MenuNodes-which-are-characterized-.patch
| lib/redmine/menu_manager.rb | ||
|---|---|---|
| 147 | 147 |
end |
| 148 | 148 | |
| 149 | 149 |
def render_single_menu_node(item, caption, url, selected) |
| 150 |
link_to(h(caption), url, item.html_options(:selected => selected)) |
|
| 150 |
options = item.html_options(:selected => selected) |
|
| 151 | ||
| 152 |
# virtual nodes are only there for their children to be displayed in the menu |
|
| 153 |
# and should not do anything on click, except if otherwise defined elsewhere |
|
| 154 |
if url.blank? |
|
| 155 |
url = '#' |
|
| 156 |
options.reverse_merge!(:onclick => 'return false;') |
|
| 157 |
end |
|
| 158 |
link_to(h(caption), url, options) |
|
| 151 | 159 |
end |
| 152 | 160 | |
| 153 | 161 |
def render_unattached_menu_item(menu_item, project) |
| ... | ... | |
| 433 | 441 |
# * Checking the permission or the url target (project only) |
| 434 | 442 |
# * Checking the conditions of the item |
| 435 | 443 |
def allowed?(user, project) |
| 436 |
if user && project |
|
| 444 |
if url.blank? |
|
| 445 |
# this is a virtual node that is only there for its children to be diplayed in the menu |
|
| 446 |
# it is considered an allowed node if at least one of the children is allowed |
|
| 447 |
all_children = children |
|
| 448 |
all_children += child_menus.call(project) if child_menus |
|
| 449 |
return true if all_children.detect{|child| child.allowed?(user, project) }
|
|
| 450 |
return false |
|
| 451 |
elsif user && project |
|
| 437 | 452 |
if permission |
| 438 | 453 |
unless user.allowed_to?(permission, project) |
| 439 | 454 |
return false |
| test/unit/lib/redmine/menu_manager/menu_helper_test.rb | ||
|---|---|---|
| 209 | 209 |
end |
| 210 | 210 |
end |
| 211 | 211 | |
| 212 |
def test_render_empty_virtual_menu_node_with_children |
|
| 213 | ||
| 214 |
# only empty item with no click target |
|
| 215 |
Redmine::MenuManager.map :menu1 do |menu| |
|
| 216 |
menu.push(:parent_node, nil, { })
|
|
| 217 |
end |
|
| 218 | ||
| 219 |
# parent with unallowed unattached child |
|
| 220 |
Redmine::MenuManager.map :menu2 do |menu| |
|
| 221 |
menu.push(:parent_node, nil, {:children => Proc.new {|p|
|
|
| 222 |
[Redmine::MenuManager::MenuItem.new("test_child_unallowed", {:controller => 'issues', :action => 'new'}, {})]
|
|
| 223 |
} }) |
|
| 224 |
end |
|
| 225 | ||
| 226 |
# parent with unallowed standard child |
|
| 227 |
Redmine::MenuManager.map :menu3 do |menu| |
|
| 228 |
menu.push(:parent_node, nil, {})
|
|
| 229 |
menu.push(:test_child_unallowed, {:controller =>'issues', :action => 'new'}, {:parent => :parent_node})
|
|
| 230 |
end |
|
| 231 | ||
| 232 |
# should not be displayed to anonymous |
|
| 233 |
User.current = User.find(6) |
|
| 234 |
assert_nil render_menu(:menu1, Project.find(1)) |
|
| 235 |
assert_nil render_menu(:menu2, Project.find(1)) |
|
| 236 |
assert_nil render_menu(:menu3, Project.find(1)) |
|
| 237 | ||
| 238 |
# should be displayed to an admin |
|
| 239 |
User.current = User.find(1) |
|
| 240 |
@output_buffer = render_menu(:menu2, Project.find(1)) |
|
| 241 |
assert_select("ul li a.parent-node", "Parent node")
|
|
| 242 |
@output_buffer = render_menu(:menu3, Project.find(1)) |
|
| 243 |
assert_select("ul li a.parent-node", "Parent node")
|
|
| 244 | ||
| 245 |
end |
|
| 246 | ||
| 212 | 247 |
def test_render_menu_node_with_children_without_an_array |
| 213 | 248 |
parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, |
| 214 | 249 |
'/test', |