krasivotokak-simple-navigation 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ rdoc
3
+ pkg
data/CHANGELOG ADDED
@@ -0,0 +1,38 @@
1
+ *master
2
+
3
+ *1.4.0
4
+
5
+ * added the capability to have several navigation-contexts
6
+ * doc-fix
7
+
8
+ *1.3.1
9
+
10
+ * now compliant with ruby 1.9.1 (thanks to Gernot Kogler for the feedback)
11
+
12
+ *1.3.0
13
+
14
+ * render_all_levels-option allows to render all subnavigation independent from the active primary navigation ('full open tree'). Userful for javascript menus. Thanks to Richard Hulse.
15
+ * ability to turn off automatic generation of dom_ids for the list items (autogenerate_item_ids). Credits again to Richard Hulse.
16
+ * ability to specify dom_class for primary and secondary lists. Thanks Richard!
17
+
18
+ *1.2.2
19
+
20
+ * renderers now have access to request_forgery_protection stuff (this allows delete-links as navigation-items)
21
+
22
+ *1.2.1
23
+
24
+ * changed way to include render_*-helper_methods into view (including them into Controller and declaring them as helper_methods instead of adding whole module as Helper). this seems to be more reliable under certain conditions. Credits to Gernot Kogler.
25
+
26
+ *1.2.0
27
+
28
+ * added capability to add conditions to navigation-items (primary.item key, name, url, :if => Proc.new {current_user.admin?})
29
+
30
+ *1.1.2
31
+
32
+ * Bugfix: config now gets evaluated on every render_navigation call. Credits to Joël Azémar.
33
+ * Config file gets reloaded on every render_navigation call in development mode. Only load config file on server start in production mode.
34
+
35
+
36
+ *1.1.1
37
+
38
+ * Change plugin into a GemPlugin
data/README ADDED
@@ -0,0 +1,19 @@
1
+
2
+ == Simple Navigation
3
+
4
+ Simple Navigation is a plugin for creating a navigation (optionally with sub navigation) for your rails app.
5
+
6
+ Source code:
7
+ git://github.com/andi/simple-navigation.git
8
+
9
+ Documentation:
10
+ http://wiki.github.com/andi/simple-navigation
11
+
12
+ Online Demo:
13
+ http://simple-navigation-demo.andischacke.com
14
+
15
+ Discussion Group for Feedback and Questions
16
+ http://groups.google.com/group/simple-navigation
17
+
18
+ Copyright (c) 2009 Andi Schacke, released under the MIT license
19
+
data/Rakefile ADDED
@@ -0,0 +1,74 @@
1
+ require 'rake'
2
+ require 'spec/rake/spectask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run specs.'
6
+ task :default => :spec
7
+
8
+ desc 'Run the specs'
9
+ Spec::Rake::SpecTask.new(:spec) do |t|
10
+ t.spec_opts = ['--colour --format progress --loadby mtime --reverse']
11
+ t.spec_files = FileList['spec/**/*_spec.rb']
12
+ end
13
+
14
+ desc 'Generate documentation for the simple_navigation plugin.'
15
+ Rake::RDocTask.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'SimpleNavigation'
18
+ rdoc.options << '--line-numbers' << '--inline-source'
19
+ rdoc.rdoc_files.include('README')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ begin
24
+ require 'jeweler'
25
+ Jeweler::Tasks.new do |gemspec|
26
+ gemspec.name = "simple-navigation"
27
+ gemspec.summary = "Simple Navigation is a ruby library for creating a navigation (optionally with sub navigation) for your rails app."
28
+ gemspec.email = "andreas.schacke@gmail.com"
29
+ gemspec.homepage = "http://github.com/andi/simple-navigation"
30
+ gemspec.description = "Simple Navigation is a ruby library for creating a navigation (optionally with sub navigation) for your rails app."
31
+ gemspec.authors = ["Andi Schacke", 'Alexander Semyonov']
32
+ gemspec.rdoc_options = ["--inline-source", "--charset=UTF-8"]
33
+ gemspec.files += ["CHANGELOG"]
34
+ gemspec.rubyforge_project = 'andi'
35
+ end
36
+ rescue LoadError
37
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
38
+ end
39
+
40
+ begin
41
+ require 'rake/contrib/sshpublisher'
42
+ namespace :rubyforge do
43
+
44
+ desc "Release gem and RDoc documentation to RubyForge"
45
+ task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
46
+
47
+ namespace :release do
48
+ desc "Publish RDoc to RubyForge."
49
+ task :docs => [:rdoc] do
50
+ config = YAML.load(
51
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
52
+ )
53
+
54
+ host = "#{config['username']}@rubyforge.org"
55
+ remote_dir = "/var/www/gforge-projects/andi/"
56
+ local_dir = 'rdoc'
57
+
58
+ Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
59
+ end
60
+ end
61
+ end
62
+ rescue LoadError
63
+ puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
64
+ end
65
+
66
+ begin
67
+ require 'yard'
68
+ YARD::Rake::YardocTask.new
69
+ rescue LoadError
70
+ task :yardoc do
71
+ abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
72
+ end
73
+ end
74
+
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :patch: 1
3
+ :major: 1
4
+ :minor: 4
@@ -0,0 +1 @@
1
+ Creates a template config file for the simple-navigation plugin. You will find the generated file in config/navigation.rb.
@@ -0,0 +1,8 @@
1
+ class NavigationConfigGenerator < Rails::Generator::Base
2
+ def manifest
3
+ record do |m|
4
+ m.file "config/navigation.rb", "config/navigation.rb"
5
+ m.readme "../../../README"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,48 @@
1
+ # Configures your navigation
2
+ SimpleNavigation::Configuration.run do |navigation|
3
+ # Specify a custom renderer if needed.
4
+ # The default renderer is SimpleNavigation::Renderer::List which renders HTML lists.
5
+ # navigation.renderer = Your::Custom::Renderer
6
+
7
+ # Specify the class that will be applied to active navigation items. Defaults to 'selected'
8
+ # navigation.selected_class = 'your_selected_class'
9
+
10
+ # Normally only the current sub menu is renderedwhen render_navigation is called
11
+ # setting this to true render all submenus which is useful for javascript
12
+ # driven hovering menus like the jquery superfish plugin
13
+ # navigation.render_all_levels = true
14
+
15
+ # Item keys are normally added to list items.
16
+ # this setting turns that off
17
+ # navigation.autogenerate_item_ids = false
18
+
19
+ # Define the primary navigation
20
+ navigation.items do |primary|
21
+ # Add an item to the primary navigation. The following params apply:
22
+ # key - a symbol which uniquely defines your navigation item in the scope of the primary_navigation
23
+ # name - will be displayed in the rendered navigation. This can also be a call to your I18n-framework.
24
+ # url - the address that the generated item links to. You can also use url_helpers (named routes, restful routes helper, url_for etc.)
25
+ # options - can be used to specify attributes that will be included in the rendered navigation item (e.g. id, class etc.)
26
+ #
27
+ primary.item :key_1, 'name', url, options
28
+
29
+ # Add an item which has a sub navigation (same params, but with block)
30
+ primary.item :key_2, 'name', url, options do |sub_nav|
31
+ # Add an item to the sub navigation (same params again)
32
+ sub_nav.item :key_2_1, 'name', url, options
33
+ end
34
+
35
+ # You can also specify a condition-proc that needs to be fullfilled to display an item.
36
+ # Conditions are part of the options. They are evaluated in the context of the views,
37
+ # thus you can use all the methods and vars you have available in the views.
38
+ primary.item :key_3, 'Admin', url, :class => 'special', :if => Proc.new { current_user.admin? }
39
+ primary.item :key_4, 'Account', url, :unless => Proc.new { logged_in? }
40
+
41
+ # you can also specify a css id or class to attach to this particular level
42
+ # works for all levels of the menu
43
+ # primary.dom_id = 'menu-id'
44
+ # primary.dom_class = 'menu-class'
45
+
46
+ end
47
+
48
+ end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/rails/init"
data/install.rb ADDED
@@ -0,0 +1,5 @@
1
+ begin
2
+ puts IO.read(File.join(File.dirname(__FILE__), 'README'))
3
+ rescue Exception => e
4
+ puts "The following error ocurred while installing the plugin: #{e.message}"
5
+ end
@@ -0,0 +1,40 @@
1
+ # A plugin for generating a simple navigation. See README for resources on usage instructions.
2
+ module SimpleNavigation
3
+
4
+ mattr_accessor :config_files
5
+ mattr_accessor :config_file_path
6
+ mattr_accessor :controller
7
+ self.config_files = {}
8
+
9
+ class << self
10
+
11
+ # Reads the config_file for the specified navigation_context and stores it for later evaluation.
12
+ def load_config(navigation_context = :default)
13
+ raise "config_file_path is not set!" unless self.config_file_path
14
+ raise "Config file '#{config_file_name(navigation_context)}' does not exists!" unless File.exists?(config_file_name(navigation_context))
15
+ if ::RAILS_ENV == 'production'
16
+ self.config_files[navigation_context] ||= IO.read(config_file_name(navigation_context))
17
+ else
18
+ self.config_files[navigation_context] = IO.read(config_file_name(navigation_context))
19
+ end
20
+ end
21
+
22
+ # Returns the singleton instance of the SimpleNavigation::Configuration
23
+ def config
24
+ Configuration.instance
25
+ end
26
+
27
+ # Returns the ItemContainer that contains the items for the primary navigation
28
+ def primary_navigation
29
+ config.primary_navigation
30
+ end
31
+
32
+ # Returns the path to the config_file for the given navigation_context
33
+ def config_file_name(navigation_context = :default)
34
+ file_name = navigation_context == :default ? '' : "#{navigation_context.to_s.underscore}_"
35
+ File.join(config_file_path, "#{file_name}navigation.rb")
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,60 @@
1
+ require 'singleton'
2
+
3
+ module SimpleNavigation
4
+
5
+ # Responsible for evaluating and handling the config/navigation.rb file.
6
+ class Configuration
7
+ include Singleton
8
+
9
+ attr_accessor :renderer
10
+ attr_accessor :selected_class
11
+ attr_accessor :render_all_levels
12
+ attr_accessor :autogenerate_item_ids
13
+ attr_reader :primary_navigation
14
+
15
+ class << self
16
+
17
+ # Evals the config_file for the given navigation_context inside the specified context (usually a controller or view)
18
+ def eval_config(context, navigation_context = :default)
19
+ context.instance_eval(SimpleNavigation.config_files[navigation_context])
20
+ SimpleNavigation.controller = extract_controller_from context
21
+ end
22
+
23
+ # Starts processing the configuration
24
+ def run(&block)
25
+ block.call Configuration.instance
26
+ end
27
+
28
+ # Extracts a controller from the context.
29
+ def extract_controller_from(context)
30
+ if context.respond_to? :controller
31
+ context.controller
32
+ else
33
+ context
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ # Sets the config's default-settings
40
+ def initialize
41
+ @renderer = SimpleNavigation::Renderer::List
42
+ @selected_class = 'selected'
43
+ @render_all_levels = false
44
+ @autogenerate_item_ids = true
45
+ end
46
+
47
+ # Yields an SimpleNavigation::ItemContainer for adding navigation items
48
+ def items(&block)
49
+ @primary_navigation = ItemContainer.new
50
+ block.call @primary_navigation
51
+ end
52
+
53
+ # Returns true if the config_file has already been evaluated.
54
+ def loaded?
55
+ !@primary_navigation.nil?
56
+ end
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,75 @@
1
+ #TODO: add :except and :only options to navigation method
2
+ module SimpleNavigation
3
+
4
+ # Adds methods for handling the current 'active' navigation to the controllers.
5
+ #
6
+ # On the controller class level, use the navigation method to set the active navigation for all actions in the controller.
7
+ #
8
+ # ==== Examples
9
+ # class AccountController << ActionController
10
+ # navigation :account
11
+ # ...
12
+ # end
13
+ #
14
+ # class AccountSettingsController << ActionController
15
+ # navigation :account, :settings
16
+ # ...
17
+ # end
18
+ #
19
+ # The first example sets the current_primary_navigation to :account for all actions. No active sub_navigation.
20
+ # The second example sets the current_primary_navigation to :account and the current_sub_navigation to :settings.
21
+ #
22
+ # On the controller instance level, use the current_navigation method to define the active navigation for a specific action.
23
+ # The navigation item that is set in current_navigation overrides the one defined on the controller class level (see navigation method).
24
+ #
25
+ # ==== Example
26
+ # class AccountController << ActionController
27
+ # navigation :account
28
+ #
29
+ # def your_special_action
30
+ # ...
31
+ # current_navigation :account, :special
32
+ # end
33
+ # end
34
+ #
35
+ # The code above still sets the active primary navigation to :account but also sets the sub_navigation to :special for 'your_special_action'.
36
+ #
37
+ # Note: The specified symbols must match the keys for your navigation items in your config/navigation.rb file.
38
+ module ControllerMethods
39
+ def self.included(base) #:nodoc:
40
+ base.class_eval do
41
+ extend ClassMethods
42
+ include InstanceMethods
43
+ include SimpleNavigation::Helpers
44
+ base.helper_method :render_navigation, :render_primary_navigation, :render_sub_navigation
45
+ end
46
+ end
47
+
48
+ module ClassMethods
49
+ # Sets the active navigation for all actions in this controller.
50
+ #
51
+ # The specified symbols must match the keys for your navigation items in your config/navigation.rb file.
52
+ def navigation(primary_navigation, sub_navigation=nil)
53
+ self.class_eval do
54
+ define_method :set_navigation do
55
+ current_navigation(primary_navigation, sub_navigation)
56
+ end
57
+ before_filter :set_navigation
58
+ end
59
+ end
60
+ end
61
+
62
+ module InstanceMethods
63
+
64
+ # Sets the active navigation. Call this method in any action to override the controller-wide active navigation
65
+ # specified by navigation.
66
+ #
67
+ # The specified symbols must match the keys for your navigation items in your config/navigation.rb file.
68
+ def current_navigation(primary_navigation, sub_navigation=nil)
69
+ @current_primary_navigation = primary_navigation
70
+ @current_secondary_navigation = sub_navigation
71
+ end
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,65 @@
1
+ module SimpleNavigation
2
+
3
+ # View helpers to render the navigation.
4
+ #
5
+ # Use render_primary_navigation to render your primary navigation with the configured renderer.
6
+ # Use render_sub_navigation to render the sub navigation belonging to the active primary navigation.
7
+ # Use render_navigation to render the primary navigation with the corresponding sub navigation rendered inside primary navigation item which is active.
8
+ #
9
+ # ==== Examples (using Haml)
10
+ # #primary_navigation= render_primary_navigation
11
+ #
12
+ # #sub_navigation= render_sub_navigation
13
+ #
14
+ # #main_navigation= render_navigation
15
+ #
16
+ module Helpers
17
+
18
+ # Renders the navigation according to the specified options-hash.
19
+ #
20
+ # The following options are supported:
21
+ # * <tt>level</tt> - defaults to :nested which renders the the sub_navigation for an active primary_navigation inside that active primary_navigation item.
22
+ # Other possible levels are :primary which only renders the primary_navigation (also see render_primary_navigation) and :secondary which only renders the sub_navigation (see render_sub_navigation).
23
+ # * <tt>context</tt> - specifies the context for which you would render the navigation. Defaults to :default which loads the default navigation.rb (i.e. config/navigation.rb)
24
+ # if you specify a context then the plugin tries to load the configuration file for that context, e.g. if you call <tt>render_navigation(:context => :admin)</tt> the file config/admin_navigation.rb
25
+ # will be loaded and used for rendering the navigation.
26
+ #
27
+ def render_navigation(*args)
28
+ args = [Hash.new] if args.empty?
29
+ default_options = {:context => :default, :level => :nested}
30
+ level, navigation_context = case args.first
31
+ when Hash
32
+ options = default_options.merge(args.first)
33
+ [options[:level], options[:context]]
34
+ when Symbol
35
+ [args[0], default_options.merge(args[1] || {})[:context]]
36
+ else
37
+ raise ArgumentError, "Invalid arguments"
38
+ end
39
+ SimpleNavigation.load_config(navigation_context)
40
+ SimpleNavigation::Configuration.eval_config(self, navigation_context)
41
+ case level
42
+ when :primary
43
+ SimpleNavigation.primary_navigation.render(@current_primary_navigation)
44
+ when :secondary
45
+ primary = SimpleNavigation.primary_navigation[@current_primary_navigation]
46
+ primary.sub_navigation.render(@current_secondary_navigation) if primary && primary.sub_navigation
47
+ when :nested
48
+ SimpleNavigation.primary_navigation.render(@current_primary_navigation, true, @current_secondary_navigation)
49
+ else
50
+ raise ArgumentError, "Invalid navigation level: #{level}"
51
+ end
52
+ end
53
+
54
+ # Renders the primary_navigation with the configured renderer. Calling render_navigation(:level => :primary) has the same effect.
55
+ def render_primary_navigation(options = {})
56
+ render_navigation(options.merge(:level => :primary))
57
+ end
58
+
59
+ # Renders the sub_navigation with the configured renderer. Calling render_navigation(:level => :secondary) has the same effect.
60
+ def render_sub_navigation(options = {})
61
+ render_navigation(options.merge(:level => :secondary))
62
+ end
63
+
64
+ end
65
+ end