Class: Redmine::MenuManager::MenuItem

Inherits:
MenuNode
  • Object
show all
Includes:
I18n
Defined in:
lib/redmine/menu_manager.rb

Instance Attribute Summary collapse

Attributes inherited from MenuNode

#last_items_count

Instance Method Summary collapse

Methods included from I18n

#abbr_day_name, #current_language, #day_letter, #day_name, #find_language, #format_date, #format_hours, #format_time, included, #l, #l_hours, #l_hours_short, #l_or_humanize, #languages_options, #ll, #lu, #month_name, #normalize_float, #set_language_if_valid, #valid_languages

Methods inherited from MenuNode

#add, #add_at, #add_last, #children, #each, #position, #prepend, #remove!, #root, #size

Constructor Details

#initialize(name, url, options = {}) ⇒ MenuItem

Returns a new instance of MenuItem.



436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
# File 'lib/redmine/menu_manager.rb', line 436

def initialize(name, url, options={})
  if options[:if] && !options[:if].respond_to?(:call)
    raise ArgumentError, "Invalid option :if for menu item '#{name}'"
  end
  if options[:html] && !options[:html].is_a?(Hash)
    raise ArgumentError, "Invalid option :html for menu item '#{name}'"
  end
  if options[:parent] == name.to_sym
    raise ArgumentError, "Cannot set the :parent to be the same as this item"
  end
  if options[:children] && !options[:children].respond_to?(:call)
    raise ArgumentError, "Invalid option :children for menu item '#{name}'"
  end

  @name = name
  @url = url
  @condition = options[:if]
  @permission = options[:permission]
  @permission ||= false if options.key?(:permission)
  @param = options[:param] || :id
  @caption = options[:caption]
  @icon = options[:icon]
  @html_options = options[:html] || {}
  # Adds a unique class to each menu item based on its name
  @html_options[:class] = [@html_options[:class], @name.to_s.dasherize].compact.join(' ')
  @parent = options[:parent]
  @child_menus = options[:children]
  @last = options[:last] || false
  @plugin = options[:plugin]
  super(@name.to_sym)
end

Instance Attribute Details

#child_menusObject (readonly)

Returns the value of attribute child_menus.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def child_menus
  @child_menus
end

#conditionObject (readonly)

Returns the value of attribute condition.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def condition
  @condition
end

#iconObject (readonly)

Returns the value of attribute icon.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def icon
  @icon
end

#lastObject (readonly)

Returns the value of attribute last.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def last
  @last
end

#nameObject (readonly)

Returns the value of attribute name.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def name
  @name
end

#paramObject (readonly)

Returns the value of attribute param.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def param
  @param
end

#parentObject (readonly)

Returns the value of attribute parent.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def parent
  @parent
end

#permissionObject (readonly)

Returns the value of attribute permission.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def permission
  @permission
end

#pluginObject (readonly)

Returns the value of attribute plugin.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def plugin
  @plugin
end

#urlObject (readonly)

Returns the value of attribute url.



433
434
435
# File 'lib/redmine/menu_manager.rb', line 433

def url
  @url
end

Instance Method Details

#allowed?(user, project) ⇒ Boolean

Checks if a user is allowed to access the menu item by:

  • Checking the permission or the url target (project only)

  • Checking the conditions of the item

Returns:

  • (Boolean)


496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
# File 'lib/redmine/menu_manager.rb', line 496

def allowed?(user, project)
  if url.blank?
    # this is a virtual node that is only there for its children to be diplayed in the menu
    # it is considered an allowed node if at least one of the children is allowed
    all_children = children
    all_children += child_menus.call(project) if child_menus
    unless all_children.detect{|child| child.allowed?(user, project)}
      return false
    end
  elsif user && project
    if permission
      unless user.allowed_to?(permission, project)
        return false
      end
    elsif permission.nil? && url.is_a?(Hash)
      unless user.allowed_to?(url, project)
        return false
      end
    end
  end
  if condition && !condition.call(project)
    # Condition that doesn't pass
    return false
  end

  return true
end

#caption(project = nil) ⇒ Object



468
469
470
471
472
473
474
475
476
477
478
479
480
# File 'lib/redmine/menu_manager.rb', line 468

def caption(project=nil)
  if @caption.is_a?(Proc)
    c = @caption.call(project).to_s
    c = @name.to_s.humanize if c.blank?
    c
  else
    if @caption.nil?
      l_or_humanize(name, :prefix => 'label_')
    else
      @caption.is_a?(Symbol) ? l(@caption) : @caption
    end
  end
end

#html_options(options = {}) ⇒ Object



482
483
484
485
486
487
488
489
490
# File 'lib/redmine/menu_manager.rb', line 482

def html_options(options={})
  if options[:selected]
    o = @html_options.dup
    o[:class] += ' selected'
    o
  else
    @html_options
  end
end