提交 6046a605 编写于 作者: G GitLab Bot

Add latest changes from gitlab-org/gitlab@master

上级 5956978e
......@@ -2,7 +2,6 @@
import { escape } from 'lodash';
import { mapActions, mapGetters } from 'vuex';
import { GlDeprecatedButton, GlTooltipDirective, GlLoadingIcon } from '@gitlab/ui';
import { polyfillSticky } from '~/lib/utils/sticky';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import Icon from '~/vue_shared/components/icon.vue';
import FileIcon from '~/vue_shared/components/file_icon.vue';
......@@ -124,9 +123,6 @@ export default {
return s__('MRDiff|Show full file');
},
},
mounted() {
polyfillSticky(this.$refs.header);
},
methods: {
...mapActions('diffs', [
'toggleFileDiscussions',
......
......@@ -88,4 +88,9 @@ export default class Editor {
updateOptions(options = {}) {
this.instance.updateOptions(options);
}
use(exts = []) {
const extensions = Array.isArray(exts) ? exts : [exts];
Object.assign(this, ...extensions);
}
}
fragment Project on Snippet {
fragment SnippetProject on Snippet {
project {
fullPath
webUrl
}
}
\ No newline at end of file
}
......@@ -7,7 +7,7 @@ query GetSnippetQuery($ids: [ID!]) {
edges {
node {
...SnippetBase
...Project
...SnippetProject
author {
...Author
}
......
......@@ -23,7 +23,6 @@ module ServiceParams
:comment_detail,
:confidential_issues_events,
:default_irc_uri,
:description,
:device,
:disable_diffs,
:drone_url,
......@@ -61,7 +60,6 @@ module ServiceParams
:sound,
:subdomain,
:teamcity_url,
:title,
:token,
:type,
:url,
......
# frozen_string_literal: true
module Snippets::BlobsActions
extend ActiveSupport::Concern
include Gitlab::Utils::StrongMemoize
include ExtractsRef
include Snippets::SendBlob
included do
before_action :authorize_read_snippet!, only: [:raw]
before_action :ensure_repository
before_action :ensure_blob
end
def raw
send_snippet_blob(snippet, blob)
end
private
def repository_container
snippet
end
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def blob
strong_memoize(:blob) do
assign_ref_vars
next unless @commit
@repo.blob_at(@commit.id, @path)
end
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
def ensure_blob
render_404 unless blob
end
def ensure_repository
unless snippet.repo_exists?
Gitlab::AppLogger.error(message: "Snippet raw blob attempt with no repo", snippet: snippet.id)
respond_422
end
end
def snippet_id
params[:snippet_id]
end
end
# frozen_string_literal: true
module Snippets::SendBlob
include SendsBlob
def send_snippet_blob(snippet, blob)
workhorse_set_content_type!
send_blob(
snippet.repository,
blob,
inline: content_disposition == 'inline',
allow_caching: snippet.public?
)
end
private
def content_disposition
@disposition ||= params[:inline] == 'false' ? 'attachment' : 'inline'
end
end
......@@ -2,11 +2,12 @@
module SnippetsActions
extend ActiveSupport::Concern
include SendsBlob
include RendersNotes
include RendersBlob
include PaginatedCollection
include Gitlab::NoteableMetadata
include Snippets::SendBlob
included do
skip_before_action :verify_authenticity_token,
......@@ -25,6 +26,10 @@ module SnippetsActions
render 'edit'
end
# This endpoint is being replaced by Snippets::BlobController#raw
# Support for old raw links will be maintainted via this action but
# it will only return the first blob found,
# see: https://gitlab.com/gitlab-org/gitlab/-/issues/217775
def raw
workhorse_set_content_type!
......@@ -39,12 +44,7 @@ module SnippetsActions
filename: Snippet.sanitized_file_name(blob.name)
)
else
send_blob(
snippet.repository,
blob,
inline: content_disposition == 'inline',
allow_caching: snippet.public?
)
send_snippet_blob(snippet, blob)
end
end
......@@ -106,10 +106,6 @@ module SnippetsActions
private
def content_disposition
@disposition ||= params[:inline] == 'false' ? 'attachment' : 'inline'
end
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def blob
return unless snippet
......
# frozen_string_literal: true
class Projects::Snippets::BlobsController < Projects::Snippets::ApplicationController
include Snippets::BlobsActions
end
......@@ -15,7 +15,7 @@ class Projects::SnippetsController < Projects::Snippets::ApplicationController
before_action :authorize_admin_snippet!, only: [:destroy]
def index
@snippet_counts = Snippets::CountService
@snippet_counts = ::Snippets::CountService
.new(current_user, project: @project)
.execute
......@@ -35,7 +35,7 @@ class Projects::SnippetsController < Projects::Snippets::ApplicationController
def create
create_params = snippet_params.merge(spammable_params)
service_response = Snippets::CreateService.new(project, current_user, create_params).execute
service_response = ::Snippets::CreateService.new(project, current_user, create_params).execute
@snippet = service_response.payload[:snippet]
handle_repository_error(:new)
......
# frozen_string_literal: true
class Snippets::BlobsController < Snippets::ApplicationController
include Snippets::BlobsActions
skip_before_action :authenticate_user!, only: [:raw]
end
......@@ -13,11 +13,10 @@ module Resolvers
def resolve(name: nil, **args)
authorize!(project)
response, start_cursor, end_cursor = jira_projects(name: name, **compute_pagination_params(args))
end_cursor = nil if !!response.payload[:is_last]
response = jira_projects(name: name)
if response.success?
Gitlab::Graphql::ExternallyPaginatedArray.new(start_cursor, end_cursor, *response.payload[:projects])
response.payload[:projects]
else
raise Gitlab::Graphql::Errors::BaseError, response.message
end
......@@ -35,41 +34,10 @@ module Resolvers
jira_service&.project
end
def compute_pagination_params(params)
after_cursor = Base64.decode64(params[:after].to_s)
before_cursor = Base64.decode64(params[:before].to_s)
def jira_projects(name:)
args = { query: name }.compact
# differentiate between 0 cursor and nil or invalid cursor that decodes into zero.
after_index = after_cursor.to_i == 0 && after_cursor != "0" ? nil : after_cursor.to_i
before_index = before_cursor.to_i == 0 && before_cursor != "0" ? nil : before_cursor.to_i
if after_index.present? && before_index.present?
if after_index >= before_index
{ start_at: 0, limit: 0 }
else
{ start_at: after_index + 1, limit: before_index - after_index - 1 }
end
elsif after_index.present?
{ start_at: after_index + 1, limit: nil }
elsif before_index.present?
{ start_at: 0, limit: before_index - 1 }
else
{ start_at: 0, limit: nil }
end
end
def jira_projects(name:, start_at:, limit:)
args = { query: name, start_at: start_at, limit: limit }.compact
response = Jira::Requests::Projects.new(project.jira_service, args).execute
return [response, nil, nil] if response.error?
projects = response.payload[:projects]
start_cursor = start_at == 0 ? nil : Base64.encode64((start_at - 1).to_s)
end_cursor = Base64.encode64((start_at + projects.size - 1).to_s)
[response, start_cursor, end_cursor]
return Jira::Requests::Projects.new(project.jira_service, args).execute
end
end
end
......
......@@ -15,7 +15,7 @@ module Types
null: true,
connection: false,
extensions: [Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension],
description: 'List of Jira projects fetched through Jira REST API',
description: 'List of all Jira projects fetched through Jira REST API',
resolver: Resolvers::Projects::JiraProjectsResolver
end
end
......
......@@ -19,6 +19,7 @@ module Ci
before_create :set_build_project
validates :build, presence: true
validates :secrets, json_schema: { filename: 'build_metadata_secrets' }
serialize :config_options, Serializers::JSON # rubocop:disable Cop/ActiveRecordSerialize
serialize :config_variables, Serializers::JSON # rubocop:disable Cop/ActiveRecordSerialize
......@@ -83,5 +84,3 @@ module Ci
end
end
end
Ci::BuildMetadata.prepend_if_ee('EE::Ci::BuildMetadata')
......@@ -3,11 +3,11 @@
class BugzillaService < IssueTrackerService
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
def default_title
def title
'Bugzilla'
end
def default_description
def description
s_('IssueTracker|Bugzilla issue tracker')
end
......
......@@ -3,11 +3,11 @@
class CustomIssueTrackerService < IssueTrackerService
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
def default_title
def title
'Custom Issue Tracker'
end
def default_description
def description
s_('IssueTracker|Custom issue tracker')
end
......@@ -17,8 +17,6 @@ class CustomIssueTrackerService < IssueTrackerService
def fields
[
{ type: 'text', name: 'title', placeholder: title },
{ type: 'text', name: 'description', placeholder: description },
{ type: 'text', name: 'project_url', placeholder: 'Project url', required: true },
{ type: 'text', name: 'issues_url', placeholder: 'Issue url', required: true },
{ type: 'text', name: 'new_issue_url', placeholder: 'New Issue url', required: true }
......
......@@ -7,11 +7,11 @@ class GitlabIssueTrackerService < IssueTrackerService
default_value_for :default, true
def default_title
def title
'GitLab'
end
def default_description
def description
s_('IssueTracker|GitLab issue tracker')
end
......
......@@ -25,28 +25,6 @@ class IssueTrackerService < Service
end
end
# this will be removed as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
def title
if title_attribute = read_attribute(:title)
title_attribute
elsif self.properties && self.properties['title'].present?
self.properties['title']
else
default_title
end
end
# this will be removed as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
def description
if description_attribute = read_attribute(:description)
description_attribute
elsif self.properties && self.properties['description'].present?
self.properties['description']
else
default_description
end
end
def handle_properties
# this has been moved from initialize_properties and should be improved
# as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
......@@ -54,13 +32,6 @@ class IssueTrackerService < Service
@legacy_properties_data = properties.dup
data_values = properties.slice!('title', 'description')
properties.each do |key, _|
current_value = self.properties.delete(key)
value = attribute_changed?(key) ? attribute_change(key).last : current_value
write_attribute(key, value)
end
data_values.reject! { |key| data_fields.changed.include?(key) }
data_values.slice!(*data_fields.attributes.keys)
data_fields.assign_attributes(data_values) if data_values.present?
......@@ -102,7 +73,6 @@ class IssueTrackerService < Service
def fields
[
{ type: 'text', name: 'description', placeholder: description },
{ type: 'text', name: 'project_url', placeholder: 'Project url', required: true },
{ type: 'text', name: 'issues_url', placeholder: 'Issue url', required: true },
{ type: 'text', name: 'new_issue_url', placeholder: 'New Issue url', required: true }
......@@ -117,8 +87,6 @@ class IssueTrackerService < Service
def set_default_data
return unless issues_tracker.present?
self.title ||= issues_tracker['title']
# we don't want to override if we have set something
return if project_url || issues_url || new_issue_url
......
......@@ -64,8 +64,6 @@ class JiraService < IssueTrackerService
def set_default_data
return unless issues_tracker.present?
self.title ||= issues_tracker['title']
return if url
data_fields.url ||= issues_tracker['url']
......@@ -103,11 +101,11 @@ class JiraService < IssueTrackerService
[Jira service documentation](#{help_page_url('user/project/integrations/jira')})."
end
def default_title
def title
'Jira'
end
def default_description
def description
s_('JiraService|Jira issue tracker')
end
......
......@@ -3,11 +3,11 @@
class RedmineService < IssueTrackerService
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
def default_title
def title
'Redmine'
end
def default_description
def description
s_('IssueTracker|Redmine issue tracker')
end
......
......@@ -12,11 +12,11 @@ class YoutrackService < IssueTrackerService
end
end
def default_title
def title
'YouTrack'
end
def default_description
def description
s_('IssueTracker|YouTrack issue tracker')
end
......@@ -26,7 +26,6 @@ class YoutrackService < IssueTrackerService
def fields
[
{ type: 'text', name: 'description', placeholder: description },
{ type: 'text', name: 'project_url', title: 'Project URL', placeholder: 'Project URL', required: true },
{ type: 'text', name: 'issues_url', title: 'Issue URL', placeholder: 'Issue URL', required: true }
]
......
......@@ -7,6 +7,9 @@ class Service < ApplicationRecord
include Importable
include ProjectServicesLoggable
include DataFields
include IgnorableColumns
ignore_columns %i[title description], remove_with: '13.4', remove_after: '2020-09-22'
SERVICE_NAMES = %w[
alerts asana assembla bamboo bugzilla buildkite campfire custom_issue_tracker discord
......
# frozen_string_literal: true
module GpgKeys
class DestroyService < Keys::BaseService
def execute(key)
key.destroy
end
end
end
......@@ -5,22 +5,16 @@ module Jira
class Base
include ProjectServicesLoggable
PER_PAGE = 50
attr_reader :jira_service, :project, :query
attr_reader :jira_service, :project, :limit, :start_at, :query
def initialize(jira_service, limit: PER_PAGE, start_at: 0, query: nil)
def initialize(jira_service, query: nil)
@project = jira_service&.project
@jira_service = jira_service
@limit = limit
@start_at = start_at
@query = query
@query = query
end
def execute
return ServiceResponse.error(message: _('Jira service not configured.')) unless jira_service&.active?
return ServiceResponse.success(payload: empty_payload) if limit.to_i <= 0
request
end
......
......@@ -9,19 +9,24 @@ module Jira
override :url
def url
'/rest/api/2/project/search?query=%{query}&maxResults=%{limit}&startAt=%{start_at}' %
{ query: CGI.escape(query.to_s), limit: limit.to_i, start_at: start_at.to_i }
'/rest/api/2/project'
end
override :build_service_response
def build_service_response(response)
return ServiceResponse.success(payload: empty_payload) unless response['values'].present?
return ServiceResponse.success(payload: empty_payload) unless response.present?
ServiceResponse.success(payload: { projects: map_projects(response), is_last: response['isLast'] })
ServiceResponse.success(payload: { projects: map_projects(response), is_last: true })
end
def map_projects(response)
response['values'].map { |v| JIRA::Resource::Project.build(client, v) }
response.map { |v| JIRA::Resource::Project.build(client, v) }.select(&method(:match_query?))
end
def match_query?(jira_project)
query = self.query.to_s.downcase
jira_project&.key&.downcase&.include?(query) || jira_project&.name&.downcase&.include?(query)
end
def empty_payload
......
- page_title "Appearance"
- page_title _("Appearance")
- @content_class = "limit-container-width" unless fluid_layout
= render 'form'
- add_to_breadcrumbs "Applications", admin_applications_path
- add_to_breadcrumbs _("Applications"), admin_applications_path
- breadcrumb_title @application.name
- page_title "Edit", @application.name, "Applications"
- page_title _("Edit"), @application.name, _("Applications")
%h3.page-title Edit application
- @url = admin_application_path(@application)
......
- page_title "Applications"
- page_title _("Applications")
%h3.page-title
System OAuth applications
%p.light
......
- breadcrumb_title "Applications"
- page_title "New Application"
- breadcrumb_title _("Applications")
- page_title _("New Application")
%h3.page-title New application
- @url = admin_applications_path
......
- page_title @application.name, "Applications"
- page_title @application.name, _("Applications")
%h3.page-title
Application: #{@application.name}
......
- page_title "Background Jobs"
- page_title _("Background Jobs")
%h3.page-title Background Jobs
%p.light GitLab uses #{link_to "sidekiq", "http://sidekiq.org/"} library for async job processing
......
- breadcrumb_title "Messages"
- page_title "Broadcast Messages"
- breadcrumb_title _("Messages")
- page_title _("Broadcast Messages")
= render 'form'
- breadcrumb_title "Messages"
- page_title "Broadcast Messages"
- breadcrumb_title _("Messages")
- page_title _("Broadcast Messages")
%h3.page-title
Broadcast Messages
......
- breadcrumb_title "Dashboard"
- breadcrumb_title _("Dashboard")
- page_title _("Dashboard")
- if show_license_breakdown?
= render_if_exists 'admin/licenses/breakdown', license: @license
......
- page_title 'New Deploy Key'
- page_title _('New Deploy Key')
%h3.page-title New public deploy key
%hr
......
- breadcrumb_title _("Gitaly Servers")
- page_title _("Gitaly Servers")
%h3.page-title= _("Gitaly Servers")
%hr
......
- page_title 'Request details'
- page_title _('Request details')
%h3.page-title
Request details
......
- breadcrumb_title "Jobs"
- breadcrumb_title _("Jobs")
- page_title _("Jobs")
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
- build_path_proc = ->(scope) { admin_jobs_path(scope: scope) }
......
- page_title @key.title, "Keys"
- page_title @key.title, _("Keys")
= render "profiles/keys/key_details", admin: true
- add_to_breadcrumbs "Projects", admin_projects_path
- add_to_breadcrumbs _("Projects"), admin_projects_path
- breadcrumb_title @project.full_name
- page_title @project.full_name, "Projects"
- page_title @project.full_name, _("Projects")
- @content_class = "admin-projects"
%h3.page-title
......
- page_title 'Requests Profiles'
- page_title _('Requests Profiles')
%h3.page-title
= page_title
......
- breadcrumb_title _('Runners')
- page_title _('Runners')
.row
.col-sm-6
......
......@@ -9,6 +9,7 @@
%span.runner-state.runner-state-specific
Specific
- page_title _("Runners")
- add_to_breadcrumbs _("Runners"), admin_runners_path
- breadcrumb_title "##{@runner.id}"
......
- add_to_breadcrumbs "Service Templates", admin_application_settings_services_path
- add_to_breadcrumbs _("Service Templates"), admin_application_settings_services_path
- page_title @service.title, _("Service Templates")
- breadcrumb_title @service.title
- page_title @service.title, "Service Templates"
- @content_class = 'limit-container-width' unless fluid_layout
= render 'form'
- page_title "Service Templates"
- page_title _("Service Templates")
%h3.page-title Service templates
%p.light= s_('AdminSettings|Service template allows you to set default values for integrations')
......
- page_title "Spam Logs"
- page_title _("Spam Logs")
%h3.page-title Spam Logs
%hr
- if @spam_logs.present?
......
- page_title "Edit", @user.name, "Users"
- page_title _("Edit"), @user.name, _("Users")
%h3.page-title
Edit user: #{@user.name}
%hr
......
- page_title "Users"
- page_title _("Users")
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
.fade-left
......
- add_to_breadcrumbs "Users", admin_users_path
- add_to_breadcrumbs _("Users"), admin_users_path
- breadcrumb_title @user.name
- page_title "SSH Keys", @user.name, "Users"
- page_title _("SSH Keys"), @user.name, _("Users")
= render 'admin/users/head'
= render 'profiles/keys/key_table', admin: true
- page_title "New User"
- page_title _("New User")
%h3.page-title
New user
%hr
......
- add_to_breadcrumbs "Users", admin_users_path
- add_to_breadcrumbs _("Users"), admin_users_path
- breadcrumb_title @user.name
- page_title "Groups and projects", @user.name, "Users"
- page_title _("Groups and projects"), @user.name, _("Users")
= render 'admin/users/head'
- if @user.groups.any?
......
- add_to_breadcrumbs "Users", admin_users_path
- add_to_breadcrumbs _("Users"), admin_users_path
- breadcrumb_title @user.name
- page_title @user.name, "Users"
- page_title @user.name, _("Users")
= render 'admin/users/head'
.row
......
......@@ -5,8 +5,8 @@
= render_dashboard_gold_trial(current_user)
- page_title "Activity"
- header_title "Activity", activity_dashboard_path
- page_title _("Activity")
- header_title _("Activity"), activity_dashboard_path
= render "projects/last_push"
= render 'dashboard/activity_head'
......
- @hide_top_links = true
- page_title "Groups"
- header_title "Groups", dashboard_groups_path
- page_title _("Groups")
- header_title _("Groups"), dashboard_groups_path
= render_dashboard_gold_trial(current_user)
= render 'dashboard/groups_head'
......
- @hide_top_links = true
- page_title 'Milestones'
- header_title 'Milestones', dashboard_milestones_path
- page_title _('Milestones')
- header_title _('Milestones'), dashboard_milestones_path
.page-title-holder.d-flex.align-items-center
%h1.page-title= _('Milestones')
......
......@@ -5,8 +5,8 @@
= render_dashboard_gold_trial(current_user)
- page_title "Projects"
- header_title "Projects", dashboard_projects_path
- page_title _("Projects")
- header_title _("Projects"), dashboard_projects_path
= render "projects/last_push"
- if show_projects?(@projects, params)
......
- @hide_top_links = true
- page_title "Snippets"
- header_title "Snippets", dashboard_snippets_path
- page_title _("Snippets")
- header_title _("Snippets"), dashboard_snippets_path
- button_path = new_snippet_path if can?(current_user, :create_snippet)
= render 'dashboard/snippets_head'
......
- @hide_top_links = true
- page_title "To-Do List"
- header_title "To-Do List", dashboard_todos_path
- page_title _("To-Do List")
- header_title _("To-Do List"), dashboard_todos_path
= render_dashboard_gold_trial(current_user)
......
- page_title "Sign up"
- page_title _("Sign up")
- if experiment_enabled?(:signup_flow)
.row
.col-lg-7
......
- page_title "Sign in"
- page_title _("Sign in")
#signin-container
- if any_form_based_providers_enabled?
......
- @hide_top_links = true
- page_title "Snippets"
- header_title "Snippets", snippets_path
- page_title _("Snippets")
- header_title _("Snippets"), snippets_path
- if current_user
= render 'dashboard/snippets_head'
......
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, group_url(@group, rss_url_options), title: "#{@group.name} activity")
- page_title "Activity"
- page_title _("Activity")
%section.activities
= render 'activities'
- breadcrumb_title _("General Settings")
- page_title _("General Settings")
- @content_class = "limit-container-width" unless fluid_layout
- expanded = expanded_by_default?
......
- @can_bulk_update = can?(current_user, :admin_issue, @group) && @group.feature_available?(:group_bulk_edit)
- page_title "Issues"
- page_title _("Issues")
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@group.name} issues")
......
- add_to_breadcrumbs _("Labels"), group_labels_path(@group)
- breadcrumb_title _("Edit")
- page_title "Edit", @label.name, _("Labels")
- page_title _("Edit"), @label.name, _("Labels")
%h3.page-title
Edit Label
......
- page_title 'Labels'
- page_title _('Labels')
- can_admin_label = can?(current_user, :admin_label, @group)
- search = params[:search]
- subscribed = params[:subscribed]
......
- @can_bulk_update = can?(current_user, :admin_merge_request, @group) && @group.feature_available?(:group_bulk_edit)
- page_title "Merge Requests"
- page_title _("Merge Requests")
- if group_merge_requests_count(state: 'all').zero?
= render 'shared/empty_states/merge_requests', project_select_button: true
......
- page_title "Milestones"
- page_title _("Milestones")
.top-area
= render 'shared/milestones_filter', counts: @milestone_states
......
- breadcrumb_title "Projects"
- breadcrumb_title _("Projects")
- page_title _("Projects")
.card.prepend-top-default
.card-header
......
- breadcrumb_title "CI / CD Settings"
- page_title "CI / CD"
- breadcrumb_title _("CI / CD Settings")
- page_title _("CI / CD")
- expanded = expanded_by_default?
- general_expanded = @group.errors.empty? ? expanded : true
......
- breadcrumb_title _("Details")
- page_title _("Groups")
- @content_class = "limit-container-width" unless fluid_layout
= content_for :meta_tags do
......
- page_title 'Instance Configuration'
- page_title _('Instance Configuration')
.documentation.md
%h1 Instance Configuration
......
- page_title "UI Development Kit", "Help"
- page_title _("UI Development Kit"), _("Help")
- lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed fermentum nisi sapien, non consequat lectus aliquam ultrices. Suspendisse sodales est euismod nunc condimentum, a consectetur diam ornare."
- link_classes = "flex-grow-1 mx-1 "
......
- @body_class = 'ide-layout'
- page_title 'IDE'
- page_title _('IDE')
- content_for :page_specific_javascripts do
= stylesheet_link_tag 'page_bundles/ide'
......
- title = _('Bitbucket Server Import')
- page_title title
- breadcrumb_title title
- header_title "Projects", root_path
- header_title _("Projects"), root_path
%h3.page-title
= icon 'bitbucket-square', text: _('Import repositories from Bitbucket Server')
......
- page_title 'Bitbucket Server import'
- header_title 'Projects', root_path
- page_title _('Bitbucket Server import')
- header_title _('Projects'), root_path
%h3.page-title
%i.fa.fa-bitbucket-square
......
- page_title "Manifest file import"
- header_title "Projects", root_path
- page_title _("Manifest file import")
- header_title _("Projects"), root_path
%h3.page-title
= _('Manifest file import')
......
- page_title "Manifest import"
- header_title "Projects", root_path
- page_title _("Manifest import")
- header_title _("Projects"), root_path
- provider = 'manifest'
%h3.page-title
......
- breadcrumb_title _("Cohorts")
- page_title _("Cohorts")
- if @cohorts
= render 'cohorts_table'
......
......@@ -15,6 +15,7 @@
%li= link_to _('New project'), new_project_path(namespace_id: @group.id)
- if create_group_subgroup
%li= link_to _('New subgroup'), new_group_path(parent_id: @group.id)
= render_if_exists 'layouts/header/create_epic_new_dropdown_item'
%li.divider
%li.dropdown-bold-header GitLab
......
- page_title _("Snippets")
- header_title _("Snippets"), snippets_path
- snippets_upload_path = snippets_upload_path(@snippet, current_user)
......
- breadcrumb_title s_("Profiles|Edit Profile")
- page_title s_("Profiles|Edit Profile")
- @content_class = "limit-container-width" unless fluid_layout
- gravatar_link = link_to Gitlab.config.gravatar.host, 'https://' + Gitlab.config.gravatar.host
......
- breadcrumb_title _('Artifacts')
- page_title @path.presence, 'Artifacts', "#{@build.name} (##{@build.id})", 'Jobs'
- page_title @path.presence, _('Artifacts'), "#{@build.name} (##{@build.id})", _('Jobs')
= render "projects/jobs/header"
......
- page_title @path, 'Artifacts', "#{@build.name} (##{@build.id})", 'Jobs'
- page_title @path, _('Artifacts'), "#{@build.name} (##{@build.id})", _('Jobs')
= render "projects/jobs/header"
......
- page_title "Blame", @blob.path, @ref
- page_title _("Blame"), @blob.path, @ref
- link_icon = icon("link")
#blob-content-holder.tree-holder
......
- breadcrumb_title "Repository"
- page_title "Edit", @blob.path, @ref
- breadcrumb_title _("Repository")
- page_title _("Edit"), @blob.path, @ref
- unless Feature.enabled?(:monaco_blobs)
- content_for :page_specific_javascripts do
= page_specific_javascript_tag('lib/ace.js')
......
- breadcrumb_title "Repository"
- page_title "New File", @path.presence, @ref
- breadcrumb_title _("Repository")
- page_title _("New File"), @path.presence, @ref
- unless Feature.enabled?(:monaco_blobs)
- content_for :page_specific_javascripts do
= page_specific_javascript_tag('lib/ace.js')
......
- page_title "New Branch"
- page_title _("New Branch")
- default_ref = params[:ref] || @project.default_branch
- if @error
......
- breadcrumb_title "Compare Revisions"
- page_title "Compare"
- breadcrumb_title _("Compare Revisions")
- page_title _("Compare")
%h3.page-title
= _("Compare Git revisions")
......
- page_title "Value Stream Analytics"
- page_title _("Value Stream Analytics")
#cycle-analytics{ "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } }
- if @cycle_analytics_no_data
......
- page_title 'Edit Deploy Key'
- page_title _('Edit Deploy Key')
%h3.page-title= _('Edit Deploy Key')
%hr
......
- @content_class = "limit-container-width" unless fluid_layout
- breadcrumb_title _("Details")
- page_title _("Details")
= render partial: 'flash_messages', locals: { project: @project }
......
- page_title "Find File", @ref
- page_title _("Find File"), @ref
.file-finder-holder.tree-holder.clearfix.js-file-finder{ 'data-file-find-url': "#{escape_javascript(project_files_path(@project, @ref, format: :json))}", 'data-find-tree-url': escape_javascript(project_tree_path(@project, @ref)), 'data-blob-url-template': escape_javascript(project_blob_path(@project, @id || @commit.id)) }
.nav-block
......
- page_title "Import repository"
- page_title _("Import repository")
%h3.page-title
Import repository
......
- page_title "Edit", "#{@issue.title} (#{@issue.to_reference})", "Issues"
- page_title _("Edit"), "#{@issue.title} (#{@issue.to_reference})", _("Issues")
%h3.page-title
Edit Issue ##{@issue.iid}
......
- @can_bulk_update = can?(current_user, :admin_issue, @project)
- page_title "Issues"
- page_title _("Issues")
- new_issue_email = @project.new_issuable_address(current_user, 'issue')
= content_for :meta_tags do
......
- page_title "Jobs"
- page_title _("Jobs")
.top-area
- build_path_proc = ->(scope) { project_jobs_path(@project, scope: scope) }
......
- add_to_breadcrumbs 'Jobs', project_jobs_path(@project)
- add_to_breadcrumbs _('Jobs'), project_jobs_path(@project)
- add_to_breadcrumbs "##{@build.id}", project_job_path(@project, @build)
- breadcrumb_title 'Terminal'
- page_title 'Terminal', "#{@build.name} (##{@build.id})", 'Jobs'
- breadcrumb_title _('Terminal')
- page_title _('Terminal'), "#{@build.name} (##{@build.id})", _('Jobs')
- content_for :page_specific_javascripts do
= stylesheet_link_tag "xterm.css"
......
- add_to_breadcrumbs "Labels", project_labels_path(@project)
- breadcrumb_title "Edit"
- page_title "Edit", @label.name, "Labels"
- add_to_breadcrumbs _("Labels"), project_labels_path(@project)
- breadcrumb_title _("Edit")
- page_title _("Edit"), @label.name, _("Labels")
%h3.page-title
Edit Label
......
- page_title "Labels"
- page_title _("Labels")
- can_admin_label = can?(current_user, :admin_label, @project)
- search = params[:search]
- subscribed = params[:subscribed]
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册