Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
5956978e1d
commit
6046a605fd
174 changed files with 1470 additions and 896 deletions
|
@ -2,7 +2,6 @@
|
||||||
import { escape } from 'lodash';
|
import { escape } from 'lodash';
|
||||||
import { mapActions, mapGetters } from 'vuex';
|
import { mapActions, mapGetters } from 'vuex';
|
||||||
import { GlDeprecatedButton, GlTooltipDirective, GlLoadingIcon } from '@gitlab/ui';
|
import { GlDeprecatedButton, GlTooltipDirective, GlLoadingIcon } from '@gitlab/ui';
|
||||||
import { polyfillSticky } from '~/lib/utils/sticky';
|
|
||||||
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
|
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
|
||||||
import Icon from '~/vue_shared/components/icon.vue';
|
import Icon from '~/vue_shared/components/icon.vue';
|
||||||
import FileIcon from '~/vue_shared/components/file_icon.vue';
|
import FileIcon from '~/vue_shared/components/file_icon.vue';
|
||||||
|
@ -124,9 +123,6 @@ export default {
|
||||||
return s__('MRDiff|Show full file');
|
return s__('MRDiff|Show full file');
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
|
||||||
polyfillSticky(this.$refs.header);
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions('diffs', [
|
...mapActions('diffs', [
|
||||||
'toggleFileDiscussions',
|
'toggleFileDiscussions',
|
||||||
|
|
|
@ -88,4 +88,9 @@ export default class Editor {
|
||||||
updateOptions(options = {}) {
|
updateOptions(options = {}) {
|
||||||
this.instance.updateOptions(options);
|
this.instance.updateOptions(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use(exts = []) {
|
||||||
|
const extensions = Array.isArray(exts) ? exts : [exts];
|
||||||
|
Object.assign(this, ...extensions);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
fragment Project on Snippet {
|
fragment SnippetProject on Snippet {
|
||||||
project {
|
project {
|
||||||
fullPath
|
fullPath
|
||||||
webUrl
|
webUrl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ query GetSnippetQuery($ids: [ID!]) {
|
||||||
edges {
|
edges {
|
||||||
node {
|
node {
|
||||||
...SnippetBase
|
...SnippetBase
|
||||||
...Project
|
...SnippetProject
|
||||||
author {
|
author {
|
||||||
...Author
|
...Author
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ module ServiceParams
|
||||||
:comment_detail,
|
:comment_detail,
|
||||||
:confidential_issues_events,
|
:confidential_issues_events,
|
||||||
:default_irc_uri,
|
:default_irc_uri,
|
||||||
:description,
|
|
||||||
:device,
|
:device,
|
||||||
:disable_diffs,
|
:disable_diffs,
|
||||||
:drone_url,
|
:drone_url,
|
||||||
|
@ -61,7 +60,6 @@ module ServiceParams
|
||||||
:sound,
|
:sound,
|
||||||
:subdomain,
|
:subdomain,
|
||||||
:teamcity_url,
|
:teamcity_url,
|
||||||
:title,
|
|
||||||
:token,
|
:token,
|
||||||
:type,
|
:type,
|
||||||
:url,
|
:url,
|
||||||
|
|
53
app/controllers/concerns/snippets/blobs_actions.rb
Normal file
53
app/controllers/concerns/snippets/blobs_actions.rb
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# 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
|
22
app/controllers/concerns/snippets/send_blob.rb
Normal file
22
app/controllers/concerns/snippets/send_blob.rb
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# 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
|
module SnippetsActions
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
include SendsBlob
|
|
||||||
include RendersNotes
|
include RendersNotes
|
||||||
include RendersBlob
|
include RendersBlob
|
||||||
include PaginatedCollection
|
include PaginatedCollection
|
||||||
include Gitlab::NoteableMetadata
|
include Gitlab::NoteableMetadata
|
||||||
|
include Snippets::SendBlob
|
||||||
|
|
||||||
included do
|
included do
|
||||||
skip_before_action :verify_authenticity_token,
|
skip_before_action :verify_authenticity_token,
|
||||||
|
@ -25,6 +26,10 @@ module SnippetsActions
|
||||||
render 'edit'
|
render 'edit'
|
||||||
end
|
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
|
def raw
|
||||||
workhorse_set_content_type!
|
workhorse_set_content_type!
|
||||||
|
|
||||||
|
@ -39,12 +44,7 @@ module SnippetsActions
|
||||||
filename: Snippet.sanitized_file_name(blob.name)
|
filename: Snippet.sanitized_file_name(blob.name)
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
send_blob(
|
send_snippet_blob(snippet, blob)
|
||||||
snippet.repository,
|
|
||||||
blob,
|
|
||||||
inline: content_disposition == 'inline',
|
|
||||||
allow_caching: snippet.public?
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -106,10 +106,6 @@ module SnippetsActions
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def content_disposition
|
|
||||||
@disposition ||= params[:inline] == 'false' ? 'attachment' : 'inline'
|
|
||||||
end
|
|
||||||
|
|
||||||
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
||||||
def blob
|
def blob
|
||||||
return unless snippet
|
return unless snippet
|
||||||
|
|
5
app/controllers/projects/snippets/blobs_controller.rb
Normal file
5
app/controllers/projects/snippets/blobs_controller.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# 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]
|
before_action :authorize_admin_snippet!, only: [:destroy]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@snippet_counts = Snippets::CountService
|
@snippet_counts = ::Snippets::CountService
|
||||||
.new(current_user, project: @project)
|
.new(current_user, project: @project)
|
||||||
.execute
|
.execute
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ class Projects::SnippetsController < Projects::Snippets::ApplicationController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
create_params = snippet_params.merge(spammable_params)
|
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]
|
@snippet = service_response.payload[:snippet]
|
||||||
|
|
||||||
handle_repository_error(:new)
|
handle_repository_error(:new)
|
||||||
|
|
7
app/controllers/snippets/blobs_controller.rb
Normal file
7
app/controllers/snippets/blobs_controller.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# 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)
|
def resolve(name: nil, **args)
|
||||||
authorize!(project)
|
authorize!(project)
|
||||||
|
|
||||||
response, start_cursor, end_cursor = jira_projects(name: name, **compute_pagination_params(args))
|
response = jira_projects(name: name)
|
||||||
end_cursor = nil if !!response.payload[:is_last]
|
|
||||||
|
|
||||||
if response.success?
|
if response.success?
|
||||||
Gitlab::Graphql::ExternallyPaginatedArray.new(start_cursor, end_cursor, *response.payload[:projects])
|
response.payload[:projects]
|
||||||
else
|
else
|
||||||
raise Gitlab::Graphql::Errors::BaseError, response.message
|
raise Gitlab::Graphql::Errors::BaseError, response.message
|
||||||
end
|
end
|
||||||
|
@ -35,41 +34,10 @@ module Resolvers
|
||||||
jira_service&.project
|
jira_service&.project
|
||||||
end
|
end
|
||||||
|
|
||||||
def compute_pagination_params(params)
|
def jira_projects(name:)
|
||||||
after_cursor = Base64.decode64(params[:after].to_s)
|
args = { query: name }.compact
|
||||||
before_cursor = Base64.decode64(params[:before].to_s)
|
|
||||||
|
|
||||||
# differentiate between 0 cursor and nil or invalid cursor that decodes into zero.
|
return Jira::Requests::Projects.new(project.jira_service, args).execute
|
||||||
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]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,7 +15,7 @@ module Types
|
||||||
null: true,
|
null: true,
|
||||||
connection: false,
|
connection: false,
|
||||||
extensions: [Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension],
|
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
|
resolver: Resolvers::Projects::JiraProjectsResolver
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,6 +19,7 @@ module Ci
|
||||||
before_create :set_build_project
|
before_create :set_build_project
|
||||||
|
|
||||||
validates :build, presence: true
|
validates :build, presence: true
|
||||||
|
validates :secrets, json_schema: { filename: 'build_metadata_secrets' }
|
||||||
|
|
||||||
serialize :config_options, Serializers::JSON # rubocop:disable Cop/ActiveRecordSerialize
|
serialize :config_options, Serializers::JSON # rubocop:disable Cop/ActiveRecordSerialize
|
||||||
serialize :config_variables, Serializers::JSON # rubocop:disable Cop/ActiveRecordSerialize
|
serialize :config_variables, Serializers::JSON # rubocop:disable Cop/ActiveRecordSerialize
|
||||||
|
@ -83,5 +84,3 @@ module Ci
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Ci::BuildMetadata.prepend_if_ee('EE::Ci::BuildMetadata')
|
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
class BugzillaService < IssueTrackerService
|
class BugzillaService < IssueTrackerService
|
||||||
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
|
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
|
||||||
|
|
||||||
def default_title
|
def title
|
||||||
'Bugzilla'
|
'Bugzilla'
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_description
|
def description
|
||||||
s_('IssueTracker|Bugzilla issue tracker')
|
s_('IssueTracker|Bugzilla issue tracker')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
class CustomIssueTrackerService < IssueTrackerService
|
class CustomIssueTrackerService < IssueTrackerService
|
||||||
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
|
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
|
||||||
|
|
||||||
def default_title
|
def title
|
||||||
'Custom Issue Tracker'
|
'Custom Issue Tracker'
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_description
|
def description
|
||||||
s_('IssueTracker|Custom issue tracker')
|
s_('IssueTracker|Custom issue tracker')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -17,8 +17,6 @@ class CustomIssueTrackerService < IssueTrackerService
|
||||||
|
|
||||||
def fields
|
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: 'project_url', placeholder: 'Project url', required: true },
|
||||||
{ type: 'text', name: 'issues_url', placeholder: 'Issue 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 }
|
{ type: 'text', name: 'new_issue_url', placeholder: 'New Issue url', required: true }
|
||||||
|
|
|
@ -7,11 +7,11 @@ class GitlabIssueTrackerService < IssueTrackerService
|
||||||
|
|
||||||
default_value_for :default, true
|
default_value_for :default, true
|
||||||
|
|
||||||
def default_title
|
def title
|
||||||
'GitLab'
|
'GitLab'
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_description
|
def description
|
||||||
s_('IssueTracker|GitLab issue tracker')
|
s_('IssueTracker|GitLab issue tracker')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -25,28 +25,6 @@ class IssueTrackerService < Service
|
||||||
end
|
end
|
||||||
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
|
def handle_properties
|
||||||
# this has been moved from initialize_properties and should be improved
|
# this has been moved from initialize_properties and should be improved
|
||||||
# as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
|
# as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
|
||||||
|
@ -54,13 +32,6 @@ class IssueTrackerService < Service
|
||||||
|
|
||||||
@legacy_properties_data = properties.dup
|
@legacy_properties_data = properties.dup
|
||||||
data_values = properties.slice!('title', 'description')
|
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.reject! { |key| data_fields.changed.include?(key) }
|
||||||
data_values.slice!(*data_fields.attributes.keys)
|
data_values.slice!(*data_fields.attributes.keys)
|
||||||
data_fields.assign_attributes(data_values) if data_values.present?
|
data_fields.assign_attributes(data_values) if data_values.present?
|
||||||
|
@ -102,7 +73,6 @@ class IssueTrackerService < Service
|
||||||
|
|
||||||
def fields
|
def fields
|
||||||
[
|
[
|
||||||
{ type: 'text', name: 'description', placeholder: description },
|
|
||||||
{ type: 'text', name: 'project_url', placeholder: 'Project url', required: true },
|
{ type: 'text', name: 'project_url', placeholder: 'Project url', required: true },
|
||||||
{ type: 'text', name: 'issues_url', placeholder: 'Issue 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 }
|
{ type: 'text', name: 'new_issue_url', placeholder: 'New Issue url', required: true }
|
||||||
|
@ -117,8 +87,6 @@ class IssueTrackerService < Service
|
||||||
def set_default_data
|
def set_default_data
|
||||||
return unless issues_tracker.present?
|
return unless issues_tracker.present?
|
||||||
|
|
||||||
self.title ||= issues_tracker['title']
|
|
||||||
|
|
||||||
# we don't want to override if we have set something
|
# we don't want to override if we have set something
|
||||||
return if project_url || issues_url || new_issue_url
|
return if project_url || issues_url || new_issue_url
|
||||||
|
|
||||||
|
|
|
@ -64,8 +64,6 @@ class JiraService < IssueTrackerService
|
||||||
def set_default_data
|
def set_default_data
|
||||||
return unless issues_tracker.present?
|
return unless issues_tracker.present?
|
||||||
|
|
||||||
self.title ||= issues_tracker['title']
|
|
||||||
|
|
||||||
return if url
|
return if url
|
||||||
|
|
||||||
data_fields.url ||= issues_tracker['url']
|
data_fields.url ||= issues_tracker['url']
|
||||||
|
@ -103,11 +101,11 @@ class JiraService < IssueTrackerService
|
||||||
[Jira service documentation](#{help_page_url('user/project/integrations/jira')})."
|
[Jira service documentation](#{help_page_url('user/project/integrations/jira')})."
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_title
|
def title
|
||||||
'Jira'
|
'Jira'
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_description
|
def description
|
||||||
s_('JiraService|Jira issue tracker')
|
s_('JiraService|Jira issue tracker')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
class RedmineService < IssueTrackerService
|
class RedmineService < IssueTrackerService
|
||||||
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
|
validates :project_url, :issues_url, :new_issue_url, presence: true, public_url: true, if: :activated?
|
||||||
|
|
||||||
def default_title
|
def title
|
||||||
'Redmine'
|
'Redmine'
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_description
|
def description
|
||||||
s_('IssueTracker|Redmine issue tracker')
|
s_('IssueTracker|Redmine issue tracker')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -12,11 +12,11 @@ class YoutrackService < IssueTrackerService
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_title
|
def title
|
||||||
'YouTrack'
|
'YouTrack'
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_description
|
def description
|
||||||
s_('IssueTracker|YouTrack issue tracker')
|
s_('IssueTracker|YouTrack issue tracker')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ class YoutrackService < IssueTrackerService
|
||||||
|
|
||||||
def fields
|
def fields
|
||||||
[
|
[
|
||||||
{ type: 'text', name: 'description', placeholder: description },
|
|
||||||
{ type: 'text', name: 'project_url', title: 'Project URL', placeholder: 'Project URL', required: true },
|
{ 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 }
|
{ type: 'text', name: 'issues_url', title: 'Issue URL', placeholder: 'Issue URL', required: true }
|
||||||
]
|
]
|
||||||
|
|
|
@ -7,6 +7,9 @@ class Service < ApplicationRecord
|
||||||
include Importable
|
include Importable
|
||||||
include ProjectServicesLoggable
|
include ProjectServicesLoggable
|
||||||
include DataFields
|
include DataFields
|
||||||
|
include IgnorableColumns
|
||||||
|
|
||||||
|
ignore_columns %i[title description], remove_with: '13.4', remove_after: '2020-09-22'
|
||||||
|
|
||||||
SERVICE_NAMES = %w[
|
SERVICE_NAMES = %w[
|
||||||
alerts asana assembla bamboo bugzilla buildkite campfire custom_issue_tracker discord
|
alerts asana assembla bamboo bugzilla buildkite campfire custom_issue_tracker discord
|
||||||
|
|
9
app/services/gpg_keys/destroy_service.rb
Normal file
9
app/services/gpg_keys/destroy_service.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# 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
|
class Base
|
||||||
include ProjectServicesLoggable
|
include ProjectServicesLoggable
|
||||||
|
|
||||||
PER_PAGE = 50
|
attr_reader :jira_service, :project, :query
|
||||||
|
|
||||||
attr_reader :jira_service, :project, :limit, :start_at, :query
|
def initialize(jira_service, query: nil)
|
||||||
|
|
||||||
def initialize(jira_service, limit: PER_PAGE, start_at: 0, query: nil)
|
|
||||||
@project = jira_service&.project
|
@project = jira_service&.project
|
||||||
@jira_service = jira_service
|
@jira_service = jira_service
|
||||||
|
@query = query
|
||||||
@limit = limit
|
|
||||||
@start_at = start_at
|
|
||||||
@query = query
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def execute
|
def execute
|
||||||
return ServiceResponse.error(message: _('Jira service not configured.')) unless jira_service&.active?
|
return ServiceResponse.error(message: _('Jira service not configured.')) unless jira_service&.active?
|
||||||
return ServiceResponse.success(payload: empty_payload) if limit.to_i <= 0
|
|
||||||
|
|
||||||
request
|
request
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,19 +9,24 @@ module Jira
|
||||||
|
|
||||||
override :url
|
override :url
|
||||||
def url
|
def url
|
||||||
'/rest/api/2/project/search?query=%{query}&maxResults=%{limit}&startAt=%{start_at}' %
|
'/rest/api/2/project'
|
||||||
{ query: CGI.escape(query.to_s), limit: limit.to_i, start_at: start_at.to_i }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
override :build_service_response
|
override :build_service_response
|
||||||
def build_service_response(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
|
end
|
||||||
|
|
||||||
def map_projects(response)
|
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
|
end
|
||||||
|
|
||||||
def empty_payload
|
def empty_payload
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Appearance"
|
- page_title _("Appearance")
|
||||||
- @content_class = "limit-container-width" unless fluid_layout
|
- @content_class = "limit-container-width" unless fluid_layout
|
||||||
|
|
||||||
= render 'form'
|
= render 'form'
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- add_to_breadcrumbs "Applications", admin_applications_path
|
- add_to_breadcrumbs _("Applications"), admin_applications_path
|
||||||
- breadcrumb_title @application.name
|
- breadcrumb_title @application.name
|
||||||
- page_title "Edit", @application.name, "Applications"
|
- page_title _("Edit"), @application.name, _("Applications")
|
||||||
|
|
||||||
%h3.page-title Edit application
|
%h3.page-title Edit application
|
||||||
- @url = admin_application_path(@application)
|
- @url = admin_application_path(@application)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Applications"
|
- page_title _("Applications")
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
System OAuth applications
|
System OAuth applications
|
||||||
%p.light
|
%p.light
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- breadcrumb_title "Applications"
|
- breadcrumb_title _("Applications")
|
||||||
- page_title "New Application"
|
- page_title _("New Application")
|
||||||
|
|
||||||
%h3.page-title New application
|
%h3.page-title New application
|
||||||
- @url = admin_applications_path
|
- @url = admin_applications_path
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title @application.name, "Applications"
|
- page_title @application.name, _("Applications")
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
Application: #{@application.name}
|
Application: #{@application.name}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Background Jobs"
|
- page_title _("Background Jobs")
|
||||||
|
|
||||||
%h3.page-title Background Jobs
|
%h3.page-title Background Jobs
|
||||||
%p.light GitLab uses #{link_to "sidekiq", "http://sidekiq.org/"} library for async job processing
|
%p.light GitLab uses #{link_to "sidekiq", "http://sidekiq.org/"} library for async job processing
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- breadcrumb_title "Messages"
|
- breadcrumb_title _("Messages")
|
||||||
- page_title "Broadcast Messages"
|
- page_title _("Broadcast Messages")
|
||||||
|
|
||||||
= render 'form'
|
= render 'form'
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- breadcrumb_title "Messages"
|
- breadcrumb_title _("Messages")
|
||||||
- page_title "Broadcast Messages"
|
- page_title _("Broadcast Messages")
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
Broadcast Messages
|
Broadcast Messages
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title "Dashboard"
|
- breadcrumb_title _("Dashboard")
|
||||||
|
- page_title _("Dashboard")
|
||||||
|
|
||||||
- if show_license_breakdown?
|
- if show_license_breakdown?
|
||||||
= render_if_exists 'admin/licenses/breakdown', license: @license
|
= render_if_exists 'admin/licenses/breakdown', license: @license
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title 'New Deploy Key'
|
- page_title _('New Deploy Key')
|
||||||
%h3.page-title New public deploy key
|
%h3.page-title New public deploy key
|
||||||
%hr
|
%hr
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title _("Gitaly Servers")
|
- breadcrumb_title _("Gitaly Servers")
|
||||||
|
- page_title _("Gitaly Servers")
|
||||||
|
|
||||||
%h3.page-title= _("Gitaly Servers")
|
%h3.page-title= _("Gitaly Servers")
|
||||||
%hr
|
%hr
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title 'Request details'
|
- page_title _('Request details')
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
Request details
|
Request details
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title "Jobs"
|
- breadcrumb_title _("Jobs")
|
||||||
|
- page_title _("Jobs")
|
||||||
|
|
||||||
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
|
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
|
||||||
- build_path_proc = ->(scope) { admin_jobs_path(scope: scope) }
|
- build_path_proc = ->(scope) { admin_jobs_path(scope: scope) }
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
- page_title @key.title, "Keys"
|
- page_title @key.title, _("Keys")
|
||||||
= render "profiles/keys/key_details", admin: true
|
= render "profiles/keys/key_details", admin: true
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- add_to_breadcrumbs "Projects", admin_projects_path
|
- add_to_breadcrumbs _("Projects"), admin_projects_path
|
||||||
- breadcrumb_title @project.full_name
|
- breadcrumb_title @project.full_name
|
||||||
- page_title @project.full_name, "Projects"
|
- page_title @project.full_name, _("Projects")
|
||||||
- @content_class = "admin-projects"
|
- @content_class = "admin-projects"
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title 'Requests Profiles'
|
- page_title _('Requests Profiles')
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
= page_title
|
= page_title
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title _('Runners')
|
- breadcrumb_title _('Runners')
|
||||||
|
- page_title _('Runners')
|
||||||
|
|
||||||
.row
|
.row
|
||||||
.col-sm-6
|
.col-sm-6
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
%span.runner-state.runner-state-specific
|
%span.runner-state.runner-state-specific
|
||||||
Specific
|
Specific
|
||||||
|
|
||||||
|
- page_title _("Runners")
|
||||||
- add_to_breadcrumbs _("Runners"), admin_runners_path
|
- add_to_breadcrumbs _("Runners"), admin_runners_path
|
||||||
- breadcrumb_title "##{@runner.id}"
|
- breadcrumb_title "##{@runner.id}"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- 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
|
- breadcrumb_title @service.title
|
||||||
- page_title @service.title, "Service Templates"
|
|
||||||
- @content_class = 'limit-container-width' unless fluid_layout
|
- @content_class = 'limit-container-width' unless fluid_layout
|
||||||
|
|
||||||
= render 'form'
|
= render 'form'
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Service Templates"
|
- page_title _("Service Templates")
|
||||||
%h3.page-title Service templates
|
%h3.page-title Service templates
|
||||||
%p.light= s_('AdminSettings|Service template allows you to set default values for integrations')
|
%p.light= s_('AdminSettings|Service template allows you to set default values for integrations')
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Spam Logs"
|
- page_title _("Spam Logs")
|
||||||
%h3.page-title Spam Logs
|
%h3.page-title Spam Logs
|
||||||
%hr
|
%hr
|
||||||
- if @spam_logs.present?
|
- if @spam_logs.present?
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Edit", @user.name, "Users"
|
- page_title _("Edit"), @user.name, _("Users")
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
Edit user: #{@user.name}
|
Edit user: #{@user.name}
|
||||||
%hr
|
%hr
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Users"
|
- page_title _("Users")
|
||||||
|
|
||||||
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
|
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
|
||||||
.fade-left
|
.fade-left
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- add_to_breadcrumbs "Users", admin_users_path
|
- add_to_breadcrumbs _("Users"), admin_users_path
|
||||||
- breadcrumb_title @user.name
|
- breadcrumb_title @user.name
|
||||||
- page_title "SSH Keys", @user.name, "Users"
|
- page_title _("SSH Keys"), @user.name, _("Users")
|
||||||
= render 'admin/users/head'
|
= render 'admin/users/head'
|
||||||
= render 'profiles/keys/key_table', admin: true
|
= render 'profiles/keys/key_table', admin: true
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "New User"
|
- page_title _("New User")
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
New user
|
New user
|
||||||
%hr
|
%hr
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- add_to_breadcrumbs "Users", admin_users_path
|
- add_to_breadcrumbs _("Users"), admin_users_path
|
||||||
- breadcrumb_title @user.name
|
- breadcrumb_title @user.name
|
||||||
- page_title "Groups and projects", @user.name, "Users"
|
- page_title _("Groups and projects"), @user.name, _("Users")
|
||||||
= render 'admin/users/head'
|
= render 'admin/users/head'
|
||||||
|
|
||||||
- if @user.groups.any?
|
- if @user.groups.any?
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- add_to_breadcrumbs "Users", admin_users_path
|
- add_to_breadcrumbs _("Users"), admin_users_path
|
||||||
- breadcrumb_title @user.name
|
- breadcrumb_title @user.name
|
||||||
- page_title @user.name, "Users"
|
- page_title @user.name, _("Users")
|
||||||
= render 'admin/users/head'
|
= render 'admin/users/head'
|
||||||
|
|
||||||
.row
|
.row
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
|
|
||||||
= render_dashboard_gold_trial(current_user)
|
= render_dashboard_gold_trial(current_user)
|
||||||
|
|
||||||
- page_title "Activity"
|
- page_title _("Activity")
|
||||||
- header_title "Activity", activity_dashboard_path
|
- header_title _("Activity"), activity_dashboard_path
|
||||||
|
|
||||||
= render "projects/last_push"
|
= render "projects/last_push"
|
||||||
= render 'dashboard/activity_head'
|
= render 'dashboard/activity_head'
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- @hide_top_links = true
|
- @hide_top_links = true
|
||||||
- page_title "Groups"
|
- page_title _("Groups")
|
||||||
- header_title "Groups", dashboard_groups_path
|
- header_title _("Groups"), dashboard_groups_path
|
||||||
|
|
||||||
= render_dashboard_gold_trial(current_user)
|
= render_dashboard_gold_trial(current_user)
|
||||||
= render 'dashboard/groups_head'
|
= render 'dashboard/groups_head'
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- @hide_top_links = true
|
- @hide_top_links = true
|
||||||
- page_title 'Milestones'
|
- page_title _('Milestones')
|
||||||
- header_title 'Milestones', dashboard_milestones_path
|
- header_title _('Milestones'), dashboard_milestones_path
|
||||||
|
|
||||||
.page-title-holder.d-flex.align-items-center
|
.page-title-holder.d-flex.align-items-center
|
||||||
%h1.page-title= _('Milestones')
|
%h1.page-title= _('Milestones')
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
|
|
||||||
= render_dashboard_gold_trial(current_user)
|
= render_dashboard_gold_trial(current_user)
|
||||||
|
|
||||||
- page_title "Projects"
|
- page_title _("Projects")
|
||||||
- header_title "Projects", dashboard_projects_path
|
- header_title _("Projects"), dashboard_projects_path
|
||||||
|
|
||||||
= render "projects/last_push"
|
= render "projects/last_push"
|
||||||
- if show_projects?(@projects, params)
|
- if show_projects?(@projects, params)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- @hide_top_links = true
|
- @hide_top_links = true
|
||||||
- page_title "Snippets"
|
- page_title _("Snippets")
|
||||||
- header_title "Snippets", dashboard_snippets_path
|
- header_title _("Snippets"), dashboard_snippets_path
|
||||||
- button_path = new_snippet_path if can?(current_user, :create_snippet)
|
- button_path = new_snippet_path if can?(current_user, :create_snippet)
|
||||||
|
|
||||||
= render 'dashboard/snippets_head'
|
= render 'dashboard/snippets_head'
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- @hide_top_links = true
|
- @hide_top_links = true
|
||||||
- page_title "To-Do List"
|
- page_title _("To-Do List")
|
||||||
- header_title "To-Do List", dashboard_todos_path
|
- header_title _("To-Do List"), dashboard_todos_path
|
||||||
|
|
||||||
= render_dashboard_gold_trial(current_user)
|
= render_dashboard_gold_trial(current_user)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Sign up"
|
- page_title _("Sign up")
|
||||||
- if experiment_enabled?(:signup_flow)
|
- if experiment_enabled?(:signup_flow)
|
||||||
.row
|
.row
|
||||||
.col-lg-7
|
.col-lg-7
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Sign in"
|
- page_title _("Sign in")
|
||||||
|
|
||||||
#signin-container
|
#signin-container
|
||||||
- if any_form_based_providers_enabled?
|
- if any_form_based_providers_enabled?
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- @hide_top_links = true
|
- @hide_top_links = true
|
||||||
- page_title "Snippets"
|
- page_title _("Snippets")
|
||||||
- header_title "Snippets", snippets_path
|
- header_title _("Snippets"), snippets_path
|
||||||
|
|
||||||
- if current_user
|
- if current_user
|
||||||
= render 'dashboard/snippets_head'
|
= render 'dashboard/snippets_head'
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
= content_for :meta_tags do
|
= content_for :meta_tags do
|
||||||
= auto_discovery_link_tag(:atom, group_url(@group, rss_url_options), title: "#{@group.name} activity")
|
= auto_discovery_link_tag(:atom, group_url(@group, rss_url_options), title: "#{@group.name} activity")
|
||||||
|
|
||||||
- page_title "Activity"
|
- page_title _("Activity")
|
||||||
|
|
||||||
%section.activities
|
%section.activities
|
||||||
= render 'activities'
|
= render 'activities'
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title _("General Settings")
|
- breadcrumb_title _("General Settings")
|
||||||
|
- page_title _("General Settings")
|
||||||
- @content_class = "limit-container-width" unless fluid_layout
|
- @content_class = "limit-container-width" unless fluid_layout
|
||||||
- expanded = expanded_by_default?
|
- expanded = expanded_by_default?
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- @can_bulk_update = can?(current_user, :admin_issue, @group) && @group.feature_available?(:group_bulk_edit)
|
- @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
|
= content_for :meta_tags do
|
||||||
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@group.name} issues")
|
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@group.name} issues")
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- add_to_breadcrumbs _("Labels"), group_labels_path(@group)
|
- add_to_breadcrumbs _("Labels"), group_labels_path(@group)
|
||||||
- breadcrumb_title _("Edit")
|
- breadcrumb_title _("Edit")
|
||||||
- page_title "Edit", @label.name, _("Labels")
|
- page_title _("Edit"), @label.name, _("Labels")
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
Edit Label
|
Edit Label
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title 'Labels'
|
- page_title _('Labels')
|
||||||
- can_admin_label = can?(current_user, :admin_label, @group)
|
- can_admin_label = can?(current_user, :admin_label, @group)
|
||||||
- search = params[:search]
|
- search = params[:search]
|
||||||
- subscribed = params[:subscribed]
|
- subscribed = params[:subscribed]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- @can_bulk_update = can?(current_user, :admin_merge_request, @group) && @group.feature_available?(:group_bulk_edit)
|
- @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?
|
- if group_merge_requests_count(state: 'all').zero?
|
||||||
= render 'shared/empty_states/merge_requests', project_select_button: true
|
= render 'shared/empty_states/merge_requests', project_select_button: true
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Milestones"
|
- page_title _("Milestones")
|
||||||
|
|
||||||
.top-area
|
.top-area
|
||||||
= render 'shared/milestones_filter', counts: @milestone_states
|
= render 'shared/milestones_filter', counts: @milestone_states
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title "Projects"
|
- breadcrumb_title _("Projects")
|
||||||
|
- page_title _("Projects")
|
||||||
|
|
||||||
.card.prepend-top-default
|
.card.prepend-top-default
|
||||||
.card-header
|
.card-header
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- breadcrumb_title "CI / CD Settings"
|
- breadcrumb_title _("CI / CD Settings")
|
||||||
- page_title "CI / CD"
|
- page_title _("CI / CD")
|
||||||
|
|
||||||
- expanded = expanded_by_default?
|
- expanded = expanded_by_default?
|
||||||
- general_expanded = @group.errors.empty? ? expanded : true
|
- general_expanded = @group.errors.empty? ? expanded : true
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title _("Details")
|
- breadcrumb_title _("Details")
|
||||||
|
- page_title _("Groups")
|
||||||
- @content_class = "limit-container-width" unless fluid_layout
|
- @content_class = "limit-container-width" unless fluid_layout
|
||||||
|
|
||||||
= content_for :meta_tags do
|
= content_for :meta_tags do
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title 'Instance Configuration'
|
- page_title _('Instance Configuration')
|
||||||
.documentation.md
|
.documentation.md
|
||||||
%h1 Instance Configuration
|
%h1 Instance Configuration
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- 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."
|
- 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 "
|
- link_classes = "flex-grow-1 mx-1 "
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- @body_class = 'ide-layout'
|
- @body_class = 'ide-layout'
|
||||||
- page_title 'IDE'
|
- page_title _('IDE')
|
||||||
|
|
||||||
- content_for :page_specific_javascripts do
|
- content_for :page_specific_javascripts do
|
||||||
= stylesheet_link_tag 'page_bundles/ide'
|
= stylesheet_link_tag 'page_bundles/ide'
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
- title = _('Bitbucket Server Import')
|
- title = _('Bitbucket Server Import')
|
||||||
- page_title title
|
- page_title title
|
||||||
- breadcrumb_title title
|
- breadcrumb_title title
|
||||||
- header_title "Projects", root_path
|
- header_title _("Projects"), root_path
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
= icon 'bitbucket-square', text: _('Import repositories from Bitbucket Server')
|
= icon 'bitbucket-square', text: _('Import repositories from Bitbucket Server')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- page_title 'Bitbucket Server import'
|
- page_title _('Bitbucket Server import')
|
||||||
- header_title 'Projects', root_path
|
- header_title _('Projects'), root_path
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
%i.fa.fa-bitbucket-square
|
%i.fa.fa-bitbucket-square
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- page_title "Manifest file import"
|
- page_title _("Manifest file import")
|
||||||
- header_title "Projects", root_path
|
- header_title _("Projects"), root_path
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
= _('Manifest file import')
|
= _('Manifest file import')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- page_title "Manifest import"
|
- page_title _("Manifest import")
|
||||||
- header_title "Projects", root_path
|
- header_title _("Projects"), root_path
|
||||||
- provider = 'manifest'
|
- provider = 'manifest'
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title _("Cohorts")
|
- breadcrumb_title _("Cohorts")
|
||||||
|
- page_title _("Cohorts")
|
||||||
|
|
||||||
- if @cohorts
|
- if @cohorts
|
||||||
= render 'cohorts_table'
|
= render 'cohorts_table'
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
%li= link_to _('New project'), new_project_path(namespace_id: @group.id)
|
%li= link_to _('New project'), new_project_path(namespace_id: @group.id)
|
||||||
- if create_group_subgroup
|
- if create_group_subgroup
|
||||||
%li= link_to _('New subgroup'), new_group_path(parent_id: @group.id)
|
%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.divider
|
||||||
%li.dropdown-bold-header GitLab
|
%li.dropdown-bold-header GitLab
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
- page_title _("Snippets")
|
||||||
- header_title _("Snippets"), snippets_path
|
- header_title _("Snippets"), snippets_path
|
||||||
- snippets_upload_path = snippets_upload_path(@snippet, current_user)
|
- snippets_upload_path = snippets_upload_path(@snippet, current_user)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
- breadcrumb_title s_("Profiles|Edit Profile")
|
- breadcrumb_title s_("Profiles|Edit Profile")
|
||||||
|
- page_title s_("Profiles|Edit Profile")
|
||||||
- @content_class = "limit-container-width" unless fluid_layout
|
- @content_class = "limit-container-width" unless fluid_layout
|
||||||
- gravatar_link = link_to Gitlab.config.gravatar.host, 'https://' + Gitlab.config.gravatar.host
|
- gravatar_link = link_to Gitlab.config.gravatar.host, 'https://' + Gitlab.config.gravatar.host
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- breadcrumb_title _('Artifacts')
|
- 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"
|
= render "projects/jobs/header"
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title @path, 'Artifacts', "#{@build.name} (##{@build.id})", 'Jobs'
|
- page_title @path, _('Artifacts'), "#{@build.name} (##{@build.id})", _('Jobs')
|
||||||
|
|
||||||
= render "projects/jobs/header"
|
= render "projects/jobs/header"
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Blame", @blob.path, @ref
|
- page_title _("Blame"), @blob.path, @ref
|
||||||
- link_icon = icon("link")
|
- link_icon = icon("link")
|
||||||
|
|
||||||
#blob-content-holder.tree-holder
|
#blob-content-holder.tree-holder
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- breadcrumb_title "Repository"
|
- breadcrumb_title _("Repository")
|
||||||
- page_title "Edit", @blob.path, @ref
|
- page_title _("Edit"), @blob.path, @ref
|
||||||
- unless Feature.enabled?(:monaco_blobs)
|
- unless Feature.enabled?(:monaco_blobs)
|
||||||
- content_for :page_specific_javascripts do
|
- content_for :page_specific_javascripts do
|
||||||
= page_specific_javascript_tag('lib/ace.js')
|
= page_specific_javascript_tag('lib/ace.js')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- breadcrumb_title "Repository"
|
- breadcrumb_title _("Repository")
|
||||||
- page_title "New File", @path.presence, @ref
|
- page_title _("New File"), @path.presence, @ref
|
||||||
- unless Feature.enabled?(:monaco_blobs)
|
- unless Feature.enabled?(:monaco_blobs)
|
||||||
- content_for :page_specific_javascripts do
|
- content_for :page_specific_javascripts do
|
||||||
= page_specific_javascript_tag('lib/ace.js')
|
= page_specific_javascript_tag('lib/ace.js')
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "New Branch"
|
- page_title _("New Branch")
|
||||||
- default_ref = params[:ref] || @project.default_branch
|
- default_ref = params[:ref] || @project.default_branch
|
||||||
|
|
||||||
- if @error
|
- if @error
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- breadcrumb_title "Compare Revisions"
|
- breadcrumb_title _("Compare Revisions")
|
||||||
- page_title "Compare"
|
- page_title _("Compare")
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
= _("Compare Git revisions")
|
= _("Compare Git revisions")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Value Stream Analytics"
|
- page_title _("Value Stream Analytics")
|
||||||
|
|
||||||
#cycle-analytics{ "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } }
|
#cycle-analytics{ "v-cloak" => "true", data: { request_path: project_cycle_analytics_path(@project) } }
|
||||||
- if @cycle_analytics_no_data
|
- if @cycle_analytics_no_data
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title 'Edit Deploy Key'
|
- page_title _('Edit Deploy Key')
|
||||||
%h3.page-title= _('Edit Deploy Key')
|
%h3.page-title= _('Edit Deploy Key')
|
||||||
%hr
|
%hr
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
- @content_class = "limit-container-width" unless fluid_layout
|
- @content_class = "limit-container-width" unless fluid_layout
|
||||||
- breadcrumb_title _("Details")
|
- breadcrumb_title _("Details")
|
||||||
|
- page_title _("Details")
|
||||||
|
|
||||||
= render partial: 'flash_messages', locals: { project: @project }
|
= render partial: 'flash_messages', locals: { project: @project }
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- 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)) }
|
.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
|
.nav-block
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Import repository"
|
- page_title _("Import repository")
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
Import repository
|
Import repository
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Edit", "#{@issue.title} (#{@issue.to_reference})", "Issues"
|
- page_title _("Edit"), "#{@issue.title} (#{@issue.to_reference})", _("Issues")
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
Edit Issue ##{@issue.iid}
|
Edit Issue ##{@issue.iid}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- @can_bulk_update = can?(current_user, :admin_issue, @project)
|
- @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')
|
- new_issue_email = @project.new_issuable_address(current_user, 'issue')
|
||||||
|
|
||||||
= content_for :meta_tags do
|
= content_for :meta_tags do
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Jobs"
|
- page_title _("Jobs")
|
||||||
|
|
||||||
.top-area
|
.top-area
|
||||||
- build_path_proc = ->(scope) { project_jobs_path(@project, scope: scope) }
|
- build_path_proc = ->(scope) { project_jobs_path(@project, scope: scope) }
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
- 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)
|
- add_to_breadcrumbs "##{@build.id}", project_job_path(@project, @build)
|
||||||
- breadcrumb_title 'Terminal'
|
- breadcrumb_title _('Terminal')
|
||||||
- page_title 'Terminal', "#{@build.name} (##{@build.id})", 'Jobs'
|
- page_title _('Terminal'), "#{@build.name} (##{@build.id})", _('Jobs')
|
||||||
|
|
||||||
- content_for :page_specific_javascripts do
|
- content_for :page_specific_javascripts do
|
||||||
= stylesheet_link_tag "xterm.css"
|
= stylesheet_link_tag "xterm.css"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- add_to_breadcrumbs "Labels", project_labels_path(@project)
|
- add_to_breadcrumbs _("Labels"), project_labels_path(@project)
|
||||||
- breadcrumb_title "Edit"
|
- breadcrumb_title _("Edit")
|
||||||
- page_title "Edit", @label.name, "Labels"
|
- page_title _("Edit"), @label.name, _("Labels")
|
||||||
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
Edit Label
|
Edit Label
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- page_title "Labels"
|
- page_title _("Labels")
|
||||||
- can_admin_label = can?(current_user, :admin_label, @project)
|
- can_admin_label = can?(current_user, :admin_label, @project)
|
||||||
- search = params[:search]
|
- search = params[:search]
|
||||||
- subscribed = params[:subscribed]
|
- subscribed = params[:subscribed]
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue