refactor(profile): generalize profile from referrer or for user
This commit is contained in:
parent
8a54650f93
commit
0309e0f6b2
5 changed files with 47 additions and 17 deletions
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
class ApplicationController < ActionController::Base
|
class ApplicationController < ActionController::Base
|
||||||
include TrustedDeviceConcern
|
include TrustedDeviceConcern
|
||||||
|
include NavBarProfileConcern
|
||||||
include Pundit::Authorization
|
include Pundit::Authorization
|
||||||
include Devise::StoreLocationExtension
|
include Devise::StoreLocationExtension
|
||||||
include ApplicationController::LongLivedAuthenticityToken
|
include ApplicationController::LongLivedAuthenticityToken
|
||||||
|
@ -422,17 +423,6 @@ class ApplicationController < ActionController::Base
|
||||||
prepend_view_path "app/custom_views"
|
prepend_view_path "app/custom_views"
|
||||||
end
|
end
|
||||||
|
|
||||||
def try_nav_bar_profile_from_referrer
|
|
||||||
# detect context from referer, simple (no detection when refreshing the page)
|
|
||||||
params = Rails.application.routes.recognize_path(request&.referer)
|
|
||||||
|
|
||||||
controller_class = "#{params[:controller].camelize}Controller".safe_constantize
|
|
||||||
return if controller_class.nil?
|
|
||||||
|
|
||||||
controller_instance = controller_class.new
|
|
||||||
controller_instance.try(:nav_bar_profile)
|
|
||||||
end
|
|
||||||
|
|
||||||
def cast_bool(value)
|
def cast_bool(value)
|
||||||
ActiveRecord::Type::Boolean.new.deserialize(value)
|
ActiveRecord::Type::Boolean.new.deserialize(value)
|
||||||
end
|
end
|
||||||
|
|
44
app/controllers/concerns/nav_bar_profile_concern.rb
Normal file
44
app/controllers/concerns/nav_bar_profile_concern.rb
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module NavBarProfileConcern
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
# Override this method on controller basis for more precise context or custom logic
|
||||||
|
def nav_bar_profile
|
||||||
|
end
|
||||||
|
|
||||||
|
def fallback_nav_bar_profile
|
||||||
|
return :guest if current_user.blank?
|
||||||
|
|
||||||
|
nav_bar_profile_from_referrer || default_nav_bar_profile_for_user
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Shared controllers (search, errors, release notes…) don't have specific context
|
||||||
|
# Simple attempt to try to re-use the profile from the previous page
|
||||||
|
# so user does'not feel lost.
|
||||||
|
def nav_bar_profile_from_referrer
|
||||||
|
# detect context from referer, simple (no detection when refreshing the page)
|
||||||
|
params = Rails.application.routes.recognize_path(request&.referer)
|
||||||
|
|
||||||
|
controller_class = "#{params[:controller].camelize}Controller".safe_constantize
|
||||||
|
return if controller_class.nil?
|
||||||
|
|
||||||
|
controller_instance = controller_class.new
|
||||||
|
controller_instance.try(:nav_bar_profile)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Fallback for shared controllers from user account
|
||||||
|
# to the more relevant profile.
|
||||||
|
def default_nav_bar_profile_for_user
|
||||||
|
return :gestionnaire if current_user.gestionnaire?
|
||||||
|
return :administrateur if current_user.administrateur?
|
||||||
|
return :instructeur if current_user.instructeur?
|
||||||
|
return :expert if current_user.expert?
|
||||||
|
|
||||||
|
:user
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,8 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class ErrorsController < ApplicationController
|
class ErrorsController < ApplicationController
|
||||||
def nav_bar_profile = try_nav_bar_profile_from_referrer
|
|
||||||
|
|
||||||
rescue_from Exception do
|
rescue_from Exception do
|
||||||
# catch any error, except errors triggered by middlewares outside controller (like warden middleware)
|
# catch any error, except errors triggered by middlewares outside controller (like warden middleware)
|
||||||
render file: Rails.public_path.join('500.html'), layout: false, status: :internal_server_error
|
render file: Rails.public_path.join('500.html'), layout: false, status: :internal_server_error
|
||||||
|
|
|
@ -23,8 +23,6 @@ class ReleaseNotesController < ApplicationController
|
||||||
render "scrollable_list" if params[:page].present?
|
render "scrollable_list" if params[:page].present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def nav_bar_profile = try_nav_bar_profile_from_referrer
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def touch_default_categories_seen_at
|
def touch_default_categories_seen_at
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
-# We can't use &. because the controller may not implement #nav_bar_profile
|
-# We can't use &. or as helper methods because the controllers from view specs does not implement these methods
|
||||||
- nav_bar_profile = controller.try(:nav_bar_profile) || :guest
|
- nav_bar_profile = controller.try(:nav_bar_profile) || controller.try(:fallback_nav_bar_profile) || :guest
|
||||||
- dossier = controller.try(:dossier_for_help)
|
- dossier = controller.try(:dossier_for_help)
|
||||||
- procedure = controller.try(:procedure_for_help)
|
- procedure = controller.try(:procedure_for_help)
|
||||||
- is_instructeur_context = nav_bar_profile == :instructeur && instructeur_signed_in?
|
- is_instructeur_context = nav_bar_profile == :instructeur && instructeur_signed_in?
|
||||||
|
|
Loading…
Reference in a new issue