Implements #1351 and #1352. The patch is not finished yet, I am sending
it just for reference. Breadcrumbs are defined to work just for Pools,
Deployments and Instances. I also need to integrate it to work with
viewstate.
Jirka
Dne 11.5.2011 16:44, jtomasek(a)redhat.com napsal(a):
From: Jiri Tomasek<jtomasek(a)redhat.com>
---
src/app/controllers/application_controller.rb | 19 ++++++++++++++++++
src/app/controllers/deployments_controller.rb | 2 +
src/app/controllers/instances_controller.rb | 2 +
src/app/controllers/pools_controller.rb | 3 ++
src/app/views/layouts/_breadcrumbs.haml | 5 ++++
src/app/views/layouts/application.haml | 2 +
src/features/breadcrumbs.feature | 26 +++++++++++++++++++++++++
7 files changed, 59 insertions(+), 0 deletions(-)
create mode 100644 src/app/views/layouts/_breadcrumbs.haml
create mode 100644 src/features/breadcrumbs.feature
diff --git a/src/app/controllers/application_controller.rb
b/src/app/controllers/application_controller.rb
index 746811b..239b425 100644
--- a/src/app/controllers/application_controller.rb
+++ b/src/app/controllers/application_controller.rb
@@ -224,4 +224,23 @@ class ApplicationController< ActionController::Base
redirect_to(default || session[:return_to])
session[:return_to] = nil
end
+
+ def save_breadcrumb(path, name = nil)
+ session[:breadcrumbs] = [] unless session[:breadcrumbs]
+ breadcrumbs = session[:breadcrumbs]
+ name.nil? ? name = controller_name : name
+
+ unless breadcrumbs.empty?
+ unless path == breadcrumbs.last[:path]
+ shifted_breadcrumb = breadcrumbs.shift unless breadcrumbs.length< 3
+ #TODO if shifted_breadcrumb has viewstate id specified in path, mark that
viewstate pending_deletion
+ #viewstate = CGI.parse(URI.parse(path).query)
+ breadcrumbs.push({:name => name, :path => path})
+ end
+ else
+ breadcrumbs.push({:name => name, :path => path})
+ end
+
+ session[:breadcrumbs] = breadcrumbs
+ end
end
diff --git a/src/app/controllers/deployments_controller.rb
b/src/app/controllers/deployments_controller.rb
index 9159daa..f48ba18 100644
--- a/src/app/controllers/deployments_controller.rb
+++ b/src/app/controllers/deployments_controller.rb
@@ -4,6 +4,7 @@ class DeploymentsController< ApplicationController
before_filter :load_deployment, :only => [:edit, :update]
def index
+ @viewstate ? save_breadcrumb(deployments_path(:viewstate => @viewstate.id)) :
save_breadcrumb(deployments_path)
end
def launch_new
@@ -51,6 +52,7 @@ class DeploymentsController< ApplicationController
init_new_deployment_attrs
@tab_captions = ['Properties', 'Instances', 'Provider
Services', 'Required Services', 'History',
'Permissions','Operation']
@details_tab = params[:details_tab].blank? ? 'properties' :
params[:details_tab]
+ save_breadcrumb(deployment_path(@deployment), @deployment.name)
respond_to do |format|
format.js do
if @url_params.delete :details_pane
diff --git a/src/app/controllers/instances_controller.rb
b/src/app/controllers/instances_controller.rb
index f44e3af..bf675d0 100644
--- a/src/app/controllers/instances_controller.rb
+++ b/src/app/controllers/instances_controller.rb
@@ -6,6 +6,7 @@ class InstancesController< ApplicationController
def index
@params = params
@search_term = params[:q]
+ save_breadcrumb(instances_path)
if @search_term.blank?
load_instances
return
@@ -81,6 +82,7 @@ class InstancesController< ApplicationController
@url_params = params.clone
@tab_captions = ['Properties', 'History', 'Permissions']
@details_tab = params[:details_tab].blank? ? 'properties' :
params[:details_tab]
+ save_breadcrumb(instance_path(@instance), @instance.name)
respond_to do |format|
format.js do
if @url_params.delete :details_pane
diff --git a/src/app/controllers/pools_controller.rb
b/src/app/controllers/pools_controller.rb
index 0ccbf78..711d21e 100644
--- a/src/app/controllers/pools_controller.rb
+++ b/src/app/controllers/pools_controller.rb
@@ -4,6 +4,8 @@ class PoolsController< ApplicationController
before_filter :load_pools, :only => [:show]
def index
+ save_breadcrumb(pools_path)
+
@search_term = params[:q]
if @search_term.blank?
load_pools
@@ -23,6 +25,7 @@ class PoolsController< ApplicationController
load_instances
@tab_captions = ['Properties', 'Deployments', 'Instances',
'History', 'Permissions']
@details_tab = params[:details_tab].blank? ? 'properties' :
params[:details_tab]
+ save_breadcrumb(pool_path(@pool), @pool.name)
respond_to do |format|
format.js do
if @url_params.delete :details_pane
diff --git a/src/app/views/layouts/_breadcrumbs.haml
b/src/app/views/layouts/_breadcrumbs.haml
new file mode 100644
index 0000000..5b7c010
--- /dev/null
+++ b/src/app/views/layouts/_breadcrumbs.haml
@@ -0,0 +1,5 @@
+- unless session[:breadcrumbs].blank?
+ #nav-hist-bar
+ - session[:breadcrumbs][0..-2].each do |breadcrumb|
+»
+ = link_to breadcrumb[:name].titleize, breadcrumb[:path]
diff --git a/src/app/views/layouts/application.haml
b/src/app/views/layouts/application.haml
index 763e3e1..26d51aa 100644
--- a/src/app/views/layouts/application.haml
+++ b/src/app/views/layouts/application.haml
@@ -33,6 +33,8 @@
%nav.container_16
= render_navigation({:expand_all => true, :level => 1})
= render_navigation({:expand_all => true, :level => 2})
+ = render :partial => 'layouts/breadcrumbs'
+
#content
#saved-searches
Saved searches
diff --git a/src/features/breadcrumbs.feature b/src/features/breadcrumbs.feature
new file mode 100644
index 0000000..3fcccf4
--- /dev/null
+++ b/src/features/breadcrumbs.feature
@@ -0,0 +1,26 @@
+Feature: Breadcrumbs
+ In order to get back to visited page
+ As a user
+ I want the application to include a breadcrumb trail for site navigation
+
+ Background:
+ Given I am an authorised user
+ And I am logged in
+
+ Scenario: Save breadcrumb and use it for navigation
+ Given I am on the deployments page
+ And a pool "testpool" exists
+ When I go to the pools page
+ Then I should see "testpool"
+ When I follow "testpool"
+ Then I should see "Pools"
+ When I follow "Pools"
+ Then I should be on the pools page
+
+ Scenario: Dont create breadcrumb when reloading or pointing to the same route
+ Given a pool "testpool" exists
+ And I am on the deployments page
+ When I go to the pools page
+ And I follow "testpool"
+ When I follow "testpool"
+ Then I should see "Deployments"