From: Jiri Tomasek jtomasek@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..5cb4fff 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] ||= [] + breadcrumbs = session[:breadcrumbs] + name ||= controller_name + viewstate = @viewstate ? @viewstate.id : nil + + unless breadcrumbs.empty? + unless path == breadcrumbs.last[:path] + shifted_breadcrumb = breadcrumbs.shift unless breadcrumbs.length < 3 + #ViewState.find(shifted_breadcrumb[:viewstate]).mark_for_deletion if shifted_breadcrumb[:viewstate] + breadcrumbs.push({:name => name, :path => path, :viewstate => viewstate}) + end + else + breadcrumbs.push({:name => name, :path => path, :viewstate => viewstate}) + end + + session[:breadcrumbs] = breadcrumbs + end end diff --git a/src/app/controllers/deployments_controller.rb b/src/app/controllers/deployments_controller.rb index bdf40de..e36039c 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 + save_breadcrumb(deployments_path(:viewstate => @viewstate ? @viewstate.id : nil)) respond_to do |format| format.html format.json { render :json => @deployments } @@ -68,6 +69,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 f04db3c..dbb77d8 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(:viewstate => @viewstate ? @viewstate.id : nil)) if @search_term.blank? load_instances else @@ -94,6 +95,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 ea09745..c2adc6f 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(:viewstate => @viewstate ? @viewstate.id : nil)) + @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"