6ec53f5d48
Every project page displays a navigation menu that in turn displays the number of open issues and merge requests. This means that for every project page we run two COUNT(*) queries, each taking up roughly 30 milliseconds on GitLab.com. By caching these numbers and refreshing them whenever necessary we can reduce loading times of all these pages by up to roughly 60 milliseconds. The number of open issues does not include confidential issues. This is a trade-off to keep the code simple and to ensure refreshing the data only needs 2 COUNT(*) queries instead of 3. A downside is that if a project only has 5 confidential issues the counter will be set to 0. Because we now have 3 similar counting service classes the code previously used in Projects::ForksCountService has mostly been moved to Projects::CountService, which in turn is reused by the various service classes. Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/36622
111 lines
4.6 KiB
Text
111 lines
4.6 KiB
Text
- can_edit = can?(current_user, :admin_project, @project)
|
|
.scrolling-tabs-container{ class: nav_control_class }
|
|
.fade-left
|
|
= icon('angle-left')
|
|
.fade-right
|
|
= icon('angle-right')
|
|
%ul.nav-links.scrolling-tabs
|
|
= nav_link(path: ['projects#show', 'projects#activity', 'cycle_analytics#show'], html_options: { class: 'home' }) do
|
|
= link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do
|
|
%span
|
|
Project
|
|
|
|
- if project_nav_tab? :files
|
|
= nav_link(controller: %w(tree blob blame edit_tree new_tree find_file commit commits compare projects/repositories tags branches releases graphs network)) do
|
|
= link_to project_tree_path(@project), title: 'Repository', class: 'shortcuts-tree' do
|
|
%span
|
|
Repository
|
|
|
|
- if project_nav_tab? :container_registry
|
|
= nav_link(controller: %w[projects/registry/repositories]) do
|
|
= link_to project_container_registry_index_path(@project), title: 'Container Registry', class: 'shortcuts-container-registry' do
|
|
%span
|
|
Registry
|
|
|
|
- if project_nav_tab? :issues
|
|
= nav_link(controller: @project.issues_enabled? ? [:issues, :labels, :milestones, :boards] : :issues) do
|
|
= link_to project_issues_path(@project), title: 'Issues', class: 'shortcuts-issues' do
|
|
%span
|
|
Issues
|
|
- if @project.issues_enabled?
|
|
%span.badge.count.issue_counter
|
|
= number_with_delimiter(@project.open_issues_count)
|
|
|
|
- if project_nav_tab? :merge_requests
|
|
- controllers = [:merge_requests, 'projects/merge_requests/conflicts']
|
|
- controllers.push(:merge_requests, :labels, :milestones) unless @project.issues_enabled?
|
|
= nav_link(controller: controllers) do
|
|
= link_to project_merge_requests_path(@project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do
|
|
%span
|
|
Merge Requests
|
|
%span.badge.count.merge_counter.js-merge-counter
|
|
= number_with_delimiter(@project.open_merge_requests_count)
|
|
|
|
- if project_nav_tab? :pipelines
|
|
= nav_link(controller: [:pipelines, :builds, :environments, :artifacts]) do
|
|
= link_to project_pipelines_path(@project), title: 'Pipelines', class: 'shortcuts-pipelines' do
|
|
%span
|
|
Pipelines
|
|
|
|
- if project_nav_tab? :wiki
|
|
= nav_link(controller: :wikis) do
|
|
= link_to get_project_wiki_path(@project), title: 'Wiki', class: 'shortcuts-wiki' do
|
|
%span
|
|
Wiki
|
|
|
|
- if project_nav_tab? :snippets
|
|
= nav_link(controller: :snippets) do
|
|
= link_to project_snippets_path(@project), title: 'Snippets', class: 'shortcuts-snippets' do
|
|
%span
|
|
Snippets
|
|
|
|
- if project_nav_tab? :project_members
|
|
= nav_link(controller: :project_members) do
|
|
= link_to project_project_members_path(@project), title: 'Members', class: 'shortcuts-members' do
|
|
%span
|
|
Members
|
|
|
|
- if project_nav_tab? :settings
|
|
= nav_link(path: %w[projects#edit members#show integrations#show services#edit repository#show ci_cd#show pages#show]) do
|
|
= link_to edit_project_path(@project), title: 'Settings', class: 'shortcuts-tree' do
|
|
%span
|
|
Settings
|
|
|
|
-# Shortcut to Project > Activity
|
|
%li.hidden
|
|
= link_to activity_project_path(@project), title: 'Activity', class: 'shortcuts-project-activity' do
|
|
%span
|
|
Activity
|
|
|
|
-# Shortcut to Repository > Graph (formerly, Network)
|
|
- if project_nav_tab? :network
|
|
%li.hidden
|
|
= link_to project_network_path(@project, current_ref), title: 'Network', class: 'shortcuts-network' do
|
|
Graph
|
|
|
|
-# Shortcut to Repository > Charts (formerly, top-nav item "Graphs")
|
|
- unless @project.empty_repo?
|
|
%li.hidden
|
|
= link_to charts_project_graph_path(@project, current_ref), title: 'Charts', class: 'shortcuts-repository-charts' do
|
|
Charts
|
|
|
|
-# Shortcut to Issues > New Issue
|
|
%li.hidden
|
|
= link_to new_project_issue_path(@project), class: 'shortcuts-new-issue' do
|
|
Create a new issue
|
|
|
|
-# Shortcut to Pipelines > Jobs
|
|
- if project_nav_tab? :builds
|
|
%li.hidden
|
|
= link_to project_jobs_path(@project), title: 'Jobs', class: 'shortcuts-builds' do
|
|
Jobs
|
|
|
|
-# Shortcut to commits page
|
|
- if project_nav_tab? :commits
|
|
%li.hidden
|
|
= link_to project_commits_path(@project), title: 'Commits', class: 'shortcuts-commits' do
|
|
Commits
|
|
|
|
-# Shortcut to issue boards
|
|
%li.hidden
|
|
= link_to 'Issue Boards', project_boards_path(@project), title: 'Issue Boards', class: 'shortcuts-issue-boards'
|