diff options
Diffstat (limited to 'app/views/layouts')
21 files changed, 140 insertions, 78 deletions
diff --git a/app/views/layouts/_flash.html.haml b/app/views/layouts/_flash.html.haml index be3f2fd74e4..a0b57f8dd52 100644 --- a/app/views/layouts/_flash.html.haml +++ b/app/views/layouts/_flash.html.haml @@ -10,4 +10,4 @@ %span= value - if %w(alert notice success).include?(key) %div{ class: "close-icon-wrapper js-close-icon" } - = sprite_icon('close', css_class: 'close-icon') + = sprite_icon('close', css_class: 'close-icon gl-vertical-align-baseline!') diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index b869298e99d..1c87452f0a3 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -1,6 +1,6 @@ - page_description brand_title unless page_description --# Needs a redirect on the client side since it's using an anchor to distuingish +-# Needs a redirect on the client side since it's using an anchor to distinguish -# between sign in and registration. We need to inline the JS to not render -# anything from this page beforehand. -# Part of an experiment to build a new sign up flow. Will be removed again with @@ -16,12 +16,7 @@ %head{ prefix: "og: http://ogp.me/ns#" } %meta{ charset: "utf-8" } - - if ActionController::Base.asset_host - %link{ rel: 'dns-prefetch', href: ActionController::Base.asset_host } - %link{ rel: 'preconnect', href: ActionController::Base.asset_host, crossorigin: '' } - - - if Gitlab::CurrentSettings.snowplow_enabled? && Gitlab::CurrentSettings.snowplow_collector_hostname - %link{ rel: 'preconnect', href: Gitlab::CurrentSettings.snowplow_collector_hostname, crossorigin: '' } + = render 'layouts/loading_hints' %meta{ 'http-equiv' => 'X-UA-Compatible', content: 'IE=edge' } @@ -54,6 +49,8 @@ = stylesheet_link_tag_defer "application_dark" - else = stylesheet_link_tag_defer "application" + - unless use_startup_css? + = stylesheet_link_tag_defer "themes/theme_#{user_application_theme_name}" = stylesheet_link_tag "disable_animations", media: "all" if Rails.env.test? || Gitlab.config.gitlab['disable_animations'] = stylesheet_link_tag_defer 'performance_bar' if performance_bar_enabled? @@ -73,7 +70,8 @@ = yield :page_specific_javascripts = webpack_controller_bundle_tags - = webpack_bundle_tag "chrome_84_icon_fix" if browser.chrome?([">=84", "<85"]) || browser.edge?([">=84", "<85"]) + = webpack_bundle_tag 'performance_bar' if performance_bar_enabled? + = webpack_bundle_tag "chrome_84_icon_fix" if browser.chrome?([">=84", "<84.0.4147.125"]) || browser.edge?([">=84", "<84.0.522.59"]) = yield :project_javascripts diff --git a/app/views/layouts/_loading_hints.html.haml b/app/views/layouts/_loading_hints.html.haml new file mode 100644 index 00000000000..0ef50d1b122 --- /dev/null +++ b/app/views/layouts/_loading_hints.html.haml @@ -0,0 +1,10 @@ +- if ActionController::Base.asset_host + %link{ rel: 'dns-prefetch', href: ActionController::Base.asset_host } + %link{ rel: 'preconnect', href: ActionController::Base.asset_host, crossorigin: '' } +- if user_application_theme == 'gl-dark' + %link{ { rel: 'preload', href: stylesheet_url('application_dark'), as: 'style' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} } +- else + %link{ { rel: 'preload', href: stylesheet_url('application'), as: 'style' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} } +%link{ { rel: 'preload', href: stylesheet_url("highlight/themes/#{user_color_scheme}"), as: 'style' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} } +- if Gitlab::CurrentSettings.snowplow_enabled? && Gitlab::CurrentSettings.snowplow_collector_hostname + %link{ rel: 'preconnect', href: Gitlab::CurrentSettings.snowplow_collector_hostname, crossorigin: '' } diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 3a543fef292..5184bc93a81 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -3,9 +3,9 @@ = render "layouts/nav/sidebar/#{nav}" .content-wrapper{ class: "#{@content_wrapper_class}" } .mobile-overlay + = yield :group_invite_members_banner .alert-wrapper = render 'shared/outdated_browser' - = render_if_exists 'layouts/header/users_over_license_banner' = render_if_exists "layouts/header/licensed_user_count_threshold" = render_if_exists "layouts/header/token_expiry_notification" = render "layouts/broadcast" diff --git a/app/views/layouts/_startup_css.haml b/app/views/layouts/_startup_css.haml index 094038d39b0..ea05157ed19 100644 --- a/app/views/layouts/_startup_css.haml +++ b/app/views/layouts/_startup_css.haml @@ -1,4 +1,7 @@ - return unless use_startup_css? +- startup_filename = current_path?("sessions#new") ? 'signin' : user_application_theme == 'gl-dark' ? 'dark' : 'general' + %style{ type: "text/css" } - = Rails.application.assets_manifest.find_sources('startup/startup-general.css').first.to_s.html_safe + = Rails.application.assets_manifest.find_sources("themes/theme_#{user_application_theme_name}.css").first.to_s.html_safe + = Rails.application.assets_manifest.find_sources("startup/startup-#{startup_filename}.css").first.to_s.html_safe diff --git a/app/views/layouts/_startup_css_activation.haml b/app/views/layouts/_startup_css_activation.haml index 0b1cce06f47..022b9a695bc 100644 --- a/app/views/layouts/_startup_css_activation.haml +++ b/app/views/layouts/_startup_css_activation.haml @@ -3,5 +3,8 @@ = javascript_tag nonce: true do :plain document.querySelectorAll('link[media="print"]').forEach(linkTag => { - linkTag.addEventListener('load', function() {this.media='all'}, {once: true}); + linkTag.setAttribute('data-startupcss', 'loading'); + const startupLinkLoadedEvent = new CustomEvent('CSSStartupLinkLoaded'); + linkTag.addEventListener('load',function(){this.media='all';this.setAttribute('data-startupcss', 'loaded');document.dispatchEvent(startupLinkLoadedEvent);},{once: true}); }) +- return unless use_startup_css? diff --git a/app/views/layouts/_startup_js.html.haml b/app/views/layouts/_startup_js.html.haml index 3eb68df07c6..33c759b7a7c 100644 --- a/app/views/layouts/_startup_js.html.haml +++ b/app/views/layouts/_startup_js.html.haml @@ -6,8 +6,11 @@ gl.startup_calls = #{page_startup_api_calls.to_json}; if (gl.startup_calls && window.fetch) { Object.keys(gl.startup_calls).forEach(apiCall => { + // fetch won’t send cookies in older browsers, unless you set the credentials init option. + // We set to `same-origin` which is default value in modern browsers. + // See https://github.com/whatwg/fetch/pull/585 for more information. gl.startup_calls[apiCall] = { - fetchCall: fetch(apiCall) + fetchCall: fetch(apiCall, { credentials: 'same-origin' }) }; }); } diff --git a/app/views/layouts/experiment_mailer.html.haml b/app/views/layouts/experiment_mailer.html.haml new file mode 100644 index 00000000000..5a342c400d6 --- /dev/null +++ b/app/views/layouts/experiment_mailer.html.haml @@ -0,0 +1,48 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +%html{ lang: "en" } + %head + %meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/ + %meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/ + %meta{ content: "IE=edge", "http-equiv" => "X-UA-Compatible" }/ + %title= message.subject + + -# Avoid premailer processing of client-specific styles (@media tag not supported) + -# We need to inline the contents here because mail clients (e.g. iOS Mail, Outlook) + -# do not support linked stylesheets. + %style{ type: 'text/css', 'data-premailer': 'ignore' } + = asset_to_string('mailer_client_specific.css').html_safe + + = stylesheet_link_tag 'mailer.css' + %body + %table#body{ border: "0", cellpadding: "0", cellspacing: "0" } + %tbody + %tr.line + %td + %tr.header + %td + = html_header_message + = header_logo + %tr + %td + %table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0" } + %tbody + %tr + %td.wrapper-cell{ style: "padding: 0" } + %table.content{ border: "0", cellpadding: "0", cellspacing: "0" } + %tbody + = yield + + = render_if_exists 'layouts/mailer/additional_text' + + %tr.footer + %td{ style: "padding: 24px 0" } + %img{ alt: "GitLab", height: "33", width: "90", src: image_url('mailers/gitlab_footer_logo.gif') } + %p{ style: "color: #949ba5; max-width: 640px; margin: 0 auto; text-align: left; font-size: 12px;" } + GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way + %br + Development, Security, and Ops teams collaborate. + + = yield :additional_footer + %tr + %td.footer-message + = html_footer_message diff --git a/app/views/layouts/header/_current_user_dropdown.html.haml b/app/views/layouts/header/_current_user_dropdown.html.haml index 4c659241f99..dcc6cba8444 100644 --- a/app/views/layouts/header/_current_user_dropdown.html.haml +++ b/app/views/layouts/header/_current_user_dropdown.html.haml @@ -14,7 +14,11 @@ %li.divider - if can?(current_user, :update_user_status, current_user) %li - .js-set-status-modal-trigger{ data: { has_status: current_user.status.present? ? 'true' : 'false' } } + %button.btn.menu-item.js-set-status-modal-trigger{ type: 'button' } + - if current_user.status.present? + = s_('SetStatusModal|Edit status') + - else + = s_('SetStatusModal|Set status') - if current_user_menu?(:profile) %li = link_to s_("CurrentUser|Profile"), current_user, class: 'profile-link', data: { user: current_user.username } @@ -35,6 +39,8 @@ = link_to _("Help"), help_path %li.d-md-none = link_to _("Support"), support_url + %li.d-md-none + = render 'shared/help_dropdown_forum_link' %li.d-md-none = link_to _("Submit feedback"), "https://about.gitlab.com/submit-feedback" - if current_user_menu?(:help) || current_user_menu?(:settings) || current_user_menu?(:profile) diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 56b70c463d0..845231238f6 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -66,7 +66,7 @@ track_property: 'navigation', container: 'body' } do = sprite_icon('todo-done') - %span.badge.badge-pill.todos-count{ class: ('hidden' if todos_pending_count == 0) } + %span.badge.badge-pill.todos-count.js-todos-count{ class: ('hidden' if todos_pending_count == 0) } = todos_count_format(todos_pending_count) %li.nav-item.header-help.dropdown.d-none.d-md-block{ **tracking_attrs('main_navigation', 'click_question_mark_link', 'navigation') } = link_to help_path, class: 'header-help-dropdown-toggle', data: { toggle: "dropdown" } do @@ -87,7 +87,7 @@ - if has_impersonation_link %li.nav-item.impersonation.ml-0 = link_to admin_impersonation_path, class: 'nav-link impersonation-btn', method: :delete, title: _('Stop impersonation'), aria: { label: _('Stop impersonation') }, data: { toggle: 'tooltip', placement: 'bottom', container: 'body', qa_selector: 'stop_impersonation_link' } do - = icon('user-secret') + = sprite_icon('incognito', size: 18) - if header_link?(:sign_in) %li.nav-item %div @@ -100,7 +100,7 @@ = sprite_icon('close', size: 12, css_class: 'close-icon js-navbar-toggle-left') - if ::Feature.enabled?(:whats_new_drawer) - #whats-new-app + #whats-new-app{ data: { features: whats_new_most_recent_release_items } } - if can?(current_user, :update_user_status, current_user) .js-set-status-modal-wrapper{ data: { current_emoji: current_user.status.present? ? current_user.status.emoji : '', current_message: current_user.status.present? ? current_user.status.message : '' } } diff --git a/app/views/layouts/header/_help_dropdown.html.haml b/app/views/layouts/header/_help_dropdown.html.haml index ad4e0f1f4b2..2b6cbc1c0ef 100644 --- a/app/views/layouts/header/_help_dropdown.html.haml +++ b/app/views/layouts/header/_help_dropdown.html.haml @@ -6,6 +6,8 @@ %li = link_to _("Support"), support_url %li + = render 'shared/help_dropdown_forum_link' + %li %button.js-shortcuts-modal-trigger{ type: "button" } = _("Keyboard shortcuts") %span.text-secondary.float-right{ "aria-hidden": true }= '?'.html_safe diff --git a/app/views/layouts/instance_statistics.html.haml b/app/views/layouts/instance_statistics.html.haml deleted file mode 100644 index 1de6b385c86..00000000000 --- a/app/views/layouts/instance_statistics.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -- page_title _('Analytics') -- header_title _('Analytics'), instance_statistics_root_path -- nav 'instance_statistics' -- @left_sidebar = true - -= render template: 'layouts/application' diff --git a/app/views/layouts/jira_connect.html.haml b/app/views/layouts/jira_connect.html.haml new file mode 100644 index 00000000000..fdeb3d3c9ac --- /dev/null +++ b/app/views/layouts/jira_connect.html.haml @@ -0,0 +1,13 @@ +%html{ lang: "en" } + %head + %meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" } + %title + GitLab + = stylesheet_link_tag 'https://unpkg.com/@atlaskit/css-reset@3.0.6/dist/bundle.css' + = stylesheet_link_tag 'https://unpkg.com/@atlaskit/reduced-ui-pack@10.5.5/dist/bundle.css' + = javascript_include_tag 'https://connect-cdn.atl-paas.net/all.js' + = javascript_include_tag 'https://unpkg.com/jquery@3.3.1/dist/jquery.min.js' + = yield :head + %body + .ac-content + = yield diff --git a/app/views/layouts/nav/_analytics_link.html.haml b/app/views/layouts/nav/_analytics_link.html.haml deleted file mode 100644 index f481aeecc1b..00000000000 --- a/app/views/layouts/nav/_analytics_link.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- return unless dashboard_nav_link?(:analytics) -= nav_link(controller: [:dev_ops_score, :cohorts], html_options: { class: "d-none d-xl-block"}) do - = link_to instance_statistics_root_path, class: 'chart-icon', title: _('Analytics'), aria: { label: _('Analytics') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do - = sprite_icon('chart', size: 18) diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 29cacbe4aff..40ea42091bd 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -43,8 +43,6 @@ = link_to dashboard_snippets_path, class: 'dashboard-shortcuts-snippets', data: { qa_selector: 'snippets_link' } do = _('Snippets') - = render_if_exists 'layouts/nav/sidebar/analytics_link' - %li.dropdown = render_if_exists 'dashboard/nav_link_list' @@ -66,8 +64,6 @@ = link_to sherlock_transactions_path, class: 'admin-icon' do = _('Sherlock Transactions') - = render_if_exists 'layouts/nav/analytics_link' - - if current_user.admin? = nav_link(controller: 'admin/dashboard', html_options: { class: "d-none d-xl-block"}) do = link_to admin_root_path, class: 'admin-icon qa-admin-area-link', title: _('Admin Area'), aria: { label: _('Admin Area') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml index 7fb5fff1e05..cb5277c02f0 100644 --- a/app/views/layouts/nav/sidebar/_admin.html.haml +++ b/app/views/layouts/nav/sidebar/_admin.html.haml @@ -48,6 +48,33 @@ %span = _('Gitaly Servers') + = nav_link(controller: admin_analytics_nav_links) do + = link_to admin_dev_ops_report_path, data: { qa_selector: 'admin_analytics_link' } do + .nav-icon-container + = sprite_icon('chart') + %span.nav-item-name + = _('Analytics') + + %ul.sidebar-sub-level-items{ data: { qa_selector: 'admin_sidebar_analytics_submenu_content' } } + = nav_link(controller: admin_analytics_nav_links, html_options: { class: "fly-out-top-item" }) do + = link_to admin_dev_ops_report_path do + %strong.fly-out-top-item-name + = _('Analytics') + %li.divider.fly-out-top-item + = nav_link(controller: :dev_ops_report) do + = link_to admin_dev_ops_report_path, title: _('DevOps Report') do + %span + = _('DevOps Report') + = nav_link(controller: :cohorts) do + = link_to admin_cohorts_path, title: _('Cohorts') do + %span + = _('Cohorts') + - if Feature.enabled?(:instance_statistics) + = nav_link(controller: :instance_statistics) do + = link_to admin_instance_statistics_path, title: _('Instance Statistics') do + %span + = _('Instance Statistics') + = nav_link(controller: admin_monitoring_nav_links) do = link_to admin_system_info_path, data: { qa_selector: 'admin_monitoring_link' } do .nav-icon-container diff --git a/app/views/layouts/nav/sidebar/_analytics_link.html.haml b/app/views/layouts/nav/sidebar/_analytics_link.html.haml deleted file mode 100644 index 9e5ae422e2d..00000000000 --- a/app/views/layouts/nav/sidebar/_analytics_link.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- return unless dashboard_nav_link?(:analytics) -= nav_link(controller: [:dev_ops_score, :cohorts]) do - = link_to instance_statistics_root_path, class: 'd-xl-none' do - = _('Analytics') diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml index 47dad21edd7..9e9e6493e5b 100644 --- a/app/views/layouts/nav/sidebar/_group.html.haml +++ b/app/views/layouts/nav/sidebar/_group.html.haml @@ -157,6 +157,12 @@ %span = _('General') + - if group_level_integrations? + = nav_link(controller: :integrations) do + = link_to group_settings_integrations_path(@group), title: _('Integrations') do + %span + = _('Integrations') + = nav_link(path: 'groups#projects') do = link_to projects_group_path(@group), title: _('Projects') do %span @@ -171,11 +177,6 @@ = link_to group_settings_ci_cd_path(@group), title: _('CI / CD') do %span = _('CI / CD') - - if Feature.enabled?(:group_level_integrations, @group) - = nav_link(controller: :integrations) do - = link_to group_settings_integrations_path(@group), title: _('Integrations') do - %span - = _('Integrations') = render_if_exists "groups/ee/settings_nav" diff --git a/app/views/layouts/nav/sidebar/_instance_statistics.html.haml b/app/views/layouts/nav/sidebar/_instance_statistics.html.haml deleted file mode 100644 index 979d98ec382..00000000000 --- a/app/views/layouts/nav/sidebar/_instance_statistics.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?) } - .nav-sidebar-inner-scroll - .context-header - = link_to instance_statistics_root_path, title: _('Analytics') do - .avatar-container.s40.settings-avatar - = sprite_icon('chart', size: 24) - .sidebar-context-title= _('Analytics') - %ul.sidebar-top-level-items - = render 'layouts/nav/sidebar/instance_statistics_links' - - = render 'shared/sidebar_toggle_button' diff --git a/app/views/layouts/nav/sidebar/_instance_statistics_links.html.haml b/app/views/layouts/nav/sidebar/_instance_statistics_links.html.haml deleted file mode 100644 index ee2c83dc31e..00000000000 --- a/app/views/layouts/nav/sidebar/_instance_statistics_links.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -- return unless can?(current_user, :read_instance_statistics) -= nav_link(controller: :dev_ops_score) do - = link_to instance_statistics_dev_ops_score_index_path do - .nav-icon-container - = sprite_icon('comment') - %span.nav-item-name - = _('DevOps Score') - %ul.sidebar-sub-level-items.is-fly-out-only - = nav_link(controller: :dev_ops_score, html_options: { class: "fly-out-top-item" } ) do - = link_to instance_statistics_dev_ops_score_index_path do - %strong.fly-out-top-item-name - = _('DevOps Score') - -- if Gitlab::CurrentSettings.usage_ping_enabled - = nav_link(controller: :cohorts) do - = link_to instance_statistics_cohorts_path do - .nav-icon-container - = sprite_icon('users') - %span.nav-item-name - = _('Cohorts') - %ul.sidebar-sub-level-items.is-fly-out-only - = nav_link(controller: :cohorts, html_options: { class: "fly-out-top-item" } ) do - = link_to instance_statistics_cohorts_path do - %strong.fly-out-top-item-name - = _('Cohorts') diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index 054311214ab..0eef587d7c7 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -167,7 +167,7 @@ = render_if_exists "layouts/nav/requirements_link", project: @project - if project_nav_tab? :pipelines - = nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts], unless: -> { current_path?('projects/pipelines#charts') }) do + = nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts, :test_cases], unless: -> { current_path?('projects/pipelines#charts') }) do = link_to project_pipelines_path(@project), class: 'shortcuts-pipelines qa-link-pipelines rspec-link-pipelines', data: { qa_selector: 'ci_cd_link' } do .nav-icon-container = sprite_icon('rocket') @@ -175,7 +175,7 @@ = _('CI / CD') %ul.sidebar-sub-level-items - = nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts], html_options: { class: "fly-out-top-item" }) do + = nav_link(controller: [:pipelines, :builds, :jobs, :pipeline_schedules, :artifacts, :test_cases], html_options: { class: "fly-out-top-item" }) do = link_to project_pipelines_path(@project) do %strong.fly-out-top-item-name = _('CI / CD') @@ -204,6 +204,8 @@ %span = _('Schedules') + = render_if_exists "layouts/nav/test_cases_link", project: @project + = render_if_exists 'layouts/nav/sidebar/project_security_link' # EE-specific - if project_nav_tab? :operations |