diff options
Diffstat (limited to 'app/helpers/sidebars_helper.rb')
-rw-r--r-- | app/helpers/sidebars_helper.rb | 269 |
1 files changed, 253 insertions, 16 deletions
diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb index 27020738515..02a912d0227 100644 --- a/app/helpers/sidebars_helper.rb +++ b/app/helpers/sidebars_helper.rb @@ -23,40 +23,130 @@ module SidebarsHelper end end - def project_sidebar_context(project, user, current_ref, ref_type: nil) + def project_sidebar_context(project, user, current_ref, ref_type: nil, **args) context_data = project_sidebar_context_data(project, user, current_ref, ref_type: ref_type) - Sidebars::Projects::Context.new(**context_data) + Sidebars::Projects::Context.new(**context_data, **args) end - def group_sidebar_context(group, user) + def group_sidebar_context(group, user, **args) context_data = group_sidebar_context_data(group, user) - Sidebars::Groups::Context.new(**context_data) + Sidebars::Groups::Context.new(**context_data, **args) end - def super_sidebar_context(user, group:, project:) + def your_work_sidebar_context(user, **args) + context_data = your_work_context_data(user) + + Sidebars::Context.new(**context_data, **args) + end + + def super_sidebar_context(user, group:, project:, panel:, panel_type:) # rubocop:disable Metrics/AbcSize { + current_menu_items: panel.super_sidebar_menu_items, + current_context_header: panel.super_sidebar_context_header, name: user.name, username: user.username, avatar_url: user.avatar_url, - assigned_open_issues_count: user.assigned_open_issues_count, - todos_pending_count: user.todos_pending_count, + has_link_to_profile: current_user_menu?(:profile), + link_to_profile: user_url(user), + logo_url: current_appearance&.header_logo_path, + status: user_status_menu_data(user), + settings: { + has_settings: current_user_menu?(:settings), + profile_path: profile_path, + profile_preferences_path: profile_preferences_path + }, + user_counts: { + assigned_issues: user.assigned_open_issues_count, + assigned_merge_requests: user.assigned_open_merge_requests_count, + review_requested_merge_requests: user.review_requested_open_merge_requests_count, + todos: user.todos_pending_count, + last_update: time_in_milliseconds + }, + can_sign_out: current_user_menu?(:sign_out), + sign_out_link: destroy_user_session_path, issues_dashboard_path: issues_dashboard_path(assignee_username: user.username), - total_merge_requests_count: user_merge_requests_counts[:total], + todos_dashboard_path: dashboard_todos_path, create_new_menu_groups: create_new_menu_groups(group: group, project: project), merge_request_menu: create_merge_request_menu(user), + projects_path: dashboard_projects_path, + groups_path: dashboard_groups_path, support_path: support_url, display_whats_new: display_whats_new?, whats_new_most_recent_release_items_count: whats_new_most_recent_release_items_count, whats_new_version_digest: whats_new_version_digest, show_version_check: show_version_check?, gitlab_version: Gitlab.version_info, - gitlab_version_check: gitlab_version_check + gitlab_version_check: gitlab_version_check, + gitlab_com_but_not_canary: Gitlab.com_but_not_canary?, + gitlab_com_and_canary: Gitlab.com_and_canary?, + canary_toggle_com_url: Gitlab::Saas.canary_toggle_com_url, + current_context: super_sidebar_current_context(project: project, group: group), + context_switcher_links: context_switcher_links, + search: search_data, + pinned_items: user.pinned_nav_items[panel_type] || super_sidebar_default_pins(panel_type), + panel_type: panel_type, + update_pins_url: pins_url, + is_impersonating: impersonating?, + stop_impersonation_path: admin_impersonation_path, + shortcut_links: shortcut_links(user, project: project) } end + def super_sidebar_nav_panel( + nav: nil, project: nil, user: nil, group: nil, current_ref: nil, ref_type: nil, + viewed_user: nil) + context_adds = { route_is_active: method(:active_nav_link?), is_super_sidebar: true } + case nav + when 'project' + context = project_sidebar_context(project, user, current_ref, ref_type: ref_type, **context_adds) + Sidebars::Projects::SuperSidebarPanel.new(context) + when 'group' + context = group_sidebar_context(group, user, **context_adds) + Sidebars::Groups::SuperSidebarPanel.new(context) + when 'profile' + context = Sidebars::Context.new(current_user: user, container: user, **context_adds) + Sidebars::UserSettings::Panel.new(context) + when 'user_profile' + context = Sidebars::Context.new(current_user: user, container: viewed_user, **context_adds) + Sidebars::UserProfile::Panel.new(context) + when 'explore' + Sidebars::Explore::Panel.new(Sidebars::Context.new(current_user: user, container: nil, **context_adds)) + when 'search' + context = Sidebars::Context.new(current_user: user, container: nil, **context_adds) + Sidebars::Search::Panel.new(context) + when 'admin' + Sidebars::Admin::Panel.new(Sidebars::Context.new(current_user: user, container: nil, **context_adds)) + else + context = your_work_sidebar_context(user, **context_adds) + Sidebars::YourWork::Panel.new(context) + end + end + private + def search_data + { + search_path: search_path, + issues_path: issues_dashboard_path, + mr_path: merge_requests_dashboard_path, + autocomplete_path: search_autocomplete_path, + search_context: header_search_context + } + end + + def user_status_menu_data(user) + { + can_update: can?(user, :update_user_status, user), + busy: user.status&.busy?, + customized: user.status&.customized?, + availability: user.status&.availability.to_s, + emoji: user.status&.emoji, + message: user.status&.message_html&.html_safe, + clear_after: user_clear_status_at(user) + } + end + def create_new_menu_groups(group:, project:) new_dropdown_sections = new_dropdown_view_model(group: group, project: project)[:menu_sections] show_headers = new_dropdown_sections.length > 1 @@ -64,11 +154,19 @@ module SidebarsHelper { name: show_headers ? section[:title] : '', items: section[:menu_items].map do |item| - { - text: item[:title], - href: item[:href] - } - end + { + text: item[:title], + href: item[:href].presence, + component: item[:component].presence, + extraAttrs: { + 'data-track-label': item[:id], + 'data-track-action': 'click_link', + 'data-track-property': 'nav_create_menu', + 'data-qa-selector': 'create_menu_item', + 'data-qa-create-menu-item': item[:id] + } + } + end } end end @@ -81,12 +179,26 @@ module SidebarsHelper { text: _('Assigned'), href: merge_requests_dashboard_path(assignee_username: user.username), - count: user_merge_requests_counts[:assigned] + count: user.assigned_open_merge_requests_count, + userCount: 'assigned_merge_requests', + extraAttrs: { + 'data-track-action': 'click_link', + 'data-track-label': 'merge_requests_assigned', + 'data-track-property': 'nav_core_menu', + class: 'dashboard-shortcuts-merge_requests' + } }, { text: _('Review requests'), href: merge_requests_dashboard_path(reviewer_username: user.username), - count: user_merge_requests_counts[:review_requested] + count: user.review_requested_open_merge_requests_count, + userCount: 'review_requested_merge_requests', + extraAttrs: { + 'data-track-action': 'click_link', + 'data-track-label': 'merge_requests_to_review', + 'data-track-property': 'nav_core_menu', + class: 'dashboard-shortcuts-review_requests' + } } ] } @@ -160,6 +272,131 @@ module SidebarsHelper container: group } end + + def your_work_context_data(user) + { + current_user: user, + container: user, + show_security_dashboard: false + } + end + + def super_sidebar_current_context(project: nil, group: nil) + if project&.persisted? + return { + namespace: 'projects', + item: { + id: project.id, + name: project.name, + namespace: project.full_name, + webUrl: project_path(project), + avatarUrl: project.avatar_url + } + } + end + + if group&.persisted? + return { + namespace: 'groups', + item: { + id: group.id, + name: group.name, + namespace: group.full_name, + webUrl: group_path(group), + avatarUrl: group.avatar_url + } + } + end + + {} + end + + def context_switcher_links + links = [ + # We should probably not return "You work" when used is not logged-in + { title: s_('Navigation|Your work'), link: root_path, icon: 'work' }, + { title: s_('Navigation|Explore'), link: explore_root_path, icon: 'compass' } + ] + + # Usually, using current_user.admin? is discouraged because it does not + # check for admin mode, but since here we want to check admin? and admin mode + # separately, we'll have to ignore the cop rule. + # rubocop: disable Cop/UserAdmin + if current_user&.can_admin_all_resources? + links.append( + { title: s_('Navigation|Admin Area'), link: admin_root_path, icon: 'admin' } + ) + end + + if Gitlab::CurrentSettings.admin_mode + if header_link?(:admin_mode) + links.append( + { + title: s_('Navigation|Leave admin mode'), + link: destroy_admin_session_path, + icon: 'lock-open', + data_method: 'post' + } + ) + elsif current_user&.admin? + links.append( + { + title: s_('Navigation|Enter admin mode'), + link: new_admin_session_path, + icon: 'lock' + } + ) + end + end + # rubocop: enable Cop/UserAdmin + + links + end + + def impersonating? + !!session[:impersonator_id] + end + + def shortcut_links(user, project: nil) + shortcut_links = [ + { + title: _('Milestones'), + href: dashboard_milestones_path, + css_class: 'dashboard-shortcuts-milestones' + }, + { + title: _('Snippets'), + href: dashboard_snippets_path, + css_class: 'dashboard-shortcuts-snippets' + }, + { + title: _('Activity'), + href: activity_dashboard_path, + css_class: 'dashboard-shortcuts-activity' + } + ] + + if project&.persisted? && can?(user, :create_issue, project) + shortcut_links << { + title: _('Create a new issue'), + href: new_project_issue_path(project), + css_class: 'shortcuts-new-issue' + } + end + + shortcut_links + end + + def super_sidebar_default_pins(panel_type) + case panel_type + when 'project' + [:project_issue_list, :project_merge_request_list] + when 'group' + [:group_issue_list, :group_merge_request_list] + else + [] + end + end end SidebarsHelper.prepend_mod_with('SidebarsHelper') |