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, #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.



429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
# File 'lib/redmine/menu_manager.rb', line 429

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]
  @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
  super @name.to_sym
end

Instance Attribute Details

#child_menusObject (readonly)

Returns the value of attribute child_menus.



426
427
428
# File 'lib/redmine/menu_manager.rb', line 426

def child_menus
  @child_menus
end

#conditionObject (readonly)

Returns the value of attribute condition.



426
427
428
# File 'lib/redmine/menu_manager.rb', line 426

def condition
  @condition
end

#lastObject (readonly)

Returns the value of attribute last.



426
427
428
# File 'lib/redmine/menu_manager.rb', line 426

def last
  @last
end

#nameObject (readonly)

Returns the value of attribute name.



426
427
428
# File 'lib/redmine/menu_manager.rb', line 426

def name
  @name
end

#paramObject (readonly)

Returns the value of attribute param.



426
427
428
# File 'lib/redmine/menu_manager.rb', line 426

def param
  @param
end

#parentObject (readonly)

Returns the value of attribute parent.



426
427
428
# File 'lib/redmine/menu_manager.rb', line 426

def parent
  @parent
end

#permissionObject (readonly)

Returns the value of attribute permission.



426
427
428
# File 'lib/redmine/menu_manager.rb', line 426

def permission
  @permission
end

#urlObject (readonly)

Returns the value of attribute url.



426
427
428
# File 'lib/redmine/menu_manager.rb', line 426

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)


487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
# File 'lib/redmine/menu_manager.rb', line 487

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



459
460
461
462
463
464
465
466
467
468
469
470
471
# File 'lib/redmine/menu_manager.rb', line 459

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



473
474
475
476
477
478
479
480
481
# File 'lib/redmine/menu_manager.rb', line 473

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