Class: MenusController

Inherits:
CrmController show all
Defined in:
app/controllers/menus_controller.rb

Overview

CRM sidebar menu fragments: lazy-loaded sections, the "load more" Turbo
Frame swap, and the command-palette search-data JSON.

Constant Summary

Constants included from Controllers::ReferenceFindable

Controllers::ReferenceFindable::ID_EMBEDDED_PATTERNS

Constants included from Controllers::AnalyticsEvents

Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY

Constants included from Controllers::ErrorRendering

Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES

Instance Method Summary collapse

Methods inherited from CrmController

#access_denied, #context_id, #context_object, #crm_home_path, #current_ability, #default_url_options, #download_temp, #get_tempfile_path_for_download, #init_status_job_collector, #initialize_crm_lazy_chunks, #persist_enqueued_status_jobs, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download, #sync_admin_presence_cookie, #touch_employee_last_seen

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y

Methods included from Controllers::ReturnPathHandling

#check_for_return_path, #redirect_to_return_path_or_default

Methods included from Controllers::AnalyticsEvents

#consume_queued_analytics_events, #registration_lead_type, #track_event

Methods included from Controllers::DeviceDetection

#device_detector, #is_ie?

Methods included from Controllers::SubdomainDetection

#is_crm_request?, #is_www_request?, #json_request?

Methods included from Controllers::TurboSafeRedirect

#redirect_to

Methods included from Controllers::TrackingDetection

#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?

Methods included from Controllers::AcceleratedFileSending

#send_file_accelerated, #send_upload_accelerated

Methods included from Controllers::ErrorRendering

#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #render_unpermitted_parameters, #safe_referer_or_fallback

Methods included from Controllers::TurnstileVerification

#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!

Methods included from Controllers::CloudflareCaching

edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_edge_cache!, #skip_session

Methods included from Controllers::Webpackable

#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?

Methods included from Controllers::Localizable

#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale

Methods included from Controllers::Authenticable

#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak

Methods included from UrlsHelper

#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?

Instance Method Details

#advanced_searchvoid

This method returns an undefined value.

Renders the "advanced search" menu section, grouped by search type.



9
10
11
12
# File 'app/controllers/menus_controller.rb', line 9

def advanced_search
  @searches = current_user.searches.order(created_at: :desc).group(:type)
  render layout: false
end

#blankvoid

This method returns an undefined value.

Renders nothing — a placeholder target for sidebar sections with no
content yet.



82
# File 'app/controllers/menus_controller.rb', line 82

def blank; end

#load_sectionvoid

This method returns an undefined value.

Renders a sidebar menu section partial as a Turbo Frame swap, gating
section/target against strict character allowlists since they're
used to build a partial path.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/controllers/menus_controller.rb', line 19

def load_section
  section = params[:section].to_s
  target  = params[:target].to_s

  allowed_sections = current_user.selected_menu_options.keys.map(&:to_s)
  unless section.match?(/\A[a-z0-9_]+\z/) && allowed_sections.include?(section)
    head :not_found
    return
  end

  unless target.match?(/\A[a-zA-Z][\w:-]*\z/)
    head :unprocessable_content
    return
  end

  @partial = "/menus/#{section}"
  @target = target

  saved_formats = lookup_context.formats
  begin
    lookup_context.formats = [:html]
    partial_found = lookup_context.exists?(@partial, [], true)
  ensure
    lookup_context.formats = saved_formats
  end

  unless partial_found
    Rails.logger.warn "MenusController#load_section: Missing partial #{@partial}"
    head :not_found
    return
  end

  # The sidebar's <turbo-frame> requests this action and swaps in the
  # matching frame from the response. No turbo_stream variant is needed
  # — the frame's own `src` lifecycle handles the swap, and the
  # response is the same plain HTML a non-Turbo client would receive.
  render :load_section, formats: [:html], layout: false
end

#search_datavoid

This method returns an undefined value.

Serves the flattened, searchable menu-item index (for the CRM command
palette) as JSON.



62
63
64
65
66
67
# File 'app/controllers/menus_controller.rb', line 62

def search_data
  @menu_items = build_searchable_menu_data
  respond_to do |format|
    format.json { render json: @menu_items }
  end
end

#showvoid

This method returns an undefined value.

Renders the default menu view.



72
73
74
75
76
# File 'app/controllers/menus_controller.rb', line 72

def show
  respond_to do |format|
    format.html { render layout: should_render_layout? }
  end
end