Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-09-20 12:10:46 +00:00
parent 742fcdb708
commit 1e62780b8c
223 changed files with 974 additions and 386 deletions

View File

@ -8772,6 +8772,10 @@ No changes.
- [Move export buttons next to each other](gitlab-org/gitlab@106bea7a6246cd153cf66d133936a09d46369ae3) ([merge request](gitlab-org/gitlab!137461))
## 16.6.10 (2024-09-20)
No changes.
## 16.6.9 (2024-07-23)
### Added (1 change)
@ -9421,6 +9425,10 @@ No changes.
- [Remove pubsub migration helper for actioncable](gitlab-org/gitlab@763ca1305db6f1c9cf6700b8497494a81926d742) ([merge request](gitlab-org/gitlab!133066))
- [Use partitioned table for CommitStatus](gitlab-org/gitlab@063826e042778995fae13928a2fb5de2c8855b45) ([merge request](gitlab-org/gitlab!134489))
## 16.5.10 (2024-09-20)
No changes.
## 16.5.9 (2024-07-23)
### Added (1 change)

View File

@ -1 +1 @@
9bfa8f596beb1e4bc81fa1e0f17e75eb1fc655c5
51d4445997817e7a637db4e5acbce16f991ccf8a

View File

@ -1 +1 @@
73ca3ba951fb8125308d5dcf467a67e2d6047ceb
ec645429780cc7695efd55bf28f14e4d317bbb6c

View File

@ -617,7 +617,7 @@
{"name":"rubocop-rspec","version":"2.27.1","platform":"ruby","checksum":"2f27ce04700be75db65afe83d7993a36e0fafd07ec062222f4b3cc10137a7a9e"},
{"name":"ruby-fogbugz","version":"0.3.0","platform":"ruby","checksum":"5e04cde474648f498a71cf1e1a7ab42c66b953862fbe224f793ec0a7a1d5f657"},
{"name":"ruby-lsp","version":"0.17.15","platform":"ruby","checksum":"c7c6f1dc793713bfefe2ed818ac3a5e4aae4a44c03978f7cc526b8c5002b7e57"},
{"name":"ruby-lsp-rails","version":"0.3.14","platform":"ruby","checksum":"71891e91acc3f00b86a4040b9cfa581777be4460090ffe64c06fef6ed28f3a92"},
{"name":"ruby-lsp-rails","version":"0.3.15","platform":"ruby","checksum":"415cbaa4c4c98b78aec4753b1d4ac332a1874a7727ff4c69cb28ebeb60f34e64"},
{"name":"ruby-lsp-rspec","version":"0.1.12","platform":"ruby","checksum":"34fe775e27dc4c2f31df901f3d44ee885ed0806b05ba9be0ea564682dd4811e5"},
{"name":"ruby-magic","version":"0.6.0","platform":"ruby","checksum":"7b2138877b7d23aff812c95564eba6473b74b815ef85beb0eb792e729a2b6101"},
{"name":"ruby-openai","version":"3.7.0","platform":"ruby","checksum":"fb735d4c055e282ade264cab9864944c05a8a10e0cddd45a0551e8a9851b1850"},

View File

@ -1652,7 +1652,7 @@ GEM
prism (>= 0.29.0, < 0.31)
rbs (>= 3, < 4)
sorbet-runtime (>= 0.5.10782)
ruby-lsp-rails (0.3.14)
ruby-lsp-rails (0.3.15)
ruby-lsp (>= 0.17.12, < 0.18.0)
ruby-lsp-rspec (0.1.12)
ruby-lsp (~> 0.17.0)

View File

@ -630,7 +630,7 @@
{"name":"rubocop-rspec","version":"2.27.1","platform":"ruby","checksum":"2f27ce04700be75db65afe83d7993a36e0fafd07ec062222f4b3cc10137a7a9e"},
{"name":"ruby-fogbugz","version":"0.3.0","platform":"ruby","checksum":"5e04cde474648f498a71cf1e1a7ab42c66b953862fbe224f793ec0a7a1d5f657"},
{"name":"ruby-lsp","version":"0.17.15","platform":"ruby","checksum":"c7c6f1dc793713bfefe2ed818ac3a5e4aae4a44c03978f7cc526b8c5002b7e57"},
{"name":"ruby-lsp-rails","version":"0.3.14","platform":"ruby","checksum":"71891e91acc3f00b86a4040b9cfa581777be4460090ffe64c06fef6ed28f3a92"},
{"name":"ruby-lsp-rails","version":"0.3.15","platform":"ruby","checksum":"415cbaa4c4c98b78aec4753b1d4ac332a1874a7727ff4c69cb28ebeb60f34e64"},
{"name":"ruby-lsp-rspec","version":"0.1.12","platform":"ruby","checksum":"34fe775e27dc4c2f31df901f3d44ee885ed0806b05ba9be0ea564682dd4811e5"},
{"name":"ruby-magic","version":"0.6.0","platform":"ruby","checksum":"7b2138877b7d23aff812c95564eba6473b74b815ef85beb0eb792e729a2b6101"},
{"name":"ruby-openai","version":"3.7.0","platform":"ruby","checksum":"fb735d4c055e282ade264cab9864944c05a8a10e0cddd45a0551e8a9851b1850"},

View File

@ -1678,7 +1678,7 @@ GEM
prism (>= 0.29.0, < 0.31)
rbs (>= 3, < 4)
sorbet-runtime (>= 0.5.10782)
ruby-lsp-rails (0.3.14)
ruby-lsp-rails (0.3.15)
ruby-lsp (>= 0.17.12, < 0.18.0)
ruby-lsp-rspec (0.1.12)
ruby-lsp (~> 0.17.0)

View File

@ -50,7 +50,7 @@ export default class VisualTokenValue {
tokenValueContainer.dataset.originalValue = tokenValue;
// eslint-disable-next-line no-unsanitized/property
tokenValueElement.innerHTML = `
<img class="avatar s20" src="${user.avatar_url}" alt="">
<img class="avatar s16 !gl-mr-2" src="${user.avatar_url}" alt="">
${escape(user.name)}
`;
/* eslint-enable no-param-reassign */

View File

@ -1,13 +1,15 @@
<script>
import { GlButton, GlSprintf, GlDisclosureDropdown } from '@gitlab/ui';
import { GlButton, GlLink, GlSprintf, GlDisclosureDropdown } from '@gitlab/ui';
import GITLAB_LOGO_SVG_URL from '@gitlab/svgs/dist/illustrations/gitlab_logo.svg?url';
import { s__ } from '~/locale';
import { joinPaths, stripRelativeUrlRootFromPath } from '~/lib/utils/url_utility';
import { helpPagePath } from '~/helpers/help_page_helper';
export default {
name: 'OAuthDomainMismatchError',
components: {
GlButton,
GlLink,
GlSprintf,
GlDisclosureDropdown,
},
@ -34,6 +36,11 @@ export default {
};
});
},
helpPageUrl() {
return helpPagePath('user/project/web_ide/index', {
anchor: 'update-the-oauth-callback-url',
});
},
},
gitlabLogo: GITLAB_LOGO_SVG_URL,
i18n: {
@ -49,7 +56,7 @@ export default {
),
expected: s__('IDE|Could not find a callback URL entry for %{expectedCallbackUrl}.'),
contact: s__(
'IDE|Contact your administrator or try to open the Web IDE again with another domain.',
'IDE|Contact your administrator or try to open the Web IDE again with another domain. %{linkStart}How can an administrator resolve the issue%{linkEnd}?',
),
},
};
@ -62,13 +69,19 @@ export default {
<p>
{{ $options.i18n.description }}
</p>
<gl-sprintf :message="$options.i18n.expected">
<template #expectedCallbackUrl>
<code>{{ expectedCallbackUrl }}</code>
</template>
</gl-sprintf>
<p>
{{ $options.i18n.contact }}
<gl-sprintf :message="$options.i18n.expected">
<template #expectedCallbackUrl>
<code>{{ expectedCallbackUrl }}</code>
</template>
</gl-sprintf>
</p>
<p>
<gl-sprintf :message="$options.i18n.contact">
<template #link="{ content }">
<gl-link :href="helpPageUrl">{{ content }}</gl-link>
</template>
</gl-sprintf>
</p>
<div class="gl-mt-6">
<gl-disclosure-dropdown

View File

@ -22,7 +22,7 @@ export const callRoleUpdateApi = async (member, role) => {
return axios.put(member.memberPath, {
[accessLevelProp]: role.accessLevel,
member_role_id: role.memberRoleId,
member_role_id: role.memberRoleId || null,
});
};

View File

@ -67,6 +67,7 @@ import {
} from '~/issues/list/constants';
import CiIcon from '~/vue_shared/components/ci_icon/ci_icon.vue';
import setSortPreferenceMutation from '~/issues/list/queries/set_sort_preference.mutation.graphql';
import issuableEventHub from '~/issues/list/eventhub';
import { i18n } from '../constants';
import getMergeRequestsQuery from '../queries/get_merge_requests.query.graphql';
import getMergeRequestsCountsQuery from '../queries/get_merge_requests_counts.query.graphql';
@ -115,6 +116,7 @@ export default {
'isSignedIn',
'newMergeRequestPath',
'releasesEndpoint',
'canBulkUpdate',
],
data() {
return {
@ -127,6 +129,7 @@ export default {
sortKey: CREATED_DESC,
state: STATUS_OPEN,
pageSize: DEFAULT_PAGE_SIZE,
showBulkEditSidebar: false,
};
},
apollo: {
@ -422,11 +425,20 @@ export default {
isOpenTab() {
return this.state === STATUS_OPEN;
},
isBulkEditButtonDisabled() {
return this.showBulkEditSidebar || !this.mergeRequests.length;
},
},
created() {
this.updateData(this.initialSort);
this.autocompleteCache = new AutocompleteCache();
},
mounted() {
issuableEventHub.$on('issuables:toggleBulkEdit', this.toggleBulkEditSidebar);
},
beforeDestroy() {
issuableEventHub.$off('issuables:toggleBulkEdit', this.toggleBulkEditSidebar);
},
methods: {
fetchBranches(search) {
return Api.branches(this.fullPath, search)
@ -560,6 +572,26 @@ export default {
mergeRequest.conflicts
);
},
toggleBulkEditSidebar(showBulkEditSidebar) {
this.showBulkEditSidebar = showBulkEditSidebar;
},
async handleBulkUpdateClick() {
if (!this.hasInitBulkEdit) {
const bulkUpdateSidebar = await import('~/issuable');
bulkUpdateSidebar.initBulkUpdateSidebar('issuable_');
this.hasInitBulkEdit = true;
}
issuableEventHub.$emit('issuables:enableBulkEdit');
},
handleUpdateLegacyBulkEdit() {
// If "select all" checkbox was checked, wait for all checkboxes
// to be checked before updating IssuableBulkUpdateSidebar class
this.$nextTick(() => {
issuableEventHub.$emit('issuables:updateBulkEdit');
});
},
},
STATUS_OPEN,
};
@ -587,14 +619,27 @@ export default {
use-keyset-pagination
:has-next-page="pageInfo.hasNextPage"
:has-previous-page="pageInfo.hasPreviousPage"
issuable-item-class="merge-request"
:show-bulk-edit-sidebar="showBulkEditSidebar"
@click-tab="handleClickTab"
@next-page="handleNextPage"
@previous-page="handlePreviousPage"
@sort="handleSort"
@filter="handleFilter"
@update-legacy-bulk-edit="handleUpdateLegacyBulkEdit"
>
<template #nav-actions>
<div class="gl-flex gl-gap-3">
<gl-button
v-if="canBulkUpdate"
class="gl-grow"
:disabled="isBulkEditButtonDisabled"
data-testid="bulk-edit"
@click="handleBulkUpdateClick"
>
{{ __('Bulk edit') }}
</gl-button>
<gl-button
v-if="newMergeRequestPath"
variant="confirm"

View File

@ -32,6 +32,7 @@ export async function mountMergeRequestListsApp() {
exportCsvPath,
rssUrl,
releasesEndpoint,
canBulkUpdate,
} = el.dataset;
return new Vue({
@ -61,6 +62,7 @@ export async function mountMergeRequestListsApp() {
exportCsvPath,
rssUrl,
releasesEndpoint,
canBulkUpdate: parseBoolean(canBulkUpdate),
},
render: (createComponent) => createComponent(MergeRequestsListApp),
});

View File

@ -48,5 +48,9 @@ fragment MergeRequestFragment on MergeRequest {
commitCount
sourceBranchExists
targetBranchExists
taskCompletionStatus {
completedCount
count
}
...MergeRequestApprovalFragment
}

View File

@ -245,10 +245,14 @@ export default {
return '';
},
handleIssuableItemClick(e) {
if (e.metaKey || e.ctrlKey || !this.preventRedirect || this.showCheckbox) {
if (e.metaKey || e.ctrlKey || this.showCheckbox) {
return;
}
e.preventDefault();
if (!this.preventRedirect) {
this.navigateToIssuable();
return;
}
this.$emit('select-issuable', {
iid: this.issuableIid,
webUrl: this.issuable.webUrl,
@ -276,6 +280,11 @@ export default {
visitUrl(this.issuableLinkHref);
}
},
handleRowClick(e) {
if (this.preventRedirect) {
this.handleIssuableItemClick(e);
}
},
},
};
</script>
@ -287,13 +296,13 @@ export default {
:class="{
closed: issuable.closedAt,
'gl-bg-blue-50': isActive,
'gl-cursor-pointer': preventRedirect,
'hover:gl-bg-subtle': preventRedirect && !isActive,
'gl-cursor-pointer': preventRedirect && !showCheckbox,
'hover:gl-bg-subtle': preventRedirect && !isActive && !showCheckbox,
}"
:data-labels="labelIdsString"
:data-qa-issue-id="issuableId"
data-testid="issuable-item-wrapper"
@click="handleIssuableItemClick"
@click="handleRowClick"
>
<gl-form-checkbox
v-if="showCheckbox"

View File

@ -185,20 +185,6 @@ $comparison-empty-state-height: 62px;
}
}
.limit-container-width {
.merge-request-tabs-container {
max-width: $limited-layout-width;
margin-left: auto;
margin-right: auto;
.inner-page-scroll-tabs {
background-color: var(--white, $white);
margin-left: -$gl-padding;
padding-left: $gl-padding;
}
}
}
.merge-request-tabs-container {
@include media-breakpoint-down(xs) {
.discussion-filter-container {
@ -248,12 +234,6 @@ $comparison-empty-state-height: 62px;
}
}
.limit-container-width:not(.container-limited) {
.merge-request-tabs-holder .merge-request-tabs-container {
max-width: $limited-layout-width - ($gl-padding * 2);
}
}
.fork-sprite {
margin-right: -5px;
}

View File

@ -247,7 +247,8 @@ module MergeRequestsHelper
email: current_user.present? ? current_user.notification_email_or_default : nil,
export_csv_path: export_csv_project_merge_requests_path(project, request.query_parameters),
rss_url: url_for(safe_params.merge(rss_url_options)),
releases_endpoint: project_releases_path(project, format: :json)
releases_endpoint: project_releases_path(project, format: :json),
can_bulk_update: can?(current_user, :admin_merge_request, project).to_s
}
end

View File

@ -18,7 +18,8 @@ module Ci
belongs_to :published_by, class_name: 'User'
has_many :components, class_name: 'Ci::Catalog::Resources::Component', inverse_of: :version
validates :release, :catalog_resource, :project, presence: true
validates :release, presence: true, uniqueness: { message: N_('has already been published') }
validates :catalog_resource, :project, presence: true
validates :published_by, presence: true, on: :create
validate :validate_published_by_is_release_author, on: :create

View File

@ -537,6 +537,7 @@ class ProjectPolicy < BasePolicy
enable :create_release
enable :update_release
enable :destroy_release
enable :publish_catalog_version
enable :read_alert_management_alert
enable :update_alert_management_alert
enable :read_terraform_state

View File

@ -13,5 +13,6 @@ class ReleasePolicy < BasePolicy
prevent :create_release
prevent :update_release
prevent :destroy_release
prevent :publish_catalog_version
end
end

View File

@ -4,22 +4,23 @@ module Ci
module Catalog
module Resources
class ReleaseService
def initialize(release, user, components_data)
def initialize(release, user, metadata)
@release = release
@user = user
@components_data = components_data
@metadata = metadata
@project = release.project
@errors = []
end
def execute
track_release_duration do
resource_version = track_release_duration do
check_access
validate_catalog_resource
create_version
end
if errors.empty?
ServiceResponse.success
ServiceResponse.success(payload: { version: resource_version })
else
ServiceResponse.error(message: errors.join(', '))
end
@ -27,7 +28,7 @@ module Ci
private
attr_reader :project, :errors, :release, :user, :components_data
attr_reader :project, :errors, :release, :user, :metadata
def track_release_duration
name = :gitlab_ci_catalog_release_duration_seconds
@ -37,13 +38,23 @@ module Ci
histogram = ::Gitlab::Metrics.histogram(name, comment, {}, buckets)
start_time = ::Gitlab::Metrics::System.monotonic_time
yield
result = yield
duration = ::Gitlab::Metrics::System.monotonic_time - start_time
histogram.observe({}, duration.seconds)
result
end
def check_access
return if Ability.allowed?(user, :publish_catalog_version, release)
errors << 'You are not authorized to publish a version to the CI/CD catalog'
end
def validate_catalog_resource
return if errors.present?
response = Ci::Catalog::Resources::ValidateService.new(project, release.sha).execute
return if response.success?
@ -53,10 +64,12 @@ module Ci
def create_version
return if errors.present?
response = Ci::Catalog::Resources::Versions::CreateService.new(release, user, components_data).execute
return if response.success?
response = Ci::Catalog::Resources::Versions::CreateService.new(release, user, metadata).execute
return response.payload[:version] if response.success?
errors << response.message
nil
end
end
end

View File

@ -71,7 +71,8 @@ module Ci
{
name: component_name,
spec: components_project.extract_spec(blob.data)
spec: components_project.extract_spec(blob.data),
component_type: 'template'
}
end
@ -88,6 +89,7 @@ module Ci
name: metadata[:name],
project: version.project,
spec: metadata[:spec],
resource_type: metadata[:component_type], # https://gitlab.com/gitlab-org/gitlab/-/issues/490377
version: version,
catalog_resource: version.catalog_resource,
created_at: Time.current
@ -96,6 +98,10 @@ module Ci
return component if component.valid?
error("Build component error: #{component.errors.full_messages.join(', ')}")
rescue ArgumentError => e
# In Rails 7.1, we'll have a better way to handle this error; https://github.com/rails/rails/pull/49100
# Ci::Catalog::Resources::Component: `enum resource_type: { template: 1 }, validate: true`
error(e.message)
end
def error(message)

View File

@ -5,11 +5,11 @@ module Ci
module Resources
module Versions
class CreateService
def initialize(release, user, components_data)
def initialize(release, user, metadata)
@release = release
@user = user
@project = release.project
@components_data = components_data
@metadata = metadata
@errors = []
end
@ -19,7 +19,7 @@ module Ci
publish(version)
if errors.empty?
ServiceResponse.success
ServiceResponse.success(payload: { version: version })
else
ServiceResponse.error(message: errors.flatten.first(10).join(', '))
end
@ -27,7 +27,7 @@ module Ci
private
attr_reader :project, :errors, :release, :user, :components_data
attr_reader :project, :errors, :release, :user, :metadata
def build_catalog_resource_version
return error('Project is not a catalog resource') unless project.catalog_resource
@ -48,7 +48,8 @@ module Ci
def build_components(version)
return if errors.present?
response = BuildComponentsService.new(release, version, components_data).execute
# metadata is passed as `nil` from the `Releases::CreateService`.
response = BuildComponentsService.new(release, version, metadata.try(:[], :components)).execute
if response.success?
version.components = response.payload

View File

@ -21,7 +21,7 @@
count: @applications.size,
options: { class: 'gl-mt-5', data: { testid: 'oauth-applications' } }) do |c|
- c.with_description do
- docs_link_path = help_page_path('integration/oauth_provider')
- docs_link_path = help_page_path('integration/oauth_provider.md')
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer nofollow">'.html_safe % { url: docs_link_path }
= s_('AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
- c.with_actions do

View File

@ -1,6 +1,6 @@
- page_title s_('BackgroundMigrations|Background migrations')
- @breadcrumb_link = admin_background_migrations_path(database: params[:database])
- learnmore_link = help_page_path('update/background_migrations')
- learnmore_link = help_page_path('update/background_migrations.md')
- learnmore_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: learnmore_link }
- page_description = html_escape(s_('BackgroundMigrations|Background migrations are used to perform data migrations when a migration exceeds the time limits set by GitLab. %{linkStart}Learn more%{linkEnd}')) % { linkStart: learnmore_link_start, linkEnd: '</a>'.html_safe }

View File

@ -1,6 +1,6 @@
- breadcrumb_title _("Dashboard")
- page_title _("Dashboard")
- billable_users_url = help_page_path('subscriptions/self_managed/index', anchor: 'billable-users')
- billable_users_url = help_page_path('subscriptions/self_managed/index.md', anchor: 'billable-users')
- billable_users_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer nofollow">'.html_safe % { url: billable_users_url }
= render_if_exists 'shared/manual_quarterly_reconciliation_banner'
@ -87,7 +87,7 @@
= feature_entry(_('LDAP'),
enabled: Gitlab.config.ldap.enabled,
doc_href: help_page_path('administration/auth/ldap/index'))
doc_href: help_page_path('administration/auth/ldap/index.md'))
= feature_entry(_('Gravatar'),
href: general_admin_application_settings_path(anchor: 'js-account-settings'),
@ -96,18 +96,18 @@
= feature_entry(_('OmniAuth'),
href: general_admin_application_settings_path(anchor: 'js-signin-settings'),
enabled: Gitlab::Auth.omniauth_enabled?,
doc_href: help_page_path('integration/omniauth'))
doc_href: help_page_path('integration/omniauth.md'))
= feature_entry(_('Reply by email'),
enabled: Gitlab::Email::IncomingEmail.enabled?,
doc_href: help_page_path('administration/reply_by_email'))
doc_href: help_page_path('administration/reply_by_email.md'))
= render_if_exists 'admin/dashboard/elastic_and_geo'
= feature_entry(_('Container Registry'),
href: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'),
enabled: Gitlab.config.registry.enabled,
doc_href: help_page_path('user/packages/container_registry/index'))
doc_href: help_page_path('user/packages/container_registry/index.md'))
= feature_entry(_('GitLab Pages'),
enabled: Gitlab.config.pages.enabled,

View File

@ -1,6 +1,6 @@
- service_ping_enabled = Gitlab::CurrentSettings.usage_ping_enabled
- if !service_ping_enabled
#js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/empty-state/empty-devops-md.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/internal_analytics/service_ping/index') } }
#js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/empty-state/empty-devops-md.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/internal_analytics/service_ping/index.md') } }
- else
#js-devops-score{ data: { devops_score_metrics: devops_score_metrics(@metric).to_json, no_data_image_path: image_path('illustrations/empty-state/empty-devops-md.svg'), devops_score_intro_image_path: image_path('illustrations/chart-bar-sm.svg') } }

View File

@ -4,7 +4,7 @@
- c.with_title { _('Naming, visibility') }
- c.with_description do
= _('Update your group name, description, avatar, and visibility.')
= link_to _('Learn more about groups.'), help_page_path('user/group/index')
= link_to _('Learn more about groups.'), help_page_path('user/group/index.md')
- c.with_body do
= render 'shared/groups/group_name_and_path_fields', f: f
= render 'shared/group_form_description', f: f

View File

@ -50,7 +50,7 @@
.gl-col-span-2
%strong
= group_lfs_status(@group)
= link_to sprite_icon('question-o', css_class: 'gl-text-blue-600'), help_page_path('topics/git/lfs/index')
= link_to sprite_icon('question-o', css_class: 'gl-text-blue-600'), help_page_path('topics/git/lfs/index.md')
= render_if_exists 'namespaces/shared_runner_status', namespace: @group
= render_if_exists 'namespaces/additional_minutes_status', namespace: @group
@ -98,7 +98,7 @@
icon: 'user',
count: @group.users_count) do |c|
- c.with_description do
- direct_members_link = link_to('', help_page_path('user/project/members/index', anchor: 'membership-types'))
- direct_members_link = link_to('', help_page_path('user/project/members/index.md', anchor: 'membership-types'))
- direct_members_message = s_('The number of direct members in the current group. Members in subgroups are not included. %{link_start}What is a direct member%{link_end}?')
- if @group.root?
= safe_format(direct_members_message, tag_pair(direct_members_link, :link_start, :link_end))

View File

@ -13,7 +13,7 @@
= _("Reset token")
- help_url = help_page_path('administration/monitoring/health_check')
- help_url = help_page_path('administration/monitoring/health_check.md')
- help_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_url }
%p.gl-mb-1= html_escape(s_('HealthCheck|Health information can be retrieved from the following endpoints. More information is available in the %{linkStart}health check documentation%{linkEnd}.')) % { linkStart: help_start, linkEnd: '</a>'.html_safe }
%ul.gl-mb-6

View File

@ -106,7 +106,7 @@
= _('Git LFS status:')
%strong
= project_lfs_status(@project)
= link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index')
= link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index.md')
- else
%li{ class: '!gl-px-5' }
%span.light
@ -160,7 +160,7 @@
- else
= _("This repository was last checked %{last_check_timestamp}. The check passed.") % { last_check_timestamp: @project.last_repository_check_at.to_fs(:medium) }
= link_to sprite_icon('question-o'), help_page_path('administration/repository_checks')
= link_to sprite_icon('question-o'), help_page_path('administration/repository_checks.md')
.form-group
= f.submit _('Trigger repository check'), pajamas_button: true

View File

@ -19,7 +19,7 @@
.form-group
= f.label :description, _("Description")
.js-markdown-editor{ data: { render_markdown_path: preview_markdown_admin_topics_path,
markdown_docs_path: help_page_path('user/markdown'),
markdown_docs_path: help_page_path('user/markdown.md'),
testid: 'topic-form-description',
form_field_placeholder: _('Write a description…'),
supports_quick_actions: 'false',

View File

@ -6,7 +6,7 @@
primary_button_text: s_("KubernetesDashboard|View projects"),
primary_button_link: dashboard_projects_path,
secondary_button_text: s_("KubernetesDashboard|Learn more"),
secondary_button_link: help_page_path('ci/environments/kubernetes_dashboard')) do |c|
secondary_button_link: help_page_path('ci/environments/kubernetes_dashboard.md')) do |c|
- c.with_description do
= s_("KubernetesDashboard|You can select an agent from a project's environment page.")

View File

@ -30,7 +30,7 @@
selected: @cluster.management_project_id } }
%p.text-muted.-gl-mt-5
= html_escape(s_('ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
= link_to _('More information'), help_page_path('user/clusters/management_project'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('More information'), help_page_path('user/clusters/management_project.md'), target: '_blank', rel: 'noopener noreferrer'
= field.submit _('Save changes'), pajamas_button: true
.sub-section.form-group

View File

@ -2,6 +2,6 @@
- c.with_body do
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe
- issue_link_start = link_start % { url: 'https://gitlab.com/gitlab-org/configure/general/-/issues/199' }
- docs_link_start = link_start % { url: help_page_path('user/clusters/agent/index') }
- docs_link_start = link_start % { url: help_page_path('user/clusters/agent/index.md') }
- link_end = '</a>'.html_safe
= s_('ClusterIntegration|This process is %{issue_link_start}deprecated%{issue_link_end}. Use the %{docs_link_start}the GitLab agent for Kubernetes%{docs_link_end} instead.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end, issue_link_start: issue_link_start, issue_link_end: link_end }

View File

@ -1,4 +1,4 @@
- autodevops_help_url = help_page_path('topics/autodevops/multiple_clusters_auto_devops')
- autodevops_help_url = help_page_path('topics/autodevops/multiple_clusters_auto_devops.md')
- help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe
- help_link_end = '</a>'.html_safe

View File

@ -1,6 +1,6 @@
- managed_namespace_help_text = s_('ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
- non_managed_namespace_help_text = s_('ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals.')
- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer'
- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer'
.js-namespace-prefixed
.form-group

View File

@ -51,7 +51,7 @@
= field.label :managed, s_('ClusterIntegration|GitLab-managed cluster'), class: 'form-check-label label-bold'
.form-text.text-muted
= s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.')
= link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer'
.form-group
.form-check
@ -59,7 +59,7 @@
= field.label :namespace_per_environment, s_('ClusterIntegration|Namespace per environment'), class: 'form-check-label label-bold'
.form-text.text-muted
= s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
= link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer'
- if cluster.allow_user_defined_namespace?
= render('clusters/clusters/namespace', platform_field: platform_field, field: field)

View File

@ -2,9 +2,9 @@
- eks_label = s_('ClusterIntegration|Amazon EKS')
- civo_label = s_('ClusterIntegration|Civo Kubernetes')
- create_cluster_label = s_('ClusterIntegration|Where do you want to create a cluster?')
- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster')
- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster')
- civo_help_path = help_page_path('user/infrastructure/clusters/connect/new_civo_cluster')
- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster.md')
- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster.md')
- civo_help_path = help_page_path('user/infrastructure/clusters/connect/new_civo_cluster.md')
.gl-py-5.md:gl-pl-5.md:gl-pr-5
%h4.gl-mb-5

View File

@ -12,10 +12,10 @@
cluster_status: @cluster.status_name,
cluster_status_reason: @cluster.status_reason,
provider_type: @cluster.provider_type,
help_path: help_page_path('user/infrastructure/clusters/index'),
environments_help_path: help_page_path('ci/environments/index', anchor: 'create-a-static-environment'),
clusters_help_path: help_page_path('user/project/clusters/deploy_to_cluster'),
deploy_boards_help_path: help_page_path('user/project/deploy_boards', anchor: 'enabling-deploy-boards'),
help_path: help_page_path('user/infrastructure/clusters/index.md'),
environments_help_path: help_page_path('ci/environments/index.md', anchor: 'create-a-static-environment'),
clusters_help_path: help_page_path('user/project/clusters/deploy_to_cluster.md'),
deploy_boards_help_path: help_page_path('user/project/deploy_boards.md', anchor: 'enabling-deploy-boards'),
cluster_id: @cluster.id } }
.js-cluster-application-notice

View File

@ -1,5 +1,5 @@
- more_info_link = link_to _('Learn more.'), help_page_path('user/project/clusters/add_existing_cluster'), target: '_blank', rel: 'noopener noreferrer'
- rbac_help_link = link_to _('Learn more.'), help_page_path('user/project/clusters/cluster_access'), target: '_blank', rel: 'noopener noreferrer'
- more_info_link = link_to _('Learn more.'), help_page_path('user/project/clusters/add_existing_cluster.md'), target: '_blank', rel: 'noopener noreferrer'
- rbac_help_link = link_to _('Learn more.'), help_page_path('user/project/clusters/cluster_access.md'), target: '_blank', rel: 'noopener noreferrer'
- api_url_help_text = s_('ClusterIntegration|The URL used to access the Kubernetes API.')
- ca_cert_help_text = s_('ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster.')
@ -58,7 +58,7 @@
= field.label :managed, s_('ClusterIntegration|GitLab-managed cluster'), class: 'form-check-label label-bold'
.form-text.text-muted
= s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.')
= link_to _('Learn more.'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more.'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer'
.form-group
.form-check
@ -66,7 +66,7 @@
= field.label :namespace_per_environment, s_('ClusterIntegration|Namespace per environment'), class: 'form-check-label label-bold'
.form-text.text-muted
= s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
= link_to _('Learn more.'), help_page_path('user/project/clusters/deploy_to_cluster', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more.'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer'
= field.fields_for :platform_kubernetes, @user_cluster.platform_kubernetes do |platform_kubernetes_field|
- if @user_cluster.allow_user_defined_namespace?

View File

@ -107,7 +107,7 @@
%p
= (s_("Todos|Not sure where to go next? Take a look at your %{strongStart}%{assignedIssuesLinkStart}assigned issues%{assignedIssuesLinkEnd}%{strongEnd} or %{strongStart}%{mergeRequestLinkStart}merge requests%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}.") % { strongStart: '<strong>', strongEnd: '</strong>', assignedIssuesLinkStart: "<a href=\"#{issues_dashboard_path(assignee_username: current_user.username)}\">", assignedIssuesLinkEnd: '</a>', mergeRequestLinkStart: "<a href=\"#{merge_requests_dashboard_path(assignee_username: current_user.username)}\">", mergeRequestLinkEnd: '</a>' }).html_safe
%p
= link_to s_("Todos| What actions create to-do items?"), help_page_path('user/todos', anchor: 'actions-that-create-to-do-items'), target: '_blank', rel: 'noopener noreferrer'
= link_to s_("Todos| What actions create to-do items?"), help_page_path('user/todos.md', anchor: 'actions-that-create-to-do-items'), target: '_blank', rel: 'noopener noreferrer'
- elsif todos_has_filtered_results?
%p

View File

@ -9,7 +9,7 @@
%h1.page-title.gl-text-size-h-display= page_title
%p
= _("Below you will find all the groups that are public or internal. Contribute by requesting to join a group.")
#{link_to _('Learn more'), help_page_path('user/group/index', { anchor: 'view-groups' })}.
#{link_to _('Learn more'), help_page_path('user/group/index.md', { anchor: 'view-groups' })}.
.page-title-controls.gl-mt-4
- if current_user&.can_create_group?
= render Pajamas::ButtonComponent.new(href: new_group_path, variant: :confirm) do

View File

@ -4,7 +4,7 @@
= f.gitlab_ui_checkbox_component :lfs_enabled, checkbox_options: { checked: @group.lfs_enabled? } do |c|
- c.with_label do
= _('Projects in this group can use Git LFS')
= link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index'), class: 'gl-ml-2'
= link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index.md'), class: 'gl-ml-2'
- c.with_help_text do
= _('This setting can be overridden in each project.')
.form-group.gl-form-group{ role: 'group' }
@ -20,7 +20,7 @@
%legend.col-form-label.col-form-label
= _('Two-factor authentication')
- label = _("All users in this group must set up two-factor authentication")
- help_link = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication', anchor: 'enforce-2fa-for-all-users-in-a-group'), class: 'gl-ml-2'
- help_link = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication.md', anchor: 'enforce-2fa-for-all-users-in-a-group'), class: 'gl-ml-2'
= f.gitlab_ui_checkbox_component :require_two_factor_authentication, '%{label}%{help_link}'.html_safe % { label: label, help_link: help_link }
.form-group.gl-form-group{ role: 'group' }

View File

@ -17,7 +17,7 @@
- if current_user.admin?
= render Pajamas::ButtonComponent.new(href: [:admin, @group], icon: 'admin', button_options: { title: _('View group in admin area'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } })
- if @notification_setting
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), group_id: @group.id, container_class: 'gl-align-top' } }
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications.md'), group_id: @group.id, container_class: 'gl-align-top' } }
- if can_create_subgroups
.sm:gl-w-auto.gl-w-full
= render Pajamas::ButtonComponent.new(href: new_group_path(parent_id: @group.id, anchor: 'create-group-pane'), button_options: { data: { testid: 'new-subgroup-button' }, class: 'sm:gl-w-auto gl-w-full'}) do

View File

@ -25,11 +25,11 @@
= render Pajamas::AlertComponent.new(dismissible: false,
variant: :warning) do |c|
- c.with_body do
- docs_link = link_to('', help_page_path('user/group/import/migrated_items', anchor: 'migrated-group-items'), target: '_blank', rel: 'noopener noreferrer')
- docs_link = link_to('', help_page_path('user/group/import/migrated_items.md', anchor: 'migrated-group-items'), target: '_blank', rel: 'noopener noreferrer')
= safe_format(s_('GroupsNew|Not all group items are migrated. %{docs_link_start}What items are migrated%{docs_link_end}?'), tag_pair(docs_link, :docs_link_start, :docs_link_end))
%p.gl-mt-5.gl-mb-3
- url_link = link_to('', help_page_path('user/group/import/direct_transfer_migrations', anchor: 'connect-the-source-gitlab-instance'), target: '_blank', rel: 'noopener noreferrer')
- url_link = link_to('', help_page_path('user/group/import/direct_transfer_migrations.md', anchor: 'connect-the-source-gitlab-instance'), target: '_blank', rel: 'noopener noreferrer')
= safe_format(s_('GroupsNew|Provide credentials for the %{url_link_start}source instance%{url_link_end} to import from. You can provide this instance as a source to move groups within this instance.'), tag_pair(url_link, :url_link_start, :url_link_end))
.form-group.gl-form-group.gl-flex.gl-flex-col
= f.label :bulk_import_gitlab_url, s_('GroupsNew|GitLab source instance base URL'), for: 'import_gitlab_url'
@ -43,8 +43,8 @@
.form-group.gl-form-group.gl-flex.gl-flex-col
= f.label :bulk_import_gitlab_access_token, s_('GroupsNew|Personal access token'), for: 'import_gitlab_token', class: 'col-form-label'
.gl-font-normal
- pat_link = link_to('', help_page_path('user/profile/personal_access_tokens'), target: '_blank')
- short_living_link = link_to('', help_page_path('security/tokens/index', anchor: 'security-considerations'), target: '_blank')
- pat_link = link_to('', help_page_path('user/profile/personal_access_tokens.md'), target: '_blank')
- short_living_link = link_to('', help_page_path('security/tokens/index.md', anchor: 'security-considerations'), target: '_blank')
= safe_format(s_('GroupsNew|Create a token with %{code_start}api%{code_end} and %{code_start}read_repository%{code_end} scopes in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, set a short expiration date for the token. Keep in mind that large migrations take more time.'), tag_pair('<code></code>'.html_safe, :code_start , :code_end), tag_pair(pat_link, :pat_link_start, :pat_link_end), tag_pair(short_living_link, :short_living_link_start, :short_living_link_end))
= f.password_field :bulk_import_gitlab_access_token, placeholder: s_('GroupsNew|e.g. h8d3f016698e...'), class: 'gl-form-input gl-mt-3 col-xs-12 col-sm-8',
required: true,

View File

@ -10,14 +10,14 @@
alert_options: { class: 'gl-mb-5' },
dismissible: false) do |c|
- c.with_body do
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/import/index') }
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/import/index.md') }
- link_end = '</a>'.html_safe
= s_('GroupsNew|This feature is deprecated and replaced by group migration by direct transfer. %{docs_link_start}Learn more%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end }
= render 'shared/groups/group_name_and_path_fields', f: f
.form-group
= f.label :file, s_('GroupsNew|Upload file')
.gl-font-normal
- import_export_link_start = '<a href="%{url}" target="_blank">'.html_safe % { url: help_page_path('user/project/settings/import_export', anchor: 'migrate-groups-by-uploading-an-export-file-deprecated') }
- import_export_link_start = '<a href="%{url}" target="_blank">'.html_safe % { url: help_page_path('user/project/settings/import_export.md', anchor: 'migrate-groups-by-uploading-an-export-file-deprecated') }
= s_('GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here.').html_safe % { link_start: import_export_link_start, link_end: '</a>'.html_safe }
.gl-mt-3
= render 'shared/file_picker_button', f: f, field: :file, help_text: nil

View File

@ -3,4 +3,4 @@
.js-invite-members-modal{ data: { is_project: 'false',
access_levels: access_level_roles_user_can_assign(group, group.access_level_roles).to_json,
reload_page_on_submit: current_path?('group_members#index').to_s,
help_link: help_page_url('user/permissions') }.merge(common_invite_modal_dataset(group)).merge(users_filter_data(group)) }
help_link: help_page_url('user/permissions.md') }.merge(common_invite_modal_dataset(group)).merge(users_filter_data(group)) }

View File

@ -9,7 +9,7 @@
= _('Visibility level')
%p
= _('Who will be able to see this group?')
= link_to _('View the documentation'), help_page_path("user/public_access"), target: '_blank', rel: 'noopener noreferrer'
= link_to _('View the documentation'), help_page_path("user/public_access.md"), target: '_blank', rel: 'noopener noreferrer'
= render 'shared/visibility_level', f: f, visibility_level: default_group_visibility, can_change_visibility_level: true, form_model: @group, with_label: false
- unless parent

View File

@ -14,7 +14,7 @@
expanded: true) do |c|
- c.with_description do
= _('Update your group name, description, avatar, and visibility.')
= link_to _('Learn more about groups.'), help_page_path('user/group/index')
= link_to _('Learn more about groups.'), help_page_path('user/group/index.md')
- c.with_body do
= render 'groups/settings/general'
@ -39,7 +39,7 @@
expanded: expanded) do |c|
- c.with_description do
= s_('GroupSettings|Customize this group\'s badges.')
= link_to s_('GroupSettings|What are badges?'), help_page_path('user/project/badges')
= link_to s_('GroupSettings|What are badges?'), help_page_path('user/project/badges.md')
- c.with_body do
= render 'shared/badges/badge_settings'

View File

@ -12,7 +12,7 @@
= f.label :description, _("Description")
- @gfm_form = true
.js-markdown-editor{ data: { render_markdown_path: group_preview_markdown_path,
markdown_docs_path: help_page_path('user/markdown'),
markdown_docs_path: help_page_path('user/markdown.md'),
testid: 'milestone-description-field',
form_field_placeholder: _('Write milestone description...'),
supports_quick_actions: 'false',

View File

@ -12,7 +12,7 @@
= render Pajamas::ButtonComponent.new(href: new_group_milestone_path(@group), variant: :confirm, button_options: { data: { testid: "new-group-milestone-link" }, class: "gl-ml-3" }) do
= _('New milestone')
- if @milestones.blank?
= render 'shared/empty_states/milestones_tab', learn_more_path: help_page_path('user/project/milestones/index') do
= render 'shared/empty_states/milestones_tab', learn_more_path: help_page_path('user/project/milestones/index.md') do
- if can?(current_user, :admin_milestone, @group)
= render Pajamas::ButtonComponent.new(href: new_group_milestone_path(@group), variant: :confirm, button_options: { data: { testid: "new-group-milestone-link" }}) do
= _('New milestone')
@ -27,7 +27,7 @@
= render 'milestone', milestone: milestone
= paginate @milestones, theme: "gitlab"
- else
= render 'shared/empty_states/milestones', learn_more_path: help_page_path('user/project/milestones/index') do
= render 'shared/empty_states/milestones', learn_more_path: help_page_path('user/project/milestones/index.md') do
- if can?(current_user, :admin_milestone, @group)
= render Pajamas::ButtonComponent.new(href: new_group_milestone_path(@group), variant: :confirm, button_options: { data: { testid: "new-group-milestone-link" }}) do
= _('New milestone')

View File

@ -3,14 +3,14 @@
%section
#js-container-registry{ data: { endpoint: group_container_registries_path(@group),
"help_page_path" => help_page_path('user/packages/container_registry/index'),
"two_factor_auth_help_link" => help_page_path('user/profile/account/two_factor_authentication'),
"personal_access_tokens_help_link" => help_page_path('user/profile/personal_access_tokens'),
"help_page_path" => help_page_path('user/packages/container_registry/index.md'),
"two_factor_auth_help_link" => help_page_path('user/profile/account/two_factor_authentication.md'),
"personal_access_tokens_help_link" => help_page_path('user/profile/personal_access_tokens.md'),
"no_containers_image" => image_path('illustrations/docker-empty-state.svg'),
"containers_error_image" => image_path('illustrations/docker-error-state.svg'),
"registry_host_url_with_port" => escape_once(registry_config.host_port),
"garbage_collection_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'container-registry-garbage-collection'),
"run_cleanup_policies_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'run-the-cleanup-policy-now'),
"garbage_collection_help_page_path" => help_page_path('administration/packages/container_registry.md', anchor: 'container-registry-garbage-collection'),
"run_cleanup_policies_help_page_path" => help_page_path('administration/packages/container_registry.md', anchor: 'run-the-cleanup-policy-now'),
"is_admin": current_user&.admin.to_s,
is_group_page: "true",
"group_path": @group.full_path,

View File

@ -9,7 +9,7 @@
%h4.gl-text-base.gl-leading-24.gl-m-0= s_('GroupSettings|Change group URL')
%p.gl-text-subtle.gl-text-sm.gl-m-0
= s_("GroupSettings|Changing a group's URL can have unintended side effects.")
#{link_to _('Learn more'), help_page_path('user/group/manage', anchor: 'change-a-groups-path'), target: '_blank', rel: 'noopener noreferrer'}.
#{link_to _('Learn more'), help_page_path('user/group/manage.md', anchor: 'change-a-groups-path'), target: '_blank', rel: 'noopener noreferrer'}.
- c.with_body do
= gitlab_ui_form_for @group, html: { multipart: true, class: 'gl-show-field-errors' }, authenticity_token: true do |f|

View File

@ -10,7 +10,7 @@
- c.with_body do
= render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_options: { class: 'gl-mb-4' }) do |c|
- c.with_body do
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/import/index') }
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/import/index.md') }
- docs_link_end = '</a>'.html_safe
= s_('GroupsNew|This feature is deprecated and replaced by group migration by direct transfer. %{docs_link_start}Learn more%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: docs_link_end }
%p

View File

@ -1,4 +1,4 @@
- docs_link_url = help_page_path('topics/git/lfs/index')
- docs_link_url = help_page_path('topics/git/lfs/index.md')
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
%h5= _('Large File Storage')

View File

@ -3,6 +3,6 @@
- if group.linked_to_subscription?
= render Pajamas::AlertComponent.new(variant: :tip, dismissible: false, alert_options: { class: 'gl-mb-5', data: { testid: 'group-has-linked-subscription-alert' }}) do |c|
- c.with_body do
= html_escape(_("This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/gitlab_com/index', anchor: 'change-the-linked-group')}\">".html_safe, linkEnd: '</a>'.html_safe }
= html_escape(_("This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/gitlab_com/index.md', anchor: 'change-the-linked-group')}\">".html_safe, linkEnd: '</a>'.html_safe }
.js-confirm-danger{ data: group_confirm_modal_data(group: group, remove_form_id: remove_form_id) }

View File

@ -11,7 +11,7 @@
- c.with_body do
= form_for group, url: transfer_group_path(group), method: :put, html: { id: form_id, class: 'js-group-transfer-form' } do |f|
%ul
- learn_more_link = help_page_url('user/project/repository/index', anchor: 'repository-path-changes')
- learn_more_link = help_page_url('user/project/repository/index.md', anchor: 'repository-path-changes')
- learn_more_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: learn_more_link }
- warning_text = s_("GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}") % { learn_more_link_start: learn_more_link_start, learn_more_link_end: '</a>'.html_safe }
%li= warning_text.html_safe
@ -21,5 +21,5 @@
- if group.paid?
= render Pajamas::AlertComponent.new(variant: :tip, dismissible: false, alert_options: { class: 'gl-mb-5' }) do |c|
- c.with_body do
= html_escape(_("This group can't be transferred because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/gitlab_com/index', anchor: 'change-the-linked-group')}\">".html_safe, linkEnd: '</a>'.html_safe }
= html_escape(_("This group can't be transferred because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/gitlab_com/index.md', anchor: 'change-the-linked-group')}\">".html_safe, linkEnd: '</a>'.html_safe }
.js-transfer-group-form{ data: initial_data }

View File

@ -4,7 +4,7 @@
.form-group
= render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-3' }) do |c|
- c.with_body do
- learn_more_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index'), target: '_blank', rel: 'noopener noreferrer'
- learn_more_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer'
- help_text = s_('GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found.')
- badge = gl_badge_tag badge_for_auto_devops_scope(group), variant: :info
- label = s_('GroupSettings|Default to Auto DevOps pipeline for all projects within this group')

View File

@ -7,5 +7,5 @@
= f.number_field :max_artifacts_size, class: 'form-control'
%p.form-text.text-muted
= _("The maximum file size in megabytes for individual job artifacts.")
= link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration.md', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer'
= f.submit _('Save changes'), pajamas_button: true

View File

@ -42,8 +42,8 @@
id: 'auto-devops-settings',
expanded: expanded) do |c|
- c.with_description do
- auto_devops_url = help_page_path('topics/autodevops/index')
- quickstart_url = help_page_path('topics/autodevops/cloud_deployments/auto_devops_with_gke')
- auto_devops_url = help_page_path('topics/autodevops/index.md')
- quickstart_url = help_page_path('topics/autodevops/cloud_deployments/auto_devops_with_gke.md')
- auto_devops_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: auto_devops_url }
- quickstart_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: quickstart_url }
= html_escape(s_('AutoDevOps|%{auto_devops_start}Automate building, testing, and deploying%{auto_devops_end} your applications based on your continuous integration and delivery configuration. %{quickstart_start}How do I get started?%{quickstart_end}')) % { auto_devops_start: auto_devops_start, auto_devops_end: '</a>'.html_safe, quickstart_start: quickstart_start, quickstart_end: '</a>'.html_safe }

View File

@ -13,7 +13,7 @@
- c.with_body do
= pending_reassignment_presenter.body
- c.with_actions do
= render Pajamas::ButtonComponent.new(variant: :default, href: help_page_path('user/project/import/index', anchor: 'placeholder-users'), button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do
= render Pajamas::ButtonComponent.new(variant: :default, href: help_page_path('user/project/import/index.md', anchor: 'placeholder-users'), button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do
= _('Learn more')
#import-history-mount-element{ data: { id: @bulk_import&.id, details_path: failures_import_bulk_import_path(':id', ':entity_id'), realtime_changes_path: realtime_changes_import_bulk_imports_path(format: :json) } }

View File

@ -42,7 +42,7 @@
- else
%li= safe_format(s_('GithubImporter|%{code_start}repo%{code_end}: Used to display a list of your public and private repositories that are available to import from.'), code_pair)
%li= safe_format(s_('GithubImporter|%{code_start}read:org%{code_end} (optional): Used to import collaborators from GitHub repositories, or if your project has Git LFS files.'), code_pair)
- docs_link = link_to('', help_page_path('user/project/import/github', anchor: 'use-a-github-personal-access-token'), target: '_blank', rel: 'noopener noreferrer')
- docs_link = link_to('', help_page_path('user/project/import/github.md', anchor: 'use-a-github-personal-access-token'), target: '_blank', rel: 'noopener noreferrer')
- docs_link_tag_pair = tag_pair(docs_link, :link_start, :link_end)
= safe_format(s_('GithubImport|%{link_start}Learn more%{link_end}.'), docs_link_tag_pair)

View File

@ -19,7 +19,7 @@
= file_field_tag :manifest, class: 'form-control-file w-auto', required: true
.form-text.text-muted
= _('Import multiple repositories by uploading a manifest file.')
= link_to sprite_icon('question-o'), help_page_path('user/project/import/manifest')
= link_to sprite_icon('question-o'), help_page_path('user/project/import/manifest.md')
.gl-mb-3
= render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm) do

View File

@ -8,6 +8,6 @@
destination_group: link_to(source_user.namespace.name, group_path(source_user.namespace)))
- c.with_actions do
= render Pajamas::ButtonComponent.new(variant: :default,
href: help_page_path('user/project/import/index', anchor: 'accept-contribution-reassignment'),
href: help_page_path('user/project/import/index.md', anchor: 'accept-contribution-reassignment'),
button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do
= _('Learn more')

View File

@ -3,6 +3,6 @@
= s_('UserMapping|You might have already accepted or rejected the reassignment, or it might have been canceled by the group owner.')
- c.with_actions do
= render Pajamas::ButtonComponent.new(variant: :default,
href: help_page_path('user/project/import/index', anchor: 'accept-contribution-reassignment'),
href: help_page_path('user/project/import/index.md', anchor: 'accept-contribution-reassignment'),
button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do
= _('Learn more')

View File

@ -8,6 +8,6 @@
destination_group: source_user.namespace.name)
- c.with_actions do
= render Pajamas::ButtonComponent.new(variant: :default,
href: help_page_path('user/project/import/index', anchor: 'accept-contribution-reassignment'),
href: help_page_path('user/project/import/index.md', anchor: 'accept-contribution-reassignment'),
button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do
= _('Learn more')

View File

@ -27,7 +27,7 @@
source_hostname: source_hostname,
destination_group: destination_group)
= succeed '.' do
= link_to s_('UserMapping|Learn more about reassignments'), help_page_path('user/project/import/index', anchor: 'accept-contribution-reassignment')
= link_to s_('UserMapping|Learn more about reassignments'), help_page_path('user/project/import/index.md', anchor: 'accept-contribution-reassignment')
%h5
= s_('UserMapping|Import details:')
%p.gl-mb-5

View File

@ -13,7 +13,7 @@
alert_options: { class: 'gl-my-5' },
close_button_options: { class: 'js-close-2fa-enabled-success-alert' }) do |c|
- c.with_body do
= html_escape(_('You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}.')) % { anchorOpen: '<a href="%{href}">'.html_safe % { href: help_page_path('user/profile/account/two_factor_authentication_troubleshooting', anchor: 'generate-new-recovery-codes-using-ssh') }, anchorClose: '</a>'.html_safe }
= html_escape(_('You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}.')) % { anchorOpen: '<a href="%{href}">'.html_safe % { href: help_page_path('user/profile/account/two_factor_authentication_troubleshooting.md', anchor: 'generate-new-recovery-codes-using-ssh') }, anchorClose: '</a>'.html_safe }
.settings-section.js-search-settings-section
.settings-sticky-header
@ -53,7 +53,7 @@
%p.gl-text-secondary
= s_('Profiles|Changing your username can have unintended side effects.')
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/profile/index', anchor: 'change-your-username'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more'), help_page_path('user/profile/index.md', anchor: 'change-your-username'), target: '_blank', rel: 'noopener noreferrer'
- data = { initial_username: current_user.username, root_url: root_url, action_url: update_username_profile_path(format: :json) }
#update-username{ data: data }

View File

@ -11,6 +11,6 @@
.gl-flex.gl-gap-3.gl-flex-wrap
- if setting
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, help_page_path: help_page_path('user/profile/notifications'), group_id: group.id, show_label: "true" } }
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, help_page_path: help_page_path('user/profile/notifications.md'), group_id: group.id, show_label: "true" } }
= form_for setting, url: profile_group_notifications_path(group), method: :put, html: { class: 'update-notifications gl-flex' } do |f|
.js-notification-email-listbox-input{ data: { name: 'notification_setting[notification_email]', emails: @user.public_verified_emails.to_json, empty_value_text: _('Global notification email') , value: setting.notification_email, placement: 'bottom-end' } }

View File

@ -11,4 +11,4 @@
.gl-flex.gl-gap-3.gl-flex-wrap
- if setting
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, help_page_path: help_page_path('user/profile/notifications'), project_id: project.id, container_class: 'gl-mr-3', show_label: "true" } }
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, help_page_path: help_page_path('user/profile/notifications.md'), project_id: project.id, container_class: 'gl-mr-3', show_label: "true" } }

View File

@ -25,7 +25,7 @@
.form-group.global-notification-setting.gl-mb-3
- if @global_notification_setting
.js-vue-notification-dropdown{ data: { dropdown_items: notification_dropdown_items(@global_notification_setting).to_json, notification_level: @global_notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), show_label: 'true' } }
.js-vue-notification-dropdown{ data: { dropdown_items: notification_dropdown_items(@global_notification_setting).to_json, notification_level: @global_notification_setting.level, help_page_path: help_page_path('user/profile/notifications.md'), show_label: 'true' } }
= gitlab_ui_form_for @user, url: profile_notifications_path, method: :put do |f|
.form-group

View File

@ -49,7 +49,7 @@
%p.gl-text-secondary
= s_('Preferences|Customize the appearance of the syntax.')
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'change-the-syntax-highlighting-theme'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'change-the-syntax-highlighting-theme'), target: '_blank', rel: 'noopener noreferrer'
.syntax-theme.row
- Gitlab::ColorSchemes.each do |scheme|
%label.col-6.col-sm-4.col-md-3.col-lg-auto.gl-mb-5
@ -76,11 +76,11 @@
%p.gl-text-secondary
= s_('Preferences|Customize the behavior of the system layout and default views.')
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'behavior'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'behavior'), target: '_blank', rel: 'noopener noreferrer'
.form-group
= f.label :layout, class: 'label-bold' do
= s_('Preferences|Keyboard shortcuts')
- shortcuts_help_link = link_to('', help_page_path('user/shortcuts'), target: '_blank', rel: 'noopener noreferrer')
- shortcuts_help_link = link_to('', help_page_path('user/shortcuts.md'), target: '_blank', rel: 'noopener noreferrer')
= f.gitlab_ui_checkbox_component :keyboard_shortcuts_enabled,
s_('Preferences|Enable keyboard shortcuts'),
help_text: safe_format(s_('Preferences|%{link_start}List of keyboard shortcuts%{link_end}'), tag_pair(shortcuts_help_link, :link_start, :link_end))
@ -141,11 +141,11 @@
%p.gl-text-secondary
= _('Customize language and region related settings.')
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'localization'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'localization'), target: '_blank', rel: 'noopener noreferrer'
.js-listbox-input{ data: { label: _('Language'), description: s_('Preferences|This feature is experimental and translations are not yet complete.'), name: 'user[preferred_language]', items: language_choices.to_json, value: current_user.preferred_language, block: true.to_s, toggle_class: 'gl-form-input-xl' } }
%p.-gl-mt-5
= link_to help_page_url('development/i18n/translation'), class: 'text-nowrap', target: '_blank', rel: 'noopener noreferrer' do
= link_to help_page_url('development/i18n/translation.md'), class: 'text-nowrap', target: '_blank', rel: 'noopener noreferrer' do
= _("Help translate GitLab into your language")
%span{ aria: { label: _('Open new window') } }
= sprite_icon('external-link')
@ -162,7 +162,7 @@
%p.gl-text-secondary
= s_('Preferences|Configure how dates and times display for you.')
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'show-exact-times-instead-of-relative-times'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'show-exact-times-instead-of-relative-times'), target: '_blank', rel: 'noopener noreferrer'
.form-group
= f.gitlab_ui_checkbox_component :time_display_relative,
s_('Preferences|Use relative times'),
@ -181,7 +181,7 @@
%p.gl-text-secondary
= s_('Preferences|Turns on or off the ability to follow or be followed by other users.')
= succeed '.' do
= link_to _('Learn more'), help_page_path('user/profile/index', anchor: 'follow-users'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more'), help_page_path('user/profile/index.md', anchor: 'follow-users'), target: '_blank', rel: 'noopener noreferrer'
.form-group
= f.gitlab_ui_checkbox_component :enabled_following,
s_('Preferences|Enable follow users')

View File

@ -3,7 +3,7 @@
- git_push_target = ''
- if protocol == 'ssh'
- ssh_doc = link_to('', help_page_path('user/ssh'), target: '_blank', rel: 'noopener noreferrer')
- ssh_doc = link_to('', help_page_path('user/ssh.md'), target: '_blank', rel: 'noopener noreferrer')
%p.gl-mt-2= safe_format(_('%{link}How to use SSH keys%{link_end}?'), tag_pair(ssh_doc, :link, :link_end))
- git_push_target = content_tag(:span, ssh_clone_url_to_repo(@project), class: 'js-clone')
- if protocol == 'https'

View File

@ -9,7 +9,7 @@
- c.with_body do
%p
- link = link_to('', help_page_path('user/project/settings/import_export'), target: '_blank', rel: 'noopener noreferrer')
- link = link_to('', help_page_path('user/project/settings/import_export.md'), target: '_blank', rel: 'noopener noreferrer')
= safe_format(_('Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}'), tag_pair(link, :link_start, :link_end))
.gl-mb-0
%p.gl-font-bold= _('The following items will be exported:')

View File

@ -11,7 +11,7 @@
alert_options: { class: 'gl-my-3' },
dismissible: false) do |c|
- c.with_body do
- docs_link_url = help_page_path('user/group/import/index') + '#migrate-groups-by-direct-transfer-recommended'
- docs_link_url = help_page_path('user/group/import/index.md') + '#migrate-groups-by-direct-transfer-recommended'
- docs_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
= html_escape(_("Importing GitLab projects? Migrating GitLab projects when migrating groups by direct transfer is in Beta. %{link_start}Learn more.%{link_end}")) % { link_start: docs_link, link_end: '</a>'.html_safe }
.import-buttons

View File

@ -3,4 +3,4 @@
.js-invite-members-modal{ data: { is_project: 'true',
access_levels: ProjectMember.permissible_access_level_roles(current_user, project).to_json,
reload_page_on_submit: current_path?('project_members#index').to_s,
help_link: help_page_url('user/permissions') }.merge(common_invite_modal_dataset(project)).merge(users_filter_data(project.group)) }
help_link: help_page_url('user/permissions.md') }.merge(common_invite_modal_dataset(project)).merge(users_filter_data(project.group)) }

View File

@ -2,4 +2,4 @@
= render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_options: { class: 'gl-hidden sm:gl-block' }) do |c|
- c.with_body do
= _('Possible LFS configuration issue. This project contains LFS objects but there is no .gitattributes file. You can ignore this message if you recently added a `.gitattributes` file.')
= link_to('Learn more.', help_page_path('topics/git/lfs/index'), target: '_blank', rel: 'noopener noreferrer')
= link_to('Learn more.', help_page_path('topics/git/lfs/index.md'), target: '_blank', rel: 'noopener noreferrer')

View File

@ -44,7 +44,7 @@
= render Pajamas::AlertComponent.new(dismissible: false,
variant: :success) do |c|
- c.with_body do
- help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/profile/index', anchor: 'add-details-to-your-profile-with-a-readme') }
- help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/profile/index.md', anchor: 'add-details-to-your-profile-with-a-readme') }
= html_escape(_('%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more%{help_link_end}.')) % { project_path: "<strong>#{current_user.username} / #{current_user.username}</strong>".html_safe, help_link_start: help_link_start, help_link_end: '</a>'.html_safe }
- if include_description
@ -67,7 +67,7 @@
.form-group.gl-form-group
= f.label :visibility_level, class: 'label-bold' do
= s_('ProjectsNew|Visibility Level')
= link_to sprite_icon('question-o'), help_page_path('user/public_access'), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer'
= link_to sprite_icon('question-o'), help_page_path('user/public_access.md'), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer'
= render 'shared/visibility_level', f: f, visibility_level: visibility_level.to_i, can_change_visibility_level: true, form_model: @project, with_label: false, data: { testid: 'visibility-radios'}
- if !hide_init_with_readme
@ -90,7 +90,7 @@
= s_('ProjectsNew|Enable Static Application Security Testing (SAST)')
- c.with_help_text do
= s_('ProjectsNew|Analyze your source code for known security vulnerabilities.')
= link_to _('Learn more.'), help_page_path('user/application_security/sast/index'), target: '_blank', rel: 'noopener noreferrer', data: { track_action: 'followed' }
= link_to _('Learn more.'), help_page_path('user/application_security/sast/index.md'), target: '_blank', rel: 'noopener noreferrer', data: { track_action: 'followed' }
- if display_sha256_repository
#js-experimental-setting-accordion.form-group.gl-mb-6

View File

@ -4,7 +4,7 @@
testid: 'service-desk-content',
expanded: expanded_by_default?) do |c|
- c.with_description do
- link_start = "<a href='#{help_page_path('user/project/service_desk/index')}' target='_blank' rel='noopener noreferrer'>".html_safe
- link_start = "<a href='#{help_page_path('user/project/service_desk/index.md')}' target='_blank' rel='noopener noreferrer'>".html_safe
= _('Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
- c.with_body do
- if ::Gitlab::ServiceDesk.supported?

View File

@ -8,14 +8,14 @@
.gl-flex.gl-grow
%h4.gl-text-base.gl-leading-24.gl-m-0= _('Transfer project')
%p.gl-text-subtle.gl-text-sm.gl-m-0
- link = link_to('', help_page_path('user/project/settings/migrate_projects', anchor: 'transfer-a-project-to-another-namespace'), target: '_blank', rel: 'noopener noreferrer')
- link = link_to('', help_page_path('user/project/settings/migrate_projects.md', anchor: 'transfer-a-project-to-another-namespace'), target: '_blank', rel: 'noopener noreferrer')
= safe_format(_("Transfer your project into another namespace. %{link_start}Learn more.%{link_end}"), tag_pair(link, :link_start, :link_end))
- c.with_body do
= form_for @project, url: transfer_project_path(@project), method: :put, html: { class: 'js-project-transfer-form', id: form_id } do |f|
.form-group.gl-mb-0
%p
- link = link_to('', help_page_path('user/project/working_with_projects', anchor: 'rename-a-repository'), target: '_blank', rel: 'noopener noreferrer')
- link = link_to('', help_page_path('user/project/working_with_projects.md', anchor: 'rename-a-repository'), target: '_blank', rel: 'noopener noreferrer')
= safe_format(_("A projects repository name defines its URL (the one you use to access the project via a browser) and its place on the file disk where GitLab is installed. %{link_start}Learn more.%{link_end}"), tag_pair(link, :link_start, :link_end))
%p= _('When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, compute minutes, and users, and start a trial or upgrade to a paid tier.')
%p

View File

@ -6,4 +6,4 @@
= s_('Pipelines|This GitLab CI configuration is invalid:')
= viewer.validation_message(project: @project, sha: @commit.sha, user: @current_user)
= link_to _('Learn more'), help_page_path('ci/yaml/index')
= link_to _('Learn more'), help_page_path('ci/yaml/index.md')

View File

@ -1,4 +1,4 @@
= gl_loading_icon(inline: true, css_class: "!gl-mr-2")
= s_('Pipelines|Validating GitLab CI configuration…')
= link_to _('Learn more'), help_page_path('ci/yaml/index')
= link_to _('Learn more'), help_page_path('ci/yaml/index.md')

View File

@ -6,4 +6,4 @@
This Route Map is invalid:
= viewer.validation_message
= link_to _('Learn more'), help_page_path('ci/environments/index', anchor: 'go-from-source-files-to-public-pages')
= link_to _('Learn more'), help_page_path('ci/environments/index.md', anchor: 'go-from-source-files-to-public-pages')

View File

@ -1,4 +1,4 @@
= gl_loading_icon(inline: true, css_class: "gl-mr-1")
Validating Route Map…
= link_to _('Learn more'), help_page_path('ci/environments/index', anchor: 'go-from-source-files-to-public-pages')
= link_to _('Learn more'), help_page_path('ci/environments/index.md', anchor: 'go-from-source-files-to-public-pages')

View File

@ -10,6 +10,6 @@
%p.form-text.text-muted
= s_('ProjectSettings|Leave empty to use default template.')
= sprintf(s_('ProjectSettings|Maximum %{maxLength} characters.'), { maxLength: Issue::MAX_BRANCH_TEMPLATE })
- branch_name_help_link = help_page_path('user/project/repository/branches/index', anchor: 'name-your-branch')
- branch_name_help_link = help_page_path('user/project/repository/branches/index.md', anchor: 'name-your-branch')
= link_to _('What variables can I use?'), branch_name_help_link, target: "_blank"
= render_if_exists 'projects/branch_defaults/branch_names_help'

View File

@ -3,7 +3,7 @@
- if change_default_disabled
- tag_pair_security_policies_page = tag_pair(link_to('', namespace_project_security_policies_path, target: '_blank', rel: 'noopener noreferrer'), :security_policies_link_start, :security_policies_link_end)
- tag_pair_security_policies_docs = tag_pair(link_to('', help_page_path('user/application_security/policies/scan-result-policies'), target: '_blank', rel: 'noopener noreferrer'), :learn_more_link_start, :learn_more_link_end)
- tag_pair_security_policies_docs = tag_pair(link_to('', help_page_path('user/application_security/policies/scan-result-policies.md'), target: '_blank', rel: 'noopener noreferrer'), :learn_more_link_start, :learn_more_link_end)
- popover_content = safe_format(s_("SecurityOrchestration|You can't change the default branch because its protection is enforced by one or more %{security_policies_link_start}security policies%{security_policies_link_end}. %{learn_more_link_start}Learn more%{learn_more_link_end}."), tag_pair_security_policies_docs, tag_pair_security_policies_page)
- popover_title = s_("SecurityOrchestration|Security policy overwrites this setting")
- popover_data = { container: 'body', toggle: 'popover', html: 'true', triggers: 'hover', title: popover_title, content: popover_content }
@ -21,7 +21,7 @@
.form-group
- help_text = _("When merge requests and commits in the default branch close, any issues they reference also close.")
- help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer'
- help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer'
= f.gitlab_ui_checkbox_component :autoclose_referenced_issues,
s_('ProjectSettings|Auto-close referenced issues on default branch'),
help_text: (help_text + "&nbsp;" + help_icon).html_safe

View File

@ -3,4 +3,4 @@
%h4.pt-3.pb-3= _("Validate your GitLab CI configuration")
#js-ci-lint{ data: { endpoint: project_ci_lint_path(@project), pipeline_simulation_help_page_path: help_page_path('ci/yaml/lint', anchor: 'simulate-a-pipeline') , lint_help_page_path: help_page_path('ci/yaml/lint', anchor: 'check-cicd-syntax') } }
#js-ci-lint{ data: { endpoint: project_ci_lint_path(@project), pipeline_simulation_help_page_path: help_page_path('ci/yaml/lint.md', anchor: 'simulate-a-pipeline') , lint_help_page_path: help_page_path('ci/yaml/lint.md', anchor: 'check-cicd-syntax') } }

View File

@ -19,17 +19,17 @@
- elsif signature.x509?
= render partial: "projects/commit/x509/certificate_details", locals: { signature: signature }
= link_to(_('Learn more about X.509 signed commits'), help_page_path('user/project/repository/signed_commits/x509'), class: 'gl-link gl-block')
= link_to(_('Learn more about X.509 signed commits'), help_page_path('user/project/repository/signed_commits/x509.md'), class: 'gl-link gl-block')
- elsif signature.ssh?
= _('SSH key fingerprint:')
%span.gl-font-monospace= signature.key_fingerprint_sha256 || _('Unknown')
= link_to(_('Learn about signing commits with SSH keys.'), help_page_path('user/project/repository/signed_commits/ssh'), class: 'gl-link gl-block gl-mt-3')
= link_to(_('Learn about signing commits with SSH keys.'), help_page_path('user/project/repository/signed_commits/ssh.md'), class: 'gl-link gl-block gl-mt-3')
- else
= _('GPG Key ID:')
%span.gl-font-monospace= signature.gpg_key_primary_keyid
= link_to(_('Learn about signing commits'), help_page_path('user/project/repository/signed_commits/index'), class: 'gl-link gl-block gl-mt-3')
= link_to(_('Learn about signing commits'), help_page_path('user/project/repository/signed_commits/index.md'), class: 'gl-link gl-block gl-mt-3')
%a.signature-badge.gl-inline-block.gl-ml-4{ role: 'button', tabindex: 0, data: { toggle: 'popover', html: 'true', placement: 'top', title: title, content: content } }
= gl_badge_tag label, variant: variant

View File

@ -3,7 +3,7 @@
- add_page_specific_style 'page_bundles/projects_edit'
- reduce_visibility_form_id = 'reduce-visibility-form'
- @force_desktop_expanded_sidebar = true
- project_docs_path = help_page_path('user/project/working_with_projects')
- project_docs_path = help_page_path('user/project/working_with_projects.md')
- project_docs_link_start = '<a href="%{url}" target="_blank">'.html_safe % { url: project_docs_path }
%h1.gl-sr-only= @breadcrumb_title
@ -36,7 +36,7 @@
expanded: expanded_by_default?) do |c|
- c.with_description do
= s_('ProjectSettings|Add badges to display information about this project.')
= link_to s_('ProjectSettings|What are badges?'), help_page_path('user/project/badges')
= link_to s_('ProjectSettings|What are badges?'), help_page_path('user/project/badges.md')
- c.with_body do
= render 'shared/badges/badge_settings'
@ -61,13 +61,13 @@
%h4.gl-text-base.gl-leading-24.gl-m-0= _('Housekeeping')
%p.gl-text-subtle.gl-text-sm.gl-m-0
= _('Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects.')
= link_to _('Learn more.'), help_page_path('administration/housekeeping'), target: '_blank', rel: 'noopener noreferrer'
= link_to _('Learn more.'), help_page_path('administration/housekeeping.md'), target: '_blank', rel: 'noopener noreferrer'
- c.with_body do
.gl-flex.gl-flex-wrap.gl-gap-3
= render Pajamas::ButtonComponent.new(method: :post, href: housekeeping_project_path(@project)) do
= _('Run housekeeping')
#js-project-prune-unreachable-objects-button{ data: { prune_objects_path: housekeeping_project_path(@project, prune: true), prune_objects_doc_path: help_page_path('administration/housekeeping', anchor: 'prune-unreachable-objects') } }
#js-project-prune-unreachable-objects-button{ data: { prune_objects_path: housekeeping_project_path(@project, prune: true), prune_objects_doc_path: help_page_path('administration/housekeeping.md', anchor: 'prune-unreachable-objects') } }
= render 'export', project: @project
@ -78,7 +78,7 @@
.gl-flex.gl-grow
%h4.gl-text-base.gl-leading-24.gl-m-0= _('Change path')
%p.gl-text-subtle.gl-text-sm.gl-m-0
- link = link_to('', help_page_path('user/project/working_with_projects', anchor: 'rename-a-repository'), target: '_blank', rel: 'noopener noreferrer')
- link = link_to('', help_page_path('user/project/working_with_projects.md', anchor: 'rename-a-repository'), target: '_blank', rel: 'noopener noreferrer')
= safe_format(_("A projects repository name defines its URL (the one you use to access the project via a browser) and its place on the file disk where GitLab is installed. %{link_start}Learn more.%{link_end}"), tag_pair(link, :link_start, :link_end))
- c.with_body do

View File

@ -34,8 +34,8 @@
= _('You can also upload existing files from your computer using the instructions below.')
.git-empty.js-git-empty
%h3.gl-text-lg= _('Configure your Git identity')
- git_get_started_doc = link_to('', help_page_path('topics/git/get_started'), target: '_blank', rel: 'noopener noreferrer')
- git_config_doc = link_to('', help_page_path('topics/git/how_to_install_git/index', anchor: 'configure-git'), target: '_blank', rel: 'noopener noreferrer')
- git_get_started_doc = link_to('', help_page_path('topics/git/get_started.md'), target: '_blank', rel: 'noopener noreferrer')
- git_config_doc = link_to('', help_page_path('topics/git/how_to_install_git/index.md', anchor: 'configure-git'), target: '_blank', rel: 'noopener noreferrer')
%p= safe_format(_("%{get_started}Get started with Git%{get_started_end} and learn %{git_config}how to configure it%{git_config_end}."), tag_pair(git_get_started_doc, :get_started, :get_started_end), tag_pair(git_config_doc, :git_config, :git_config_end))
.scrolling-tabs-container.inner-page-scroll-tabs
= gl_tabs_nav({ class: 'js-configure-git-tabs' }) do

View File

@ -5,7 +5,7 @@
"can-read-environment" => can?(current_user, :read_environment, @project).to_s,
"can-create-environment" => can?(current_user, :create_environment, @project).to_s,
"new-environment-path" => new_project_environment_path(@project),
"help-page-path" => help_page_path("ci/environments/index"),
"help-page-path" => help_page_path("ci/environments/index.md"),
"project-path" => @project.full_path,
"project-id" => @project.id,
"default-branch-name" => @project.default_branch_or_main } }

View File

@ -4,9 +4,9 @@
"project-id" => @project.id,
"project-name" => @project.name,
"error-state-svg-path" => image_path('illustrations/empty-state/empty-feature-flag-md.svg'),
"feature-flags-help-page-path" => help_page_path("operations/feature_flags"),
"feature-flags-client-libraries-help-page-path" => help_page_path("operations/feature_flags", anchor: "choose-a-client-library"),
"feature-flags-client-example-help-page-path" => help_page_path("operations/feature_flags", anchor: "go-application-example"),
"feature-flags-help-page-path" => help_page_path("operations/feature_flags.md"),
"feature-flags-client-libraries-help-page-path" => help_page_path("operations/feature_flags.md", anchor: "choose-a-client-library"),
"feature-flags-client-example-help-page-path" => help_page_path("operations/feature_flags.md", anchor: "go-application-example"),
"feature-flags-limit-exceeded" => @project.actual_limits.exceeded?(:project_feature_flags, @project.operations_feature_flags.count),
"feature-flags-limit" => @project.actual_limits.project_feature_flags,
"unleash-api-url" => (unleash_api_url(@project) if can?(current_user, :admin_feature_flag, @project)),

View File

@ -9,6 +9,6 @@
user_callouts_path: callouts_path,
user_callout_id: Users::CalloutsHelper::FEATURE_FLAGS_NEW_VERSION,
show_user_callout: show_feature_flags_new_version?.to_s,
strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'),
environments_scope_docs_path: help_page_path('ci/environments/index', anchor: 'limit-the-environment-scope-of-a-cicd-variable'),
strategy_type_docs_page_path: help_page_path('operations/feature_flags.md', anchor: 'feature-flag-strategies'),
environments_scope_docs_path: help_page_path('ci/environments/index.md', anchor: 'limit-the-environment-scope-of-a-cicd-variable'),
project_id: @project.id } }

View File

@ -3,6 +3,6 @@
- breadcrumb_title s_('FeatureFlags|Edit User List')
- page_title s_('FeatureFlags|Edit User List')
#js-edit-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags', anchor: 'user-list'),
#js-edit-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags.md', anchor: 'user-list'),
'user-list-iid' => @user_list.iid,
'project-id' => @project.id } }

View File

@ -3,6 +3,6 @@
- page_title s_('FeatureFlags|Feature flag User Lists')
#js-user-lists{ data: { project_id: @project.id,
feature_flags_help_page_path: help_page_path("operations/feature_flags"),
feature_flags_help_page_path: help_page_path("operations/feature_flags.md"),
new_user_list_path: can?(current_user, :create_feature_flag, @project) ? new_project_feature_flags_user_list_path(@project): nil,
error_state_svg_path: image_path('illustrations/empty-state/empty-feature-flag-md.svg') } }

View File

@ -4,6 +4,6 @@
- breadcrumb_title s_('FeatureFlags|New User List')
- page_title s_('FeatureFlags|New User List')
#js-new-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags', anchor: 'user-list'),
#js-new-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags.md', anchor: 'user-list'),
'feature-flags-path' => project_feature_flags_path(@project),
'project-id' => @project.id } }

View File

@ -4,7 +4,7 @@
endpoint: new_project_fork_path(@project, format: :json),
new_group_path: new_group_path,
project_full_path: @project.full_path,
visibility_help_path: help_page_path("user/public_access"),
visibility_help_path: help_page_path("user/public_access.md"),
cancel_path: project_path(@project),
project_id: @project.id,
project_name: @project.name,

View File

@ -1,5 +1,5 @@
- return unless show_moved_service_desk_issue_warning?(issue)
- service_desk_link_url = help_page_path('user/project/service_desk/index')
- service_desk_link_url = help_page_path('user/project/service_desk/index.md')
- service_desk_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: service_desk_link_url }
= render Pajamas::AlertComponent.new(variant: :warning,

View File

@ -1,6 +1,6 @@
- return if @issue.work_item_type&.incident?
- requirements_link_url = help_page_path('user/project/issues/design_management', anchor: 'prerequisites')
- requirements_link_url = help_page_path('user/project/issues/design_management.md', anchor: 'prerequisites')
- requirements_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: requirements_link_url }
- link_end = '</a>'.html_safe
- enable_lfs_message = s_("DesignManagement|To upload designs, you'll need to enable LFS and have an admin enable hashed storage. %{requirements_link_start}More information%{requirements_link_end}").html_safe % { requirements_link_start: requirements_link_start, requirements_link_end: link_end }

View File

@ -45,7 +45,7 @@
%li.droplab-item-ignore.gl-ml-3.gl-mr-3.gl-mt-5
- if can_create_confidential_merge_request?
#js-forked-project{ data: { namespace_path: @project.namespace.full_path, project_path: @project.full_path, new_fork_path: new_project_fork_path(@project), help_page_path: help_page_path('user/project/merge_requests/index') } }
#js-forked-project{ data: { namespace_path: @project.namespace.full_path, project_path: @project.full_path, new_fork_path: new_project_fork_path(@project), help_page_path: help_page_path('user/project/merge_requests/index.md') } }
.form-group
%label{ for: 'new-branch-name' }
= _('Branch name')

Some files were not shown because too many files have changed in this diff Show More