Class: Sidebars::Menu

Direct Known Subclasses

Admin::BaseMenu, Admin::Menus::SpamLogsMenu, Explore::Menus::GroupsMenu, Explore::Menus::ProjectsMenu, Explore::Menus::SnippetsMenu, Explore::Menus::TopicsMenu, Groups::Menus::CiCdMenu, Groups::Menus::CustomerRelationsMenu, Groups::Menus::GroupInformationMenu, Groups::Menus::IssuesMenu, Groups::Menus::KubernetesMenu, Groups::Menus::MergeRequestsMenu, Groups::Menus::ObservabilityMenu, Groups::Menus::PackagesRegistriesMenu, Groups::Menus::ScopeMenu, Groups::Menus::SettingsMenu, Groups::SuperSidebarMenus::AnalyzeMenu, Groups::SuperSidebarMenus::BuildMenu, Groups::SuperSidebarMenus::CodeMenu, Groups::SuperSidebarMenus::DeployMenu, Groups::SuperSidebarMenus::ManageMenu, Groups::SuperSidebarMenus::MonitorMenu, Groups::SuperSidebarMenus::OperationsMenu, Groups::SuperSidebarMenus::PlanMenu, Groups::SuperSidebarMenus::SecureMenu, Organizations::Menus::ManageMenu, Organizations::Menus::ScopeMenu, Projects::Menus::AnalyticsMenu, Projects::Menus::CiCdMenu, Projects::Menus::ConfluenceMenu, Projects::Menus::DeploymentsMenu, Projects::Menus::ExternalIssueTrackerMenu, Projects::Menus::ExternalWikiMenu, Projects::Menus::HiddenMenu, Projects::Menus::InfrastructureMenu, Projects::Menus::IssuesMenu, Projects::Menus::MergeRequestsMenu, Projects::Menus::MonitorMenu, Projects::Menus::PackagesRegistriesMenu, Projects::Menus::ProjectInformationMenu, Projects::Menus::RepositoryMenu, Projects::Menus::ScopeMenu, Projects::Menus::SecurityComplianceMenu, Projects::Menus::SettingsMenu, Projects::Menus::ShimoMenu, Projects::Menus::SnippetsMenu, Projects::Menus::WikiMenu, Projects::Menus::ZentaoMenu, Projects::SuperSidebarMenus::AnalyzeMenu, Projects::SuperSidebarMenus::BuildMenu, Projects::SuperSidebarMenus::CodeMenu, Projects::SuperSidebarMenus::DeployMenu, Projects::SuperSidebarMenus::ManageMenu, Projects::SuperSidebarMenus::MonitorMenu, Projects::SuperSidebarMenus::OperationsMenu, Projects::SuperSidebarMenus::PlanMenu, Projects::SuperSidebarMenus::SecureMenu, StaticMenu, UncategorizedMenu, UserProfile::BaseMenu, UserSettings::Menus::AccessTokensMenu, UserSettings::Menus::AccountMenu, UserSettings::Menus::ActiveSessionsMenu, UserSettings::Menus::ApplicationsMenu, UserSettings::Menus::AuthenticationLogMenu, UserSettings::Menus::ChatMenu, UserSettings::Menus::CommentTemplatesMenu, UserSettings::Menus::EmailsMenu, UserSettings::Menus::GpgKeysMenu, UserSettings::Menus::NotificationsMenu, UserSettings::Menus::PasswordMenu, UserSettings::Menus::PreferencesMenu, UserSettings::Menus::ProfileMenu, UserSettings::Menus::SshKeysMenu, YourWork::Menus::ActivityMenu, YourWork::Menus::GroupsMenu, YourWork::Menus::IssuesMenu, YourWork::Menus::MergeRequestsMenu, YourWork::Menus::MilestonesMenu, YourWork::Menus::OrganizationsMenu, YourWork::Menus::ProjectsMenu, YourWork::Menus::SnippetsMenu, YourWork::Menus::TodosMenu

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Gitlab::Utils::Override

extended, extensions, included, method_added, override, prepended, queue_verification, verify!

Methods included from Concerns::HasPartial

#menu_partial, #menu_partial_options, #menu_with_partial?

Methods included from Concerns::HasActiveRoutes

#active_routes

Methods included from Concerns::ContainerWithHtmlOptions

#collapsed_container_html_options, #extra_collapsed_container_html_options, #extra_container_html_options, #extra_nav_link_html_options, #nav_link_html_options, #title, #title_html_options

Methods included from Concerns::LinkWithHtmlOptions

#link_html_options

Methods included from Concerns::PositionableList

#add_element, #insert_element_after, #insert_element_before, #remove_element, #replace_element

Methods included from Concerns::HasAvatar

#avatar, #avatar_shape, #entity_id

Methods included from Concerns::HasIcon

#icon_or_image?, #image_html_options, #image_path, #sprite_icon, #sprite_icon_html_options

Methods included from Concerns::HasPill

#format_cached_count, #has_pill?, #pill_count, #pill_html_options

Methods included from Gitlab::Allowable

#can?

Methods included from Routing::PackagesHelper

#package_path

Methods included from Routing::PseudonymizationHelper

#masked_page_url

Methods included from Routing::GraphqlHelper

#graphql_etag_pipeline_path, #graphql_etag_pipeline_sha_path, #graphql_etag_project_on_demand_scan_counts_path

Methods included from Routing::WikiHelper

#wiki_page_path, #wiki_path

Methods included from Routing::SnippetsHelper

#gitlab_dashboard_snippets_path, #gitlab_raw_snippet_blob_path, #gitlab_raw_snippet_blob_url, #gitlab_raw_snippet_path, #gitlab_raw_snippet_url, #gitlab_snippet_note_path, #gitlab_snippet_note_url, #gitlab_snippet_notes_path, #gitlab_snippet_notes_url, #gitlab_snippet_path, #gitlab_snippet_url, #gitlab_toggle_award_emoji_snippet_note_path, #gitlab_toggle_award_emoji_snippet_note_url, #gitlab_toggle_award_emoji_snippet_path, #gitlab_toggle_award_emoji_snippet_url, #preview_markdown_path, #toggle_award_emoji_personal_snippet_path, #toggle_award_emoji_project_project_snippet_path, #toggle_award_emoji_project_project_snippet_url

Methods included from Routing::PipelineSchedulesHelper

#edit_pipeline_schedule_path, #pipeline_schedule_path, #pipeline_schedules_path, #play_pipeline_schedule_path, #take_ownership_pipeline_schedule_path

Methods included from Routing::ArtifactsHelper

#artifacts_action_path, #expose_fast_artifacts_path, #fast_browse_project_job_artifacts_path, #fast_download_project_job_artifacts_path, #fast_keep_project_job_artifacts_path

Methods included from Routing::MembersHelper

#source_members_url

Methods included from Routing::Groups::MembersHelper

#approve_access_request_group_member_path, #group_member_path, #group_members_url, #leave_group_members_path, #request_access_group_members_path, #resend_invite_group_member_path

Methods included from Routing::Projects::MembersHelper

#approve_access_request_project_member_path, #leave_project_members_path, #project_member_path, #project_members_url, #request_access_project_members_path, #resend_invite_project_member_path

Methods included from Routing::ProjectsHelper

#commit_url, #commits_url, #edit_milestone_path, #environment_delete_path, #environment_path, #issue_path, #issue_url, #merge_request_path, #merge_request_url, #pipeline_job_url, #pipeline_path, #pipeline_url, #project_commits_path, #project_ref_path, #project_tree_path, #release_url, #toggle_subscription_path, #work_item_url

Methods included from API::Helpers::RelatedResourcesHelpers

#expose_path, #expose_url, #issues_available?, #mrs_available?, #project_feature_string_access_level

Methods included from ApplicationSettingsHelper

#all_protocols_enabled?, #allowed_protocols_present?, #anti_spam_service_enabled?, #deprecated_attributes, #enabled_protocol, #enabled_protocol_button, #expanded_by_default?, #external_authorization_allow_token_help_text, #external_authorization_client_certificate_help_text, #external_authorization_client_key_help_text, #external_authorization_client_pass_help_text, #external_authorization_client_url_help_text, #external_authorization_description, #external_authorization_service_attributes, #external_authorization_timeout_help_text, #external_authorization_url_help_text, #http_enabled?, #import_sources_checkboxes, #instance_clusters_enabled?, #integration_expanded?, #key_restriction_options_for_select, #kroki_available_formats, #oauth_providers_checkboxes, #omnibus_protected_paths_throttle?, #pending_user_count, #registration_features_can_be_prompted?, #repository_storages_options_json, #restricted_level_checkboxes, #runner_token_expiration_interval_attributes, #sidekiq_job_limiter_mode_help_text, #sidekiq_job_limiter_modes_for_select, #signup_enabled?, #signup_form_data, #ssh_enabled?, #storage_weights, #user_oauth_applications?, #valid_runner_registrars, #visible_attributes

Methods included from ProjectsHelper

#able_to_see_forks_count?, #able_to_see_issues?, #able_to_see_merge_requests?, #any_projects?, #author_content_tag, #autodeploy_flash_notice, #badge_count, #branch_rules_path, #can_admin_associated_clusters?, #can_admin_project_member?, #can_change_visibility_level?, #can_disable_emails?, #can_push_code?, #can_view_branch_rules?, #clusters_deprecation_alert_message, #delete_confirm_phrase, #directory?, #error_tracking_setting_project_json, #explore_projects_tab?, #external_classification_label_help_message, #fork_button_data_attributes, #grafana_integration_enabled?, #grafana_integration_masked_token, #grafana_integration_url, #http_clone_url_to_repo, #import_from_bitbucket_message, #import_from_gitlab_message, #inactive_project_deletion_date, #last_pipeline_from_status_cache, #last_push_event, #link_to_autodeploy_doc, #link_to_member, #link_to_member_avatar, #link_to_project, #load_pipeline_status, #localized_project_human_access, #membership_locked?, #no_password_message, #project_can_be_shared?, #project_classes, #project_coverage_chart_data_attributes, #project_incident_management_setting, #project_license_name, #project_list_cache_key, #project_permissions_panel_data, #project_title, #push_to_create_project_command, #remote_mirror_setting_enabled?, #remove_fork_project_confirm_json, #remove_fork_project_description_message, #remove_fork_project_warning_message, #remove_project_message, #show_auto_devops_implicitly_enabled_banner?, #show_clusters_alert?, #show_count?, #show_inactive_project_deletion_banner?, #show_mobile_devops_project_promo?, #show_no_password_message?, #show_no_ssh_key_message?, #show_projects?, #show_terraform_banner?, #show_xcode_link?, #ssh_clone_url_to_repo, #transfer_project_message, #visibility_level_content, #visible_fork_source, #vue_fork_divergence_data, #xcode_uri_to_repo

Methods included from CompareHelper

#create_mr_button?, #create_mr_path, #project_compare_selector_data, #target_projects

Methods included from Gitlab::Routing

includes_helpers, redirect_legacy_paths, url_helpers

Constructor Details

#initialize(context) ⇒ Menu

Returns a new instance of Menu.



22
23
24
25
26
27
# File 'lib/sidebars/menu.rb', line 22

def initialize(context)
  @context = context
  @items = []

  configure_menu_items
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



18
19
20
# File 'lib/sidebars/menu.rb', line 18

def context
  @context
end

Instance Method Details

#add_item(item) ⇒ Object



118
119
120
# File 'lib/sidebars/menu.rb', line 118

def add_item(item)
  add_element(@items, item)
end

#all_active_routesObject

This method normalizes the information retrieved from the submenus and this menu Value from menus is something like: [{ path: ‘foo’, path: ‘bar’, controller: :foo }] This method filters the information and returns: { path: [‘foo’, ‘bar’], controller: :foo }



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/sidebars/menu.rb', line 46

def all_active_routes
  @all_active_routes ||=
    ([active_routes] + renderable_items.map(&:active_routes)).flatten.each_with_object({}) do |pairs, hash|
      pairs.each do |k, v|
        hash[k] ||= []
        hash[k] += Array(v)
        hash[k].uniq!
      end

      hash
    end
end

#configure_menu_itemsObject



29
30
31
# File 'lib/sidebars/menu.rb', line 29

def configure_menu_items
  true
end

#container_html_optionsObject



144
145
146
147
148
149
150
151
# File 'lib/sidebars/menu.rb', line 144

def container_html_options
  super.tap do |html_options|
    # Flagging menus that can be rendered and with renderable menu items
    if render? && has_renderable_items?
      html_options[:class] = [*html_options[:class], 'has-sub-items'].join(' ')
    end
  end
end

#has_items?Boolean

Returns whether the menu has any menu item, no matter whether it is renderable or not

Returns:

  • (Boolean)


61
62
63
# File 'lib/sidebars/menu.rb', line 61

def has_items?
  @items.any?
end

#has_renderable_items?Boolean

Returns whether the menu has any renderable menu item

Returns:

  • (Boolean)


114
115
116
# File 'lib/sidebars/menu.rb', line 114

def has_renderable_items?
  renderable_items.any?
end

#insert_item_after(after_item, new_item) ⇒ Object



126
127
128
# File 'lib/sidebars/menu.rb', line 126

def insert_item_after(after_item, new_item)
  insert_element_after(@items, after_item, new_item)
end

#insert_item_before(before_item, new_item) ⇒ Object



122
123
124
# File 'lib/sidebars/menu.rb', line 122

def insert_item_before(before_item, new_item)
  insert_element_before(@items, before_item, new_item)
end


39
40
41
# File 'lib/sidebars/menu.rb', line 39

def link
  renderable_items.first&.link
end

#pick_into_super_sidebar?Boolean

Returns:

  • (Boolean)


109
110
111
# File 'lib/sidebars/menu.rb', line 109

def pick_into_super_sidebar?
  false
end

#remove_item(item) ⇒ Object



130
131
132
# File 'lib/sidebars/menu.rb', line 130

def remove_item(item)
  remove_element(@items, item.item_id)
end

#render?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/sidebars/menu.rb', line 34

def render?
  has_renderable_items? || menu_with_partial?
end

#renderable_itemsObject

Returns all renderable menu items



66
67
68
# File 'lib/sidebars/menu.rb', line 66

def renderable_items
  @renderable_items ||= @items.select(&:render?)
end

#replace_placeholder(item) ⇒ Object



134
135
136
137
138
139
140
141
# File 'lib/sidebars/menu.rb', line 134

def replace_placeholder(item)
  idx = @items.index { |e| e.item_id == item.item_id && e.is_a?(::Sidebars::NilMenuItem) }
  if idx.nil?
    add_item(item)
  else
    replace_element(@items, item.item_id, item)
  end
end

#separated?Boolean

Defines whether menu is separated from others with a top separator

Returns:

  • (Boolean)


71
72
73
# File 'lib/sidebars/menu.rb', line 71

def separated?
  false
end

#serialize_as_menu_item_argsObject

Sometimes we want to convert a top-level Menu (e.g. Wiki/Snippets) to a MenuItem. This serializer is used in order to enable that conversion



155
156
157
158
159
160
161
162
# File 'lib/sidebars/menu.rb', line 155

def serialize_as_menu_item_args
  {
    title: title,
    link: link,
    active_routes: active_routes,
    container_html_options: container_html_options
  }
end

#serialize_for_super_sidebarObject

Returns a tree-like representation of itself and all renderable menu entries, with additional information on whether the item(s) have an active route



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/sidebars/menu.rb', line 78

def serialize_for_super_sidebar
  items = serialize_items_for_super_sidebar
  is_active = @context.route_is_active.call(active_routes) || items.any? { |item| item[:is_active] }

  {
    title: title,
    icon: sprite_icon,
    avatar: avatar,
    avatar_shape: avatar_shape,
    entity_id: entity_id,
    link: link,
    is_active: is_active,
    pill_count: has_pill? ? pill_count : nil,
    items: items,
    separated: separated?
  }
end

#serialize_items_for_super_sidebarObject

Returns an array of renderable menu entries, with additional information on whether the item has an active route



99
100
101
102
103
104
105
106
107
# File 'lib/sidebars/menu.rb', line 99

def serialize_items_for_super_sidebar
  # All renderable menu entries
  renderable_items.map do |entry|
    entry.serialize_for_super_sidebar.tap do |item|
      active_routes = item.delete(:active_routes)
      item[:is_active] = active_routes ? @context.route_is_active.call(active_routes) : false
    end
  end
end