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::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
-
#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
#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
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
Methods included from Routing::PackagesHelper
Methods included from Routing::PseudonymizationHelper
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
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, #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 = [] 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
118 119 120 |
# File 'lib/sidebars/menu.rb', line 118 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
144 145 146 147 148 149 150 151 |
# File 'lib/sidebars/menu.rb', line 144 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
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 |
#link ⇒ Object
39 40 41 |
# File 'lib/sidebars/menu.rb', line 39 def link renderable_items.first&.link end |
#pick_into_super_sidebar? ⇒ Boolean
109 110 111 |
# File 'lib/sidebars/menu.rb', line 109 def 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
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
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
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
155 156 157 158 159 160 161 162 |
# File 'lib/sidebars/menu.rb', line 155 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 |
# File 'lib/sidebars/menu.rb', line 78 def items = 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_sidebar ⇒ Object
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 # 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 |