Class: Sidebars::Menu
- Inherits:
-
Object
- Object
- Sidebars::Menu
- Extended by:
- Gitlab::Utils::Override
- Includes:
- Gitlab::Allowable, Gitlab::Routing, GitlabRoutingHelper, Concerns::ContainerWithHtmlOptions, Concerns::HasActiveRoutes, Concerns::HasAvatar, Concerns::HasIcon, Concerns::HasPartial, Concerns::HasPill, Concerns::PositionableList, Concerns::Renderable
- Defined in:
- lib/sidebars/menu.rb
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
Instance Attribute Summary collapse
-
#context ⇒ Object
readonly
Returns the value of attribute context.
Instance Method Summary collapse
- #add_item(item) ⇒ Object
-
#all_active_routes ⇒ Object
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 }.
- #configure_menu_items ⇒ Object
- #container_html_options ⇒ Object
-
#has_items? ⇒ Boolean
Returns whether the menu has any menu item, no matter whether it is renderable or not.
-
#has_renderable_items? ⇒ Boolean
Returns whether the menu has any renderable menu item.
-
#initialize(context) ⇒ Menu
constructor
A new instance of Menu.
- #insert_item_after(after_item, new_item) ⇒ Object
- #insert_item_before(before_item, new_item) ⇒ Object
- #link ⇒ Object
- #pick_into_super_sidebar? ⇒ Boolean
- #remove_item(item) ⇒ Object
- #render? ⇒ Boolean
-
#renderable_items ⇒ Object
Returns all renderable menu items.
- #replace_placeholder(item) ⇒ Object
-
#separated? ⇒ Boolean
Defines whether menu is separated from others with a top separator.
-
#serialize_as_menu_item_args ⇒ Object
Sometimes we want to convert a top-level Menu (e.g. Wiki/Snippets) to a MenuItem.
-
#serialize_for_super_sidebar ⇒ Object
Returns a tree-like representation of itself and all renderable menu entries, with additional information on whether the item(s) have an active route.
-
#serialize_items_for_super_sidebar ⇒ Object
Returns an array of renderable menu entries, with additional information on whether the item has an active route.
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
Methods included from Concerns::ContainerWithHtmlOptions
#extra_container_html_options, #title
Methods included from Concerns::LinkWithHtmlOptions
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
Methods included from Routing::PackagesHelper
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
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 = [] end |
Instance Attribute Details
#context ⇒ Object (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_routes ⇒ Object
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_items ⇒ Object
29 30 31 |
# File 'lib/sidebars/menu.rb', line 29 def true end |
#container_html_options ⇒ Object
146 147 148 149 150 151 152 153 |
# File 'lib/sidebars/menu.rb', line 146 def super.tap do || # Flagging menus that can be rendered and with renderable menu items if render? && has_renderable_items? [:class] = [*[: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
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
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 |
#link ⇒ Object
39 40 41 |
# File 'lib/sidebars/menu.rb', line 39 def link renderable_items.first&.link end |
#pick_into_super_sidebar? ⇒ Boolean
111 112 113 |
# File 'lib/sidebars/menu.rb', line 111 def 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
34 35 36 |
# File 'lib/sidebars/menu.rb', line 34 def render? has_renderable_items? || end |
#renderable_items ⇒ Object
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
71 72 73 |
# File 'lib/sidebars/menu.rb', line 71 def separated? false end |
#serialize_as_menu_item_args ⇒ Object
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 { title: title, link: link, active_routes: active_routes, container_html_options: } end |
#serialize_for_super_sidebar ⇒ Object
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 items = 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_sidebar ⇒ Object
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 # All renderable menu entries renderable_items.map do |entry| entry..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 |