#Taken from Radiant Nav Tab API require 'singleton' module Radmin class AdminUI class DuplicateTabNameError < StandardError; end class NavTab < Array attr_reader :name def initialize(name) @name = name @items = [] end def [](id) unless id.kind_of? Fixnum self.find {|subnav_item| subnav_item.name.to_s.titleize == id.to_s.titleize } else super end end def <<(*args) options = args.extract_options! item = args.first raise DuplicateTabNameError.new("duplicate tab name '#{item.name}'") if self[item.name] item.tab = self if item.respond_to?(:tab=) if options.empty? super(item) else options.symbolize_keys! before = options.delete(:before) after = options.delete(:after) tab_name = before || after if self[tab_name] _index = index(self[tab_name]) _index += 1 unless before insert(_index, item) else super(item) end end end alias :add :<< def add_item(*args) options = args.extract_options! options.symbolize_keys! before = options.delete(:before) after = options.delete(:after) tab_name = before || after if self[tab_name] _index = index(self[tab_name]) _index += 1 unless before insert(_index, NavSubItem.new(args.first, args.second)) else add NavSubItem.new(args.first, args.second) end end def visible?(user) any? { |sub_item| sub_item.visible?(user) } end end class NavSubItem attr_reader :name, :url attr_accessor :tab def initialize(name, url = "#") @name, @url = name, url end def visible?(user) visible_by_controller?(user) end def relative_url File.join('/', url) end private def visible_by_controller?(user) params = Rails.application.routes.recognize_path(url, :method => :get) if params && params[:controller] ctx = params[:controller].sub('/','_').to_sym Authorization::Engine.instance.permit?(params[:action], :context => ctx, :user => user) else false end end end class << self def tab(name,&block) the_tab = instance.nav[name] unless the_tab the_tab = NavTab.new(name) instance.nav << the_tab end if block_given? yield(the_tab) end the_tab end end include Singleton attr_accessor :nav def initialize @nav = NavTab.new("Tab Container") load_default_nav end def nav_tab(*args) NavTab.new(*args) end def nav_item(*args) NavSubItem.new(*args) end protected def load_default_nav settings = nav_tab("Settings") settings << nav_item("Account", "/admin/account/edit") settings << nav_item("Users", "/admin/users") settings << nav_item("Application", "/admin/settings") nav << settings end end end