Class: Sidebars::Menu

Direct Known Subclasses

Admin::BaseMenu, Admin::Menus::SpamLogsMenu, Explore::Menus::CatalogMenu, 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::PackagesRegistriesMenu, Groups::Menus::ScopeMenu, Groups::Menus::SettingsMenu, Groups::SuperSidebarMenus::AnalyzeMenu, Groups::SuperSidebarMenus::BuildMenu, Groups::SuperSidebarMenus::CodeMenu, Groups::SuperSidebarMenus::DeployMenu, Groups::SuperSidebarMenus::ManageMenu, Groups::SuperSidebarMenus::OperationsMenu, Groups::SuperSidebarMenus::PlanMenu, Groups::SuperSidebarMenus::SecureMenu, Organizations::Menus::ManageMenu, Organizations::Menus::ScopeMenu, Organizations::Menus::SettingsMenu, 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::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, UserSettings::Menus::UsageQuotasMenu, 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

Constant Summary

Constants included from Routing::PseudonymizationHelper

Routing::PseudonymizationHelper::PSEUDONOMIZED_GROUP, Routing::PseudonymizationHelper::PSEUDONOMIZED_ID, Routing::PseudonymizationHelper::PSEUDONOMIZED_NAMESPACE, Routing::PseudonymizationHelper::PSEUDONOMIZED_PROJECT

Constants included from ProjectsHelper

ProjectsHelper::BANNED

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

#extra_container_html_options, #title

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_path, #sprite_icon, #sprite_icon_html_options

Methods included from Concerns::HasPill

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

Methods included from Gitlab::Allowable

#can?, #can_all?, #can_any?

Methods included from Routing::PackagesHelper

#package_path

Methods included from Routing::PseudonymizationHelper

#masked_page_url, #masked_query_params, #masked_referrer_url, #referrer_params

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

#group_wiki_page_url, #project_wiki_page_url, #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, #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_set_diff_preview_in_email?, #can_view_branch_rules?, #clusters_deprecation_alert_message, #dashboard_projects_app_data, #delete_confirm_phrase, #directory?, #error_tracking_setting_project_json, #explore_projects_tab?, #external_classification_label_help_message, #fork_button_data_attributes, #hidden_issue_icon, #home_panel_data_attributes, #http_clone_url_to_repo, #import_from_bitbucket_message, #inactive_project_deletion_date, #issue_css_classes, #issue_manual_ordering_class, #last_pipeline_from_status_cache, #last_push_event, #link_to_autodeploy_doc, #link_to_data_loss_doc, #link_to_member, #link_to_member_avatar, #link_to_namespace_change_doc, #link_to_project, #load_catalog_resources, #load_pipeline_status, #localized_project_human_access, #membership_locked?, #no_password_message, #notification_data_attributes, #project_can_be_shared?, #project_classes, #project_coverage_chart_data_attributes, #project_incident_management_setting, #project_license_name, #project_permissions_panel_data, #project_title, #projects_filtered_search_and_sort_app_data, #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_archived_project_banner?, #show_auto_devops_implicitly_enabled_banner?, #show_clusters_alert?, #show_count?, #show_dashboard_projects_welcome_page?, #show_inactive_project_deletion_banner?, #show_invalid_gpg_key_message?, #show_lfs_misconfiguration_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, #star_count_data_attributes, #transfer_project_confirm_button, #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



120
121
122
# File 'lib/sidebars/menu.rb', line 120

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



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

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)


116
117
118
# File 'lib/sidebars/menu.rb', line 116

def has_renderable_items?
  renderable_items.any?
end

#insert_item_after(after_item, new_item) ⇒ Object



128
129
130
# File 'lib/sidebars/menu.rb', line 128

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



124
125
126
# File 'lib/sidebars/menu.rb', line 124

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)


111
112
113
# File 'lib/sidebars/menu.rb', line 111

def pick_into_super_sidebar?
  false
end

#remove_item(item) ⇒ Object



132
133
134
# File 'lib/sidebars/menu.rb', line 132

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



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

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



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

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
95
96
# 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] }

  {
    id: self.class.name.demodulize.underscore,
    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,
    pill_count_field: has_pill? ? pill_count_field : nil,
    items: items,
    separated: separated?
  }.compact
end

#serialize_items_for_super_sidebarObject

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



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

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